Backup der gespeicherten Karte

  • Vielen Dank im Voraus für deine Mühen!:thumbup:

  • Thyraz hat hier ja eine sehr geile Backup/Restore Lösung über den smarthome-Ansatz vorgestellt. Da bei uns eine Vollautomatisierung daran scheitert, dass man den Roboter zwangsläufig die Treppen hoch- und runtertragen muss (es gibt weder einen Aufzug, noch einen für den Robbi modifizierten Treppenlift), habe ich mir eine einfache Karten-/Etagenauswahl für mein Android-phone gebastelt. Falls Interesse daran besteht, könnte ich davon ein kleines Howto zusammenklöppeln... ;)


    Gruß

    Toby

  • Das klingt toll. Da finden sich sicherlich User, die sofort JA sagen!

  • Na dann wollen wir mal...ich hoffe ich kriege das einigermaßen verständlich erklärt...


    Erstmal ein grober Überblick was später möglich ist:
    Mit der app SSH Button wird die gewünschte Karte/Etage ausgewählt:

    SSH-Button_Beispiel.jpg

    Der Roboter quitiert das erfolgreiche Laden mit dem Abspielen eines Soundfiles. In meine Fall "Erdgeschoss geladen, Untergeschoss geladen, aktuelle Karte wiederhergestellt" usw.

    Nachdem man jetzt kurz die Komplettreinigung gestartet hat, erscheint die neu geladene Karte in der Mi Home app.


    Was braucht man dafür?

    • SSH Zugang auf dem Roboter
    • Für jede Karte/Etage ein "Lade-Skript"
    • Für jede Karte/Etage müssen die 4 benötigten Kartendateien "last_map", "user_map0", "PersistData_1.data" und "PersistData_2.data" vorliegen
    • Die Soundfiles kann man mit diversen "Text-to-Speech"-Online-Tools generieren. Ich finde "Deutsch - Arabella" bei notevibes kommt der Roborock-Stimme schon relativ nah. Die mp3s müssen dann noch in .wav-Dateien umgewandelt werden.
    • Auf dem Roboter muss "aplay" aus den alsa-utils installiert sein. (apt install alsa-utils)

    Alles weitere werde ich am Beispiel meiner Bastelei erklären, hier kann (und muss?) jeder natürlich die Datei- und Pfadnamen seinen Bedürfnissen anpassen.

    Wir legen einen Ordner "/mnt/data/MapManagement" an. In diesem Order befinden sich

    • Unterordner für jede Karte/Etage (/mnt/data/MapManagement/EG, /mnt/data/MapManagement/UG usw.) in diese Unterordner kopieren wir die jeweiligen 4 Kartendateien
    • Ordner für die Soundfiles (/mnt/data/MapManagement/Sounds)
    • die Lade-Skripte
    • Textdatei "ActiveMap.txt"

    Bei mir sieht das dann so aus:

    Ordner.jpg


    In der "ActiveMap.txt" wird die gerade geladene/"aktive" Karte/Etage (EG, UG, EG-Wisch usw.) eingetragen, später wird das in jedem Skript automatisch geändert.

    Ganz wichtig: Egal was man manuell kopiert, der Eintrag in der ActiveMap.txt muss immer mit den Karten-Dateien in /mnt/data/rockrobo übereinstimmen, sonst werden nachher vom Skript Karten mit falschen Dateien überschrieben!

    Bei meiner Variante wird, vor dem laden der neuen Karte, jeweils die alte gerade aktive Karte bzw. deren Status abgespeichert, wer also immer dieselbe "alte" Karte (wegen Türproblemen o.ä.) laden will, muss dies dementsprechend abändern.

    Hier mein "EG-load.sh"-Skript als Beispiel mit Erläuterungen. Vorweg; ich bin absoluter Skript-Anfänger, dies sind quasi meine ersten "Gehversuche", die Dinger funktionieren aber ich bin mir ziemlich sicher, dass man das ganze eleganter, schöner, effizienter, höher, weiter, schneller umsetzen kann.


    Dementsprechend sieht mein "UG-load.sh"-Skript so aus:

    Falls mal eine Karte "zerschossen" wurde hier mein "MapRestore.sh"-Skript:

    Jetzt müssen wir nur noch die Daten in der SSH-Button-app eintragen:

    • Label: Erdgeschoss laden
    • Command: . /mnt/data/MapManagement/EG-load.sh
    • SSH hostname: <IP des Roboters>
    • SSH username: root
    • SSH password: <leer>
    • Use private key: <aktivieren>
    • Select Private key file: <SSH private Schlüsseldatei auswählen>
    • SSH port: 22

    Soweit erstmal...ich hoffe das war jetzt nicht zu kompliziert erklärt...bei Fragen natürlich bitte fragen... ;)


    Gruß

    Toby

  • Achso...kleiner Nachtrag: es sollte ja selbstverständlich sein, dass man die Karten NICHT während einer Reinigung lädt, sondern nur wenn der Roboter auf dem Dock steht oder auf Anweisung wartet. ;)

  • Sehr cool, vielen Dank, Toby!

  • Gibt es einen Experten, der mitteilen kann, ob und wie das ganze mit Tasker bzw. Alexa+IFTTT anstelle von SSH Button ginge? Das wäre dann für mich die Jakobs Krönung aller Lösung. :thumbup:

  • Hallo zusammen,


    mal eine Frage...es ist aber doch nur nötig die Karten zu sichern wenn ich Sperrzonen habe, oder?

    Ansonsten müsste ich um das mit den geschlossenen Türen zu umgehen doch nur dafür sorgen das die Karten jedes mal neu erstellt wird oder?


    Gruß

    Lars

  • Klar, wenn Du eh nur die Komplettreinigung ohne Sperrzonen verwendest, brauchst Du natürlich keine Karten sichern. Es besteht ja kein "Sicherungszwang". :)

  • Hi,


    ich habe alles nach der Anleitung zusammengebaut, per Konsole werden auch die Sounds abgespielt. Also stimmt der Zugriff soweit. Allerdings kann ich die Skripte nicht per SSH Button starten. Beim Klick erscheint der Fehler "Returncode was 127". Nehme ich den Punkt am Anfang des relativen Pfads weg, kommt "Returncode was 126".

    Die Skripte habe ich auch ausführbar gemacht:

    -rw-r--r-- 1 root root 2 Jun 18 02:26 ActiveMap.txt

    -rwxr-xr-x 1 root root 914 Jun 18 02:49 MapRestore.sh

    drwxr-xr-x 2 root root 4096 Jun 18 10:18 OG

    -rwxr-xr-x 1 root root 942 Jun 18 02:46 OG-load.sh

    drwxr-xr-x 2 root root 4096 Jun 18 10:56 Sounds

    drwxr-xr-x 2 root root 4096 Jun 18 10:18 UG

    -rwxr-xr-x 1 root root 942 Jun 18 02:46 UG-load.sh

    -rwxr-xr-x 1 root root 64 Jun 19 03:04 test.sh


    Hat jemand eine Ahnung woran es haken kann?

  • Hmmm...mit welchem Editor hast Du die Skripte erstellt? Nicht, dass sich da Windows Zeilenenden eingeschlichen haben...ansonsten würde ich mal zum testen in ssh-button einen anderen Befehl (z.B. aplay /mnt/data/MapManagement/Sounds/EG.wav) versuchen, um sicher zu gehen, dass es wirklich an den Skripten und nicht an was anderem liegt...


    Gruß

    Toby

  • Hallo,

    erst einmal vielen Dank für den super Ansatz.

    Ich habe nach einigem Testen und Teilerfolgen noch zwei konkrete Fragen:

    • [...]
    • Auf dem Roboter muss "aplay" aus den alsa-utils installiert sein. (apt install alsa-utils)

    Wie gelingt hier die Installation?

    Ich bekomme immer folgenden Fehler:

    Package alsa-utils is not available, but is referred to by another package. This may mean that the package is missing, has been obsoleted, or is only available from another source

    Muss hier eine Source eingebunden werden? Wenn ja finde ich nicht welche und wie.

    Also ist bei mir im Moment mal noch alles stumm :(


    [...]

    Soweit erstmal...ich hoffe das war jetzt nicht zu kompliziert erklärt...bei Fragen natürlich bitte fragen... ;)


    Gruß

    Toby

    Dann noch eine Frage zu den Einstellungen in Valetudo 0.4.0

    Ist hier unter "Persistent Data" ein Hake zu setzen oder nicht.

    Es funktioniert bei mir noch nicht zuverlässig, dass die Karten in der GUI nach Wechsel und einem kurzen Start/Stop aktualisiert angezeigt werden.

    Manchmal ja, aber nicht zuverlässig immer.

    Was sind hier ggf. noch Knackpunkte?

    Gruß

    Meinolf

  • Ich bekomme immer folgenden Fehler:

    Package alsa-utils is not available, but is referred to by another package. This may mean that the package is missing, has been obsoleted, or is only available from another source

    mach mal vorher ein "apt update".

  • mach mal vorher ein "apt update".

    OH man Danke. Das hatte ich schon etliche Male gemacht und auch immer ne Fehlermeldung erhalten. Aber durch Deinen Hinweis bin ich nochmal intensiver dran gegangen und dann fiel es mir wie Schuppen von den Augen.

    Der Robo konnte gar nicht ins Internet, da ich ihm das in der FW untersagt hatte. Also FW auf und schon ging alles. Manchmal braucht man einen Anstoß.;)

  • Hallo,

    nachdem ich mir auch ein Multimap Feature überlegt hatte und vor dem Scripten natürlich gegoogelt habe, bin ich auf diesen Thread gestoßen. Super, dass Toby_CGN schon die meiste Arbeit erledigt hat. Einige Änderungen habe ich allerdings noch vorgenommen und die möchte ich euch jetzt auch zur Verfügung stellen.



    - Hauptänderung ist, dass man jetzt nur noch ein Script braucht, um den Raumwechsel auszuführen. Vorher musste man in jeden Ordner für einen Raum / Etage ein Script kopieren und es anpassen. Das ist Vergangenheit.


    - Zudem habe ich einen Raum für alles eingeführt. Diese Karte wird nicht gesichert und kann für Räume benutzt werden die keine Zonen benötigen. Diese Karte wird also immer gelöscht, wenn man in einen andere Etage wechselt und dann zum 'anderen Raum' zurück wechselt (oder man führt das neue clear Script aus).


    - Die Lautstärke kann nun angepasst werden (in der Datei volume.txt) und ist per default auf 30% gesetzt. Eigentlich wollte ich uart-test (ich glaube, das hieß so verwenden, aber ulkigerweise hat das nur funktioniert, wenn ich es auf der cli ausführte, nicht aber über ssh button??? Wenn also jemand weiß, woran das liegt...). Dafür bin ich zu sox gewechselt, das hat den Vorteil, dass man auch mp3 verwenden kann.


    - Nach dem Wechsel auf eine andere Etage/ Raum wird Valetudo neu gestartet.


    - Bevor kopiert wird, werden die betreffenden Karten aus dem rockrobo Verzeichnis gelöscht. Man kann also immer zwischen persistent und non persistent maps wechseln, ohne dass irgendwas vermischt wird.



    So, nun geht's los (den mit Quellcode markierten Code in die CLI kopieren und ausführen):


    1. sox muss installiert werden

    Code
    1. apt-get update



    Code
    1. apt-get install sox libsox-fmt-mp3


    Nun legen wir die Ordnerstruktur an. Wenn ihr an den Scripts nichts ändern wollt, einfach nachmachen, fehlen euch Räume/ Etagen in der Auflistung, dann legt diese an und ändert später das Script. Die einzelnen Zeilen nacheinander ausführen.



    anderes sollte immer vorhanden sein. Den Namen könnt ihr änderen. Das ist, wie schon erwähnt, der 'Raum für alles'.

    In _sounds landen dann die mp3 Dateien


    2. Die benötigten Files werden erstellt. Die einzelnen Zeilen nacheinander ausführen.

    Code
    1. touch /mnt/data/mapmanagement/activemap.txt
    2. touch /mnt/data/mapmanagement/volume.txt
    3. touch /mnt/data/mapmanagement/copy.sh
    4. touch /mnt/data/mapmanagement/restore.sh
    5. touch /mnt/data/mapmanagement/clear.sh


    volume.txt enthält in der ersten Zeile die Lautstärke im Format z.B. 0.5 für 50%.


    Code
    1. echo "0.3" > /mnt/data/mapmanagement/volume.txt


    copy.sh ist das Hauptscript und sichert die Maps des aktuellen Raumes und stellt die Maps der Raumes in der Parameterangabe wieder her.


    Code
    1. nano /mnt/data/mapmanagement/copy.sh


    dann den Code unten kopieren und ins Terminal einfügen (über dem Terminal RMB), dann STRG-O STRG-X



    restore.sh stellt Karten wieder her (siehe weiter unten).

    Code
    1. nano /mnt/data/mapmanagement/restore.sh


    nun wieder den Code unten kopieren und ins Terminal einfügen (über dem Terminal RMB), dann STRG-O STRG-X





    clear.sh löscht die aktuelle aktive Karte in /mnt/data/rockrobo/

    Ist an sich für den "anderen Raum" interessant, wenn man diesen beibehält, aber immer die Räume wechselt, werden sich die Karten überlappen. Damit kann man die Karte zurücksetzen. Oder man wechselt einfach auf eine andere Map und lädt danach wieder den 'anderen Raum'.

    Code
    1. nano /mnt/data/mapmanagement/clear.sh

    und ein letztes Mal den Code unten kopieren und ins Terminal einfügen (über dem Terminal RMB), dann STRG-O STRG-X



    3. Jetzt erstellen wir die mp3 Dateien für alle oben angeführten Subdirs von mapmanagement. Wie Toby_CGN mache ich das mit notevibes. Das umwandeln in wav entfällt. Ein spezielles Namensschema ist nun notwendig.

    mapZIMMER_geladen.mp3

    Wobei Zimmer mit den og Räumen identisch sein muss, also etwa mapbuero_geladen.mp3. Bei mir darf der Roborock dann etwa 'Raum Büro geladen' sagen.

    Es müssen also wieder, wie bei den Ordnern, folgende Räume berücksichtigt werden (es sei denn, ihr ändert etwas):

    kueche, wohnzimmer, keller, buero, flurEG, flurOG, EG, OG, anderes


    Zusätzlich müssen noch folgende Sounds kreiert werden:

    kein-gueltiger-raum.mp3

    aktuelle-karte-geloescht.mp3

    karte-bereits-aktiv.mp3

    karte-wiederhergestellt.mp3


    Das Soundfileschema gibt es in Zeile 65 von copy.sh. Dort kann man es, falls gewünscht, ändern.


    Die erstellten Dateien müssen in den Odner /mnt/data/mapmanagement/_sounds hochgeladen werden.



    Die Installation auf dem Roborock ist nun beendet.



    Will man die Benennung der Räume/ Etagen ändern oder welche hinzufügen, löschen, dann kann man das im copy.sh Zeile 20 machen. Der 'andere Raum' wird in Zeile 5 der copy.sh definiert. Die Lautstärke, wie schon gesagt wird in volume.txt definiert.



    Die Räume, Etagen kann man nun folgendermaßen ansprechen:


    Code
    1. bash /mnt/data/mapmanagement/copy.sh -r ZIMMER


    ZIMMER ersetzt ihr durch eine der oben angegebenen Auswahlen, z.B.


    Code
    1. bash /mnt/data/mapmanagement/copy.sh -r keller



    Ist man in ein Zimmer gewechselt (z.B. EG) und hat etwas herumgespielt und die Karte vernichtet, kann man sie wiederherstellen mit


    Code
    1. bash /mnt/data/mapmanagement/restore.sh


    Das stellt die Karte wieder her, in der der Robi glaubt er befindet sich. Wechselt man allerdings in einen anderen Raum mittels Script, wird überschrieben.



    Code
    1. bash /mnt/data/mapmanagement/clear.sh


    löscht die maps in /mnt/data/rockrobo/


    Wird man selten bis nie benötigen.



    Wie Toby_CGN habe löse ich diese Befehle mit der App SSH Button aus. Bisher läuft alles geschmeidig. Nach dem Laden einer Karte zeigt die Mapansicht 'no data'. Sobald der Roborock aber gestartet wird, wird die zuletzt gespeicherte Karte incl. zones, forbidden zones und virtual walls angezeigt.


    Viel Spass damit,

    Thomas



    P.S.: Falls ihr schon eine Map mit allen möglichen Zonen erstellt habt, kopiert doch die Files manuell in den zugehörigen backup folder des zugehörigen Raums, bevor ihr das Script zum ersten Mal ausführt.