Es ist einige Zeit vergangen und ich habe im Mai 2021 den Artikel leicht überarbeitet.
Der Staubsauger ist in der Cloud und mein Typ
Xiaomi Mi Robot Vacuum (rockrobo.vacuum.v1) wird auch noch von
höchster Instanz (CCC) genau analysiert!
Was bedeutet es einen Staubsauger mit Root Zugriff zu haben?!Markus hat gesagt: Es ist nur der ssh Zugriff - und irgendwann geht es vielleicht nicht mehr.
WLAN Zugang ändern und danach den Token neu auslesen - ist mit dem normalen Gerät ein Graus, aber mit ssh Zugang ganz einfach!?
Tobias hat mir mit seinem Beitrag die Hemmschwelle genommen - also los und Test!
Wie so oft: Meine Beschreibung wird auch irgendwann nicht mehr aktuell sein.
Die Grundlage steht hier https://github.com/dgiese/dustcloud
Stand Mai 2021 - gibt es einige weitere Entwicklungen und als aktuelle Quelle kann dieser Link
dienen:
Das mirobo Tool gibt es auch für Windows, ich habe ursprünglich die Linux
Version verwendet.Ich habe auch Valetudo getestet und in diesem Artikel beschrieben.
Vorbereitung
-
Der Roboter muss für den Flashvorgang in der Ladestation stehen!
- Um den Roboter ohne Token zu rooten, darf er noch nicht mit einem Wlan verbunden sein! In dem Fall braucht ein System welches man einfach mit dem initialen Wlan des Roboters verbinden kann.
- Hat man den Token des Roboters schon braucht man eine System im vollständig geroutetem Lan. Wlan oder das gleiche Netzwerksegment sind nicht nötig.
Software, Firmware - flashen
Man braucht das mirobo Tool und eine passende Firmware. Die Installation ist simpel:# Software installieren
sudo apt-get update
sudo apt-get install ccrypt python3-pip dos2unix
sudo pip3 install python-miio
Hat man den Token schon (war bei mir der Fall) kann man einfach die Funktion prüfen. Weiter unten habe ich die Ermittlung des Token für einen "jungfräulichen" Roboter beschrieben.
#ip Adresse und token ablegen um sich Tipparbeit zu sparen
export MIROBO_IP="<ip adresse - kein name>"
export MIROBO_TOKEN="<32 stelliger token>"
#Verbindung testen
mirobo status
Firmware
- fertige Firmware nehmen, z.B. von hier: https://vacuumz.info/download/
- Original Firmware patchen, ursprüngliche Beschreibung weiter unten.
Achtung: Dieser Vorgang ist auch zur zukünftigen Aktualisierung zu verwenden, mit der Xiaomi App würde man den gerooteten Zustand zerstören und muss von vorn beginnen!
Eventuell kann man die Host IP Adresse wegfallen lassen.
hip="<primäre host ip adresse>"
wget https://vacuumz.info/download/gen1/stock_root/root_4028.pkg
mirobo update-firmware --ip $hip root_4028.pkg
Der Flash- und Installationsvorgang dauert einige Minuten, als Abschluss bootet der Roboter neu. Das vorgegebene Passwort steht auf der Webseite mit der Firmware. Bei einem Update wird das Passwort überschrieben.Schlägt dieser Vorgang fehl, hat man eventuell vergessen den Update Schutz (weiter unten) wieder zu entfernen.
ssh root@rockrobo
# Nach dem ersten Login neues root passwort setzen.
passwd
Der Sauger ist weiterhin in der App und in FHEM verfügbar. Was man sich dank
des Tools mirobo noch gönnen kann, ist eine deutsche Sprachdatei, das wäre
aber wohl auch ohne root gegangen!? (Alternativ gibt es Sprachpakete auch auf der vacuumz Seite)
wget https://builder.dontvacuum.me/pkg/voice-v1/de.pkg
mirobo install-sound de.pkg
Originale Firmware patchen
Dieser Teil der Beschreibung ist 2021 nicht neu getestet, ich verwende jetzt die fertige Firmware.
Was hier eigentlich passiert ist keine Magie: die Originale Firmware wird entpackt/entschlüsselt, der ssh Zugang wird freigeschaltet und anschließend wird das Firmware Paket wieder zusammengebaut und auf die Sauger geflashed. Dazu wird das Tool mirobo und ein flasher Script verwendet, man muss also selbst nicht viel tun.
Den gesamten Vorgang schreib ich mal ein einem Block mit ein paar Kommentaren. Achtung: Ich starte aus dem Login des normalen User Pi, ohne sudo su!
Was hier eigentlich passiert ist keine Magie: die Originale Firmware wird entpackt/entschlüsselt, der ssh Zugang wird freigeschaltet und anschließend wird das Firmware Paket wieder zusammengebaut und auf die Sauger geflashed. Dazu wird das Tool mirobo und ein flasher Script verwendet, man muss also selbst nicht viel tun.
Den gesamten Vorgang schreib ich mal ein einem Block mit ein paar Kommentaren. Achtung: Ich starte aus dem Login des normalen User Pi, ohne sudo su!
# ssh Key erzeugen, File bestätigen, Frage nach passphrase zweimal bestätigen (keine Passphrase!)
ssh-keygen -t rsa -b 4096 -C "RockRobo"
#Arbeitspfad erzeugen
mkdir dc && cd dc
#nur die drei Dateien laden und nicht das ganze Repository
wget https://raw.githubusercontent.com/dgiese/dustcloud/master/devices/xiaomi.vacuum/firmwarebuilder/imagebuilder.sh
wget https://raw.githubusercontent.com/dgiese/dustcloud/master/devices/xiaomi.vacuum/firmwarebuilder/flasher.py
wget https://raw.githubusercontent.com/dgiese/dustcloud/master/devices/xiaomi.vacuum/firmwarebuilder/adbd
# den Key ins Verzeichnis kopieren
cp ~/.ssh/id_rsa.pub .
Ab diesem Schritt muss man den Vorgang für jede zukünftige Firmware
wiederholen.Die alten Links funktionieren zum Teil nicht mehr. Mal hier schauen
https://builder.dontvacuum.me/pkg
Der Inhalt der Datei wifi.conf entspricht ein bisschen dem Inhalt der Datei wpa_supplicant.conf. Quelle Ich arbeite gern mit nano, vi ist vorhanden und braucht nicht installiert zu werden.
Was ist mit neuer Firmware? Es gibt eine Liste getesteter Firmware, aber welche ist gut, aktuell, neu?
Die Mi Home App hat mir ein Update angeboten, die Flole App hat andere Updates angeboten, was bedeutet denn fullos.pkg oder app.pkg? Das Update der Mi Home App (v11_003476.app.pkg) war nur 29 MB groß. Die Aufbereitung mit dem imagebuilder schlug fehl. Die Versionsnummer hatte einen "Sprung" 3.5.0 statt 3.3.9 - was soll man tun?
Ich war so mutig, habe die Updates wieder aktiviert und versucht: Damit war mein Root Zugang weg. Und nun? Es bleibt nur Factory Reset!
Es gibt drei Arten von Reset (neben einfach aus und wieder einschalten)
Dafür braucht man jetzt einen Linux Rechner, den man mit dem offenen Wlan des Rockrobo verbinden kann. Und irgendwo stand: man darf kein zweites Netzwerkinterface haben. Also hab ich einfach Monitor und Tastatur an meinen schon vorbereiteten Raspberry Zero angesteckt.
Achtung! Der Rockrobo hat im AP Mode nicht all zuviel Leistung! Zum Flashen muss der Linux Rechner und der Roboter im gleichen Raum im Umkreis weniger Meter und in der Ladestation stehen!
Ich bin gewohnt Wlanverbindungen über die Datei /etc/wpa_supplicant/wpa_supplicant.conf einzurichten. Nach kurzem Test war klar: Geht universell und auch ohne WPA. Man muss die exakte ssid mit dem Befehl sudo iwlist scan scannen und dann die Datei so abändern.
In diesem Stadium gibt der Rockrobo seinen Token einfach so her. Der Befehl zum Test:
#Bei mir ging dieser Link
wget https://cdn.awsde0.fds.api.mi-img.com/updpkg/v11_003468.fullos.pkg
#oder der
#wget https://dustbuilder.xvm.mit.edu/pkg/v1/3.3.9_003468/v11_003468.fullos.pkg
#Image erzeugen - der Vorgang läuft ein Weilchen...
sudo bash ./imagebuilder.sh -f v11_003468.fullos.pkg -k id_rsa.pub -t Europe/Berlin
#Wenn alles Fehlerfrei lief kann man jetzt das Image flashen:
sudo python3 flasher.py -a IP-Adresse -t 32-Stellen -f output/v11_003468.fullos.pkg
Jetzt wird der Staubsauger automatisch neu starten und meldet sich mit seiner
Melodie zurück. Danach kann man sich per ssh einloggen. Das geht beim ersten
Mal nur mit dem Account (und dem Key) der das Kommando ssh-keygen (siehe oben)
ausgeführt hat!
Was geht jetzt mit "root"?
- ssh Login
- Wlan Konfiguration ohne Reset
- Token auslesen.
- direkt auf dem Roboter Software installieren
- Den Rockrobo aus der Cloud aussperren
- die Karten sichern ...
printf $(cat /mnt/data/miio/device.token) | xxd -p
Wlan ohne reset ändern. Der Token bleibt dabei erhalten!Der Inhalt der Datei wifi.conf entspricht ein bisschen dem Inhalt der Datei wpa_supplicant.conf. Quelle Ich arbeite gern mit nano, vi ist vorhanden und braucht nicht installiert zu werden.
apt-get update
apt-get install nano
nano /mnt/data/miio/wifi.conf
reboot
Damit man nicht mit der App ein update durchführt, kann man zur Sicherheit
die Updates erstmal verhindern.mv /usr/bin/ccrypt /usr/bin/ccrypt_
touch /usr/bin/ccrypt
chmod +x /usr/bin/ccrypt
Will man wie oben beschrieben die Firmware aktualisieren, muss man den Schutz vorher wieder aufheben.
rm /usr/bin/ccrypt_
mv /usr/bin/ccrypt_ /usr/bin/ccrypt
Kleines Zwischenspiel mit Folgen
Mir ist aus keiner der Beschreibungen im Internet so richtig klar geworden wie es "weitergeht"!Was ist mit neuer Firmware? Es gibt eine Liste getesteter Firmware, aber welche ist gut, aktuell, neu?
Die Mi Home App hat mir ein Update angeboten, die Flole App hat andere Updates angeboten, was bedeutet denn fullos.pkg oder app.pkg? Das Update der Mi Home App (v11_003476.app.pkg) war nur 29 MB groß. Die Aufbereitung mit dem imagebuilder schlug fehl. Die Versionsnummer hatte einen "Sprung" 3.5.0 statt 3.3.9 - was soll man tun?
Ich war so mutig, habe die Updates wieder aktiviert und versucht: Damit war mein Root Zugang weg. Und nun? Es bleibt nur Factory Reset!
Es gibt drei Arten von Reset (neben einfach aus und wieder einschalten)
- WiFi Reset: beide Tasten auf der Oberseite (Home und Ein/Aus) drücken und Nachricht abwarten. Danach ist WiFi gelöscht und man kann den Sauger mit der Mi Home App neu anlernen.
- Reset: Taster unter dem Deckel mit Stift o.ä. drücken. Danach wird das System neu gestartet und WiFi ist gelöscht.
- Factory Reset: Home drücken und halten, Reset Taster mit Stift/Büroklammer drücken, Home weiterhin halten bis die Nachricht für Factory Reset ertönt. Danach ist softwaretechnisch der Auslieferungszustand erreicht. Die Logs über Verbrauch usw. scheinen erhalten zu bleiben.
Rooten nach dem Auspacken/Factory Reset
Das ist eigentlich zu empfehlen, damit kommt man unkompliziert an den Token und kann das Wlan leicht verwalten. Das Anlernen an die App (falls man das will) macht man erst nach dem rooten.Dafür braucht man jetzt einen Linux Rechner, den man mit dem offenen Wlan des Rockrobo verbinden kann. Und irgendwo stand: man darf kein zweites Netzwerkinterface haben. Also hab ich einfach Monitor und Tastatur an meinen schon vorbereiteten Raspberry Zero angesteckt.
Achtung! Der Rockrobo hat im AP Mode nicht all zuviel Leistung! Zum Flashen muss der Linux Rechner und der Roboter im gleichen Raum im Umkreis weniger Meter und in der Ladestation stehen!
Ich bin gewohnt Wlanverbindungen über die Datei /etc/wpa_supplicant/wpa_supplicant.conf einzurichten. Nach kurzem Test war klar: Geht universell und auch ohne WPA. Man muss die exakte ssid mit dem Befehl sudo iwlist scan scannen und dann die Datei so abändern.
country=DE
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
ssid="rockrobo-vacuum-v1_miapF0C8"
key_mgmt=NONE
}
Ich musste den Raspberry neu starten um die Verbindung mit dem offenen Wlan
herzustellen.In diesem Stadium gibt der Rockrobo seinen Token einfach so her. Der Befehl zum Test:
mirobo discover --handshake true
Auch der Flash Befehl geht etwas "einfacher" (der oben gezeigte mirobo Befehl sollte auch funktionieren):sudo python3 flasher.py -f output/v11_003468.fullos.pkg
Nach dem Neustart und erfolgreichem ssh Login kann man entweder den Rockrobo
direkt mit dem Wlan verbinden oder falls man die Mi Home App nutzen will, den
Rockrobo mit der App einrichten.Ein paar Zusatzinfos
Ich habe auch mal probiert den Token (steht in /mnt/data/miio/device.token) selbst zu setzen, weil man vielleicht zu faul ist den in FHEM zu ändern. Dafür muss man ihn ins interne Format wandeln.echo "44446e74695a4445713547644a79444d" |xxd -r -p
Man kann auch das interne root Passwort auslesen. Ich habe die Richtigkeit von
diesem Code nicht überprüft.
Auf der Webseite schauen welche Firmware getestet ist!
perl -e 'print(join("", (map { chr(ord($_) ^ 0x37) } split(//, $ARGV[0]))), "\n");' `cat /mnt/default/vinda`
Für die Zukunft
Keine Updates über irgend eine App!Auf der Webseite schauen welche Firmware getestet ist!
Eventuell
Valetudo RE
installieren oder neue Firmware flashen.
Keine Kommentare:
Kommentar veröffentlichen