Script für gleitenden Mittelwert
Moderator: Co-Administratoren
Re: Script für gleitenden Mittelwert
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
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
Re: Script für gleitenden Mittelwert
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.
In einem Programm stündlich diesen Script ausführen lassen:
Dieses ergibt eine durchschnittliche Temperatur der letzten 8 Stunden.
Gruess aus der Schweiz
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);
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);
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
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
Re: Script für gleitenden Mittelwert
Zeichenketten haben keine Masseinheit.hanan hat geschrieben:- "AusssenTListe" als "Zeichenkette" und Masseinheit "°C"
Du hast vergessen zu erwähnen, dass bei unverändertem Skript der Kanal 1 des Aussenfühlers den Namen "Aussen.Sensor" erhalten muss.hanan hat geschrieben:Code: Alles auswählen
string x = dom.GetObject(raum#".Sensor").DPByHssDP("TEMPERATURE").Value().ToString(1);
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)
Re: Script für gleitenden Mittelwert
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:
Hat jemand eine Idee, warum das so ist?
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);
CCU2 mit 61+ Geräten, CCU-Historian und OpenHab auf einem Raspberry 2
Re: Script für gleitenden Mittelwert
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...
Wenn die Liste 6 Werte enthält, aber durch 5 dividiert wird, muss der Wert zu hoch sein.Daniel hat geschrieben:Code: Alles auswählen
! Konstante: Anzahl Werte in der Liste integer n = 5;
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)
Re: Script für gleitenden Mittelwert
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... Also geht alles genau so wie es gehen soll!
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... Also geht alles genau so wie es gehen soll!
CCU2 mit 61+ Geräten, CCU-Historian und OpenHab auf einem Raspberry 2
Re: Script für gleitenden Mittelwert
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
und
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!
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);
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
Grund: Code in Codetags posten
-
- Beiträge: 10752
- Registriert: 24.02.2011, 01:34
- System: CCU
- Hat sich bedankt: 65 Mal
- Danksagung erhalten: 672 Mal
Re: Script für gleitenden Mittelwert
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:
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
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);
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.
Re: Script für gleitenden Mittelwert
Super, vielen Dank Alchy! Es funktioniert. Was die kleinen Anführungszeichen so alles bewirken
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.
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.
Re: Script für gleitenden Mittelwert
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 !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.
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)