Einleitung

Diese Anleitung dient dazu einen Roborock S50 (auch unter Roborock S5 oder Roborock S55 oder Xaomi Roborock bekannt) mit der Custom Firmware Valetudo zu flashen. Zu keinem Zeitpunkt soll vor dem Flashen der Roborock in ein WLAN gebracht werden oder jemals die Xaomi Mi app benutzt werden. Alles soll offline bleiben.
Am Ende werde ich nach dem Flashen den Roborock in mein WLAN bringen. Dieses ist in meinem Fall ein eigenes WLAN für Smart Home Geräte, welches nur Traffic erlaubt, welcher explizit durch die Firewall freigegeben ist. Der Staubsaugerroboter wird da natürlich nicht freigegeben.

Vorbereitung

Wir benötigen einen PC mit Linux, welcher auch ein WLAN-Netzwerkadapter benötigt. Ich habe dazu einen alten Laptop genutzt. Ich habe es zuvor mit einer VM und einem durchgeschliffenen WLAN-USB-Stick probiert, was aber leider nicht funktioniert hat. Dieses Problem ist bekannt.

Da wir später per Browser auf den Roborock zugreifen müssen, habe ich mich für eine Ubuntu Desktop-Installation entschieden. Dies geht wie folgt:

  1. Dazu habe ich zunächst Ubuntu Desktop heruntergeladen: https://www.ubuntu.com/download/desktop
  2. Dann benötigen wir “Rufus” und einen USB Stick mit mindestens 2 GB Speicherplatz für die Installation. Alternativ kann das Image auf eine DVD gebrannt werden. Ich gehe hier auf den Weg via USB-Stick ein. Rufus kann hier heruntergeladen werden: https://rufus.ie/de_DE.html (Die Portable-Version reicht)
  3. Wenn alles heruntergeladen wurde, starten wir Rufus. Hier wählen wir zunächst den USB-Stick aus (1), dann die heruntergeladene ISO-Datei mit Ubuntu (2) und klicken auf “Start”.

  4. Wenn wir nach dem Schreibmodus gefragt werden, wählen wir “ISO Image mode”.

  5. Nach ein paar Minuten ist das Schreiben auf den USB-Stick abgeschlossen und wir können die Installation am Laptop vornehmen. Dazu einfach den USB-Stick in den Laptop stecken. Je nach Modell muss nun entweder direkt nach dem Einschalten eine Taste gedrückt werden um das Bootmenü aufzurufen (z.B. F12, F2 oder Esc) oder im BIOS muss die Boot-Reihenfolge umgestellt werden, damit vom USB-Stick gebootet werden kann. Da dies je nach BIOS variiert, kann ich hier keine Allgemeine Anleitung dazu geben. Wenn ihr alles richtig gemacht habt und vom USB-Stick startet, startet das Setup von Ubuntu. Dies ist weitestgehend selbsterklärend, darum gehe ich hier nicht im Detail darauf ein. Ich habe im meinem Fall einen Laptop genutzt, auf dem schon ein Windows 7 installiert war und habe eine Parallelinstallation zu Windows 7 gewählt.
  6. Wenn die Installation abgeschlossen ist, startet das System neu und der Ubuntu Desktop erscheint.
  7. Hier nun zunächst eine WLAN-Verbindung für eine Internetverbindung einrichten. Dazu rechts oben auf den Pfeil klicken, auf den WLAN-Eintrag klicken und das WLAN zum Verbinden auswählen sowie den WLAN-Schlüssel eingeben.
  8. Nun links unten auf die neun Punkte klicken und, auf der zweiten Seite, im Ordner “Utilities” das Programm “Terminal” starten. Eine Kommandozeile erscheint.
  9. Um Ubuntu nun zunächst zum Aktualisieren folgende Befehle eingeben:
    sudo apt-get update
    sudo apt-get upgrade
  10. Fertig ist die Vorbereitung.

 

Valetudo installieren

Dann benötigen wir ein paar Pakete für die spätere Konfiguration:

sudo apt-get install -y openssh-server ccrypt git dos2unix python3-pip python3-venv

Für den späteren Zugriff auf die Roborock Konsole via SSH erstellen wir einen SSH Key:

