Script für gleitenden Mittelwert

Homematic-, TCL- und Shell-Script, Toolchain, C, etc.

Moderator: Co-Administratoren

paul53
Beiträge: 2554
Registriert: 26.04.2012, 20:42
Wohnort: Berlin
Danksagung erhalten: 15 Mal

Script für gleitenden Mittelwert

Beitrag von paul53 » 03.10.2012, 15:21

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).
Versionen: HM-CC-TC 2.1, HM-LC-Sw1 1.9, HM-CC-RT-DN 1.1, HM-MOD-RPI-PCB 1.2.1 (keine CCU)

paul53
Beiträge: 2554
Registriert: 26.04.2012, 20:42
Wohnort: Berlin
Danksagung erhalten: 15 Mal

Re: Script für gleitenden Mittelwert

Beitrag von paul53 » 06.02.2013, 17:03

Ein Beispiel zur Glättung der Windgeschwindigkeitswerte findet man hier
http://homematic-forum.de/forum/viewtop ... =56#p88661
Versionen: HM-CC-TC 2.1, HM-LC-Sw1 1.9, HM-CC-RT-DN 1.1, HM-MOD-RPI-PCB 1.2.1 (keine CCU)

Benutzeravatar
uwe111
Beiträge: 4805
Registriert: 26.02.2011, 22:22
Hat sich bedankt: 3 Mal
Danksagung erhalten: 239 Mal
Kontaktdaten:

Re: Script für gleitenden Mittelwert

Beitrag von uwe111 » 06.02.2013, 18:16

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.
Alle sagten: Das geht nicht. Dann kam einer, der wußte das nicht und hat's einfach gemacht.
SPENDEN :wink: Download: CUxD 2.11, SSH KeyDir

paul53
Beiträge: 2554
Registriert: 26.04.2012, 20:42
Wohnort: Berlin
Danksagung erhalten: 15 Mal

Re: Script für gleitenden Mittelwert

Beitrag von paul53 » 06.02.2013, 19:42

Danke Uwe,

das CUxD scheint ja einiges zu können. Werde mir das mal genauer ansehen.
Versionen: HM-CC-TC 2.1, HM-LC-Sw1 1.9, HM-CC-RT-DN 1.1, HM-MOD-RPI-PCB 1.2.1 (keine CCU)

drose28357
Beiträge: 174
Registriert: 14.10.2011, 09:05
System: CCU
Wohnort: Bremen
Hat sich bedankt: 53 Mal
Danksagung erhalten: 7 Mal

Re: Script für gleitenden Mittelwert

Beitrag von drose28357 » 29.03.2013, 07:01

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
RaspberryMatic auf Raspberry Pi 4 2Gbyte

drose28357
Beiträge: 174
Registriert: 14.10.2011, 09:05
System: CCU
Wohnort: Bremen
Hat sich bedankt: 53 Mal
Danksagung erhalten: 7 Mal

Re: Script für gleitenden Mittelwert

Beitrag von drose28357 » 29.03.2013, 07:28

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.
RaspberryMatic auf Raspberry Pi 4 2Gbyte

paul53
Beiträge: 2554
Registriert: 26.04.2012, 20:42
Wohnort: Berlin
Danksagung erhalten: 15 Mal

Re: Script für gleitenden Mittelwert

Beitrag von paul53 » 29.03.2013, 08:15

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.
Versionen: HM-CC-TC 2.1, HM-LC-Sw1 1.9, HM-CC-RT-DN 1.1, HM-MOD-RPI-PCB 1.2.1 (keine CCU)

drose28357
Beiträge: 174
Registriert: 14.10.2011, 09:05
System: CCU
Wohnort: Bremen
Hat sich bedankt: 53 Mal
Danksagung erhalten: 7 Mal

Re: Script für gleitenden Mittelwert

Beitrag von drose28357 » 30.03.2013, 22:18

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.
RaspberryMatic auf Raspberry Pi 4 2Gbyte

Benutzeravatar
joni-blue
Beiträge: 1171
Registriert: 04.01.2012, 12:20
System: CCU
Wohnort: Hannover
Hat sich bedankt: 6 Mal
Danksagung erhalten: 1 Mal

Re: Script für gleitenden Mittelwert

Beitrag von joni-blue » 28.02.2016, 16:58

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());
Reboot tut gut ! ! !

Benutzeravatar
hanan
Beiträge: 222
Registriert: 15.12.2012, 16:00
Danksagung erhalten: 1 Mal

Re: Script für gleitenden Mittelwert

Beitrag von hanan » 10.06.2016, 09:00

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
Liebe Grüsse aus der Schweiz
Andy
_________________________________________________________________________________________________
Raspberrymatic auf NUC unter Proxmox mit RPI-RF-MOD Funkmodul und Antenne Aurel GP868, ca. 19x BidCos-RF und ca. 46x HmIP-RF, ioBroker auf NUC unter Proxmox, 4x Wiffi 3.0, Pulsecounter, Weatherman-Edition

Antworten

Zurück zu „Softwareentwicklung für die HomeMatic CCU“