Script für gleitenden Mittelwert

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

Moderator: Co-Administratoren

stephanw
Beiträge: 20
Registriert: 26.12.2010, 22:41
Danksagung erhalten: 1 Mal

Re: Script für gleitenden Mittelwert

Beitrag von stephanw » 02.09.2016, 15:00

Hallo Hanan
ich habe diesen Thread gelesen, aber bei mir funktioniert das irgendwie nicht. Könntest Du mir das komplette Script nochmals posten. Vielleicht ist mir ein Fehler unterlaufen beim Anpassen der im Threas beschriebenen Änderungen.

Danke und auch Gruss aus der Schweiz
Stephan

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.11.2016, 14:16

Hallo stephanw
Hier das Script welches ich durch die tollen Menschen in diesem Forum benutze...

Zwei Variablen anlegen:
- "AussenMittel" als "Zahl" und Masseinheit "°C"
- "AusssenTListe" als "Zeichenkette" und Masseinheit "°C"

Jetzt einmal folgender Skript unter "Skript tetsen" durchlaufen lassen, damit die Variable AussenTListe mit allen 8 Werten gefüllt wird.

Code: Alles auswählen

! Liste initialisieren
string raum = "Aussen";
integer n = 8;
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);
In einem Programm stündlich diesen Script ausführen lassen:

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 = 8;

! 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#"Mittel").State(s / n);
Dieses ergibt eine durchschnittliche Temperatur der letzten 8 Stunden.

Gruess 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

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.11.2016, 15:22

hanan hat geschrieben:- "AusssenTListe" als "Zeichenkette" und Masseinheit "°C"
Zeichenketten haben keine Masseinheit.
hanan hat geschrieben:

Code: Alles auswählen

string x = dom.GetObject(raum#".Sensor").DPByHssDP("TEMPERATURE").Value().ToString(1);
Du hast vergessen zu erwähnen, dass bei unverändertem Skript der Kanal 1 des Aussenfühlers den Namen "Aussen.Sensor" erhalten muss.
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
Daniel
Beiträge: 219
Registriert: 16.01.2012, 17:33

Re: Script für gleitenden Mittelwert

Beitrag von Daniel » 04.03.2017, 13:38

Hallo zusammen, ich habe das von @hanan gepostete Script etwas modifiziert (6 statt 8 Werte) und setze es ein, um die Lux-Werte eines HM-Sen-LI-O zu glätten. Mein Problem ist jetzt aber, dass der Mittelwert eigentlich konstant ÜBER dem aktuellen Lux-Wert liegt...

Hier mein angepasstes Script, das ich über die Zeitsteuerung alle 2 Minuten auslöse:

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)

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

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

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

list = list#","#dom.GetObject("BidCos-RF.NEQ1358731:1.LUX").Value().ToString(2);
dom.GetObject(19596).State(list);

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

! Mittelwert in Systemvariable schreiben
dom.GetObject(19595).State(s / n);
Hat jemand eine Idee, warum das so ist?
trend.png
CCU2 mit 61+ Geräten, CCU-Historian und OpenHab auf einem Raspberry 2

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 » 04.03.2017, 14:38

Daniel hat geschrieben:(6 statt 8 Werte) und setze es ein, um die Lux-Werte eines HM-Sen-LI-O zu glätten. Mein Problem ist jetzt aber, dass der Mittelwert eigentlich konstant ÜBER dem aktuellen Lux-Wert liegt...
Daniel hat geschrieben:

Code: Alles auswählen

! Konstante: Anzahl Werte in der Liste
integer n = 5;
Wenn die Liste 6 Werte enthält, aber durch 5 dividiert wird, muss der Wert zu hoch sein.
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
Daniel
Beiträge: 219
Registriert: 16.01.2012, 17:33

Re: Script für gleitenden Mittelwert

Beitrag von Daniel » 04.03.2017, 18:07

Sorry, da habe ich mich verschrieben - 5 Werte sind in der Liste, damit ich den 10-Minuten-Durchschnitt habe.

