L10Pro + Valetudo-MQTT-Template + JSON decoding error

Begonnen von drhirn, 13 Juni 2022, 09:15:52

Vorheriges Thema - Nächstes Thema

drhirn

Guten Morgen,

ich habe einen neuen L10Pro mit dem Valetudo MQTT-Template eingebunden. Bekomme da jetzt aber hunderte Fehlermeldungen im Log:

JSON decoding error, >< seems not to be valid JSON data: malformed JSON string, neither tag, array, object, number, string or atom, at character offset 0 (before "(end of string)") at ./FHEM/99_valetudoUtils.pm line 26

Wie bekomme ich am schnellsten raus, was genau da schuld ist? Oder weiß es zufällig jemand von euch schon?


defmod MQTT2_l10pro MQTT2_DEVICE l10pro
attr MQTT2_l10pro alias l10pro
attr MQTT2_l10pro devicetopic valetudo/l10pro
attr MQTT2_l10pro event-on-change-reading .*
attr MQTT2_l10pro icon vacuum_top
attr MQTT2_l10pro model valetudoV2
attr MQTT2_l10pro readingList $DEVICETOPIC/\x24state:.* _state\
  $DEVICETOPIC/(Att.*|Basic.*|Consum.*|Curr.*|Loc.*|Wifi.*)/[a-zA-Z\-_]+:.* { $TOPIC =~ m,$DEVICETOPIC\/.*\/([a-zA-Z\-_]+),;; $1 eq 'ips'? {"ip4"=> (split ',',$EVENT)[0]}:{"$1"=>$EVENT} }\
  $DEVICETOPIC/BatteryStateAttribute/level:.* batteryPercent\
  $DEVICETOPIC/BatteryStateAttribute/status:.* batteryState\
  $DEVICETOPIC/FanSpeedControlCapability/preset:.* fanSpeed\
  $DEVICETOPIC/GoToLocationCapability/presets:.* .locationsPresets\
  $DEVICETOPIC/GoToLocationCapability/go:.* {}\
  $DEVICETOPIC/MapData/map-data:.* {}\
  $DEVICETOPIC/MapData/segments:.* .segments\
  $DEVICETOPIC/StatusStateAttribute/status:.* { {"state"=>$EVENT,"cleanerState"=>$EVENT} }\
  $DEVICETOPIC/StatusStateAttribute/detail:.* stateDetail\
  $DEVICETOPIC/StatusStateAttribute/error:.* stateError\
  $DEVICETOPIC/WaterUsageControlCapability/preset:.* waterUsage\
  $DEVICETOPIC/ZoneCleaningCapability/presets:.* .zonesPresets\
  $DEVICETOPIC/ZoneCleaningCapability/start:.* {}
attr MQTT2_l10pro room MQTT2_DEVICE
attr MQTT2_l10pro setList pause:noArg $DEVICETOPIC/BasicControlCapability/operation/set PAUSE\
  start:noArg $DEVICETOPIC/BasicControlCapability/operation/set START\
  stop:noArg $DEVICETOPIC/BasicControlCapability/operation/set STOP\
  charge:noArg $DEVICETOPIC/BasicControlCapability/operation/set HOME\
  clean_zone:{valetudo_w($name,'zones')} { valetudo_c($NAME,$EVENT) }\
  fanSpeed:off,min,low,medium,high,turbo,max $DEVICETOPIC/FanSpeedControlCapability/preset/set $EVTPART1\
  waterUsage:off,min,low,medium,high,turbo,max $DEVICETOPIC/WaterUsageControlCapability/preset/set $EVTPART1\
  locate:PERFORM   $DEVICETOPIC/LocateCapability/locate/set $EVTPART1\
  x_raw_payload:textField { valetudo_c($NAME,$EVENT) }
attr MQTT2_l10pro setStateList operation clean_segment clean_zone goto fanSpeed waterUsage locate x_raw_payload
attr MQTT2_l10pro stateFormat <a href="http://ip4" target="_blank">state</a>
attr MQTT2_l10pro timestamp-on-change-reading .*

