Seite 1 von 10

Script für gleitenden Mittelwert

Verfasst: 03.10.2012, 15:21
von paul53
Das folgende Script bildet den gleitenden Mittelwert über 6 Werte. Benötigt werden 6 Systemvariablen zur Speicherung der Werte. Das Programm muss zyklisch per Zeitmodul ausgelöst werden (z.B. alle 2 Stunden für eine Mittelwertbildung über 12 Stunden).

Code: Alles auswählen

! gleitender Mittelwert über 6 Werte
! Programm muß zyklisch per Zeitmodul ausgelöst werden

! Raumname ist Bestandteil des Kanalnamens (Raum.Sensor)
! und des Namens der Systemvariablen (Raum.T1...T6 Raum.T_Mittel)
string raum = "Aussen";

! Lokale Variablen
real    x;       ! Meßwert
real    m;       ! Mittelwert
real    s = 0.0; ! Summe

! Werte einlesen und verschieben
x = dom.GetObject(raum+".T2").Value();
dom.GetObject(raum+".T1").State(x);
s = x + s;
x = dom.GetObject(raum+".T3").Value();
dom.GetObject(raum+".T2").State(x);
s = x + s;
x = dom.GetObject(raum+".T4").Value();
dom.GetObject(raum+".T3").State(x);
s = x + s;
x = dom.GetObject(raum+".T5").Value();
dom.GetObject(raum+".T4").State(x);
s = x + s;
x = dom.GetObject(raum+".T6").Value();
dom.GetObject(raum+".T5").State(x);
s = x + s;
x = dom.GetObject(raum+".Sensor").DPByHssDP("TEMPERATURE").Value(); 
dom.GetObject(raum+".T6").State(x);
s = x + s;

! Berechnung Mittelwert
m = s / 6;

! In Systemvariable schreiben
dom.GetObject(raum+".T_Mittel").State(m);

