FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: hkspks am 01 Dezember 2022, 16:26:11

Titel: Tasmota/ MQTT: Parse JSON Reading
Beitrag von: hkspks am 01 Dezember 2022, 16:26:11
Hallo zusammen,

gibt es eine charmante Möglichkeit, den Tasmota-JSON-Response "SENSOR" direkt in Einzel-Readings zu überführen?

Aktuell packt er mir nachvollziehbar den JSON-String in ein Reading "Sensor". Klar, könnte ich da jetzt ein Notify drauf setzen und mit Codings hantieren - ggf. gibt es aber ja eine charmantere Möglichkeit? Ich hätte gerne die Energiewerte direkt als einzelne Readings im Device.

defmod Steckdose MQTT_DEVICE
attr Steckdose subscribeReading_Sensor tele/tasmota_EE34E1/SENSOR
setstate Steckdose 2022-12-01 15:15:20 Sensor {"Time":"2022-12-01T15:15:20","ENERGY":{"TotalStartTime":"2022-10-14T12:15:23","Total":1.323,"Yesterday":0.470,"Today":0.288,"Period": 4,"Power":45,"ApparentPower":77,"ReactivePower":63,"Factor":0.57,"Voltage":237,"Current":0.326}}


Ggf. ist es möglich, einzelne Readings zu definieren und dann darin direkt Perl-Code auszuführen, der das richtige Datenelement aus dem JSON extrahiert:

Zitatattr <name> subscribeReading_<reading> [{Perl-expression}] [qos:?] [retain:?] <topic>
mapps a reading to a specific topic. The reading is updated whenever a message to the configured topic arrives.
QOS and ratain can be optionally defined for this topic.
Furthermore, a Perl statement can be provided which is executed when the message is received. The following variables are available for the expression: $hash, $name, $topic, $message. Return value decides whether reading is set (true (e.g., 1) or undef) or discarded (false (e.g., 0)).

z.B. attr Steckdose subscribeReading_EnergyTotal PERL_EXTRAKT_CODE(tele/tasmota_EE34E1/SENSOR)

Falls ja, ggf. hat ja jemand ein Snippet für mich ;-)

LG, Christian
Titel: Antw:Tasmota/ MQTT: Parse JSON Reading
Beitrag von: OdfFhem am 01 Dezember 2022, 17:02:25
Bei MQTT_DEVICE wird (oft) expandJSON verwendet.

s. https://forum.fhem.de/index.php/topic,100187.msg936219.html#msg936219 (https://forum.fhem.de/index.php/topic,100187.msg936219.html#msg936219) und natürlich die gerätespezifische FHEM-Hilfe.
Titel: Antw:Tasmota/ MQTT: Parse JSON Reading
Beitrag von: Otto123 am 01 Dezember 2022, 17:04:04
Hi,

"charmanter" wäre mit MQTT2_DEVICE und attrTemplate zu hantieren ;)

Gruß Otto
Titel: Antw:Tasmota/ MQTT: Parse JSON Reading
Beitrag von: hkspks am 03 Dezember 2022, 14:03:14
Cool, das hat geklappt. Jetzt habe ich an 6 Geräten ein Reading Energy_Today reading.

Was wäre der Goldstandard, um die Werte täglich abzugreifen, wegzuschreiben, zu aggregieren und zu plotten? Überlege mir ein kleines Energiereporting a la ein Barchart mit einer Säule je Tag und die Säule unterteilt in die Geräte 😉

Quasi eine kleine DWH Anwendung ^^
Titel: Antw:Tasmota/ MQTT: Parse JSON Reading
Beitrag von: Sany am 04 Dezember 2022, 10:28:11
Zitatum die Werte täglich abzugreifen, wegzuschreiben, zu aggregieren und zu plotten? Überlege mir ein kleines Energiereporting a la ein Barchart mit einer Säule je Tag und die Säule unterteilt in die Geräte

schau mal hier, sowas in der Art gibts schon.
https://wiki.fhem.de/wiki/DOIF/uiTable_Schnelleinstieg#Anwendungsbeispiele_mit_card (https://wiki.fhem.de/wiki/DOIF/uiTable_Schnelleinstieg#Anwendungsbeispiele_mit_card)
Laut Damian Work in progress, es wird erweitert und Säulendiagramme kommen...
Ist aber nicht copy-paste, jedenfalls nicht der Anzeigeteil. Einarbeitung in DOIF-perl und uiTable ist schon erforderlich.


Gruß


Sany

