MQTT2 für Xiaomi Vacuum Sauger

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

Vorheriges Thema - Nächstes Thema

MadMax-FHEM

Ok, danke.

Vielleicht gebe ich dem dann doch eher noch mal eine Chance 8)
(und verm. hatte ich nur bei valetudo geschaut / hatte auf meinem "Test-Sauger" ja beides mal drauf, also valetudo und valetudoRE / aktuell laufe ich mit valetudoRE ohne mqtt)

Jetzt bin ich aber erst mal dabei auf Bullseye zu gehen...

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

Otto123

Ich habe jetzt den Gen 1 der kann nur Zonen - den habe ich aber noch auf valetudoRE
Und ich habe neu den Dreame L10 pro - den habe ich auf valetudo - der kann Segmente und Zonen (derzeit nur über die alte UI)

Mein Ziel jetzt ist: ein Template für valetudo (ohne map - finde ich unnötig in FHEM)
Dann schau ich mal nach dem update des Gen1 auf valetudo

BTW: aus User Sicht sind für mich Segmente und Zonen erstmal identisch/ähnlich - aber nein - aus Sicht des Saugers ist es was komplett anderes!

BTW: der Neue kann mein OpenWrt WLAN (zweistufig gerootet ins Internet) nicht, der kann nur direkt an der Fritzbox, das muss ich auch noch klären. ::)
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

ich habe mal ne erste Version valetudo v2 Template eingecheckt.
zwei subs sind ausgelagert in eine 99_valetudoUtils.pm - die wird vom Template nachgeladen.
segment und zone cleaning grundlegend eingebaut.
Die setList nutzt die neue Dynamic :)

Da geht noch was, bin gespannt auf Ideen. ;)

Ich hoffe, ich sind keine bugs eingebaut.
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

TomLee

Otto, kurze Frage zu Valetudo, das Segmente mit dem Gen1 nicht gehen scheint ja geklärt, Zonen (welche in Valetudo mit Presets bezeichnet werden) kann ich aber ganz normal im alten UI (da heissen sie weiterhin Zones) erstellen und im neuen Ui werden diese auch zur Auswahl angeboten und auch ausgeführt.

Über MQTT werden mir die Zonen aber nicht übertragen, das Reading presets (wie auch segments) beinhaltet einfach nur eine öffnende und schliessende geschweifte Klammer, hast du irgendwas gemacht das (in meinem Fall halt nur presets) die gefüllt werden ?

Provide Map Data hab ich mal aktiviert weil dazu was in der Utils steht (aber wegen der Segmente), dann kommt auch nix.

Otto123

#109
Hi,

ja kommt bei mir, ich habe dazu nur provide map data angehakt und die anderen beiden (homie und home assistant) nicht angehakt:
     2022-01-16 17:45:21   presets         {"4f8b7ebe-ad5f-4c2b-850b-90172fc47dba":{"__class":"ValetudoZonePreset","metaData":{},"name":"Kamin","zones":[{"__class":"ValetudoZone","metaData":{},"points":{"pA":{"x":3450,"y":3475},"pB":{"x":3675,"y":3475},"pC":{"x":3675,"y":3665},"pD":{"x":3450,"y":3665}},"iterations":1}],"id":"4f8b7ebe-ad5f-4c2b-850b-90172fc47dba"},"539000a2-6691-4a97-ba50-399521215256":{"__class":"ValetudoZonePreset","metaData":{},"name":"Eingang","zones":[{"__class":"ValetudoZone","metaData":{},"points":{"pA":{"x":3720,"y":3300},"pB":{"x":4100,"y":3300},"pC":{"x":4100,"y":3425},"pD":{"x":3720,"y":3425}},"iterations":1}],"id":"539000a2-6691-4a97-ba50-399521215256"}}
     2022-01-16 17:45:21   segments        {"1":"Bad","2":"Badwanne","3":"Wohnzimmer","4":"Kueche","6":"Schlafzimmer"}
...
     2022-01-16 17:45:21   zones           {"Eingang":"539000a2-6691-4a97-ba50-399521215256","Kamin":"4f8b7ebe-ad5f-4c2b-850b-90172fc47dba"}


