Roborock/Xiaomi Vacuum: Backup und Restore der gespeicherten Karte über MQTT

Begonnen von Thyraz, 05 Juni 2019, 23:09:57

Vorheriges Thema - Nächstes Thema

MadMax-FHEM

Und weil ich grad dabei war hab ich ne Sub gebastelt...
...kann man sicher besser machen (ich halt nicht ;)  )...


sub my_makeFHEMcoordinates($)
{
  my ($ValetudoCoordinates) = @_;
  my $Result = "";
 
  $ValetudoCoordinates = (split(/\[/,$ValetudoCoordinates))[1]; # "rauslösen" des Inhalts innerhalb der Eckigen Klammer(n)
  my $X1 = int((split(/,/,$ValetudoCoordinates))[0]); # int() ist vermutlich nicht nötig. War der erste Versuch die "führende" eckige Klammer "loszuwerden" hat leider nicht geklappt / hab's aber drin gelassen schadet ja nicht ;-)
  my $Y1 = int((split(/,/,$ValetudoCoordinates))[1]);
  my $X2 = int((split(/,/,$ValetudoCoordinates))[2]);
  my $Y2 = int((split(/,/,$ValetudoCoordinates))[3]);

  $Y1 = 51200 - $Y1;
  $Y2 = 51200 - $Y2;

  if($X1 > $X2)
  {
    my $X = $X1;
    $X1 = $X2;
    $X2 = $X;
  }
  if($Y1 > $Y2)
  {
    my $Y = $Y1;
    $Y1 = $Y2;
    $Y2 = $Y;
  }
 
  $Result = "[" . $X1 . "," . $Y1 . "," . $X2 . "," . $Y2 . ",1]";
 
  return $Result;
}


Aufruf dann so:


my_makeFHEMcoordinates("[24540, 25827, 26244, 26448, 1]")


Mit oder ohne 1 am Ende ist egal.
Leerzeichen (weil die beim Rauskopieren bei Valetudo [zumindest bei mir] drin sind) sollten kein Problem sein...

Wichtig sind halt die eckigen Klammern, ansonsten muss der erste Split-Aufruf weg...
...bzw. irgendwas mit RegEx (war mir aber zu wild ;)  ) was evtl. vorhandene Klammern etc. "rausnimmt"...
und die Anführungszeichen (also Übergabe eines Strings)!

Hab's aber jetzt nicht intensiv getestet...

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)

gsbox

Hi.
Hat jemand eine Idee, wie ich die Karte vom letzten Saug-Vorgang in FHEM anzeigen lassen kann ? Wie kann ich das PNG bekommen ? Ich habe mir schon das https://github.com/Hypfer/ICantBelieveItsNotValetudo Projekt angeschaut, aber irgendwie blicke ich da nicht durch... Gibt es da nicht einen einfacheren Weg ?

Viele Grüße
Guido

MadMax-FHEM

Hallo Marcel/rakete123,

ich nehme hier mal Bezug zu dort: https://forum.fhem.de/index.php/topic,73052.msg950459.html#msg950459 (damit das nicht verloren geht bzw. dort evtl. OT wird / ok, dann ist es hier wohl OT / auch nicht besser :-| )...

Zitat von: rakete123/Marcel
Hallo zusammen,

wäre es ggf. sinnvoll das Module zu erweitern damit es mit der Valetudo API auf den Vaccums sprechen kann?
Wir hatten da eine kleine Diskussion wegen der Koordinaten, siehe: https://forum.fhem.de/index.php/topic,101197.msg950415.html#msg950415

Aktiveren mit einem Attribute wie use_valetudo_api und dann könnte man über /api/get_config die Zonen aus Valetudo auslesen und automatisch in das zone_names Attribute übernehmen. Irgendwie mit einem SET Command z.b.

Ich würde auch selber mal versuchen das Module zu erweitern wenn das erlaubt ist.

mfg
Marcel

Das mit /api/get_config geht aber nur (zumindest bei mir), wenn man schon Zonen in Valetudo gespeichert hat...
...um das zu tun muss man entweder per /IP-Sauger/zone welche anlegen und die Koordinaten speichern...
...oder eben per "Entwickleroptionen" den HTTP-Aufruf "zone_clean" von Valetudo an den Sauger "abgreifen" und dort die Koordinaten nehmen...

