json2nameValueErrorText Fehlermeldung

Begonnen von Wernieman, 05 September 2025, 21:40:53

Vorheriges Thema - Nächstes Thema

Wernieman

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!
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

Beta-User

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?
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

rudolfkoenig

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)

Wernieman

#3
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
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

betateilchen

#4
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.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!