MQTT2 für Xiaomi Vacuum Sauger

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

Vorheriges Thema - Nächstes Thema

drhirn

Nein. Leider. Ich hab aber auch keine Fehlermeldung. verbose 5 meldet bei beiden leider nur den Befehl.

Otto123

funktioniert das in der FHEM Kommandozeile - oder erreicht FHEM den Sauger nicht?
{GetHttpFile('xxx.xxx.xxx.xxx', '/api/v2/valetudo/version')}

lokale IPs aus-x-en ist unnütz :)
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

drhirn

Haha, die IP ist bei mir in FHEM schon richtig. Aber muss ja nicht jeder wissen, wie mein Heimnetz aussieht ;).

Otto123

war das jetzt schon die eigentliche Antwort auf meine Frage?

ich habe keine Idee was da bei Dir passieren soll, die Routine an der Stelle ist eigentlich simpel.
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

drhirn

Bin ein Depp. Der Docker-Container, in dem FHEM residiert, kommt natürlich nicht zum Roboter. Bitte entschuldigt die Störung!

Otto123

Naja diese Methode über REST API ist eine Krücke, das ist mir klar. Ich weiß aber nicht wie man es besser lösen könnte.

Die beiden Readings kannst Du natürlich per Hand setzen, die ändern sich ja nicht so oft. Eleganter wäre ein Job auf deinem MQTT der das einmal am Tag oder auf Anforderung macht ;) Aber auch das ist eine Krücke.
Die Segmente sollten aber gesendet werden - bei Änderung oder morgens beim Neustart von valetudo.
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

drhirn

Bin doch kein Depp. Der FHEM-Container kommt schon zum Roboter. Der Roboter verliert nur leider verdammt oft die WLAN Verbindung (kennt jemand eine Lösung?). Das macht das Testen extrem mühsam. Aber im dem Fall ist es doch genau so, wie beschrieben. set MQTT2_staubi get release tut einfach gar nichts. Die Segmente kommen, wenn ich den Roboter neu starte.
Ich kann aber von FHEM aus mit wget die API erreichen. Daran liegt's also nicht.

Wir könnten ja bei Valetudo mal nachfragen, ob sie nicht einen MQTT-Befehl einbauen möchten, der ein "Info-Topic" zurück liefert?

drhirn

In Zeile 244 in 99_valetudoUtils liegt der Hund begraben.
Füge ich das || ReadingsVal($NAME,'ip4',undef) dazu, funktioniert's. Die IP wurde nie gefunden.
Mir ist nur nicht ganz klar, warum. Hab's jetzt aber auch nicht genau verfolgt, weil da hätte ich mir einen MQTT2_SERVER einrichten müssen.

my $ip = (split q{ },$load)[1] || ReadingsVal($NAME,'ip4',undef) || ReadingsVal($NAME,'ip4',(split q{_}, InternalVal($NAME,ReadingsVal($NAME,'IODev','').'_CONN','') )[-2] || return 'error no ip');

drhirn

Aber was anderes, was jetzt ein bisschen vom Thema abkommt: Eigentlich wäre die IP ja "retained". Die ist also schon da. Gibt's keine Möglichkeit, den Wert nach FHEM zu bekommen, ohne dass da neu gepublished werden muss?

rudolfkoenig

#309
ZitatGibt's keine Möglichkeit, den Wert nach FHEM zu bekommen, ohne dass da neu gepublished werden muss?
Sicher doch, Du musst ihn nur aus dem retain Internal des MQTT2_SERVERS rauspuhlen, z.Bsp. so
{ %{json2nameValue($defs{m2s}{retain}{"..."}{val})}{ip}  }


Nachtrag:
Aus dem Reading kann man es auch holen, ist halt dann einmal mehr eingepackt:
{ %{json2nameValue(%{json2nameValue(ReadingsVal("m2s", "RETAIN", "{}"))}{"..."})}{ip}  }

drhirn

Und wenn man MQTT2_CLIENT verwendet? ;)

rudolfkoenig

ZitatUnd wenn man MQTT2_CLIENT verwendet? ;)
Selbst schuld :)

Subscription nochmal setzen muesste reichen, dass muss aber jemand testen und bestaetigen.

drhirn

Zitat von: rudolfkoenig am 07 November 2022, 19:07:53
Subscription nochmal setzen muesste reichen, dass muss aber jemand testen und bestaetigen.

Hmm, weiß jetzt leider nicht, was du damit meinst.

