MQTT2 für Xiaomi Vacuum Sauger

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

Vorheriges Thema - Nächstes Thema

rudolfkoenig

ZitatIch hab das Internal nirgends. Wo finde ich das?
Das kriegen nur die Instanzen mit einem MQTT2_SERVER als IODev:
   IODev      m2s
   LASTInputDev m2s
   MSGCNT     302328
   NAME       <deleted>
   NR         306
   STATE      ON
   TYPE       MQTT2_DEVICE
   eventCount 302328
   m2s_CONN   m2s_192.168.178.33_2485
   m2s_MSGCNT 302328
   m2s_TIME   2022-10-19 11:45:49

drhirn

Ah, ok. Danke Rudi!
Dann funktioniert die Lösung nicht, sobald einer MQTT2_CLIENT verwendet.

rudolfkoenig

Bei MQTT2_CLIENT ist die Gegenseite dieser Netzwerkschicht nicht bekannt.

Otto123

#243
Zitat von: drhirn am 19 Oktober 2022, 11:54:02
Ah, ok. Danke Rudi!
Dann funktioniert die Lösung nicht, sobald einer MQTT2_CLIENT verwendet.
Du meinst wenn einer valetudo -> mosquitto -> M2_CLIENT verwendet. Ok daran habe ich nicht gedacht. Dann brauchen wir final die Kombination aus meinem und deinem Vorschlag  :D
Aber zur Ehrenrettung hatte ich für mein "Forschungsprojekt" ja MQTT2_SERVER als Voraussetzung definiert  :P
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

Hehe, ja, stimmt :D
Und trotzdem, soll ja Leute geben, die das nicht machen. Mich z.B. ;)

meier81

Hallo euch allen,

gibt es die Möglichkeit die readings zu runden, geht um folgendes hier:

   2022-10-19 21:54:11   cleanedArea     44.8775 m2

Dann könnte ich das auf 2 Stellen runden und die Anzeige wäre gleich wie in valetudo. Ist zur Zeit so konfiguriert:

$DEVICETOPIC/CurrentStatisticsCapability/area:.* { $TOPIC =~ m,$DEVICETOPIC\/.*\/([a-zA-Z\-_]+),;; {"cleanedArea"=>($EVENT / 10000)." m2"} }

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

ja, in der Art (als Test für die FHEM Kommandozeile){return sprintf "%.2f", 44.8775}
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

Gute Idee!
$DEVICETOPIC/CurrentStatisticsCapability/area:.* { $TOPIC =~ m,$DEVICETOPIC\/.*\/([a-zA-Z\-_]+),; {"cleanedArea"=>sprintf("%.2f",($EVENT / 10000))." m2"} }

Otto123

#248
Ich habe das mit Zonen mal so leidlich implementiert, vielleicht will es jemand testen.
Die dazu notwendige utils liegt derzeit auf meiner GitHub Seite, die sollte kompatibel zu allem bisherigen sein:
{ $data{f}='99_valetudoUtils.pm';; qx(wget -qO "./FHEM/$data{f}" "https://raw.githubusercontent.com/heinz-otto/scripts/master/fhem/$data{f}");; fhem("sleep 2;;reload $data{f}") }
ein neues Reading anlegen (Wird in Zukunft automatisch gemacht)
setreading MQTT2_ClumsyQuirkyCattle valetudo_release 2022.10.0
dazu dann drei neue setList Einträge:
  zoneNew:textField { fhem("setreading $NAME .zones ".valetudo_z($NAME,$EVENT) );return undef}
  zoneRename:textField {fhem("setreading $NAME .zones ".valetudo_z($NAME,$EVENT) );return undef}
  zonesDelete:noArg {fhem("deletereading $NAME .zones");return undef}

Dann in der valetudo Oberfläche eine Zone "machen" -> Add -> Position und Größe festlegen -> lange auf "Clean 1 Zones" drücken

  • Aus dem PopUp Fenster den kompletten json String kopieren
  • im Textfeld hinter set ... zoneNew einfügen und set drücken (hat man attr global showInternalValues 1 gesetzt sieht man das reading .zones). Jedes set ... zoneNew fügt eine neue Zone mit fortlaufender Nummer ein
  • mit set ... zoneRename Zone1 Eingang das reading umbenennen. Das Eingabefeld wird mit den vorhandene Zonennamen vor belegt.
  • mit set ... clean_zone kann man die Zone auswählen und ansteuern.
  • jedes set ... zoneDelete löscht das komplette Reading .zones