Da habe ich mittlerweile eine kleine Umwandlung geschrieben -> zones sub valetudo_r {
my $setter = shift;
my $payload = shift;
my $ret = 'error';
my %t;
if ($setter eq 'presets') {
  my $decoded = decode_json($payload);
  for (keys %$decoded) { $t{$decoded->{$_}->{'name'}} = $_ } # build a new hash only with zone id and zone name
  $ret = encode_json(\%t)
  }
return $ret
}
und die Readingslist so gemacht:
$DEVICETOPIC/ZoneCleaningCapability/presets:.* { $TOPIC =~ m,$DEVICETOPIC\/.*\/([a-zA-Z\-_]+),; {"zones"=>valetudo_r($1,$EVENT)} }

Wenn ich jetzt darüber nachdenke, die presets kommen doch ohne map-data, die kamen sofort nach der Definition. Die segments kommen erst nach aktivierung map-data
Sieht man ja auch an der rL
$\DEVICETOPIC/ZoneCleaningCapability/presets:.* presets\
Kannst Du deine Zonen mit der Swagger UI abfragen?
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

TomLee

Ok.

Ich hatte bisher MQTT deaktiviert gehabt auf dem Valetudo.

Ich hab mal rawevents auf valetudo/.* gesetzt und sehe es kommt bei mir dann immer nach einer Sekunde noch ein leerer "Json" hinterher, deswegen das "zappeln" alle 30 Sekunden in der Detailansicht des Devices, mal steht ganz viel drin mal nix (geschweifte Klammern).

Und wenn ich im Event-Monitor bin kommt alle paar Sekunden

Connection lost, trying a reconnect after 5 seconds

2022-01-16 17:50:55 MQTT2_DEVICE MQTT2_valetudo_QuintessentialRemoteLouse presets: {"9970781a-f848-4aba-b5f5-2df35fbb1c42":{"__class":"ValetudoZonePreset","metaData":{},"name":"Sleep","zones":[{"__class":"ValetudoZone","metaData":{},"points":{"pA":{"x":2515,"y":2060},"pB":{"x":3095,"y":2060},"pC":{"x":3095,"y":2585},"pD":{"x":2515,"y":2585}},"iterations":1}],"id":"9970781a-f848-4aba-b5f5-2df35fbb1c42"},"222cc472-ed90-4232-8dcf-cf3f40e7603e":{"__class":"ValetudoZonePreset","metaData":{},"name":"Living","zones":[{"__class":"ValetudoZone","metaData":{},"points":{"pA":{"x":2520,"y":3115},"pB":{"x":3080,"y":3115},"pC":{"x":3080,"y":3535},"pD":{"x":2520,"y":3535}},"iterations":1}],"id":"222cc472-ed90-4232-8dcf-cf3f40e7603e"}}
2022-01-16 17:50:55 MQTT2_SERVER MQTT2_Server valetudo/QuintessentialRemoteLouse/ZoneCleaningCapability/presets:{"9970781a-f848-4aba-b5f5-2df35fbb1c42":{"__class":"ValetudoZonePreset","metaData":{},"name":"Sleep","zones":[{"__class":"ValetudoZone","metaData":{},"points":{"pA":{"x":2515,"y":2060},"pB":{"x":3095,"y":2060},"pC":{"x":3095,"y":2585},"pD":{"x":2515,"y":2585}},"iterations":1}],"id":"9970781a-f848-4aba-b5f5-2df35fbb1c42"},"222cc472-ed90-4232-8dcf-cf3f40e7603e":{"__class":"ValetudoZonePreset","metaData":{},"name":"Living","zones":[{"__class":"ValetudoZone","metaData":{},"points":{"pA":{"x":2520,"y":3115},"pB":{"x":3080,"y":3115},"pC":{"x":3080,"y":3535},"pD":{"x":2520,"y":3535}},"iterations":1}],"id":"222cc472-ed90-4232-8dcf-cf3f40e7603e"}}
2022-01-16 17:50:56 MQTT2_DEVICE MQTT2_valetudo_QuintessentialRemoteLouse presets: {}
2022-01-16 17:50:56 MQTT2_SERVER MQTT2_Server valetudo/QuintessentialRemoteLouse/GoToLocationCapability/presets:{}


Ich werd MQTT wieder deaktivieren und bei Gelegenheit wieder ValetudoRe draufspielen.

Otto123

#111
hmm, ich habe jetzt auf meinem Gen1 mal (da rennt noch valetudoRE) die valetudo binary runtergeladen und dann RE gestoppt und valetudo gestartet:
wget https://github.com/Hypfer/Valetudo/releases/latest/download/valetudo-armv7 -O valetudo
service valetudo stop
./valetudo