Aber ich hab im Valetudo mal eine Diskussion gestartet, ob ein "Info"-Topic nicht sinnvoll wäre. Hypfer klingt nicht abgeneigt. Mal schauen, ob da was dabei raus kommt.

meier81

Hallo euch allen,

so, hab mich jetzt auch mal an das aktuelle Template gewagt. Hat soweit erstmal alles funktioniert, alle verfügbaren readings angelegt, soweit so gut.

Hier mal meine Definition / readings:

defmod EG_fl_HW_Saugroboter MQTT2_DEVICE valetudo_ExpensiveRegalMongoose
attr EG_fl_HW_Saugroboter alias Frida
attr EG_fl_HW_Saugroboter devStateIcon docked:rc_PLAY:start (moving|cleaning):rc_PLAY@blue:pause (idle|paused):rc_PAUSE@red:start returning:refresh:pause
attr EG_fl_HW_Saugroboter devicetopic valetudo/rockrobo
attr EG_fl_HW_Saugroboter event-on-change-reading .*
attr EG_fl_HW_Saugroboter group Geräte
attr EG_fl_HW_Saugroboter icon vacuum_top
attr EG_fl_HW_Saugroboter model valetudoV2
attr EG_fl_HW_Saugroboter readingList $DEVICETOPIC/\x24state:.* _state\
  $DEVICETOPIC/.*/[a-zA-Z\-_]+:.* { $TOPIC =~ m,$DEVICETOPIC\/(.*)\/([a-zA-Z\-_]+),;; valetudo_r($NAME,$1,$2,$EVENT) }
attr EG_fl_HW_Saugroboter room Erdgeschoß->Flur
attr EG_fl_HW_Saugroboter 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) }\
  goto:{valetudo_w($name,'locations')} { valetudo_c($NAME,$EVENT) }\
  locationNew:textField { valetudo_z($NAME,$EVENT) }\
  locationRename:textField { valetudo_z($NAME,$EVENT) }
attr EG_fl_HW_Saugroboter setStateList operation clean_segment clean_zone goto fanSpeed waterUsage locate x_raw_payload
attr EG_fl_HW_Saugroboter stateFormat cleanerState\
<a href="http://ip4" target="_blank">cleanerState</a>
attr EG_fl_HW_Saugroboter timestamp-on-change-reading .*

setstate EG_fl_HW_Saugroboter idle\
<a href="http://192.168.179.26" target="_blank">idle</a>
setstate EG_fl_HW_Saugroboter 2022-11-07 20:24:28 .segments {}
setstate EG_fl_HW_Saugroboter 2022-11-07 20:17:52 IODev NN_xx_SW_MQTT2_Server
setstate EG_fl_HW_Saugroboter 2022-11-07 20:24:28 _state ready
setstate EG_fl_HW_Saugroboter 2022-11-07 20:24:58 area 46.64 m²
setstate EG_fl_HW_Saugroboter 2022-11-07 20:19:27 attrTemplateVersion 20221101
setstate EG_fl_HW_Saugroboter 2022-11-07 20:24:43 batteryPercent 100
setstate EG_fl_HW_Saugroboter 2022-11-07 20:24:43 batteryState discharging
setstate EG_fl_HW_Saugroboter 2022-11-07 20:19:21 brush-main 623280
setstate EG_fl_HW_Saugroboter 2022-11-07 20:24:58 brush-side_right 263280
setstate EG_fl_HW_Saugroboter 2022-11-07 20:24:43 cleanerState idle
setstate EG_fl_HW_Saugroboter 2022-11-07 20:19:21 detail none
setstate EG_fl_HW_Saugroboter 2022-11-07 20:24:43 error_description No error
setstate EG_fl_HW_Saugroboter 2022-11-07 20:24:28 fanSpeed medium
setstate EG_fl_HW_Saugroboter 2022-11-07 20:19:21 filter-main 540000
setstate EG_fl_HW_Saugroboter 2022-11-07 20:19:21 frequency 2.4ghz
setstate EG_fl_HW_Saugroboter 2022-11-07 20:19:28 ip4 192.168.179.26
setstate EG_fl_HW_Saugroboter 2022-11-07 20:24:58 ip6 fe80::52ec:50ff:fe04:3e83
setstate EG_fl_HW_Saugroboter 2022-11-07 20:19:21 ips 192.168.179.26,fe80::52ec:50ff:fe04:3e83
setstate EG_fl_HW_Saugroboter 2022-11-07 20:19:21 level 100
setstate EG_fl_HW_Saugroboter 2022-11-07 20:19:21 message
setstate EG_fl_HW_Saugroboter 2022-11-07 20:19:20 preset medium
setstate EG_fl_HW_Saugroboter 2022-11-07 20:19:21 sensor-all 108000
setstate EG_fl_HW_Saugroboter 2022-11-07 20:40:28 signal -45
setstate EG_fl_HW_Saugroboter 2022-11-07 20:19:21 ssid FRITZ!Box 7590
setstate EG_fl_HW_Saugroboter 2022-11-07 20:24:43 state idle
setstate EG_fl_HW_Saugroboter 2022-11-07 20:24:43 stateDetail none
setstate EG_fl_HW_Saugroboter 2022-11-07 20:24:43 stateError {"severity":{"kind":"none","level":"none"},"subsystem":"none","message":""}
setstate EG_fl_HW_Saugroboter 2022-11-07 20:19:21 status discharging
setstate EG_fl_HW_Saugroboter 2022-11-07 20:17:52 subscriptions valetudo/rockrobo/BasicControlCapability/operation/set valetudo/rockrobo/CurrentStatisticsCapability/refresh/set valetudo/rockrobo/FanSpeedControlCapability/preset/set valetudo/rockrobo/GoToLocationCapability/go/set valetudo/rockrobo/LocateCapability/locate/set valetudo/rockrobo/WifiConfigurationCapability/refresh/set valetudo/rockrobo/ZoneCleaningCapability/start/set
setstate EG_fl_HW_Saugroboter 2022-11-07 20:19:21 subsystem none
setstate EG_fl_HW_Saugroboter 2022-11-07 20:19:21 time 3344
setstate EG_fl_HW_Saugroboter 2022-11-07 20:19:28 valetudo_release 2022.11.0