ssh-keygen -t ed25519 -C "me@home.local"

nun erstellen wir ein Verzeichnis Roborock

mkdir ~\rockrobo
cd ~\rockrobo

nun klonen wir das Repository der dustcloud:

git clone https://github.com/dgiese/dustcloud.git

Erstellen des Valetudo-Verzeichnisses

mkdir valetudo
pushd valetudo

Herunterladen der aktuellen Valetudo-Dateien. Dazu auf https://github.com/Hypfer/Valetudo/releases gehen und den Pfad für die aktuellste Version von Valetudo kopieren.

Nun dieses Paket herunterladen, weitere Verzeichnisse erstellen und ein paar Konfigurationsdateien speichern:

wget https://github.com/Hypfer/Valetudo/releases/download/<die version, welche auf der Webseite zu sehen ist>/valetudo
mkdir deployment
pushd deployment
wget https://github.com/Hypfer/Valetudo/raw/master/deployment/valetudo.conf
mkdir etc
pushd etc
wget https://github.com/Hypfer/Valetudo/raw/master/deployment/etc/hosts
wget https://github.com/Hypfer/Valetudo/raw/master/deployment/etc/rc.local
popd
popd
popd
mkdir firmware
pushd firmware

Nun finde die URL zur aktuellsten Firmware (höchste Nummer und Datum) von https://dustbuilder.xvm.mit.edu/pkg/s5/. (z.B. https://dustbuilder.xvm.mit.edu/pkg/s5/v11_001820.fullos.pkg). Lade die Datei herunter:

wget https://dustbuilder.xvm.mit.edu/pkg/s5/<latest file>.fullos.pkg

Wechsle ins rockrobo Verzeichniss und erstelle die Firmware Datei:

popd
mkdir image
pushd image
sudo ../dustcloud/devices/xiaomi.vacuum/firmwarebuilder/imagebuilder.sh --firmware=../firmware/<Firmwaredatei>.fullos.pkg --public-key=$HOME/.ssh/id_ed25519.pub --valetudo-path=../valetudo --disable-firmware-updates --ntpserver=192.168.x.1 --replace-adbd

Bei diesem letzten Befehl muss die Firmwaredatei im valetudo/firmware-Verzeichniss angegeben werden. Des Weiteren sollte beim NTP-Server-Parameter der NTP-Server des Netzwerks angegeben werden. Dies ist in Heimnetzwerken in der Regel der Router.

Wenn die Datei erstellt ist, erstellen wir einen “flasher”-Ordner und die miio Python Pakete:

popd
mkdir flasher
pushd flasher
python3 -m venv venv
source venv/bin/activate
pip3 install wheel
pip3 install python-miio
popd

Nun müssen wir den Laptop in das WLAN des Roborock verbinden. Dazu die “Reset”-Taste unter der Klappe des Roborocks drücken. Dann beginnt nach ein paar Sekunden die LED neben der Taste blau zu blinken. Nun findet ihr ein offenes WLAN, dass roborock-vacuum-s5_…. heißt. Zu diesem müsst ihr verbinden.

Nun müssen wir noch die Firewall deaktivieren. Sonst ist der Roborock nicht in der Lage das Image herunterzuladen. Wenn die Installation von Ubuntu auch noch für andere Dinge benutzt wird, vergesst nicht die Firewall mit “sudo ufw enable” am Ende wieder einzuschalten.

sudo ufw disable

Des Weiteren sollte der Roborock im Dock stehen und geladen werden. Wenn dies nicht der Fall war, wurde mit mitgeteilt, dass der Akkustand mindestens 20% betragen muss um das Update durchzuführen – selbst wenn der Akkustand bei über 90% war.

Nun eine Verbindung mit dem Roborock aufbauen um den Token zur Verbindung zu holen:

mirobo --debug discover --handshake true

Die letzte Zeile der Ausgabe enthält einen Token, diesen in folgenden Befehl einsetzen:

mirobo --ip 192.168.8.1 --token <Token> update-firmware image/output/<erstellte firmware datei>.fullos.pkg