edit: link vergessen ::)
Titel: Antw:Tasmota/ MQTT: Parse JSON Reading
Beitrag von: OdfFhem am 04 Dezember 2022, 11:26:11
Zitat von: Sany am 04 Dezember 2022, 10:28:11
schau mal hier
"hier" scheint nur Text zu sein ... Link fehlt ...
Titel: Antw:Tasmota/ MQTT: Parse JSON Reading
Beitrag von: Beta-User am 04 Dezember 2022, 11:28:00
statistics macht so was auch, man muss sich dann hält um die Darstellung selbst kümmern...
Titel: Antw:Tasmota/ MQTT: Parse JSON Reading
Beitrag von: Sany am 04 Dezember 2022, 11:40:15
Zitathier" scheint nur Text zu sein ... Link fehlt ...

oben korrigiert.
Titel: Antw:Tasmota/ MQTT: Parse JSON Reading
Beitrag von: Damian am 04 Dezember 2022, 12:32:36
Für Energiereporting (inklusive Berechnung des Tages/Monats/Jahres-Verbrauchs) mit Visualisierung habe hier etwas definiert. Erforderlich ist nur die Angabe des Zählerreadings. Die Visualisierung habe ich über vordefinierte Templates vereinfacht, auch hier reicht schon die Angabe des betroffenen Devices und des Readingnamens.

https://wiki.fhem.de/wiki/DOIF/Automatisierung#Tages-.2C_Monats-_und_Jahresstatistik_f.C3.BCr_Strom-.2C_Gas-.2C_Wasserz.C3.A4hler_und_andere_Z.C3.A4hler
Titel: Antw:Tasmota/ MQTT: Parse JSON Reading
Beitrag von: hkspks am 05 Dezember 2022, 22:12:47
Hi Damian,

mega - das war ja super einfach. Gibt es auch die Möglichkeit, gestapelte Charts zu erstellen - egal ob als Linien- oder Balkendiagramm?

LG, Christian
Titel: Antw:Tasmota/ MQTT: Parse JSON Reading
Beitrag von: Damian am 05 Dezember 2022, 22:29:41
Zitat von: hkspks am 05 Dezember 2022, 22:12:47
Hi Damian,

mega - das war ja super einfach. Gibt es auch die Möglichkeit, gestapelte Charts zu erstellen - egal ob als Linien- oder Balkendiagramm?

LG, Christian

In der card-Funktion z. Zt. nicht. card mit Balken wird es bald geben. Es gibt Balken/gestapelte Balken, allerdings muss man sich um die einzelnen Werte selbst kümmern:

https://wiki.fhem.de/wiki/DOIF/uiTable_Schnelleinstieg#3d-Balkendarstellung_mehrerer_Zahlenwerten_mit_Hilfe_der_universellen_SVG-Funktion_cylinder.2Fcylinder_s

oder

https://wiki.fhem.de/wiki/DOIF/uiTable_Schnelleinstieg#Balkendarstellung_mehrerer_Zahlenwerte_mit_Hilfe_der_universellen_SVG-Funktion_cylinder_bars

Edit: Man kann sich allerdings behelfen, indem man die einzelnen Werte über ein user-Reading oder DOIF-Reading selbst addiert und dann den kumulierten und einen der anderen Werte darstellt. Das sieht man z. B. bei Darstellung der Heizenergie im di_counter-Beispiel. Heizenergie ist die Summe aus der Warmwasserenergie und Energie der Heizung.
Titel: Antw:Tasmota/ MQTT: Parse JSON Reading
Beitrag von: hkspks am 07 Dezember 2022, 10:25:04
Cool, ansonsten habe ich früher etwas hier mit gespielt: https://developers-dot-devsite-v2-prod.appspot.com/chart/interactive/docs/gallery

Wäre ggf. auch etwas? Natürlich dann nicht mehr komplett on premise, aber für ein Dashboard müsste das aus meiner Sicht OK sein :-)

LG, Christian
Titel: Antw:Tasmota/ MQTT: Parse JSON Reading
Beitrag von: Damian am 07 Dezember 2022, 11:56:07
ja, so schön die Tools auch sind, sie bauen auf irgendwelchen externen Bibliotheken auf. Ich erzeuge die Plots mit rudimentären SVG-Funktionen, die alle Browser unterstützen. Dadurch ist man unabhängig und hat die höchste Darstellungsgeschwindigkeit. Den HTML-Code erzeuge ich nicht im Browser, sondern auf dem Server in Perl.
Titel: Antw:Tasmota/ MQTT: Parse JSON Reading
Beitrag von: hkspks am 08 Dezember 2022, 23:21:42
Zitat von: Damian am 07 Dezember 2022, 11:56:07
ja, so schön die Tools auch sind, sie bauen auf irgendwelchen externen Bibliotheken auf.

Da ist sicherlich was wahres dran - so eine API ändert sich auch mal gerne :-)

