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
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.
Hi,
"charmanter" wäre mit MQTT2_DEVICE und attrTemplate zu hantieren ;)
Gruß Otto
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 ^^
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 ::)
Zitat von: Sany am 04 Dezember 2022, 10:28:11
schau mal hier
"hier" scheint nur Text zu sein ... Link fehlt ...
statistics macht so was auch, man muss sich dann hält um die Darstellung selbst kümmern...
Zitathier" scheint nur Text zu sein ... Link fehlt ...
oben korrigiert.
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
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
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.
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
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.
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
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.
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.
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]
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 ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
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.
Danke - hat geklappt. Wäre ich nie drauf gekommen ;-)
Ich werde zukünftig eine Funktion zum Löschen und zum Übernehmen von Werten aus dem Log zur Verfügung stellen.