setstate MQTT2_l10pro <a href="http://xxx.xxx.xxx.xxx" target="_blank">docked</a>
setstate MQTT2_l10pro 2022-06-13 09:29:41 .segments {}
setstate MQTT2_l10pro 2022-06-13 09:24:13 IODev Mqtt2Server
setstate MQTT2_l10pro 2022-06-13 09:29:41 _state ready
setstate MQTT2_l10pro 2022-06-13 09:30:11 area 0
setstate MQTT2_l10pro 2022-06-13 09:24:13 associatedWith mqttGeneralBridge
setstate MQTT2_l10pro 2022-06-13 09:32:09 batteryPercent 100
setstate MQTT2_l10pro 2022-06-13 09:30:11 batteryState none
setstate MQTT2_l10pro 2022-06-13 09:30:11 brush-main 1069200
setstate MQTT2_l10pro 2022-06-13 09:30:11 brush-side_right 709200
setstate MQTT2_l10pro 2022-06-13 09:28:16 cleanerState docked
setstate MQTT2_l10pro 2022-06-13 09:30:11 fanSpeed high
setstate MQTT2_l10pro 2022-06-13 09:30:11 filter-main 529200
setstate MQTT2_l10pro 2022-06-13 09:30:11 frequency 2.4ghz
setstate MQTT2_l10pro 2022-06-13 09:30:11 ip4 xxx.xxx.xxx.xxx
setstate MQTT2_l10pro 2022-06-13 09:30:11 mop false
setstate MQTT2_l10pro 2022-06-13 09:30:11 sensor-all 97200
setstate MQTT2_l10pro 2022-06-13 09:30:41 signal -62
setstate MQTT2_l10pro 2022-06-13 09:30:11 ssid xxxx
setstate MQTT2_l10pro 2022-06-13 09:28:16 state docked
setstate MQTT2_l10pro 2022-06-13 09:30:11 stateDetail none
setstate MQTT2_l10pro 2022-06-13 09:30:11 time 0
setstate MQTT2_l10pro 2022-06-13 09:30:11 waterUsage medium
setstate MQTT2_l10pro 2022-06-13 09:30:11 watertank false


Danke!
Stefan

Beta-User

Moin,

das kommt m.E. aus der Evaluierung des setters für "clean_zone" iVm. damit, dass dort im Readingwert nichts steht.

Als Abhilfe würde ich eine Zeile #46 einfügen:
return 'none' if ! $json;

Kann aber sein, dass das Folgeprobleme verursacht (den set-Wert sollte man dann beim Ausführen aussortieren), und das ist m.E. nicht die einzige Stelle, an der mal diese Art "Fehler" mit einem "unpassenden" default bei der ReadingsVal-Abfrage provoziert.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

drhirn

Hmm, der Log-Eintrag wird aber trotzdem geschrieben. Und eigentlich ist genau der mein Problem. Ansonsten habe ich bis jetzt keine Funktions-Einschränkungen festgestellt. Außer, dass mir keine Segmente angezeigt werden.

Beta-User

Na ja,

ich habe keinen solchen Sauger und kann daher nur "etwas Theorie" liefern.

Gemeint war es so (Basis: aktueller svn-Code):
        my $json = ReadingsVal($NAME,'.'.$setter.'Presets',q{});
        return 'none' if !$json!
        my $decoded = decode_j($json);

Das Log wird geschrieben, wenn decode_j() (ob der Funktionsname in main glücklich ist, sei mal dahingestellt) mit offenkundig "ungültigem" JSON aufgerufen wird. Kann sein, dass das noch an anderen Stellen passiert. Dann müßte man die (stacktrace) ebenfalls identifizieren und entsprechend nachbehandeln.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

drhirn

Hach, bist du gut! Danke!

Mal schauen, ob da in einem regulären Reinigungsvorgang noch etwas anders aufpoppt. Kurztest war erfolgreich.

Für die Nachwelt, da war ein kleiner Vertipper drin (Rufzeichen statt Strichpunkt):

        my $json = ReadingsVal($NAME,'.'.$setter.'Presets',q{});
        return 'none' if !$json;
        my $decoded = decode_j($json);

Beta-User

Zitat von: drhirn am 13 Juni 2022, 12:42:13
Danke!
Immer wieder gerne!

ZitatFür die Nachwelt, da war ein kleiner Vertipper drin (Rufzeichen statt Strichpunkt):
Sorry für den Typo, falls es jemand einbauen will, würde ich der Nachwelt eher diese "direkte" Variante vorschlagen:
        my $json = ReadingsVal($NAME,'.'.$setter.'Presets',undef) // return 'none';
        my $decoded = decode_j($json);
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files