MQTT Json payload in Readings auflösen

Begonnen von o.l.i, 23 Juli 2020, 10:05:26

Vorheriges Thema - Nächstes Thema

o.l.i

Hallo,

ich habe ein Shelly Plug S mit Tasmota geflashed und kann es erfolgreich an und ausschalten.
Jetzt möchte ich auch die aktuelle Leistung und Gesamtleistung welches als Jason Payload ins FHEM kommt auslesen und jeweils ein Reading dazu erstellen / aktualsisieren lassen.

Dies kann man ja mittels "defmod ej3 expandJSON" machen. Aber ich komme damit nicht klar und benötige etwas Support.

Hier ist mein MQTT payload welchen ich im FHEM von der Shelly erhalte:
2020.07.22 17:29:11.343 5 : publish received for Smarthome/KE_Waschmaschine/tele/SENSOR, {"Time":"2020-07-22T17:29:11","ENERGY":{"TotalStartTime":"2020-07-22T09:06:06","Total":0.012,"Yesterday":0.000,"Today":0.012,"Power":160,"ApparentPower":178,"ReactivePower":78,"Factor":0.90,"Voltage":238,"Current":0.750}}

-> Davon soll "Power" & "Total" als Reading im FHEM verwendet werden.

amenomade

#1
Steht alles in CommandRef:

expandJSON <device>:<reading>:.\{.*} (Power|Total)

Wenn es ein MQTT2_DEVICE ist, kann man nw auch über  json2nameValue machen. Siehe CommandRef
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

betateilchen

#2
Zitat von: amenomade am 23 Juli 2020, 21:47:47
Wenn es ein MQTT2_DEVICE ist, kann man nw auch über  json2nameValue machen

json2nameValue() ist eine zentrale FHEM-Funktion, die von fhem.pl bereitgestellt wird und nicht auf MQTT-Szenarien beschränkt ist.


$VAR1 = {
          'Time' => '2020-07-22T17:29:11',
          'ENERGY_Yesterday' => '0.000',
          'ENERGY_Current' => '0.750',
          'ENERGY_Today' => '0.012',
          'ENERGY_TotalStartTime' => '2020-07-22T09:06:06',
          'ENERGY_Factor' => '0.90',
          'ENERGY_Voltage' => '238',
          'ENERGY_Power' => '160',
          'ENERGY_Total' => '0.012',
          'ENERGY_ReactivePower' => '78',
          'ENERGY_ApparentPower' => '178'
        };
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Beta-User

...und das ganze ist ein Doppelpost, den der TE oder ein Mod bitte (ausnahmsweise) schließen sollte, denn das Problem ist wohl gelöst: https://forum.fhem.de/index.php/topic,113063.0.html

@betateilchen: Die Aussage ist zwar an sich korrekt, allerdings ist es mMn. für den Normaluser nicht ganz trivial, json2nameValue() außerhalb des MQTT2_DEVICE-Kontexts zu nutzen. Falls du Lust hast, ein (vollständiges) funktionierendes Beispiel (mit dummy/sonos) zu zeigen, wie man die von der Funktion gelieferte Referenz auf einen Hash nutzt, wäre z.B. hier der passende Thread: https://forum.fhem.de/index.php/topic,113009.0.html
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

betateilchen

Zitat von: Beta-User am 24 Juli 2020, 10:50:35
@betateilchen: Die Aussage ist zwar an sich korrekt, allerdings ist es mMn. für den Normaluser nicht ganz trivial, json2nameValue() außerhalb des MQTT2_DEVICE-Kontexts zu nutzen. Falls du Lust hast, ein (vollständiges) funktionierendes Beispiel (mit dummy/sonos) zu zeigen, wie man die von der Funktion gelieferte Referenz auf einen Hash nutzt, wäre z.B. hier der passende Thread:

Hab ich keine Lust dazu, aber was ist denn daran schwierig?
Mit dem Beispiel hier aus dem Thread und einem simplen dummy (define testDummy dummy) funktioniert das Ganze so:


sub beispiel {
   my $json = '{"Time":"2020-07-22T17:29:11","ENERGY":{"TotalStartTime":"2020-07-22T09:06:06","Total":0.012,"Yesterday":0.000,"Today":0.012,"Power":160,"ApparentPower":178,"ReactivePower":78,"Factor":0.90,"Voltage":238,"Current":0.750}}';
   my $werte = json2nameValue($json);
   while ( my ($key, $value) = each (%$werte)) {
     fhem("setreading testDummy $key $value");
   }
}


