Hallo,
ich habe ein HTTPMOD das JSON abfragen durchführt.
Dort gibt es ein Reading welches einen Wert hat, sobald sich dieser Wert ändert möchte ich ein Notify auslösen mit dem Differenzwert!
Hierfür muss ich den OldValue bekommen und eine Subtraktion durchführen.
Wie löse ich am besten das mit dem alten Wert?
Danke schon mal.
Es gibt dafür seit einigen Tagen das Attribut oldreadings. Schau bitte in die Commandref dazu.
Hi,
ich würde ein usereadings machen und modifier difference nehmen
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.
Gruß Otto
Danke für die schnelle Hilfe, irgendwie steige ich durch die Attribute nicht so ganz durch.
Ich habe
attr Gerät1 oldreadings ValueImReading
Ich möchte gerne OldValueImReading - NewValueImReading = Differenz;
Die Differenz benötige ich dann im Notify.
Im Notify einfach OldReadingsVal() - ReadingsVal() machen.
Solltest du mehr Hilfe brauchen bitte list vom HTTPMOD Device und vom Notify
Derweil bekommt ich als Message in Telegram nur "ValueChange: {OldReadingsVal() - ReadingsVal()}"
Wie kann ich die Werte einsetzen bzw das "OldReadings" aus dem Device auslesen? Normale Abfragen werden ja mit [HTTPValueRequest:CurrentValue] gemacht.
Also ich habe gerade gesehen das ich im Device (Name: HTTPValueRequest) folgenden Eintrag habe wenn ich auf List gehe:
OLDREADINGS:
2018-03-13 16:58:53 CurrentValue 123456789
Dazu hier die Attr des Devices:
Attributes:
event-on-change-reading CurrentValue
extractAllJSON 1
oldreadings CurrentValue
Hier ist mein Notify
Internals:
DEF HTTPValueRequest set Telegram message ValueChange: {OldReadingsVal() - ReadingsVal()}
NAME notify_HTTPValueRequest_sendMessage
NOTIFYDEV HTTPValueRequest
NR 212
NTFY_ORDER 50-notify_HTTPValueRequest_sendMessage
REGEXP HTTPValueRequest
STATE 2018-03-13 17:03:53
TYPE notify
READINGS:
2018-03-13 16:17:44 state active
Code bitte immer in Codetags. Und Du solltest Du bitte mit Perlfunktionen beschäftigen.
Nun zu Deinem HTTPMOD Device. Ich gehe davon aus das Du ein Reading meinst. Ist CurrentValue ein Reading?
Dann muss Dein Notify so aussehen
DEF HTTPValueRequest:CurrentValue:.* { fhem('set Telegram message ValueChange: ' . OldReadingsVal($NAME,'CurrentValue',0) - $EVTPART1) }
Probier das mal. Du kannst das auch oben in der FHEMWEB Kommandozeile testen. Musst dann aber die Variablen durch die tatsächlichen Namen/Werte ersetzen. In etwa so
{ fhem('set Telegram message ValueChange: ' . OldReadingsVal('HTTPValueRequest','CurrentValue',0) - ReadingsVal('HTTPValueRequest','CurrentValue',0)) }
Vielen vielen dank für deine Hilfe CoolTux.
So ähnlich hatte ich es mir auch gerade zusammen gebaut. :)
Bei deiner letzten Zeile erhalte ich folgende Fehlermeldung:
Unknown command -221200000000, try help.
Derzeit befinden sich folgende Values in den Var
OldReadingsVal: 221200000001
ReadingsVal: 221200000000
Wenn ich die Funktion gesondert ausführe, dann funktioniert die Kalkulation.
{OldReadingsVal('HTTPValueRequest','CurrentValue',0)}-{ReadingsVal('HTTPValueRequest','CurrentValue',0) }
Dann probiere mal so
{ fhem('set Telegram message ValueChange: ' . (OldReadingsVal('HTTPValueRequest','CurrentValue',0) - ReadingsVal('HTTPValueRequest','CurrentValue',0))) }
wunderbar, genau so funktioniert es :)