Hallo Kollegen,
ich habe ein Problem mit einem MQTT Device. Es ist ein espeasy Gerät mit eine angeschlossenen PCF8574 und einer RelaiCarte.
Das Gerät ist definiert mit:
defmod esp_06 MQTT2_DEVICE esp_06
attr esp_06 readingList esp_06:esp-06/System/RSSI:.* RSSI\
esp_06:esp-06/System/FreeRam:.* FreeRam\
esp_06:esp-06/System/Load:.* Load\
esp_06:esp-06/System/UpTime:.* UpTime\
esp_06:esp-06/status/LWT:.* LWT\
esp_06:esp-06/status:.* { json2nameValue($EVENT) }
attr esp_06 room ESPEasy
attr esp_06 stateFormat LWT
setstate esp_06 Connected
setstate esp_06 2025-09-05 21:36:28 FreeRam 17296.00
setstate esp_06 2025-09-05 14:34:47 IODev mqtt2s
setstate esp_06 2025-09-05 18:43:31 LWT Connected
setstate esp_06 2025-09-05 21:36:28 Load 7.60
setstate esp_06 2025-09-05 21:36:28 RSSI -60.00
setstate esp_06 2025-09-05 21:36:29 UpTime 173.00
setstate esp_06 2025-09-05 21:24:02 json2nameValueErrorText error parsing (#2) 'OK'
setstate esp_06 2025-09-05 21:24:02 json2nameValueInput OK
setstate esp_06 2025-09-05 21:24:02 log port#65: set to 1
setstate esp_06 2025-09-05 21:24:02 mode output
setstate esp_06 2025-09-05 21:24:02 pin 65
setstate esp_06 2025-09-05 21:24:02 plugin 19
setstate esp_06 2025-09-05 21:24:02 state 1
Bzw. die Einzelnen Geräte dann mit:
defmod esp_06_Relais_1 MQTT2_DEVICE esp_06
attr esp_06_Relais_1 room ESPEasy
attr esp_06_Relais_1 setList on:noArg esp-06/cmd PCFGPIO,65,0 \\
off:noArg esp-06/cmd PCFGPIO,65,1
Also eigentlich funktioniert alles, aber .. etwas stört das
setstate esp_06 2025-09-05 21:24:02 json2nameValueErrorText error parsing (#2) 'OK'
Immer wenn ich ein Relais über MQTT schalte, erhalte ich dieses. Ich gehe momentan davon aus, das dieses mit einem einfachen OK beantwortet wird, und deshalb der { json2nameValue($EVENT) } scheitert? Ich finde diesbezüglich nur nichts im Log und wenn das so ist, wie soll ich es beheben? Schließlich sendet der ESP mehr Daten (bzw. soll senden, die Temperaturdaten sind noch nicht angeschlossen). Bin omentan etwas ... Hilflos und drehe mich im Kreise.
Über einen Stupsen in die Richtige Richtung würde ich mich freuen!
Und ja, ich habe im Forum (und Google) gesucht, d.h. falls ich etwas übersehen habe, auch diese Info freut mich!
Na ja, was per MQTT kommt, kann man im IO mitverfolgen.
Dein ESPEasy-Ding scheint jetzt halt "gemischt" zu senden, mal JSON-verpackt, mal nicht. Entweder du behebst das auf dem ESP, oder du mußt das "vorverarbeiten", und statt des simplen json2nameValue()-Aufrufs dann z.B. erst schauen, ob "OK" zurückkommt. In dem Fall dann entweder ohne Rückgabewert aus dem Perl-Code rausspringen, oder schauen, was die letzte Anweisung war und dieses Reading dann setzen (HASH-Variante, als key-value-Paar zurückgeben).
Sonst halt weiter mit der nächsten Klartext-Prüfung, bis klar ist, dass "nur noch" JSON da sein sollte und dann erst json2nameValue() aufrufen.
Hoffe, das ist halbwegs nachvollziebar?
Zitatwenn das so ist, wie soll ich es beheben?
Ob das so ist, kann man mit zuschauen/protokollieren des Datenverkehrs feststellen, z.Bsp. in der MQTT2_SERVER Detailsansicht, "Show MQTT traffic".
Wenn das so ist, dann kann man z.Bsp. die betreffende Zeile so erweitern:
esp_06:esp-06/status:.* { $EVENT =~ m/^OK/ ? { simpleStatus=>"OK"} : json2nameValue($EVENT) }
(Beta-User war schneller)
DANKE .... damit kann ich arbeiten ...
irgendwie habe ich das "Show MQTT traffic" nicht gefunden bzw. gewusst. So kann man besser debuggen
Edit:
Und genau dort ist die Meldung zu finden...
22:34:22.645 SENT esp-06/cmd PCFGPIO,65,0 \
22:34:22.874 esp_06 esp-06/status {(10)"log": "port#65: set to 0",(10)"plugin": 19,(10)"pin": 65,(10)"mode": "output",(10)"state": 0(10)}(10)
22:34:23.041 esp_06 esp-06/status (10)OK
Zitat von: Beta-User am 05 September 2025, 21:58:24oder du mußt das "vorverarbeiten", und statt des simplen json2nameValue()-Aufrufs dann z.B. erst schauen, ob "OK" zurückkommt. In dem Fall dann entweder ohne Rückgabewert aus dem Perl-Code rausspringen, oder schauen, was die letzte Anweisung war und dieses Reading dann setzen (HASH-Variante, als key-value-Paar zurückgeben)
...
Hoffe, das ist halbwegs nachvollziebar?
Etwas noch komplizierteres ist Dir wohl nicht eingefallen?
Grundsätzlich bevorzuge ich ja "einfache" und pragmatische Lösungen.
In diesem Sinne würde es reichen, die geschweifte Klammer zu Beginn des json in die regex aufzunehmen.
esp_06:esp-06/status:\{.* { json2nameValue($EVENT) }
Die "anderen" Werte kann man dann beispielsweise in ein reading "status" schreiben:
esp_06:esp-06/status:[^\{].* status
Edit:
man könnte sich auch eine Funktion "looks_like_json" zusammenklöppeln und diese für Fallunterscheidungen verwenden.
sub looks_like_json {
return !defined((json2nameValue(shift))->{json2nameValueErrorText});
}
Aber sonderlich effizient ist es vermutlich nicht, den gesamten Inhalt erstmal auszuwerten, um ihn dann im Erfolgsfall wieder zu verwerfen.
Es gibt sicherlich perl Module, die diese Aufgabe perfomanter erledigen.