MQTT2 für Xiaomi Vacuum Sauger

Begonnen von Otto123, 12 Mai 2021, 12:53:37

Vorheriges Thema - Nächstes Thema

Otto123

#360
Hinweis:
Mit valetudo Version 2023.03.0 wurde der json String für die Zonen geändert. Im Code ist da nichts zu tun, bei neuer Definition auch nicht - aber bei einem existierenden Reading .zones.
Um nicht alles neu zu machen, holt man sich das reading aus der Raw Def und editiert es:
Zitatsetstate MQTT2_ClumsyQuirkyCattle 2023-01-26 13:33:33 .zones {"Eingang":{"action":"clean","zones":[{"iterations":1,"points":{"pA":{"x":2465,"y":3120},"pB":{"x":2650,"y":3120},"pC":{"x":2650,"y":3245},"pD":{"x":2465,"y":3245}}}]}, ...
ändern in
Zitatsetreading MQTT2_ClumsyQuirkyCattle .zones {"Eingang":{"action":"clean","zones":[{"points":{"pA":{"x":2465,"y":3120},"pB":{"x":2650,"y":3120},"pC":{"x":2650,"y":3245},"pD":{"x":2465,"y":3245}}}],"iterations":1}, ...
anschließend neu abspeichern.

Aus dem alten Reading detail wird jetzt das Reading flag - bei mir stand da immer none drin. Für mich ist das  egal ;), kann aber sein bei anderen Saugern war das anders.
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

sherwood

#361
Seit dem ich ein neues MQTT2_Device für meine Valetudo (2023.05.0, L10Pro) angelegt und das valetudo Template angewendet habe, bekomme ich laufend (minütlich) folgende Fehler im log:

Use of uninitialized value in concatenation (.) or string at FHEM/SetExtensions.pm line 98.
Use of uninitialized value in concatenation (.) or string at FHEM/SetExtensions.pm line 98.
Use of uninitialized value in concatenation (.) or string at FHEM/SetExtensions.pm line 98.


Beim Ausführen von "get segments" oder "get release" diese:
2023.08.08 12:36:03 1: JSON decoding error, >No credentials provided< seems not to be valid JSON data: malformed JSON string, neither tag, array, object, number, string or atom, at character offset 0 (before "No credentials provi...") at ./FHEM/99_valetudoUtils.pm line 29.
2023.08.08 12:36:03 1: ERROR evaluating my $DEVICETOPIC=   $evalSpecials->{'%DEVICETOPIC'};my $EVENT=   $evalSpecials->{'%EVENT'};my $EVTPART0=   $evalSpecials->{'%EVTPART0'};my $EVTPART1=   $evalSpecials->{'%EVTPART1'};my $NAME=   $evalSpecials->{'%NAME'};{ valetudo_g($NAME,$EVENT) }: Can't use string ("") as an ARRAY ref while "strict refs" in use at ./FHEM/99_valetudoUtils.pm line 267.


Habe ich irgendetwas in meiner Definition vergessen oder weiß jemand wie ich die Fehler im Log weg bekomme?
Readings kommen rein und der L10Pro lässt sich steuern.

 



Hier meine Definition:
defmod Valetudo MQTT2_DEVICE
attr Valetudo alias valetudo
attr Valetudo devStateIcon docked:rc_PLAY:start (moving|cleaning):rc_PLAY@blue:pause (idle|paused):rc_PAUSE@red:start returning:refresh:pause
attr Valetudo devicetopic device/valetudo
attr Valetudo event-on-change-reading .*
attr Valetudo icon vacuum_top
attr Valetudo model valetudoV2
attr Valetudo readingList $DEVICETOPIC/\x24state:.* _state\
  $DEVICETOPIC/.*/[a-zA-Z\-_]+:.* { $TOPIC =~ m,$DEVICETOPIC\/(.*)\/([a-zA-Z\-_]+),;; valetudo_r($NAME,$1,$2,$EVENT) }
attr Valetudo 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:min,low,medium,high,max $DEVICETOPIC/FanSpeedControlCapability/preset/set $EVTPART1\
  locate:PERFORM   $DEVICETOPIC/LocateCapability/locate/set $EVTPART1\
  x_raw_payload:textField { valetudo_c($NAME,$EVENT) }\
  delete:zones,locations {fhem("deletereading $NAME .$EVTPART1");;;;return undef}\
  zoneNew:textField { valetudo_z($NAME,$EVENT) }\
  zoneRename:textField { valetudo_z($NAME,$EVENT) }\
  get:segments,release,ip { valetudo_g($NAME,$EVENT) }
attr Valetudo setStateList operation clean_segment clean_zone goto fanSpeed waterUsage locate x_raw_payload
attr Valetudo stateFormat cleanerState\
<a href="http://ip4" target="_blank">cleanerState</a>
attr Valetudo timestamp-on-change-reading .*

setstate Valetudo docked\
<a href="http://192.168.1.25" target="_blank">docked</a>
setstate Valetudo 2023-08-08 09:50:17 .segments {"1":"LivingRoom","5":"Passage"}
setstate Valetudo 2023-08-08 12:50:30 .zones {"Test":{"action": "clean","zones": [{"points": {"pA": {"x": 3170,"y": 3180},"pB": {"x": 3245,"y": 3180},"pC": {"x": 3245,"y": 3325},"pD": {"x": 3170,"y": 3325}}}],"iterations": 1}}
setstate Valetudo 2023-08-08 09:33:42 IODev mosqittoMQTTbroker
setstate Valetudo 2023-08-08 09:43:37 area 0.00 m²
setstate Valetudo 2023-08-08 09:34:37 attrTemplateVersion 20221101
setstate Valetudo 2023-08-08 09:46:06 batteryPercent 100
setstate Valetudo 2023-08-08 09:37:21 charge set
setstate Valetudo 2023-08-08 09:44:46 cleanerState docked
setstate Valetudo 2023-08-08 09:40:14 fanSpeed medium
setstate Valetudo 2023-08-08 09:48:09 get set get segments
setstate Valetudo 2023-08-08 09:34:37 ip4 192.168..X.XX
setstate Valetudo 2023-08-08 09:44:26 operation HOME
setstate Valetudo 2023-08-08 09:43:14 pause set
setstate Valetudo 2023-08-08 09:43:24 sensor-all 93600
setstate Valetudo 2023-08-08 09:44:26 set HOME
setstate Valetudo 2023-08-08 12:30:39 signal -80
setstate Valetudo 2023-08-08 09:40:25 start set
setstate Valetudo 2023-08-08 10:11:56 state set_fanSpeed
setstate Valetudo 2023-08-08 09:43:22 stop set
setstate Valetudo 2023-08-08 09:43:37 time 0

rudolfkoenig

Die Fehlermeldung aus SetExtensions wird im Log von einer Zeile wie
Zitat2023.08.08 18:10:52 3: eval: valetudo_w($name,'zones')
gefolgt (wenn man global verbose nicht geaendert hat).

Diese Funktion (in 99_valetudoUtils.pm) kann z.Zt. nicht damit umgehen, wenn das Reading .zonesPresets nicht gesetzt ist.
Weiterhelfen muss der Mainainer dieser Datei (99_valetudoUtils.pm).

sherwood

OK, nach einem setreading Valetudo .zonesPresets {} funktionierrt jetzt set zoneNew, zoneRename, zoneRename und cleanZone.

Keine Ahnung ob das value von .zonesPresets korrekt ist? Scheint aber nicht zu stören.
Sollte ".zonesPresets" nicht automatisch generiert werden, evtl. bug im Template/Script?



Ich habe auch mal setreading Valetudo valetudo_release 2022.10.0 gesetzt. Eine set Valetudo get release schmeißt noch immer den gleichen JSON error und aktualisiert auch nicht das reading.

Otto123

Guten Morgen,

ich schau mir das an, komme aber heute nicht dazu.

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Otto123

Zitat von: rudolfkoenig am 08 August 2023, 18:18:17Diese Funktion (in 99_valetudoUtils.pm) kann z.Zt. nicht damit umgehen, wenn das Reading .zonesPresets nicht gesetzt ist.
Zitat von: sherwood am 08 August 2023, 19:09:11Sollte ".zonesPresets" nicht automatisch generiert werden, evtl. bug im Template/Script?
Eigentlich lese ich das Reading so aus: ReadingsVal($NAME,'.'.$setter.'Presets','{}')Das kann also auch leer sein. In der Version  (2023.05.0, L10Pro) ist es auch leer und der Code wird gar nicht verwendet.
Irgendwas stimmt mit der Version nicht, wenn die von Hand falsch gesetzt wird ?

Aber warum wir release nicht gelesen?

@sherwood Ist der Robot überhaupt von FHEM erreichbar?
Was gibt das zurück?
{GetHttpFile(ReadingsVal('Valetudo','ip4',''), '/api/v2/valetudo/version')}
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

sherwood

Entscheiden war das setzen des Readings ".zonesPresets". Das Release Reading habe ich später gesetzt.

Da das Release nicht ausgelesen wird (werden kann), wird trotzdem versucht .zonesPresets auszulesen.

if (ReadingsVal($NAME,'valetudo_release','') lt '2022.05.0') {
         # old code
          my $json = ReadingsVal($NAME,'.zonesPresets',q{});
          my $decoded = decode_j($json);
          for (keys %{$decoded}) {
            if ( $decoded->{$_}->{'name'} eq $load ) {$ret = $devicetopic.'/ZoneCleaningCapability/start/set '.$_ }
          }
       } else {
           my $json = ReadingsVal($NAME,'.zones',q{});
           my $decoded = decode_j($json);
           for (keys %{$decoded}) {
               if ( $_ eq $load ) {$ret = $devicetopic.'/ZoneCleaningCapability/start/set '.toJSON $decoded->{$_} }
           }
       }



Die Abfragen via REST API schlagen fehl, da "HTTP Basic Auth" aktiviert ist und das script nicht vorsieht sich zu authentifizieren.

{GetHttpFile(ReadingsVal('Valetudo','ip4',''), '/api/v2/valetudo/version')} -> No credentials provided



Otto123

Zitat von: sherwood am 10 August 2023, 08:21:00Entscheiden war das setzen des Readings ".zonesPresets".
Aber im Code wird ja der default Wert (also wenn Reading nicht lesbar / gesetzt) genauso gesetzt wie Du es mit setreading gemacht hast. Verstehe nicht wie es zum Fehler kommen kann.  :o

Die Sache mit Basic Auth macht den Fehler mit release klar. Ok, muss ich mir was überlegen, ich dachte nicht, dass jemand den isolierten Staubsauger gegen interne Hacker absichert ;)
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