Was mir nun auffällt ist das beim reading "area" die Umrechnung anscheinend korrekt ist, zeigt bei mir 46.64 m² an, wie beim Sauger. Es werden aber die readings "brush-main", "brush-side_right", "filter-main", "sensor-all" und "time" nicht umgerechnet, diese stehen in der "ursprünglichen" Zahl da. Lässt sich das in dem Template auch noch automatisieren oder hab ich hier noch einen Fehler drin bei mir?

Gruß Markus
QNAP NAS mit Debian VM, darauf FHEM, debmatic, influxdb2 und Grafana || HB-RF-ETH || WS980 Wetterstation || Xiaomi Mi Robot mit valetudo-FW || Buderus web KM100 || div. Tasmota-Devices || mehrere Homematic-IP und Homematic-Devices

Otto123

Zitat von: drhirn am 07 November 2022, 18:17:26
In Zeile 244 in 99_valetudoUtils liegt der Hund begraben.
Füge ich das || ReadingsVal($NAME,'ip4',undef) dazu, funktioniert's. Die IP wurde nie gefunden.
Mir ist nur nicht ganz klar, warum. Hab's jetzt aber auch nicht genau verfolgt, weil da hätte ich mir einen MQTT2_SERVER einrichten müssen.

my $ip = (split q{ },$load)[1] || ReadingsVal($NAME,'ip4',undef) || ReadingsVal($NAME,'ip4',(split q{_}, InternalVal($NAME,ReadingsVal($NAME,'IODev','').'_CONN','') )[-2] || return 'error no ip');
Der Originalcode:    my $ip = (split q{ },$load)[1] || ReadingsVal($NAME,'ip4',(split q{_}, InternalVal($NAME,ReadingsVal($NAME,'IODev','').'_CONN','') )[-2] || return 'error no ip');in $load wird entweder ein Wort (segments|release|ip) oder ip 192.168.4.1 übergeben.
Im letzten Fall wird ip auf den Übergabewert gesetzt, existiert der nicht
wird ReadingsVal($NAME,'ip4', gelesen, ist das Reading leer
wird InternalVal() gelesen, wenn der nicht existiert
wird eine Fehlermeldung zurück gegeben.

Was soll bei Deiner Variante anders laufen, für den Fall das schon ip4 gefüllt ist? Der Code muss doch bei Dir auch funktionieren wenn keine MQTT2 Server da ist, denn das erste ReadingsVal() greift doch, ob Du das ein zweites mal hinschreibst ist doch egal. :-[ ich versteh das nicht :'(
Hat da einer ne Idee?
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