presets bleibt leider leer :(

Ach so - er löscht es also wieder?

gefunden: liegt hier dran
valetudo_VapidArcticBee:valetudo/VapidArcticBee/GoToLocationCapability/presets:.* presets

muss so - oder so ähnlich:
$DEVICETOPIC/GoToLocationCapability/presets:.* goto-presets

hatte mein L10pro nicht, deswegen war es nicht im Template - bau ich ein!

So sieht es aus wenn man für L10pro und Gen1 die Features abfragt:
##########################################
# Support features L10pro
[
  "BasicControlCapability",
  "CarpetModeControlCapability",
  "CombinedVirtualRestrictionsCapability",
  "ConsumableMonitoringCapability",
  "CurrentStatisticsCapability",
  "DoNotDisturbCapability",
  "FanSpeedControlCapability",
  "KeyLockCapability",
  "LocateCapability",
  "ManualControlCapability",
  "MapResetCapability",
  "MapSegmentEditCapability",
  "MapSegmentRenameCapability",
  "MapSegmentationCapability",
  "MappingPassCapability",
  "ObstacleAvoidanceControlCapability"
  "PendingMapChangeHandlingCapability",
  "SpeakerTestCapability",
  "SpeakerVolumeControlCapability",
  "TotalStatisticsCapability",
  "VoicePackManagementCapability",
  "WaterUsageControlCapability",
  "WifiConfigurationCapability",
  "ZoneCleaningCapability",
]
###########################################
# supported Features Gen1
[
  "BasicControlCapability",
  "CarpetModeControlCapability",
  "ConsumableMonitoringCapability",
  "CurrentStatisticsCapability"
  "DoNotDisturbCapability",
  "FanSpeedControlCapability",
  "GoToLocationCapability",
  "LocateCapability",
  "ManualControlCapability",
  "SpeakerTestCapability",
  "SpeakerVolumeControlCapability",
  "TotalStatisticsCapability",
  "VoicePackManagementCapability",
  "WifiConfigurationCapability",
  "ZoneCleaningCapability",
]
############################################
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

TomLee

komm zwar gerade nicht mit aber es klappt wenn man das Reading anders nennt ->goto-presets.

ZitatSo sieht es aus wenn man für L10pro und Gen1 die Features abfragt:

Wie frägt man den Features ab ?

Otto123

Linkes Menu / Swagger UI / Robot / Get Robot Supportcapabilities / Try it out / execute

Dann steht dort ein Json im schwarzen Fenster
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

TomLee

ZitatLinkes Menu / Swagger UI / Robot / Get Robot Supportcapabilities / Try it out / execute

Funzt, Danke.

sherwood

Wie fragt man eigentlich bei einem über MQTT angebunden valetudo(2022.01.0) Dreame L10 PRO ab, ob ein Reinigungsvorgang erfolgreich war oder nicht?

z.B. Will ich eine msg versenden wenn der Vorgang erfolgreich war oder nicht. Am besten noch eine map und CurrentStatisticsCapability/area und CurrentStatisticsCapability/time dazu.


readingList:
  $DEVICETOPIC/\x24state:.* _state
  $DEVICETOPIC/AttachmentStateAttribute/dustbin:.* dustbin
  $DEVICETOPIC/AttachmentStateAttribute/.* { $TOPIC =~ m,.*\/(.*),; {"$1"=>$EVENT} }
  $DEVICETOPIC/BatteryStateAttribute/level:.* batteryPercent
  $DEVICETOPIC/BatteryStateAttribute/status:.* batteryState
  $DEVICETOPIC/BasicControlCapability/operation:.* operation
  $DEVICETOPIC/CurrentStatisticsCapability/area:.* area
  $DEVICETOPIC/CurrentStatisticsCapability/time:.* time
  $DEVICETOPIC/ConsumableMonitoringCapability/.* { $TOPIC =~ m,.*\/(.*),; {"$1"=>$EVENT} }
  $DEVICETOPIC/FanSpeedControlCapability/preset:.* fanSpeed
  $DEVICETOPIC/LocateCapability/locate:.* locate
  $DEVICETOPIC/MapData/map-data:.* {}
  $DEVICETOPIC/MapData/segments:.* segments
  $DEVICETOPIC/StatusStateAttribute/status:.* state
  $DEVICETOPIC/StatusStateAttribute/detail:.* stateDetail
  $DEVICETOPIC/StatusStateAttribute/error:.* stateError
  $DEVICETOPIC/WaterUsageControlCapability/preset:.* waterUsage
  $DEVICETOPIC/WifiConfigurationCapability/.* { $TOPIC =~ m,.*\/(.*),; {"$1"=>$EVENT} }
  $DEVICETOPIC/ZoneCleaningCapability/presets:.* presets
  $DEVICETOPIC/ZoneCleaningCapability/start:.* start


Ein History Funktion oder letzte Reinigung scheint es nicht zu geben.

Verfolge ich die Status Änderung für einen Reinigungsversuch sieht das so aus:
StausStateAttribute/status: docked -> cleaning -> returning -> docked

Für eine abgebrochenen Reinigung (set valetudo operation HOME):
StausStateAttribute/status: docked -> cleaning -> returning -> docked

Darüber wird das nix.

Area und time ist nicht persistent und steht bei mir auf 0.

Wie habt Ihr das gelöst?

Otto123

Die Karte ist für mich erstmal nicht verständlich, da braucht man irgendwelche Tools zum dekomprimieren.
Am Ende der Reinigung könnte man die CurrentStatisticsCapability in ein anderes Reading schreiben.
Vielleicht einfach ein notify auf returning?
Das xiaomi Sauger Modul hat ja so eine rotierenden 10 letzte Reinigungsvorgänge Historie erzeugt - könnte man nachempfinden.
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

Das mit der Karte läuft über einen zusätzlichen Service https://github.com/Hypfer/Icantbelieveitsnotvaletudo, da die Ressourcen für das erstellen einer PNG auf dem Robot nicht reichen. Hat aber erst mal Prio X.

Problem ist, es gibt weder eine Status "Reinigung: erfolgreich/abgebrochen", noch hat man Zugriff auf eine Reinigungs-Historie.
Der Status ist ein MQTT Problem, welches von valetudo nicht zur Verfügung gestellt wird, obwohl der Robot es kann (Sprachausgabe).
Die Historie wird nicht von der Robot Firmeware oder valetudo erstellt bzw. gespeichert, da dies von der Xiaomi Cloud erledigt wird.

Prio 1, ist erst mal eine Reinigungs-Historie oder zumindest den letzten Reinigungsvorgang als Reading abzulegen.

Ich guck mir mal an wie das im Xiaomi Module gemacht wurde, befürchte aber, dass dort auf die Cloud Historie zurückgriffen wird.

@Otto123: Das mit den rotierenden 10 letzten Einträgen klingt interessant. Hast du das Modul bei dir am laufen?

MadMax-FHEM

#118
Zitat von: sherwood am 17 Januar 2022, 09:37:39
Ich guck mir mal an wie das im Xiaomi Module gemacht wurde, befürchte aber, dass dort auf die Cloud Historie zurückgriffen wird.

Also ich habe valetudo FW auf dem Sauger, den App-Account gelöscht (würde eh nicht mehr tun), also keine Cloud mehr...
...trotzdem die Cleaning-Historie.
EDIT: genauer valetudoRE

Xiaomi V1/V2

Macht also wohl das Modul oder Infos kommen vom Sauger...

Bzgl. Reinigungs-Ende nutze ich: total_cleans

Gruß, Joachim

P.S.: bzgl. mqtt bin ich noch nicht weiter... Aktuell wenig Zeit...
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

Otto123

#119
Ich kann es nicht genau sagen.
Auf dem Gen1 ist die Reinigungshistorie lokal gespeichert, die valetudoRE hat darauf Zugriff. Starte ich auf dem gleichen Sauger valetudo habe ich keine Historie, valetudo sieht das offenbar nicht vor.
Den L10pro hatte ich nie anders in Betrieb als mit valetudo.

ein Ansatz wäre ein userReadings (ungetestet)
lastArea:state:.returning {ReadingsVal($name,'area','error')}

Das xiaomi Modul habe ich nicht mehr am laufen.

Das mit der Map interessiert mich eigentlich nicht und die Hintergründe verstehe ich nicht. Die Firmware und valetudo zeigen die Karte ja an. Die Karten Daten werden auch über mqtt übertragen. Sicher mussman diese bloß dekodieren, irgendwo steht was von compressed png. Ob das mit dem externen Dienst wirklich noch aktuell ist weiß ich nicht. An der Kartendarstellung und codierung wurde ja hart gearbeitet: https://github.com/Hypfer/Valetudo/releases
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