HTTPMOD/JSON - Notify mit differenz zwischen altem/neuem Reading

Begonnen von dr4g0n, 13 März 2018, 11:32:22

Vorheriges Thema - Nächstes Thema

dr4g0n

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.

CoolTux

Es gibt dafür seit einigen Tagen das Attribut oldreadings. Schau bitte in die Commandref dazu.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Otto123

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
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

dr4g0n

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.

CoolTux

Im Notify einfach OldReadingsVal() - ReadingsVal() machen.
Solltest du mehr Hilfe brauchen bitte list vom HTTPMOD Device und vom Notify
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

dr4g0n

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

CoolTux

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)) }
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

dr4g0n

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) }

CoolTux

Dann probiere mal so


{ fhem('set Telegram message ValueChange: ' . (OldReadingsVal('HTTPValueRequest','CurrentValue',0) - ReadingsVal('HTTPValueRequest','CurrentValue',0))) }
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

dr4g0n