und schon stehen die Werte aus dem json als readings im dummy - siehe Screenshot.

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Beta-User

#5
Danke, ich hatte das neulich mit einer for-Schleife analog 10_MQTT2_DEVICE.pm#L168 versucht, und dabei irgendeinen bug reingebaut, daher die Frage... Vermutlich ein 60cm-Problem, zu müde oder so, vielleicht ist auch das mit den Querstrichen in den Readingnamen das Problem gewesen (sollte doch aber an sich abgefangen werden von goodReadingName?).
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

betateilchen

Auf Wunsch eines einzelnen Forummitglieds habe ich nun auch ein funktionierendes Beispiel für das Radiosender-Problem im angegebenen Thread beigesteuert.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

TomLee

#7
Es gab nie ein Radiosender-Problem, die Ausgabe in Readings zu schreiben war nicht mein Anliegen.
Danke aber für das Beispiel.

betateilchen

Zitat von: TomLee am 24 Juli 2020, 18:21:50
die Ausgabe in Readings zu schreiben war nicht mein Anliegen.
Danke aber für das Beispiel.

Es ist doch egal, was Du mit den key/value Paaren machst.
Deine Frage war, wie man an diese Werte kommt um damit irgendwas zu machen, diese Frage wird in meinem Beispiel beantwortet.

Zitatbesteht die Möglichkeit aus diesem JSON ein Array zu erhalten welches kommasepariert nur die Titel ohne ' zurückgibt ?

Du kannst nach dem gleichen Prinzip aus meinem Beispiel auch Logausgaben produzieren oder was immer Du willst.
Sogar ein Array läßt sich erzeugen, dann würdest Du eben anstatt fhem() einfach die Funktion push() verwenden.

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

TomLee

Na Gott sei Dank hast du den Hinweis push() ganz am Ende noch erwähnt.

War schon am testen, wär sonst genauso nass wie zuvor gewesen.  DANKE

betateilchen

Zitat von: TomLee am 24 Juli 2020, 18:21:50
Es gab nie ein Radiosender-Problem, die Ausgabe in Readings zu schreiben war nicht mein Anliegen.

Jetzt ist mir übrigens auch wieder eingefallen, warum ich eigentlich zuerst gar keine Lust hatte, der Bitte von Beta-User

Zitat von: Beta-User am 24 Juli 2020, 10:50:35
@betateilchen: Falls du Lust hast, ein (vollständiges) funktionierendes Beispiel ... zu zeigen, wie man die von der Funktion gelieferte Referenz auf einen Hash nutzt, ...

nachzukommen: wegen genau solcher Antworten wie der oben zitierten.

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

TomLee

Damit wollte ich nur zum Ausdruck bringen das es nicht mein Anliegen war Readings zu erhalten, nicht mehr und nicht weniger und Beta-User es aber erstmal so verstanden hatte.

Zitat
Es ist doch egal, was Du mit den key/value Paaren machst.
Deine Frage war, wie man an diese Werte kommt um damit irgendwas zu machen, diese Frage wird in meinem Beispiel beantwortet.
Du kannst nach dem gleichen Prinzip aus meinem Beispiel auch Logausgaben produzieren oder was immer Du willst.
Sogar ein Array läßt sich erzeugen, dann würdest Du eben anstatt fhem() einfach die Funktion push() verwenden.

Mir war das mit dem Beispiel gleich klar, was du damit zum Ausdruck bringen wolltest, push war der entscheidende Hinweis der mir dann noch fehlte.

Sicher hab ich auch nix in den falschen Hals bekommen.

Es gibt für mich keinen Grund so zu reagieren.

Das einzige was du mir Übel nehmen könntest wäre das ich dir Übel nehme das ich mich nicht wirklich für Post die ich mal erhalten habe, revanchieren kann, sowas fuchst mich auch.





betateilchen

Zitat von: TomLee am 24 Juli 2020, 19:21:35
push war der entscheidende Hinweis der mir dann noch fehlte.

push() ist aber nichts FHEM spezifisches, sondern perl Grundwissen und dieses Grundwissen fehlt Dir halt immer wieder.
Wie es scheint und hier im Forum immer wieder zum Ausdruck kommt, siehst Du aber bisher keine Notwendigkeit, am Zustand dieses Mangels irgendwas ändern zu wollen.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!