EDIT: Ich war noch viel blöder als gedacht! Ich hatte für die Systemvariable einen Maximalwert von 100.000 angegeben, LUX vom Sensor hat 200.000 - deshalb hat der CCU-Historian das ordnungsgemäß auf zwei Skalen gepackt, was ich übersehen habe... :shock: Also geht alles genau so wie es gehen soll!
CCU2 mit 61+ Geräten, CCU-Historian und OpenHab auf einem Raspberry 2

xaler
Beiträge: 3
Registriert: 01.05.2017, 15:12

Re: Script für gleitenden Mittelwert

Beitrag von xaler » 01.05.2017, 15:27

Hallo zusammen, hallo Daniel,

irgendwie funktioniert das Script zu glätten der Helligkeitswerte bei mir nicht. Die ID des HM-Sen-LI-O habe ich an meine angepasst. Jedoch kann ich mit

Code: Alles auswählen

dom.GetObject(19596)

und

Code: Alles auswählen

dom.GetObject(19595).State(s / n);
nichts anfangen. Da ich keine Veränderung feststellen kann, wird entweder kein Messwert vom Sensor ausgelesen oder die Systemvariable wird nicht beschrieben.

Es wäre super wenn es zum Script eine Beschreibung geben würde welche Systemvariablen in der CCU2 angelegt werden müssen.

Danke vorab für die Mühe!
Zuletzt geändert von alchy am 01.05.2017, 23:53, insgesamt 1-mal geändert.
Grund: Code in Codetags posten

alchy
Beiträge: 10744
Registriert: 24.02.2011, 01:34
System: CCU
Hat sich bedankt: 65 Mal
Danksagung erhalten: 671 Mal

Re: Script für gleitenden Mittelwert

Beitrag von alchy » 02.05.2017, 00:16

19595 ist ein Beispiel für die ISE_ID des Objekts.
Wenn du stattdessen den Namen des Objektes in Anführungsstrichen eingibst, erreichst du das selbe.

Wenn wir mal statt des "falschen" Scriptes die Version anschauen:

Code: Alles auswählen

dom.GetObject(19595).State(s / n);
Das Script bedeutet nix anderes als:

nimm s und teile es durch n
das Ergebnis wird dann im Object mit der ISE_ID 19595 gespeichert.
Gibt es s & n als Zahlen dann wird das auch funktionieren, sofern natürlich die ISE_ID des zu speicherndes Objectes stimmt.

Alchy

Blacklist................... almost full
Ignoranz ist die Summe aller Maßnahmen die man ergreift, um bestehende Tatsachen nicht sehen zu müssen.

© Sandra Pulsfort (*1974)

Lies bitte die Logik von WebUI Programmen und die Tipps und Tricks für Anfänger.

Wichtig auch CUxD ersetzt System.exec. Die HM Script Doku (Downloadart Skripte) hilft auch weiter.
Zum Testen von Scripten den >> HomeMatic Script Executor << von Anli benutzen.

xaler
Beiträge: 3
Registriert: 01.05.2017, 15:12

Re: Script für gleitenden Mittelwert

Beitrag von xaler » 02.05.2017, 19:37

Super, vielen Dank Alchy! Es funktioniert. Was die kleinen Anführungszeichen so alles bewirken :D

Jetzt müsste mir nur noch erklärt werden, wieso nur 2 Werte in die Messwertliste "list" und in die Variable eingetragen werden. Es sollten doch 5 sein, bzw. die Anzahl = n entsprechen.

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 » 02.05.2017, 20:08

xaler hat geschrieben:Jetzt müsste mir nur noch erklärt werden, wieso nur 2 Werte in die Messwertliste "list" und in die Variable eingetragen werden. Es sollten doch 5 sein, bzw. die Anzahl = n entsprechen.
Die Zahl der Werte in der Liste wird durch das einmalig auszuführende Initialisierungsskript (s.o.) vorgegeben. Falls fehlerhaft, dann das Skript noch einmal ohne Fehler ausführen !
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)

Antworten

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