Was ich überlege ist aus meiner Funktion mittels Notify und userattr beim Sauger folgendes zu ermöglichen:

neues Attribut "valetudo_zones" (userattr)...
Aufbau (praktisch wie zone_names): Zone1Name:[X1,Y1,X2,Y2,Anzahl] Zone2Name:[X1,Y1,X2,Y2,Anzahl]

Dann ein Notify auf "Änderung im Attribut 'valetudo_zones'" wo dann die Berechnung stattfindet und "zone_names" gesetzt wird...

Würde aber dann dort eingetragene (also die NICHT von valetudo_zones kommenden) Zonen "löschen" bzw. halt immer mit den Einträgen von "valetudo_zones" überschreiben...

Nur so als Idee...
...wenn ich das habe poste ich es mal.

@gsbox:

geht es nur um die Anzeige in fhem also beispielsweise in FhemWeb?
Evtl. geht sowas wie weblink, also einfach auf Valetudo "verlinken" oder per iFrame etc.

Ansonsten müsste man sich mal anschauen was dort gemacht wird um das Bild/Karte anzuzeigen.
Glaube nicht, dass das "nur" ein png ist...

EDIT: hab gerade geschaut. Ist kein png (gut dachte ich mir schon) und es ist einiges an Script notwendig um das Bild/Karte anzuzeigen... Evtl. iFrame und dann halt die gesamte Webseite einblenden...

EDIT2: folgendes geht für FhemWeb (RawDefinition) / die Attribute (v.a. bzgl. width/height nat. entsprechend anpassen)

defmod AnzeigeValetudo weblink iframe http://IP-Adresse-Sauger
attr AnzeigeValetudo htmlattr width="480" height="560"
attr AnzeigeValetudo room Valetudo


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)

gsbox

Hallo Joachim.
Zitatgeht es nur um die Anzeige in fhem also beispielsweise in FhemWeb?
Nein, ich möchte das Bild via Telegram an mich senden. Mal schauen, ob das geht.

ZitatAnsonsten müsste man sich mal anschauen was dort gemacht wird um das Bild/Karte anzuzeigen.
Ok. Ich versuche mal, das herauszufinden. Falls ich erfolg habe, poste ich das Ergebnis.

Danke erstmal für Deine Antwort.
VG

Shojo

Ich nutze das aktuell schon mit Telegram.
Die Vorgehensweise ist recht simpel, Valetudo sendet über MQTT die Map Daten an ICantBelieveItsNotValetudo und dort kann man dann einfach die Map via URL als Bild abfragen.

Kann man z.B. so im FHEM verarbeiten :
set TelegramBot cmdSend {GetFileFromURL("http://IP:PORT/api/map/image")}
FHEM auf: Shuttle PC (x64) (Docker)
Bridge: SignalESP 433mHz, ConBee (deCONZ in Docker)
Rest: ESP8266, SONOFF, Sonos, Echo Dot, Xiaomi Vacuum (root), ESP RGBWW Wifi Led Controller, Node-RED, LEDMatrix, Pixel It

gsbox

Hallo shojo.
Vielen Dank. Das hört sich ja gut an. Hm, kann ich den Dienst von ICantBelieveItsNotValetudo auch auf meinem raspberry pi laufen lassen? Ich habe keinen anderen Rechner, der die ganze Zeit läuft😕.
Oder läuft das direkt auf dem Robi? Aber das ist ja glaube ich nicht so sinnvoll...

Danke für die Info.
Vg

Shojo

"Früher" lief der Dienst auch direkt auf dem Robi, aber da das rendern der Bilder doch schon etwas Leistung braucht  (und davon hat der Robi auch nicht viel von über) wurde dieser Dienst in ICantBelieveItsNotValetudo  ausgelagert.

Bei mir läuft alles in Docker Containern und daher war es kein Aufwand den Dienst mal eben mit laufen zu lassen.
Aber auf den Raspi sollte das auch kein großes Problem darstellen, man muss halt nur NodeJS am laufen haben.
FHEM auf: Shuttle PC (x64) (Docker)
Bridge: SignalESP 433mHz, ConBee (deCONZ in Docker)
Rest: ESP8266, SONOFF, Sonos, Echo Dot, Xiaomi Vacuum (root), ESP RGBWW Wifi Led Controller, Node-RED, LEDMatrix, Pixel It

