Vielen Dank im Voraus für deine Mühen!
Backup der gespeicherten Karte
-
-
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: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:
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.
Shell-Script- #!/bin/bash
- activemap=$(</mnt/data/MapManagement/ActiveMap.txt) #Variable wird aus der Textdatei gelesen
- if [ $activemap = "EG" ] #wenn EG-Karte schon geladen/aktiv soll nichts passieren
- then
- aplay /mnt/data/MapManagement/Sounds/NoChange.wav
- exit 0
- fi
- if [ $activemap = "UG" ] #wenn UG-Karte aktiv
- then
- cp -p /mnt/data/rockrobo/last_map /mnt/data/MapManagement/UG #alte UG-Dateien mit neuen überschreiben
- cp -p /mnt/data/rockrobo/user_map0 /mnt/data/MapManagement/UG #alte UG-Dateien mit neuen überschreiben
- cp -p /mnt/data/rockrobo/PersistData_1.data /mnt/data/MapManagement/UG #alte UG-Dateien mit neuen überschreiben
- cp -p /mnt/data/rockrobo/PersistData_2.data /mnt/data/MapManagement/UG #alte UG-Dateien mit neuen überschreiben
- cp -p /mnt/data/MapManagement/EG/last_map /mnt/data/rockrobo #EG-Dateien kopieren
- cp -p /mnt/data/MapManagement/EG/user_map0 /mnt/data/rockrobo #EG-Dateien kopieren
- cp -p /mnt/data/MapManagement/EG/PersistData_1.data /mnt/data/rockrobo #EG-Dateien kopieren
- cp -p /mnt/data/MapManagement/EG/PersistData_2.data /mnt/data/rockrobo #EG-Dateien kopieren
- echo "EG" > /mnt/data/MapManagement/ActiveMap.txt #EG-Karte als aktiv in Textfile schreiben
- aplay /mnt/data/MapManagement/Sounds/EG.wav #Soundfile "Erdgeschoss geladen" abspielen
- exit 0
- fi
- if [ $activemap = "EG-Wisch" ] #wenn EG-Wischkarte aktiv
- then
- cp -p /mnt/data/rockrobo/last_map /mnt/data/MapManagement/EG-Wisch
- cp -p /mnt/data/rockrobo/user_map0 /mnt/data/MapManagement/EG-Wisch
- cp -p /mnt/data/rockrobo/PersistData_1.data /mnt/data/MapManagement/EG-Wisch
- cp -p /mnt/data/rockrobo/PersistData_2.data /mnt/data/MapManagement/EG-Wisch
- cp -p /mnt/data/MapManagement/EG/last_map /mnt/data/rockrobo
- cp -p /mnt/data/MapManagement/EG/user_map0 /mnt/data/rockrobo
- cp -p /mnt/data/MapManagement/EG/PersistData_1.data /mnt/data/rockrobo
- cp -p /mnt/data/MapManagement/EG/PersistData_2.data /mnt/data/rockrobo
- echo "EG" > /mnt/data/MapManagement/ActiveMap.txt
- aplay /mnt/data/MapManagement/Sounds/EG.wav
- exit 0
- fi
Dementsprechend sieht mein "UG-load.sh"-Skript so aus:
Shell-Script- #!/bin/bash
- activemap=$(</mnt/data/MapManagement/ActiveMap.txt)
- if [ "$activemap" = "UG" ]
- then
- aplay /mnt/data/MapManagement/Sounds/NoChange.wav
- exit 0
- fi
- if [ "$activemap" = "EG" ]
- then
- cp -p /mnt/data/rockrobo/last_map /mnt/data/MapManagement/EG
- cp -p /mnt/data/rockrobo/user_map0 /mnt/data/MapManagement/EG
- cp -p /mnt/data/rockrobo/PersistData_1.data /mnt/data/MapManagement/EG
- cp -p /mnt/data/rockrobo/PersistData_2.data /mnt/data/MapManagement/EG
- cp -p /mnt/data/MapManagement/UG/last_map /mnt/data/rockrobo
- cp -p /mnt/data/MapManagement/UG/user_map0 /mnt/data/rockrobo
- cp -p /mnt/data/MapManagement/UG/PersistData_1.data /mnt/data/rockrobo
- cp -p /mnt/data/MapManagement/UG/PersistData_2.data /mnt/data/rockrobo
- echo "UG" > /mnt/data/MapManagement/ActiveMap.txt
- aplay /mnt/data/MapManagement/Sounds/UG.wav
- exit 0
- fi
- if [ "$activemap" = "EG-Wisch" ]
- then
- cp -p /mnt/data/rockrobo/last_map /mnt/data/MapManagement/EG-Wisch
- cp -p /mnt/data/rockrobo/user_map0 /mnt/data/MapManagement/EG-Wisch
- cp -p /mnt/data/rockrobo/PersistData_1.data /mnt/data/MapManagement/EG-Wisch
- cp -p /mnt/data/rockrobo/PersistData_2.data /mnt/data/MapManagement/EG-Wisch
- cp -p /mnt/data/MapManagement/UG/last_map /mnt/data/rockrobo
- cp -p /mnt/data/MapManagement/UG/user_map0 /mnt/data/rockrobo
- cp -p /mnt/data/MapManagement/UG/PersistData_1.data /mnt/data/rockrobo
- cp -p /mnt/data/MapManagement/UG/PersistData_2.data /mnt/data/rockrobo
- echo "UG" > /mnt/data/MapManagement/ActiveMap.txt
- aplay /mnt/data/MapManagement/Sounds/UG.wav
- exit 0
- fi
Falls mal eine Karte "zerschossen" wurde hier mein "MapRestore.sh"-Skript:
Shell-Script- #!/bin/bash
- activemap=$(</mnt/data/MapManagement/ActiveMap.txt)
- if [ "$activemap" = "EG" ]
- then
- cp -p /mnt/data/MapManagement/EG/last_map /mnt/data/rockrobo
- cp -p /mnt/data/MapManagement/EG/user_map0 /mnt/data/rockrobo
- cp -p /mnt/data/MapManagement/EG/PersistData_1.data /mnt/data/rockrobo
- cp -p /mnt/data/MapManagement/EG/PersistData_2.data /mnt/data/rockrobo
- aplay /mnt/data/MapManagement/Sounds/MapRestored.wav
- exit 0
- fi
- if [ "$activemap" = "UG" ]
- then
- cp -p /mnt/data/MapManagement/UG/last_map /mnt/data/rockrobo
- cp -p /mnt/data/MapManagement/UG/user_map0 /mnt/data/rockrobo
- cp -p /mnt/data/MapManagement/UG/PersistData_1.data /mnt/data/rockrobo
- cp -p /mnt/data/MapManagement/UG/PersistData_2.data /mnt/data/rockrobo
- aplay /mnt/data/MapManagement/Sounds/MapRestored.wav
- exit 0
- fi
- if [ "$activemap" = "EG-Wisch" ]
- then
- cp -p /mnt/data/MapManagement/EG-Wisch/last_map /mnt/data/rockrobo
- cp -p /mnt/data/MapManagement/EG-Wisch/user_map0 /mnt/data/rockrobo
- cp -p /mnt/data/MapManagement/EG-Wisch/PersistData_1.data /mnt/data/rockrobo
- cp -p /mnt/data/MapManagement/EG-Wisch/PersistData_2.data /mnt/data/rockrobo
- aplay /mnt/data/MapManagement/Sounds/MapRestored.wav
- exit 0
- fi
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!
-
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: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:
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.
Shell-Script- #!/bin/bash
- activemap=$(</mnt/data/MapManagement/ActiveMap.txt) #Variable wird aus der Textdatei gelesen
- if [ $activemap = "EG" ] #wenn EG-Karte schon geladen/aktiv soll nichts passieren
- then
- aplay /mnt/data/MapManagement/Sounds/NoChange.wav
- exit 0
- fi
- if [ $activemap = "UG" ] #wenn UG-Karte aktiv
- then
- cp -p /mnt/data/rockrobo/last_map /mnt/data/MapManagement/UG #alte UG-Dateien mit neuen überschreiben
- cp -p /mnt/data/rockrobo/user_map0 /mnt/data/MapManagement/UG #alte UG-Dateien mit neuen überschreiben
- cp -p /mnt/data/rockrobo/PersistData_1.data /mnt/data/MapManagement/UG #alte UG-Dateien mit neuen überschreiben
- cp -p /mnt/data/rockrobo/PersistData_2.data /mnt/data/MapManagement/UG #alte UG-Dateien mit neuen überschreiben
- cp -p /mnt/data/MapManagement/EG/last_map /mnt/data/rockrobo #EG-Dateien kopieren
- cp -p /mnt/data/MapManagement/EG/user_map0 /mnt/data/rockrobo #EG-Dateien kopieren
- cp -p /mnt/data/MapManagement/EG/PersistData_1.data /mnt/data/rockrobo #EG-Dateien kopieren
- cp -p /mnt/data/MapManagement/EG/PersistData_2.data /mnt/data/rockrobo #EG-Dateien kopieren
- echo "EG" > /mnt/data/MapManagement/ActiveMap.txt #EG-Karte als aktiv in Textfile schreiben
- aplay /mnt/data/MapManagement/Sounds/EG.wav #Soundfile "Erdgeschoss geladen" abspielen
- exit 0
- fi
- if [ $activemap = "EG-Wisch" ] #wenn EG-Wischkarte aktiv
- then
- cp -p /mnt/data/rockrobo/last_map /mnt/data/MapManagement/EG-Wisch
- cp -p /mnt/data/rockrobo/user_map0 /mnt/data/MapManagement/EG-Wisch
- cp -p /mnt/data/rockrobo/PersistData_1.data /mnt/data/MapManagement/EG-Wisch
- cp -p /mnt/data/rockrobo/PersistData_2.data /mnt/data/MapManagement/EG-Wisch
- cp -p /mnt/data/MapManagement/EG/last_map /mnt/data/rockrobo
- cp -p /mnt/data/MapManagement/EG/user_map0 /mnt/data/rockrobo
- cp -p /mnt/data/MapManagement/EG/PersistData_1.data /mnt/data/rockrobo
- cp -p /mnt/data/MapManagement/EG/PersistData_2.data /mnt/data/rockrobo
- echo "EG" > /mnt/data/MapManagement/ActiveMap.txt
- aplay /mnt/data/MapManagement/Sounds/EG.wav
- exit 0
- fi
Dementsprechend sieht mein "UG-load.sh"-Skript so aus:
Shell-Script- #!/bin/bash
- activemap=$(</mnt/data/MapManagement/ActiveMap.txt)
- if [ "$activemap" = "UG" ]
- then
- aplay /mnt/data/MapManagement/Sounds/NoChange.wav
- exit 0
- fi
- if [ "$activemap" = "EG" ]
- then
- cp -p /mnt/data/rockrobo/last_map /mnt/data/MapManagement/EG
- cp -p /mnt/data/rockrobo/user_map0 /mnt/data/MapManagement/EG
- cp -p /mnt/data/rockrobo/PersistData_1.data /mnt/data/MapManagement/EG
- cp -p /mnt/data/rockrobo/PersistData_2.data /mnt/data/MapManagement/EG
- cp -p /mnt/data/MapManagement/UG/last_map /mnt/data/rockrobo
- cp -p /mnt/data/MapManagement/UG/user_map0 /mnt/data/rockrobo
- cp -p /mnt/data/MapManagement/UG/PersistData_1.data /mnt/data/rockrobo
- cp -p /mnt/data/MapManagement/UG/PersistData_2.data /mnt/data/rockrobo
- echo "UG" > /mnt/data/MapManagement/ActiveMap.txt
- aplay /mnt/data/MapManagement/Sounds/UG.wav
- exit 0
- fi
- if [ "$activemap" = "EG-Wisch" ]
- then
- cp -p /mnt/data/rockrobo/last_map /mnt/data/MapManagement/EG-Wisch
- cp -p /mnt/data/rockrobo/user_map0 /mnt/data/MapManagement/EG-Wisch
- cp -p /mnt/data/rockrobo/PersistData_1.data /mnt/data/MapManagement/EG-Wisch
- cp -p /mnt/data/rockrobo/PersistData_2.data /mnt/data/MapManagement/EG-Wisch
- cp -p /mnt/data/MapManagement/UG/last_map /mnt/data/rockrobo
- cp -p /mnt/data/MapManagement/UG/user_map0 /mnt/data/rockrobo
- cp -p /mnt/data/MapManagement/UG/PersistData_1.data /mnt/data/rockrobo
- cp -p /mnt/data/MapManagement/UG/PersistData_2.data /mnt/data/rockrobo
- echo "UG" > /mnt/data/MapManagement/ActiveMap.txt
- aplay /mnt/data/MapManagement/Sounds/UG.wav
- exit 0
- fi
Falls mal eine Karte "zerschossen" wurde hier mein "MapRestore.sh"-Skript:
Shell-Script- #!/bin/bash
- activemap=$(</mnt/data/MapManagement/ActiveMap.txt)
- if [ "$activemap" = "EG" ]
- then
- cp -p /mnt/data/MapManagement/EG/last_map /mnt/data/rockrobo
- cp -p /mnt/data/MapManagement/EG/user_map0 /mnt/data/rockrobo
- cp -p /mnt/data/MapManagement/EG/PersistData_1.data /mnt/data/rockrobo
- cp -p /mnt/data/MapManagement/EG/PersistData_2.data /mnt/data/rockrobo
- aplay /mnt/data/MapManagement/Sounds/MapRestored.wav
- exit 0
- fi
- if [ "$activemap" = "UG" ]
- then
- cp -p /mnt/data/MapManagement/UG/last_map /mnt/data/rockrobo
- cp -p /mnt/data/MapManagement/UG/user_map0 /mnt/data/rockrobo
- cp -p /mnt/data/MapManagement/UG/PersistData_1.data /mnt/data/rockrobo
- cp -p /mnt/data/MapManagement/UG/PersistData_2.data /mnt/data/rockrobo
- aplay /mnt/data/MapManagement/Sounds/MapRestored.wav
- exit 0
- fi
- if [ "$activemap" = "EG-Wisch" ]
- then
- cp -p /mnt/data/MapManagement/EG-Wisch/last_map /mnt/data/rockrobo
- cp -p /mnt/data/MapManagement/EG-Wisch/user_map0 /mnt/data/rockrobo
- cp -p /mnt/data/MapManagement/EG-Wisch/PersistData_1.data /mnt/data/rockrobo
- cp -p /mnt/data/MapManagement/EG-Wisch/PersistData_2.data /mnt/data/rockrobo
- aplay /mnt/data/MapManagement/Sounds/MapRestored.wav
- exit 0
- fi
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
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.
-
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
-
Ja, es hakte offensichtlich beim Hineinkopieren des Codes in die Skriptdatei. Jetzt funktioniert es, danke für den Hinweis!
-
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
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.
Code- mkdir /mnt/data/mapmanagement
- mkdir /mnt/data/mapmanagement/EG
- mkdir /mnt/data/mapmanagement/OG
- mkdir /mnt/data/mapmanagement/keller
- mkdir /mnt/data/mapmanagement/kueche
- mkdir /mnt/data/mapmanagement/buero
- mkdir /mnt/data/mapmanagement/wohnzimmer
- mkdir /mnt/data/mapmanagement/flurEG
- mkdir /mnt/data/mapmanagement/flurOG
- mkdir /mnt/data/mapmanagement/anderes
- mkdir /mnt/data/mapmanagement/_sounds
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.
volume.txt enthält in der ersten Zeile die Lautstärke im Format z.B. 0.5 für 50%.
copy.sh ist das Hauptscript und sichert die Maps des aktuellen Raumes und stellt die Maps der Raumes in der Parameterangabe wieder her.
dann den Code unten kopieren und ins Terminal einfügen (über dem Terminal RMB), dann STRG-O STRG-X
Shell-Script- #!/bin/bash
- # übergebenen Parameter lesen und in Variable speichern
- # Raum für alles (wird nicht gespeichert)
- ANDERES="anderes"; #hier den Namen für 'alle anderen Zimmer/ Etagen' eintragen (maps hierfür werden nicht gespeichert, also für alle Räume, die keine Zonen brauchen)
- # Einstellung der Lautstärke aus volume.txt
- VOLUME=$(</mnt/data/mapmanagement/volume.txt)
- while getopts r:v: option
- do
- case "${option}" in
- r) ROOM=${OPTARG};;
- v) VOLUME=${OPTARG};;
- esac
- done
- # Gelesenen Parameter auf Existenz überprüfen, hier müssen die vorhandenen Zimmer, Etagen eingetragen werden bis auf $ANDERES (nicht ändern)
- case $ROOM in
- kueche | wohnzimmer | keller | buero | flurEG | flurOG | EG | OG |$ANDERES );;
- *)
- sox -v $VOLUME -q /mnt/data/mapmanagement/_sounds/kein-gueltiger-raum.mp3 -d
- exit 0;
- esac
- ACTIVEMAP=$(</mnt/data/mapmanagement/activemap.txt) #Aktueller Standorts wird aus der Textdatei gelesen und in einer Variablen gespeichert
- if [ $ACTIVEMAP = $ROOM ]; #wenn EG-Karte schon geladen/aktiv soll nichts passieren (Vergleich mit übergeb. Parameter)
- then
- sox -v $VOLUME -q /mnt/data/mapmanagement/_sounds/karte-bereits-aktiv.mp3 -d
- exit 0
- fi
- if [ $ROOM = $ANDERES ];
- then
- # für die Möglichkeit, den 'Raum für alles' zu haben, werden erst die vorhanden Maps gesichert und dann gelöscht, maps anderes werden nicht gesichert
- cp --preserve "/mnt/data/rockrobo/last_map" "/mnt/data/mapmanagement/$ACTIVEMAP/"
- cp --preserve "/mnt/data/rockrobo/user_map0" "/mnt/data/mapmanagement/$ACTIVEMAP/"
- cp --preserve "/mnt/data/rockrobo/PersistData_1.data" "/mnt/data/mapmanagement/$ACTIVEMAP/"
- cp --preserve "/mnt/data/rockrobo/PersistData_2.data" "/mnt/data/mapmanagement/$ACTIVEMAP/"
- rm "/mnt/data/rockrobo/PersistData_*"
- rm "/mnt/data/rockrobo/user_map0"
- rm "/mnt/data/rockrobo/last_map"
- else
- #aktive Kartendateien in das Verzeichnis sichern, das in avtivemap.txt angegeben ist
- cp --preserve "/mnt/data/rockrobo/last_map" "/mnt/data/mapmanagement/$ACTIVEMAP/"
- cp --preserve "/mnt/data/rockrobo/user_map0" "/mnt/data/mapmanagement/$ACTIVEMAP/"
- cp --preserve "/mnt/data/rockrobo/PersistData_1.data" "/mnt/data/mapmanagement/$ACTIVEMAP/"
- cp --preserve "/mnt/data/rockrobo/PersistData_2.data" "/mnt/data/mapmanagement/$ACTIVEMAP/"
- # PeristData, user_map0 und last_map werden gelöscht, da nicht immer alle geschrieben werden (zB wenn Persistent Data nicht eingeschaltet war)
- rm /mnt/data/rockrobo/PersistData_*
- rm /mnt/data/rockrobo/user_map0
- rm /mnt/data/rockrobo/last_map
- # Map zurückschreiben, die im Parameter übergeben wurde
- cp --preserve "/mnt/data/mapmanagement/$ROOM/last_map" "/mnt/data/rockrobo/"
- cp --preserve "/mnt/data/mapmanagement/$ROOM/user_map0" "/mnt/data/rockrobo/"
- cp --preserve "/mnt/data/mapmanagement/$ROOM/PersistData_1.data" "/mnt/data/rockrobo/"
- cp --preserve "/mnt/data/mapmanagement/$ROOM/PersistData_2.data" "/mnt/data/rockrobo/"
- fi
- echo "$ROOM" > "/mnt/data/mapmanagement/activemap.txt" #im Parameter übergebenen Raum als aktiv in Textfile schreiben
- sox -v $VOLUME -q /mnt/data/mapmanagement/_sounds/map"$ROOM"_geladen.mp3 -d #Soundfile abspielen
- #Valetudo neu statrten
- service valetudo restart
- exit 0
restore.sh stellt Karten wieder her (siehe weiter unten).
nun wieder den Code unten kopieren und ins Terminal einfügen (über dem Terminal RMB), dann STRG-O STRG-X
Shell-Script- #!/bin/bash
- # Einstellung der Lautstärke aus volume.txt
- VOLUME=$(</mnt/data/mapmanagement/volume.txt)
- #Aktueller Standorts wird aus der Textdatei gelesen und in einer Variablen gespeichert
- ACTIVEMAP=$(</mnt/data/mapmanagement/activemap.txt)
- # Map zurückschreiben, die im Parameter übergeben wurde
- cp --preserve "/mnt/data/mapmanagement/$ACTIVEMAP/last_map" "/mnt/data/rockrobo/"
- cp --preserve "/mnt/data/mapmanagement/$ACTIVEMAP/user_map0" "/mnt/data/rockrobo/"
- cp --preserve "/mnt/data/mapmanagement/$ACTIVEMAP/PersistData_1.data" "/mnt/data/rockrobo/"
- cp --preserve "/mnt/data/mapmanagement/$ACTIVEMAP/PersistData_2.data" "/mnt/data/rockrobo/"
- sox -v $VOLUME -q /mnt/data/mapmanagement/_sounds/map"$ACTIVEMAP"_geladen.mp3 -d #Soundfile abspielen
- sox -v $VOLUME -q /mnt/data/mapmanagement/_sounds/karte-wiederhergestellt.mp3 -d
- #Valetudo neu starten
- service valetudo restart
- exit 0
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'.
und ein letztes Mal den Code unten kopieren und ins Terminal einfügen (über dem Terminal RMB), dann STRG-O STRG-X
Shell-Script- #!/bin/bash
- # Einstellung der Lautstärke aus volume.txt
- VOLUME=$(</mnt/data/mapmanagement/volume.txt)
- # PeristData, user_map0 und last_map werden gelöscht
- rm /mnt/data/rockrobo/PersistData_*
- rm /mnt/data/rockrobo/user_map0
- rm /mnt/data/rockrobo/last_map
- sox -v $VOLUME -q /mnt/data/mapmanagement/_sounds/aktuelle-karte-geloescht.mp3 -d #Soundfile abspielen
- #Valetudo neu starten
- service valetudo restart
- exit 0
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:
ZIMMER ersetzt ihr durch eine der oben angegebenen Auswahlen, z.B.
Ist man in ein Zimmer gewechselt (z.B. EG) und hat etwas herumgespielt und die Karte vernichtet, kann man sie wiederherstellen mit
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.
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.