Script für gleitenden Mittelwert

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

Moderator: Co-Administratoren

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

Re: Script für gleitenden Mittelwert

Beitrag von hanan » 11.06.2016, 08:25

Hallo paul53
Hmmmm... zu früh gefreut.

Es wird ein Wert berechnet und in die Variable geschrieben, also der Script funzt.

Nur muss etwas mit der Berechnung nicht stimmen, da die Werte gegenüber dem Sensorwert sehr tief sind.
Eigentlich müsste der Wert aus der Variablen geholt werden, mal (n-1) durch n gerechnet werden plus (aktueller Wert durch n) und zurück in die Variable.

Irgendwo fehlt da noch eine Klammer oder so...

Code: Alles auswählen

m = (m*(n-1)/n) +  dom.GetObject(raum+".Sensor").DPByHssDP("TEMPERATURE").Value() /n;
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

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 » 11.06.2016, 12:19

Die Formel stammt nicht von mir. Mein Ansatz zur Mittelwertbildung war ein anderer.
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 » 11.06.2016, 13:28

Hier ein anderes Skript für eine gleitende Mittelwertbildung, das eine Hilfs-SV "AussenTListe" vom Typ "Zeichenkette" verwendet:

Code: Alles auswählen

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

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

! Konstante: Anzahl Werte in der Liste
integer n = 24;

! Lokale Variablen
string  list;    ! Meßwertliste
integer len;     ! Element-Länge
real    s = 0.0; ! Summe

! Werte einlesen und verschieben
list = dom.GetObject(raum#"TListe").Value();
len = list.StrValueByIndex(",",0).Length() + 1;
list = list.Substr(len, list.Length() - len);

list = list#","#dom.GetObject(raum#".Sensor").DPByHssDP("TEMPERATURE").Value().ToString(1);
dom.GetObject(raum#"TListe").State(list);

string summand;
foreach(summand, list.Split(","))
{s = s + summand.ToFloat();
}

! Mittelwert in Systemvariable schreiben
dom.GetObject(raum#"TMittel").State(s / n);
Bevor das obige Script verwendet werden kann muss die Zeichenketten-SV "AussenTListe" erst gefüllt (initialisiert) werden, was nur einmal ausgeführt werden muss / darf:

Code: Alles auswählen

! Liste initialisieren
string raum = "Aussen";
integer n = 24;
string x = dom.GetObject(raum#".Sensor").DPByHssDP("TEMPERATURE").Value().ToString(1); 
string list = x;
integer i = 1;
while(i < n)
{list = list#","#x;
 i = i + 1;
}
dom.GetObject(raum#"TListe").State(list);
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)

BadenPower

Re: Script für gleitenden Mittelwert

Beitrag von BadenPower » 11.06.2016, 13:39

hanan hat geschrieben:Irgendwo fehlt da noch eine Klammer oder so...

Code: Alles auswählen

m = (m*(n-1)/n) +  dom.GetObject(raum+".Sensor").DPByHssDP("TEMPERATURE").Value() /n;
HM-Skript kennt keine Punkt-vor-Strich-Regel.

Daher musst Du die Division des aktuellen Wert durch n auch noch in Klammern setzen.

Code: Alles auswählen

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

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 » 11.06.2016, 14:52

BadenPower hat geschrieben:HM-Skript kennt keine Punkt-vor-Strich-Regel.
Dafür eine Rechts-vor-Links-Regel. Diese Klammer sollte keinen Unterschied machen :?:
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)

BadenPower

Re: Script für gleitenden Mittelwert

Beitrag von BadenPower » 11.06.2016, 15:10

EDIT hier stand Blodsinn.

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 » 11.06.2016, 15:26

Du musst einen andern HM Script Interpreter haben:
Rechts_vor_Links.JPG
EDIT: Badenpower hat offenbar selbst bemerkt, dass es die Rechts-vor-Links-Regel gibt.
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)

BadenPower

Re: Script für gleitenden Mittelwert

Beitrag von BadenPower » 11.06.2016, 15:43

paul53 hat geschrieben:EDIT: Badenpower hat offenbar selbst bemerkt, dass es die Rechts-vor-Links-Regel gibt.
Ja und daher habe ich mir das Skript nochmals angeschaut und wieder den schlichtweg unverzeihlichen Anfängenfehler bemerkt.
Und der wäre:

Eine Variable als einen bestimmten Typ deklarieren und einen anderen Typ zuweisen.
Hier ein real deklariert und ein Integer zugewiesen.

Code: Alles auswählen

real    n = 6; ! Anzahl der Mittelwerte
Das n ist hier kein Real mehr, sondern schon ein Integer.

Durch die rechts-vor-links-Regel wird mitten in der Berechnung mit einem Integer gerechnet statt mit einem real, was "(n -1) / n" natürlich immer zu 0 werden läßt.
Dies entsteht durch die Regel: Nimm immer den Typ an, welcher links steht.

Code: Alles auswählen

real n = 10;
real ausgabe = 3.0 * (n-1) / n;
WriteLine(ausgabe);

real n = 10.0;
real ausgabe = 3.0 * (n-1) / n;
WriteLine(ausgabe);

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 » 11.06.2016, 16:13

BadenPower hat geschrieben:Durch die rechts-vor-links-Regel wird mitten in der Berechnung mit einem Integer gerechnet statt mit einem real, was "(n -1) / n" natürlich immer zu 0 werden läßt.
Stimmt, das hätte mir auch auffallen können; aber wie schon erwähnt, stammt diese Lösung nicht von mir. n hätte richtig deklariert werden müssen:

Code: Alles auswählen

real    n = 6.0; ! Anzahl der Mittelwerte
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
hanan
Beiträge: 222
Registriert: 15.12.2012, 16:00
Danksagung erhalten: 1 Mal

Re: Script für gleitenden Mittelwert

Beitrag von hanan » 12.06.2016, 06:45

Hallo paul53, hallo BadenPower
Besten Dank, Ihr habt mir sehr weitergeholfen.

Es funzt jetzt...

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“