Die Mittelwertbildung ist sinnvoll, wenn bei bestimmten Aktionen oder Berechnungen das Wärmebeharrungsvermögen des Raumes oder der Wand berücksichtigt werden sollte.
Ein Beispiel ist die Berechnung der Oberflächentemperatur einer Außenwandecke (siehe http://homematic-forum.de/forum/viewtop ... 835#p71539). Die Zeit, über die die Mittelwertbildung erfolgen sollte, hängt stark von der Wandkonstruktion ab (von 6 h bei einer dünnen Leichtbauwand bis zu 48 h bei einer sehr dicken, schweren Vollziegel-, Kalksandstein-Wand).

Re: Script für gleitenden Mittelwert

Verfasst: 06.02.2013, 17:03
von paul53
Ein Beispiel zur Glättung der Windgeschwindigkeitswerte findet man hier
http://homematic-forum.de/forum/viewtop ... =56#p88661

Re: Script für gleitenden Mittelwert

Verfasst: 06.02.2013, 18:16
von uwe111
Hallo Paul,

als Alternative lassen sich mit dem Transform-Device vom CUxD auch der Mittel- und der Zentralwert über maximal 30 Werte berechnen.

Viele Grüße,

Uwe.

Re: Script für gleitenden Mittelwert

Verfasst: 06.02.2013, 19:42
von paul53
Danke Uwe,

das CUxD scheint ja einiges zu können. Werde mir das mal genauer ansehen.

Re: Script für gleitenden Mittelwert

Verfasst: 29.03.2013, 07:01
von drose28357
Die Berechnung eines gleitenden Mittelwertes geht auch einfacher. Man braucht dafür nur eine Speichervariable. Der Trick ist, das Mann die Summe aller Werte nicht jedes mal neu berechnet.

Das geht so ...

<pseudocode>

var n /* Anzahl der zu mittelnden Werte */
var MW /* Mittelwert */

Funktion Init ;
n = 10 /* Anzahl der Mittelwerte definieren */
MW = 0 /* Start mit wert 0 oder zum schnelleren Einschwingen mit dem ersten Messwert */
Ende Funktion

Funktion Berechne_Mittelwert (Messung);
MW = MW * (n - 1)/n + Messung / n
Ende Funktion

</Pseudocode>

Im Beispiel werden also die bisherigen Mittelwerte um 1/10 reduziert (entspricht dem Faktor *9/10) und 1/10 des neuen Messwert hinzuaddiert. Macht in Summe 10/10 = 1.

Vorteil dieser Methode :
- braucht nur eine Speicherstelle
- kann ganz einfach auf längere Mitteilungen geändert werden. Einfach den Wert von n in der Initialisierung andern.

In der Realisierung kann man die Berechnung der Faktoren in der Initialisierung vorwegnehmen, dann hat man in der Mittelwert Berechnung nur noch zwei Multiplikationen und eine Addition.

Da ich kein Homematic Scripting kann, wünsche ich viel Spass bei der Umsetzung und eine Veröffentlichung des Scripts.

Ditmar

Re: Script für gleitenden Mittelwert

Verfasst: 29.03.2013, 07:28
von drose28357
ich versuch es mal mit dem Beispiel von weiter oben ....

Code: Alles auswählen

    ! gleitender Mittelwert über 6 Werte
    ! Programm muß zyklisch per Zeitmodul ausgelöst werden

    ! Raumname ist Bestandteil des Kanalnamens (Raum.Sensor)
    ! und des Namens der Systemvariablen (Raum.T_Mittel)
    string raum = "Aussen";

    ! Lokale Variablen
    real    m;       ! Mittelwert
    real    n = 6; ! Anzahl der Mittelwerte
    
   ! Mittelwert in die lokale Variable einlesen
   m = dom.GetObject(raum+".T_Mittel").Value();

    ! Berechnung Mittelwert
    m = m*(n-1)/n +  dom.GetObject(raum+".Sensor").DPByHssDP("TEMPERATURE").Value()  /n;

    ! In Systemvariable schreiben
    dom.GetObject(raum+".T_Mittel").State(m);

hoffe, ich hab den Algorithmus korrekt ein getippt ....

Vermutlich kann man sich das einlesen in Variable m auch noch sparen.

Re: Script für gleitenden Mittelwert

Verfasst: 29.03.2013, 08:15
von paul53
drose28357 hat geschrieben:

Code: Alles auswählen

! Berechnung Mittelwert
m = m*(n-1)/n +  dom.GetObject(raum+".Sensor").DPByHssDP("TEMPERATURE").Value()  /n;
hoffe, ich hab den Algorithmus korrekt ein getippt ....
Man muss Klammern setzen, damit die Abarbeitungsreihenfolge in HM Script stimmt.

Code: Alles auswählen

m = ((m*(n-1)) +  dom.GetObject(raum+".Sensor").DPByHssDP("TEMPERATURE").Value())/n;
Diese Funktion berechnet nicht den gleitenden Mittelwert mit Gleichgewichtung aller n Werte, sondern einen gewichteten Mittelwert über unendlich viele Werte, wobei die jüngsten Werte die höchste Gewichtung haben.

Re: Script für gleitenden Mittelwert

Verfasst: 30.03.2013, 22:18
von drose28357
Das ist korrekt. Solange keine großen Sprünge in den Werten vorliegen und die Anzahl der Mittelwerte groß ist, ist die Abweichung zum gleitenden Mittelwert zu vernachlässigen.

Re: Script für gleitenden Mittelwert

Verfasst: 28.02.2016, 16:58
von joni-blue
hier einmal angepasst für all die die möglichst wenig variablen im script benutzen wollen

http://homematic-forum.de/forum/viewtop ... 34&t=25388

Code: Alles auswählen

! gleitender Mittelwert über 6 Werte

! Werte einlesen und verschieben



dom.GetObject("Bad.L6").State(dom.GetObject("Bad.L5").Value());
dom.GetObject("Bad.L5").State(dom.GetObject("Bad.L4").Value());
dom.GetObject("Bad.L4").State(dom.GetObject("Bad.L3").Value());
dom.GetObject("Bad.L3").State(dom.GetObject("Bad.L2").Value());
dom.GetObject("Bad.L2").State(dom.GetObject("Bad.L1").Value());
dom.GetObject("Bad.L1").State(dom.GetObject("Heizungsgruppe Bad 1").DPByHssDP("ACTUAL_HUMIDITY").Value());

dom.GetObject("Bad.L.Mittel").State(((
  dom.GetObject("Bad.L1").Value()
  +
  dom.GetObject("Bad.L2").Value()
  +
  dom.GetObject("Bad.L3").Value()
  +
  dom.GetObject("Bad.L4").Value()
  +
  dom.GetObject("Bad.L5").Value()
  +
  dom.GetObject("Bad.L6").Value()
)/6));

WriteLine(dom.GetObject("Bad.L.Mittel").Value());

Re: Script für gleitenden Mittelwert

Verfasst: 10.06.2016, 09:00
von hanan
Hallo zusammen
Ich wollte den gleitenden Mittelwert über 24 Stunden mit einem HM-WDS30-OT2-SM errechnen, leider habe ich da etwas Probleme die Daten vom Sensor mit CUXD zu holen.

Wass mache ich hier falsch?

Hier mein Skript:

Code: Alles auswählen

    ! gleitender Mittelwert über 24 Werte
    ! Programm muß zyklisch per Zeitmodul ausgelöst werden

    ! Raumname ist Bestandteil des Kanalnamens (Raum.Sensor)
    ! und des Namens der Systemvariablen (AussenT.Mittelwert)
    string raum = "Aussentemperatur.LEQ0177421";

    ! Lokale Variablen
    real    m;       ! Mittelwert
    real    n = 24; ! Anzahl der Mittelwerte
    
   ! Mittelwert in die lokale Variable einlesen
   m = dom.GetObject(Aussentemperatur+"AussenT.Mittelwert").Value();

    ! Berechnung Mittelwert
    m = m*(n-1)/n +  dom.GetObject(Aussentemperatur+"LEQ0177421").DPByHssDP("TEMPERATURE").Value()  /n;

    ! In Systemvariable schreiben
    dom.GetObject(Aussentemperatur+"AussenT.Mittelwert").State(m);
Danke für die Hilfe.
Grüsse aus der Schweiz