Nun wird der Roborock mit der Custom Firmware geflashed. Dies dauert einige Minuten. Der Roborock sagt Bescheid wenn er fertig ist.

Roborock zum WLAN verbinden

Um den Roborock zum eigentlichen WLAN zu verbinden, muss der Roborock über http://192.168.8.1 aus einem Browser aufgerufen werden.

Hier kann nun im Setting-Dialog die WLAN-Verbindung eingerichtet werden. Valetudo unterstützt nur WPA2-PSK – dieser ist bei normalen Heimroutern Standard.

Valetudo benutzen

Sobald der Roborock im WLAN hängt, kann dieser über seine IP im Browser aufgerufen werden. z.B. lautet diese dann http://192.168.1.185.

Update von Valetudo

Von Zeit zu Zeit gibt es ein Update von Valetudo. In meinem Fall sind mit diesem z.B. die virtuellen Wände hinzugekommen. Daher benötigt mein Roborock ein Update.
Im Wesentlichen müssen wir die gleichen Aktionen durchführen, wie bei der Installation. Lediglich den Token haben wir bereits. Dieser ist auf der Valetudo-Seite unter Settings => Token zu finden. Daher ist der Erste Schritt bei einem Update ähnlich dem Schritt “nun klonen wir das Repository der dustcloud“. Wir aktualisieren zunächst das dustcloud repository:

cd ~/rockrobo/dustcloud
git pull

https://github.com/Hypfer/Valetudo/releases/download/0.4.0/valetudo

Nun das aktualisierte Paket von der GitHub Seite herunterladen (s.o.):

cd ../valetudo
wget https://github.com/Hypfer/Valetudo/releases/download/<neue Version>/valetudo

nun die neue Firmware erstellen (auf basis der bereits bestehenden Firmware. Ansonsten die Firmware zunächst wie oben beschrieben herunterladen):

pushd image 
sudo ../dustcloud/devices/xiaomi.vacuum/firmwarebuilder/imagebuilder.sh --firmware=../firmware/<Firmwaredatei>.fullos.pkg --public-key=$HOME/.ssh/id_ed25519.pub --valetudo-path=../valetudo --disable-firmware-updates --ntpserver=192.168.x.1 --replace-adbd
popd
pushd flasher
source venv/bin/activate
popd

Nun müssen wir den Laptop in das WLAN des Roborock verbinden. Dazu die “Reset”-Taste unter der Klappe des Roborocks (kurz!) drücken. Dann beginnt nach ein paar Sekunden die LED neben der Taste blau zu blinken. Nun findet ihr ein offenes WLAN, dass roborock-vacuum-s5_…. heißt. Zu diesem müsst ihr verbinden.

Nun müssen wir noch die Firewall deaktivieren. Sonst ist der Roborock nicht in der Lage das Image herunterzuladen. Wenn die Installation von Ubuntu auch noch für andere Dinge benutzt wird, vergesst nicht die Firewall mit “sudo ufw enable” am Ende wieder einzuschalten.

sudo ufw disable

Des Weiteren sollte der Roborock im Dock stehen und geladen werden. Wenn dies nicht der Fall war, wurde mit mitgeteilt, dass der Akkustand mindestens 20% betragen muss um das Update durchzuführen – selbst wenn der Akkustand bei über 90% war.

Nun eine Verbindung mit dem Roborock aufbauen um den Token zur Verbindung zu holen ODER den Token vorher von der Settings-Seite in Valetudo auslesen:

mirobo --debug discover --handshake true

Beim ausführen des Befehls enthält die letzte Zeile der Ausgabe einen Token, diesen in folgenden Befehl einsetzen:

mirobo --ip 192.168.8.1 --token <Token> update-firmware image/output/<erstellte firmware datei>.fullos.pkg

Nun wird der Roborock mit der Custom Firmware geflashed. Dies dauert einige Minuten. Der Roborock sagt Bescheid wenn er fertig ist.

Roborock Control Center

Noch ein kleines Gimmick obendrauf:
Unter https://github.com/LazyT/rrcc/releases kann man das Roborock Control Center herunterladen. Dieses kann von einem Windows PC auf den Roborock zugreifen und diesen ebenfalls auslesen und steuern.