sherwood

#368
Ist es den unbedingt nötig den Release zu prüfen?
Würde es nicht reichen, mit .zones zu beginnen und wenn dieses fehlschlägt, auf das für die älteren Releases auf .zonesPresets zu gehen?


Habe noch ein paar weitere Unklarheiten/Bugs, die mir beim anlegen aufgefallen sind:

- "clean_segment" wurde in setlist nicht angelegt. ".segements" wurde allerdings korrekt ausgelesen. Manuel hinzugefügt funktioniert es problemlos. clean_segment:{valetudo_w($name,'segments')} { valetudo_c($NAME,$EVENT) }- Zu setlist hinzugefügt: operationMode:vacuum_and_mop,vacuum,mop $DEVICETOPIC/OperationModeControlCapability/preset/set $EVTPART1- Die Readings mit time werden nicht richtig formatiert. Meine Readings sind zB. brush-side_right: 489600.
  Liegt wohl am  "my $TMF = AttrVal($NAME,'timeformat','')". Ein <defaultvalue> setzen löst das Problem.
- Neue Readings für TotalStatisticsCapability und SpeakerVolumeControlCapability fehlen.
  ++Zeile 228 in 99_valetudoUtils.pm
if ($feature eq 'TotalStatisticsCapability')
       {return $value eq 'area' ? {"totalArea"=>sprintf("%.2f",($EVENT / 10000))." m²"}:
               $value eq 'time' ? {"totalTime"=>sprintf '%2$02dh %3$02dm %4$02ds',valetudo_dhms($EVENT)}:
               $value eq 'count' ? {"totalCount"=>$EVENT}:
               {"total"."$value"=>$EVENT} }