gsbox


rakete123

Zitat von: MadMax-FHEM am 23 Juni 2019, 13:28:06
Das mit /api/get_config geht aber nur (zumindest bei mir), wenn man schon Zonen in Valetudo gespeichert hat...
...um das zu tun muss man entweder per /IP-Sauger/zone welche anlegen und die Koordinaten speichern...
...oder eben per "Entwickleroptionen" den HTTP-Aufruf "zone_clean" von Valetudo an den Sauger "abgreifen" und dort die Koordinaten nehmen...

Was ich überlege ist aus meiner Funktion mittels Notify und userattr beim Sauger folgendes zu ermöglichen:

neues Attribut "valetudo_zones" (userattr)...
Aufbau (praktisch wie zone_names): Zone1Name:[X1,Y1,X2,Y2,Anzahl] Zone2Name:[X1,Y1,X2,Y2,Anzahl]

Dann ein Notify auf "Änderung im Attribut 'valetudo_zones'" wo dann die Berechnung stattfindet und "zone_names" gesetzt wird...

Würde aber dann dort eingetragene (also die NICHT von valetudo_zones kommenden) Zonen "löschen" bzw. halt immer mit den Einträgen von "valetudo_zones" überschreiben...

Ich hab ein kleines Skript geschrieben, welches die Valetudo API ausliest und dann den passenden Output für FHEM erzeugt. Das kann dann einfach in das Attribute zone_names kopiert werden.

Skript liegt auf github: https://github.com/marcelfischer/fhem_stuff/blob/master/valetudo2fhem.pl

Genial wäre, wenn man das in das XiaomiDevice Module übernehmen würde, dann könnte ich mit einem simplen SET Command die Zonen aus Valetudo übernehmen.

BTW: Ich benutze das Teil ausschließlich über Valetudo aktuell.
Zwave: ZMEEUZB1 (Fibaro, Aeotec, diverse)
Zigbee: Conbee (HUE, Xiaomi, osram)
Homematic: HM-MOD-RPI-PCB + diverse HM-CC-RT-DN
Sonstiges: Harmony, Android, Netatmo, Jabber (talk2fhem)
https://resize2fs.de

MadMax-FHEM

@rakete123

Muss ich mir mal anschauen...
...allerdings ist jetzt erst mal "Urlaubspause"...  :-\

Ich hab meine noch in der Europacloud von Xiaomi und steuere per fhem-Modul...

Einen hab ich jetzt mal mit Valetudo-FW geflasht...
...nutze ihn aber eigentlich auch nur per fhem-Modul...

Außer zum Karte kucken (geht ja dann nicht mehr anders) und "rumspielen"...
...da schaue ich dann mal "über" Valetudo rein... ;)

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)

gsbox

@Shoho
Hier meine Rückmeldung :
Ich habe es nun hinbekommen und ein laufendes NodeJS auf meinem Raspi 3 installiert. MQTT ist sowohl auf dem Sauger, als auch auf dem Raspi aktiviert und ich kann meine Karte mittels deines Kommandos "getFileFromUrl()" wunderbar auslesen und senden. Danke nochmal für die Hilfe.

Installieren von NodeJS via folgender Anleitung : https://crycode.de/installation-von-node-js

@rakete123
Vielen Dank für dein tolles perl-Skript für die Konvertierung der Koordinaten. Funktioniert super  :)

VG

AET_FHEM

=> bin da noch nicht ganz durch und bekomme das ICantBelieveItsNotValetudo nich so richtig ans laufen => hab leider bis jetzt keine Anleitung gefunden
kann mal einer erklären wie ich das auf einem Raspi 3 zum laufen bekomme  ;D

KurtK

So, dank diesem Thread habe ich jetzt auch endlich ein Restore der Karte beim V1 geschafft. Vielen Dank.

Wer dies bei seinem V1 auch machen möchte, hier meine Lösung:

Ein Shell-Script mit folgendem Inhalt als User fhem anlegen:
#!/bin/bash
roboip='<IP des Roboters>'
privatekey='<Speicherpfad + Dateiname des privaten Schlüssels>'
lastmap='<Speicherpfad + Dateiname der Karte>'
echo "reload map"
scp -i $privatekey $lastmap root@$roboip:/mnt/data/rockrobo/
echo "restart process"
ssh -i $privatekey root@$roboip 'killall player'
echo "finished"