Mit etwas FHEM Code könnte man auch ein GoTo Location implementieren, was mein Dreame L10 pro von Hause aus nicht kann. Beispiel: kleine Zone Eimer definiert und dann:
set MQTT2_ClumsyQuirkyCattle clean_zone Eimer;sleep MQTT2_ClumsyQuirkyCattle:cleanerState:.returning; set MQTT2_ClumsyQuirkyCattle stop

Ich hoffe das es gut funktioniert.  :)
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

Zitat von: Otto123 am 20 Oktober 2022, 12:31:13
lange auf "Clean 1 Zones" drücken

Haha, da muss man mal drauf kommen. Kannte ich nicht den Trick.

Otto123

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

Hmm. Anlegen, umbenennen und löschen geht. Bei "clean_zone" bekomme ich aber keine Auswahl. Und wenn ich einfach set ... clean_zone Zone1 mache, tut sich gar nichts.


defmod staubi MQTT2_DEVICE fhem_test
attr staubi alias staubi
attr staubi devicetopic valetudo/staubi
attr staubi event-on-change-reading .*
attr staubi icon vacuum_top
attr staubi model valetudoV2
attr staubi 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/StatusStateAttribute/error_description:.* stateErrorDescription\
  $DEVICETOPIC/WaterUsageControlCapability/preset:.* waterUsage\
  $DEVICETOPIC/ZoneCleaningCapability/presets:.* .zonesPresets\
  $DEVICETOPIC/ZoneCleaningCapability/start:.* {}\
  $DEVICETOPIC/OperationModeControlCapability/preset:.* operationMode\
  $DEVICETOPIC/MapSegmentationCapability/clean:.* { json2nameValue($EVENT,'clean_') }\
fhem_test:valetudo/staubi/MapSegmentationCapability/clean/set:.* { json2nameValue($EVENT) }
attr staubi room MQTT2_DEVICE
attr staubi 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) }\
  clean_segment:{'multiple-strict,'.valetudo_w($name,'segments')} { valetudo_c($NAME,$EVENT) }\
  zoneNew:textField { fhem("setreading $NAME .zones ".valetudo_z($NAME,$EVENT) );;return undef}\
  zoneRename:textField {my $val = ReadingsVal($NAME,'.zones','');;$val =~ s/$EVTPART1/$EVTPART2/;;fhem("setreading $NAME .zones ".$val);;return undef}\
  zonesDelete:noArg {fhem("deletereading $NAME .zones");;return undef}
attr staubi setStateList operation clean_segment clean_zone goto fanSpeed waterUsage locate x_raw_payload
attr staubi stateFormat <a href="http://xxx.xxx.xxx.xxx" target="_blank">state</a>
attr staubi timestamp-on-change-reading .*

setstate staubi 2022-10-20 12:56:27 .zones {"Zone1":{"action":"clean","zones":[{"iterations":1,"points":{"pA":{"x":2905,"y":2993},"pB":{"x":3055,"y":2993},"pC":{"x":3055,"y":3143},"pD":{"x":2905,"y":3143}}}]}}

Otto123

#252
Ja sorry da fehlt bei dir die release Info - warte ...
auf die Schnelle:
setreading MQTT2_.... valetudo_release 2022.10.0

und das funktioniert bei dir nicht :(
{my $NAME='MQTT2_ClumsyQuirkyCattle';;
my $url = '/api/v2/valetudo/version' ;;
my $ip = ( split '_', InternalVal($NAME,ReadingsVal($NAME,'IODev','').'_CONN','error') )[1] ;;
my $json = GetHttpFile($ip, $url);;
my $ret = decode_json($json)->{release};;
fhem("setreading $NAME valetudo_release $ret")
}

Da muss ich mir noch was einfallen lassen.
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

Hab's gerade gesehen. Hab das Reading händisch erstellt und jetzt am Broker gefunden:
call method "encode_json" on unblessed reference at ./FHEM/99_valetudoUtils.pm line 110.

Otto123

#254
ersetz das mal mit toJSON - kommt zweimal vor
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