if ($feature eq 'SpeakerVolumeControlCapability')
    {return $value eq 'value' ? {"speakerVolume"=>$EVENT}:{"$value"=>$EVENT} }





schwatter

@Otto123

Hallo Otto,

habe heute einen 2ten Valetudo Robi eingerichtet.
Dabei ist mir aufgefallen, es kommen keine Segmente an. Beim nachforschen zur Api und deinem
Aufruf in "sub valetudo_g" gibt es wohl ein Problem mit Umlauten. Bei mir führt der Raum "Küche" zum Fehler.
Im ersten Robi hatte ich ich schon "Kueche" gesetzt, um Problemen aus dem Weg zu gehen.
Das bewahrt aber andere User nicht davor.

Log:
2023.12.19 13:18:29 1: JSON decoding error, >{"10":"Badezimmer","11":"Wohnzimmer","12":"Flur","13":"Küche","14":"Arbeitszimmer","15":"Esszimmer"}< seems not to be valid JSON data: malformed UTF-8 character in JSON string, at character offset 56 (before "\x{fffd}"14":"Arbeit...") at ./FHEM/99_valetudoUtils.pm line 29.

Der Thread ist auch sehr populär zu dem Problem.

https://forum.fhem.de/index.php?topic=126088.0


Danach bin ich unsicher. Soll Fhem es abfangen oder das Modul?


Gruß schwatter

Otto123

Hallo Schwatter,

ich schaue es mir an. Ich kann mich erinnern, dass ich da schon dran war, es aber irgendwie kaum wirklich lösbar war.

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

KyleK

Ich hab vor einer Weile diese Zeile:

if ( eval { $data = decode_json($maybe_json); 1 } ) { return $data }

gegen diese getauscht:

if ( eval { $data = JSON->new->utf8->decode(encode('UTF-8', $maybe_json)); 1 } ) { return $data }

Weil ich auch ein Problem mit Umlauten hatte.
Ich sehe aber gerade, dass ich gar keine Umlaute bei Segmenten (mehr) verwende, daher weiß ich nicht sicher, ob diese Änderung das Problem behebt.
FHEM on Raspberry Pi 3B+
CUL868
7x MAX! Thermostat, 8x MAX! Fensterkontakte
Conbee II + deConz, TradFri Lampen, Osram Smart+ Steckdosen

schwatter

Danke,

das funktioniert.


Gruß schwatter

schwatter

#373
Ok,

edit:

Muss nochmal schauen.  Habe geschrieben, das ich weiterhin Fehler habe. Aber die angepasste Zeile ist nicht mehr da.
Anscheinend hatte ich kein Save gemacht?

edit2:
Ah, ich hatte nochmal attrTemplate Valetudo angewandt. Dachte die 99_valetudoUtils.pm liegt in /fhem/Fhem.
Aber die liegt ja in /fhem/contrib/AttrTemplate/99_valetudoUtils.pm. Daher muss ich die da auch anpassen.

Gruß schwatter


Otto123

Zitat von: schwatter am 20 Dezember 2023, 16:27:19Ah, ich hatte nochmal attrTemplate Valetudo angewandt.
Wenn Du das tust wird die Originale vom SVN geholt. Da habe ich noch nichts angepasst.

Eine wiederholte Anwendung von attrTemplate ist in der Regel nicht sinnvoll, es sei denn man selbst keine Änderungen gemacht und weiß das im SVN eine Verbesserung liegt. :)
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz