Hallo,
Habe schon ein paar versuche gemacht aber noch keine Lösung gefunden.
Ich habe einen Zähler ( Geigerzähler ) der einfach hoch zählt, und würde gerne den Wert alle 10 Minuten den Wert in eine andere Variable schreiben, und die Differenz zum vorherigen Wert ermittel.
Wie könnte man das am geschicktesten anstellen?
DOIF? at? notify?
Wieso so umständlich?
Kannst du doch mit einem Userreading / difference erschlagen:
ZitatuserReadings
Komma getrennte Liste von benutzerdefinierten Readings. Jede Definition hat folgendes Format:
<reading>[:<trigger>] [<modifier>] { <perl code> }
Diese benutzerdefinierte Readings werden bei jeder Aktualisierung der Gerätereadings gesetzt, indem das spezifizierte perl code { <perl code> } ausgeführt wird, und dessen Wert dem Reading zugewiesen wird. Falls <trigger> spezifiziert ist, dann findet diese Ausführung nur dann statt, falls einer der aktualisierten Readings dem regexp <trigger> entspricht (matched).
Beispiele:
attr myEnergyMeter userReadings energy { ReadingsVal("myEnergyMeter","counters.A",0)/1250.0;; }
attr myMultiMeter userReadings energy1:counters.A.* {ReadingsVal("myMultiMeter","counters.A",0)/1250.0}, energy2:counters.B.* {ReadingsVal("myMultiMeter","counters.B",0)/1250.0}
<modifier> kann die folgenden Werte haben:
none: als ob man es gar nicht spezifiziert hätte.
difference: das Reading wird auf die Differenz zw. dem aktuellen und dem vorherigen Wert gesetzt.
differential: das Reading wird auf die Differenz zw. dem aktuellen und dem vorherigen Wert, geteilt durch die Sekunden zw. der aktuellen Zeit und der letzten Auswertung, sekundengenau. Kein Wert wird berechnet, falls der Unterschied unter eine Sekunde liegt.
integral: das Gegenteil von differential. Das Ergebnis wird um das Produkt aus der Zeit-Differenz und der Durschnittswert der letzten zwei Readings erhöht.
result += (time - timeold) * (oldval + value) / 2
offset: wenn der aktuellen Wert kleiner als der vorherige Wert ist wird der vorherige Wert zum Reading addiert. Das Reading kann dann als offset verwendet werden um einen Zähler der durch Sromverlust zurückgesetzt wird zu korrigieren.
monotonic: wenn die Differenz zw. dem aktuellen und dem vorherigen Wert positiv ist wird diese Differenz zum Reading addiert. Damit lässt sich von einem Zähler der bei Stromverlust zurückgesetzt wird ein monoton wachsender Zähler ableiten.
Beispiel:
attr myPowerMeter userReadings power differential { ReadingsVal("myPowerMeter","counters.A",0)/1250.0}
Achtung:
Falls difference oder differential spezifiziert ist, dann werden für die Berechnung ältere Werte benötigt, d.h. der Wert wird frühestens beim zweiten Änderung gesetzt.
der Name der definierten Readings besteht aus alphanumerischen Zeichen, Unterstrich (_) und Minus-Zeichen (-).
Edit:
Natürlich in Kombination mit event-min-intervall
Statistik Modul?
https://wiki.fhem.de/wiki/Statistics
Gruß Arnd
Signalduino (Nano, ESP, ...), CUL (Busware, Nano, Maple, ...), Homematic (HM-MOD-UART-RPI, ESP, Maple, ...), LaCrosseGateway (LGW, ESP, ...), 1-wire, ESPEasy, Bravia, Yamaha, ...
Hallo,
Statistics läuft schon, macht aber min. 1x pro Stunde und nicht alle 5 oder 10 Minuten.
Kann es sein das userReadings bei einem Dummy Device nicht funktioniert?
Mit und ohne event-min-intervall geht es nicht
define ArduinoGammaCounter_temp1 dummy
attr ArduinoGammaCounter_temp1 room Umweltdaten
attr ArduinoGammaCounter_temp1 userReadings state {ReadingsVal("ArduinoGammaCounter","Counter",0)}
attr ArduinoGammaCounter_temp1 userReadings state {ReadingsVal("ArduinoGammaCounter","Counter",0)}
Ich nehme jetzt nicht an, dass du ein neues Readinge mit dem Namen "state" erzeugen willst?
Richtige Syntax ist:
<NeuerReadingsname>[:<Alterreadingsname.*>] [<modifier>] { <perl code, welcher ausgeführt werden soll> }
Klingt jetzt vielleicht doof aber wie füge ich zu einem Reading einen Wert hinzu?