FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: rohlande am 09 November 2020, 16:52:47

Titel: DOIF --> MQTT publish (JSON) String
Beitrag von: rohlande am 09 November 2020, 16:52:47
Hallo Experten,

ich versuche die Energie Daten meines IR Lesekopf der PV und Stromzähler auf den MQTT Broker zu mappen.
Das gelingt mir auch soweit.
Nur bekomme ich keinen sauberen JSON String hin:

so sieht mein DOIF aus:
define MS_Liefern_MQTT DOIF ([MS_Liefern:power] || 0) ({my $power=(ReadingsVal("MS_Liefern","power",""));;fhem ("set DSBroker publish /Fhem/MS_Liefern $power")})
DOELSE ()


Heraus kommt das:
{power:27.9 W}

sollte aber wohl so aussehen damit es JSON konform aussieht:
{"power":27.9 W}

Kann mir jemand sagen wie der String korrekt auszusehen hat?

Vg Denny
Titel: Antw:DOIF --> MQTT publish (JSON) String
Beitrag von: Otto123 am 09 November 2020, 19:32:16
Hallo Denny,

ich weiß ja nicht was das gegenüber genau will und was (ReadingsVal("MS_Liefern","power","") wirklich zurück liefert - aber es gibt auch eine Funktion toJson.
Ich habe hier  (https://heinz-otto.blogspot.com/2019/11/mqtt-ich-muss-das-testen.html)mal ein bisschen was zusammengeschrieben - kommst Du damit weiter?

Gruß Otto
Titel: Antw:DOIF --> MQTT publish (JSON) String
Beitrag von: rohlande am 04 Dezember 2020, 11:33:46
Hallo Otto,

Sorry für die späte Rückmeldung.
Ich habe es via DOIF gelöst.
define MS_Liefern_MQTT DOIF ([MS_Liefern:power] || 0) ({my $power=(ReadingsVal("MS_Liefern","power",""));;;; fhem ("set DSBroker publish /Fhem/MS_Liefern '{power:$power}'")}) \
DOELSE ()

Das einzige was ich dabei nicht hinbekommen habe, sind die doppelten Hochkomma ["]. Das habe ich einfach nicht hinbekommen.

Was aber obsolet ist, da die OpwnWB die Daten selbst direkt von Fhem holen kann.
Aber wieder etwas dazu gelernt.

Vielen Dank!

Vg Denny
Titel: Antw:DOIF --> MQTT publish (JSON) String
Beitrag von: Otto123 am 04 Dezember 2020, 11:56:55
Du meinst escapen? Also anstatt {"Dein String \"im String\" "} ?
Titel: Antw:DOIF --> MQTT publish (JSON) String
Beitrag von: Beta-User am 04 Dezember 2020, 13:07:05
Zitat von: Otto123 am 04 Dezember 2020, 11:56:55
Du meinst escapen? Also anstatt {"Dein String \"im String\" "} ?
Da ist m.E. noch mehr "verbogen", weil $power in einfachen Quotes auch nicht aufgelöst werden dürfte.

Würde mal den Umweg über eine Variable austesten:
{my $power=ReadingsVal('MS_Liefern','power','unknown'); my $cmnd = qq(set DSBroker publish /Fhem/MS_Liefern {"power":$power}); fhem ($cmnd)}

Details: z.B. hier https://www.perlmonks.org/?node_id=401006
Titel: Antw:DOIF --> MQTT publish (JSON) String
Beitrag von: Otto123 am 04 Dezember 2020, 15:31:17
Zitat von: Beta-User am 04 Dezember 2020, 13:07:05
Da ist m.E. noch mehr "verbogen", weil $power in einfachen Quotes auch nicht aufgelöst werden dürfte.
Doch es wird, weil doch die äußeren Klammern zählen?
Versuch:
{my $power=75;; return "set DSBroker publish /Fhem/MS_Liefern '{power:$power}'"}
Titel: Antw:DOIF --> MQTT publish (JSON) String
Beitrag von: Beta-User am 04 Dezember 2020, 16:09:09
 :o Uih, da muss ich wohl nochmal nachsitzen, staun...

(Trotzdem ist die Escaperei auf die Dauer irgendwie unschön ::) )
Titel: Antw:DOIF --> MQTT publish (JSON) String
Beitrag von: rohlande am 04 Dezember 2020, 16:14:45
Vielen Dank für Eure Hilfe.
Ich mache es via GENERIC_MQTT_BRIDGE Modul.
Warum ich das nicht gleich so gemacht habe!
:-(
Man lernt nicht aus.

VG Denny