Das Skript einmal in der Konsole ausführen um den Roboter zu den bekannten Hosts hinzuzufügen.


Abschließend lasse ich mit einem DOIF bei Rückkehr des Roboters in die Station die Karte resetten.

Bsp:
([MQTT2_kueche_robo] eq "docked") ({system('/opt/fhem/roboter/roboter.sh&');;})
Dabei das Reading des Roboter auf jeden Fall zu event-on-change-reading hinzufügen, damit nicht alle 2 Minuten die Karte neu geladen und der Roboter abgeschossen wird.
- FHEM auf Intel NUC mit Proxmox -
- FTUI mit FUIP -
- HM, Zigbee,  WLAN -

laberlaib

Hallo,
nachdem hier das Homeoffice mit 2 Kindern immer überall Krümmel macht, möchte ich jetzt auch fixe Karte und Zonen auf meinem V1 möglich machen.

Aber ich komme bei der Installation nicht weiter:

Sauger hat Valetudo, ich hab root zugriff etc.
Wenn ich node testen will:
node -v
Dann kommt bei mir folgender Fehler:
node: error while loading shared libraries: libatomic.so.1: cannot open shared object file: No such file or directory
Googeln sagt mir, dass eine Datei fehlt, welche node benötigt in gewissen Versionen - die aktuelle für ARMv7 ist 12.16.2, die habe ich auf den Sauger geladen.

Bevor ich den Sauger jetzt mit Dateien zumüll - wovon ich gar nicht genau weiß, wie es geht - könnt Ihr mir sagen, mit welcher node-Version es bei Euch klappt?
Die würde ich dann unter "Previous Releases" ja finden und dann mit dieser Version weiter machen (und hoffentlich nur noch zum Danke sagen hier aufschlagen...).


Grüße
laberlaib


Edit: Hat sich erledigt - ich hab das dann ebenfalls per Skript erledigt.
--
Proxmox, Homematic, G-Tags, Zigbee2MQTT, Rhasspy Sprachsteuerung im Aufbau (beta)

dominik

Zitat von: KurtK am 07 April 2020, 17:27:42
So, dank diesem Thread habe ich jetzt auch endlich ein Restore der Karte beim V1 geschafft. Vielen Dank.

Wer dies bei seinem V1 auch machen möchte, hier meine Lösung:

Ein Shell-Script mit folgendem Inhalt als User fhem anlegen:
#!/bin/bash
roboip='<IP des Roboters>'
privatekey='<Speicherpfad + Dateiname des privaten Schlüssels>'
lastmap='<Speicherpfad + Dateiname der Karte>'
echo "reload map"
scp -i $privatekey $lastmap root@$roboip:/mnt/data/rockrobo/
echo "restart process"
ssh -i $privatekey root@$roboip 'killall player'
echo "finished"


Das Skript einmal in der Konsole ausführen um den Roboter zu den bekannten Hosts hinzuzufügen.


Abschließend lasse ich mit einem DOIF bei Rückkehr des Roboters in die Station die Karte resetten.

Bsp:
([MQTT2_kueche_robo] eq "docked") ({system('/opt/fhem/roboter/roboter.sh&');;})
Dabei das Reading des Roboter auf jeden Fall zu event-on-change-reading hinzufügen, damit nicht alle 2 Minuten die Karte neu geladen und der Roboter abgeschossen wird.

Danke für die Anleitung!

Könnte man das auch direkt am Saugroboter lösen? Die lastmap kann man in einem anderen Verzeichnis wegspeichern, aber mir fehlt noch die Information im Saugroboter wann er lädt. Hast du da vielleicht eine Idee?

//Edit
Ich glaube last_map wird immer am Ende des Saugvorgangs geschrieben - noch nicht 100% verifiziert. Wenn das der Fall ist, dann braeuchte man last_map nur alle paar Minuten pruefen und wenn es unterschiedlich zur gespeicherten Version ist einfach ueberschreiben.
fhempy -  https://github.com/fhempy/fhempy: GoogleCast, Tuya, UPnP, Ring, EQ3BT, Nespresso, Xiaomi, Spotify, Object Detection, ...
Kaffeespende: https://paypal.me/todominik