Zitat von: Damian am 05 Dezember 2022, 22:29:41
Edit: Man kann sich allerdings behelfen, indem man die einzelnen Werte über ein user-Reading oder DOIF-Reading selbst addiert

Kannst Du mir noch kurz helfen, wo du die Werte aggregieren würdest? Im DOIF-Skript selbst oder würdest Du ein Dummy-Device zwischen DOIF und den Geräten schalten?

In meinem Beispiel habe ich 4 Tasmota Lampen, die ich gerne aggregiert in das uiTables geben würde. In dem Fall nicht gestapelt, sondern einfach eine Linie mit den summierten werten.

LG
Titel: Antw:Tasmota/ MQTT: Parse JSON Reading
Beitrag von: Damian am 09 Dezember 2022, 07:47:20
Wenn du es nur für die Darstellung brauchst, dann würde ich die Summierung direkt in dem DOIF-Device über DOIF_Readings machen. Das hat den Vorteil, dass im Gegensatz zu user_Readings keine Events nach außen produziert werden, uiTable-Funktionen werden dennoch benachrichtigt.
Titel: Antw:Tasmota/ MQTT: Parse JSON Reading
Beitrag von: hkspks am 09 Dezember 2022, 14:14:40
OK, welches Reading würdest Du mithilfe eines DOIF-Readings summieren damit das restliche Skript noch funktioniert?

Meine Idee wäre:


defmod EnergieMonitor.df DOIF subs {\
##                     Device        Reading          hier die push-Zeilen löschen bzw. durch eigene Readings ersetzen\
  push (@{$_counter},["Lampe1","ENERGY_Total"]);; ## Wasserzähler\
  push (@{$_counter},["Lampe2","ENERGY_Total"]);; ## Wasserzähler\
  push (@{$_counter},["EnergieMonitor.df,"SUMMEÜBERALLELAMPEN"]);; ## Wasserzähler\

... }\

attr EnergieMonitor.df DOIF_Readings SUMMEÜBERALLELAMPEN:($SELF:e_Lampe1_ENERGY_Total+$SELF:e_Lampe2_ENERGY_Total)


Also ich packe quasi das DOIF selbst mit dem kalkulierten Reading für die Gerätegruppe in den "Abarbeitungsstack".

Macht das Sinn? Andernfalls wüsste ich zumindest nicht, wie sonst die Funktionen im Skript zur Historisierung der Werte noch funktionieren.
Titel: Antw:Tasmota/ MQTT: Parse JSON Reading
Beitrag von: Damian am 09 Dezember 2022, 16:44:21
Was ist das für eine Syntax:

SUMMEÜBERALLELAMPEN:($SELF:e_Lampe1_ENERGY_Total+$SELF:e_Lampe2_ENERGY_Total)

Readings werden immer in eckige Klammern gesetzt: [device:reading]
Titel: Antw:Tasmota/ MQTT: Parse JSON Reading
Beitrag von: hkspks am 24 Januar 2023, 11:54:47
Noch eine Frage zum uitable: gibt es eine Möglichkeit, eine Grafik/ card wieder zurückzusetzen? Ich hatte das .col reading mit setreading wieder genullt, allerdings hat das nur Einfluss auf den weiteren Verlauf und nicht auf die vergangenen Werte. Wo werden denn diese gecached und komme ich da irgendwie ran? :-)

setreading .col_72_[...]_Total.last_month_8760_values ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
Titel: Antw:Tasmota/ MQTT: Parse JSON Reading
Beitrag von: Damian am 25 Januar 2023, 10:13:44
Zitat von: hkspks am 24 Januar 2023, 11:54:47
Noch eine Frage zum uitable: gibt es eine Möglichkeit, eine Grafik/ card wieder zurückzusetzen? Ich hatte das .col reading mit setreading wieder genullt, allerdings hat das nur Einfluss auf den weiteren Verlauf und nicht auf die vergangenen Werte. Wo werden denn diese gecached und komme ich da irgendwie ran? :-)

setreading .col_72_[...]_Total.last_month_8760_values ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
z. Zt. geht es so nicht zur Laufzeit.

Entweder du kommentierst die card aus, dann das System zwei mal durchstarten, damit das .col-Reading verschwindet und dann die card wieder aktivieren.

Oder du stoppst das System und löschst das .col-Reading in der cfg-Datei.
Titel: Antw:Tasmota/ MQTT: Parse JSON Reading
Beitrag von: hkspks am 27 Januar 2023, 11:44:41
Danke - hat geklappt. Wäre ich nie drauf gekommen ;-)
Titel: Antw:Tasmota/ MQTT: Parse JSON Reading
Beitrag von: Damian am 27 Januar 2023, 11:47:29
Ich werde zukünftig eine Funktion zum Löschen und zum Übernehmen von Werten aus dem Log zur Verfügung stellen.