Xiaomi Roborock Saugroboter mit Raspberry Pi hacken/rooten (ohne cloud upload)

Erstellt am 5. Mai 2019 von Makertutorials @ben_roe

Ziel dieser Anleitung ist es, den Xiaomi/Roborock Saugroboter ohne Internet/Cloud zu betreiben.
Es sollen keine persönlichen Daten hochgeladen werden können.

Unterstützte Geräte: alle Roborock mit LDS (S5, S50, S55), Xiaomi Mi

Ein Saug- und Wischroboter ist eine sehr große Hilfe bei einer großen Wohnung.
Da die Preise in diesem Jahr stark gesunken sind, habe ich angefangen verschiedenen Modelle zu vergleichen.
Die Funktion, dass der Saugroboter die Räume mit einem Laser abscannen kann und eine Karte der Wohnung erstellt, war mir wichtig.
So kann der Saugroboter selbständig durch die Wohnung navigieren und die Räume schneller saugen, als ein Saugroboter der nach dem Zufallsprinzip vorgeht.

Leider „benötigen" die Saugroboter mit Raumerkennung eine aktive Internetverbindung, um zu funktionieren.
Damit habe ich ein großes Problem, da alle persönlichen Daten in die Cloud des Herstellers hochgeladen werden.
Man hat keine Wahl ob bzw. welche Daten man freigibt. Mir ist es ein Rätsel warum das mit der deutschen Datenschutzverordnung möglich ist.

Nach einer Recherche, habe ich das Dustcloud Projekt gefunden, mit der es möglich ist, Xiaomi/Roborock Saugroboter zu rooten.
Mit dem Root-Zugang hat man uneingeschränkten Zugriff auf das System des Saugroboters und kann beliebige Software darauf installieren.
Damit du den Saugroboter im eigenen Netzwerk steuern kannst, wird die Web-App Valetudo auf dem Saugroboter installiert.

Benötigt wird:

Die Anleitung muss auf einem Linux (Debian) System ausgeführt werden (Windows/Mac OSX nicht möglich). Deshalb benötigst du den Raspberry Pi.
Alternativ kannst du auch eine Virtuelle Machine mit Debian verwenden. Bei einigen Schritten kann es zu Problemen kommen, da die Programme mit der Netzwerkverbindung der Virtual Machine nicht zurecht kommen.

Ich übernehme keine Haftung für Schäden. Beachte auch das die Garantie des Gerätes verfällt.
Es ist möglich die original Firmware wieder auf das Gerät zu spielen.

Inhalt

Dustcloud/Dummycloud, Valetudo und Firmware herunterladen

  1. Installiere Raspbian auf deinem Raspberry Pi. Eine einfache Anleitung findest du hier.
    Schritt 1 in dieser Anleitung ist ausreichend. WLAN kannst du im Raspbian Desktop einstellen.
  2. Aktualisiere die Paketlisten um die neuesten Software Versionen installieren zu können.
    Danach werden ein paar Programme installiert, die zum „rooten" benötigt werden. (& verbindet zwei Befehle)
    sudo apt-get update & sudo apt-get install -y ccrypt git wget unzip dos2unix
  3. Erstell einen Ordern mit dem Name rockrobo im Heimverzeichnis (/home/pi) und navigiere in den neu erstellten Ordner.
    mkdir ~/rockrobo & cd ~/rockrobo
  4. Klone/kopiere das Dustcloud Repository in den aktuellen Ordner (rockrobo) mit Git.
    git clone https://github.com/dgiese/dustcloud.git
  5. Erstelle im rockrobo Ordner einen neuen Ordner valetudo und navigiere hinein.
    mkdir valetudo & cd valetudo
  6. Jetzt musst du die aktuelle Valetudo Datei in den valetudo Ordner herunterladen.
    Geh dazu auf dieValetudo Release Seite. Dort sind alle Versionen aufgelistet. Bei mir ist es die Version 0.3.1.
    Scroll etwas nach unten bis zur „Assets" Auflistung. Kopiere dort den Link zur „valetudo" Datei.

    Ersetze dann den Link nach dem wget Befehl.

    wget https://github.com/Hypfer/Valetudo/releases/download/0.3.1/valetudo

    Nachdem du den Befehl ausgeführt hast, sollte sich eine Datei „valetudo" im aktuellen Ordner Befinden. Das kannst du mit dem Befehl ls prüfen.

  7. Erstell im valetudo Ordner einen neuen Ordner, mit dem Namen deployment und navigiere hinein.
    mkdir deployment & cd deployment
  8. Lade die valetudo.conf Datei herunter.
    wget https://github.com/Hypfer/Valetudo/raw/master/deployment/valetudo.conf
  9. Erstell im deployment Ordner einen neuen Ordner, mit dem Namen etc und navigiere hinein.
    mkdir etc & cd etc

    Lade die hosts und die rc.local Datei herunter.

    wget https://github.com/Hypfer/Valetudo/raw/master/deployment/etc/hosts
    wget https://github.com/Hypfer/Valetudo/raw/master/deployment/etc/rc.local 

    In der hosts Datei sind alle bekannten Xiaomi/mi.com/RoboRock Server vermerkt. Dies verhindert das deine Daten in die Cloud hochgeladen werden.

    In der rc.local Datei wird festgelegt, dass der Datenaustausch mit der Xiaomi/mi.com/RoboRock Cloud auf die interne Dummycloud umgeleitet wird. So wird dem RoboRock System vorgegaukelt das es nach „Hause telefoniert".

  10. Navigiere zurück in die oberste Ebene des rockrobo Ordners
    cd ~/rockrobo

    und erstelle dort einen neuen Ordner mit dem Namen rrlogd-patcher. Navigiere hinein.

    mkdir rrlogd-patcher & pushd rrlogd-patcher

    Lade die patcher.py Datei herunter.

    wget https://raw.githubusercontent.com/JohnRev/rrlogd-patcher/master/patcher.py

    Das Python script rrlogd-patcher sorgt dafür das die Cleaning Logs nicht verschlüsselt werden. Das ist nötig um sie später in der Valetudo App anzeigen zu lassen.

  11. Navigiere wieder zurück in die oberste Ebene des rockrobo Ordners
    cd ~/rockrobo

    und erstelle einen neuen Ordner mit dem Namen firmware und navigiere hinein.

    mkdir firmware & cd firmware

    Schau auf der Dustcloud Seite nach, welche die aktuellste getestete Firmware vom Roborock ist.

    Achte darauf das du die richtige Generation wählst (Roborock S5 ist z.B. Gen2).



    Ersetze den letzten Teil der URL (v11_001810.fullos.pkg) mit dem Dateinamen deiner Firmwareversion.

    wget https://cdn.awsbj0.fds.api.mi-img.com/rubys/updpkg/v11_001810.fullos.pkg

    Wenn du die Firmware nicht herunterladen konntest, probier einen anderen Server. Nicht alle Versionen sind auf allen Servern verfügbar.

  12. Dein rockrobo Ordner sollte jetzt folgende Struktur haben.
     rockrobo/ ├── dustcloud │ ├── cloudprotocol.pdf │ ├── devices │ ├── docker │ ├── dummycloud │ ├── dustcloud │ ├── LICENSE │ ├── Pipfile │ ├── Pipfile.lock │ ├── presentations │ └── README.md ├── firmware │ └── v11_001810.fullos.pkg ├── rrlogd-patcher │ └── patcher.py └── valetudo ├── deployment │ └── etc │ ├── hosts │ └── rc.local └── valetudo 

SSH Key erstellen

Der SSH Key wird benötigt, um dich später mit deinem gerooteten Roborock per SSH zu verbinden.

  1. Prüfe ob schon ein SSH Key existiert.
    Wenn die Meldung angezeigt wird, dass die Datei oder Verzeichnis nicht gefunden wurde, gibt es noch keinen SSH Key.
    cat ~/.ssh/id_rsa.pub
  2. Erstelle einen neuen SSH Key mit folgendem Befehl.

    Speicherort (~/.ssh/id_rsa) mit Enter bestätigen.
    Das Passwort kannst du leer lassen und mit zwei mal Enter Bestätigen.

Firmware „patchen" und Image erstellen

Bevor du die Firmware auf den Roborock kopierst, muss sie „gepatched" werden.
Sonst hast du später keinen Root-Zugang zum Roborock und der Saugroboter kann nicht ohne Xiaomi Cloud betrieben werden.

  1. Navigiere wieder in den rockrobo Ordner
    cd ~/rockrobo

    und erstelle einen neuen Ordner image und navigiere hinein.

    mkdir image & cd image
  2. Führe jetzt den Befehl aus, der die Firmware patch/rootet.
    Für eine bessere Übersicht habe ich den Befehl in mehrere Zeilen aufgeteilt. DurchBackslash \ am Ende jeder Zeile kannst du den Befehl so in dein Terminal einfügen und er wird als eine Zeile interpretiert.

    Wichtig ist noch, dass du den Dateiname der zuvor gespeicherten Firmware anpasst (bei mir v11_001810.fullos.pkg).

     sudo ../dustcloud/devices/xiaomi.vacuum/firmwarebuilder/imagebuilder.sh \ --firmware=../firmware/v11_001810.fullos.pkg \ --soundfile=../firmware/english.pkg \ --public-key=$HOME/.ssh/id_rsa.pub \ --valetudo-path=../valetudo \ --disable-firmware-updates \ --ntpserver=fritz.box \ --rrlogd-patcher=../rrlogd-patcher/patcher.py \ --replace-adbd 

    Hier der selbe Befehlt in einer langen Zeile, falls du Probleme hast.

     sudo ../dustcloud/devices/xiaomi.vacuum/firmwarebuilder/imagebuilder.sh --firmware=../firmware/v11_001810.fullos.pkg --soundfile=../firmware/english.pkg --public-key=$HOME/.ssh/id_rsa.pub --valetudo-path=../valetudo --disable-firmware-updates --ntpserver=fritz.box --rrlogd-patcher=../rrlogd-patcher/patcher.py --replace-adbd 

    Falls du keine Fritzbox hast, entferne die Zeile mit dem Parameter -ntpserver, oder ersetze fritz.box mit der IP des NTP Server.

    • -firmware: gibt an wo die original Firmware gespeichert ist
    • -soundfile: gibt an wo die Sprachdatei gespeichert ist, die später vom Saugroboter verwendet werden soll (hier englisch)
    • -public-key: gibt an wo der Public SSH Key gespeichert ist
    • -valetudo-path: gibt an wo das Valetudo Programm gespeichert ist
    • -disable-firmware-updates: schaltet automatische Firmware Updates aus (wichtig da sonst der root Zugang verloren gehen kann)
    • -ntpserver: IP des NTP Servers (Zeitserver)
    • -rrlogd-patcher: gibt an wo das rrlogd-patcher script gespeichert ist
    • -replace-adbd: falls etwas schief geht, kannst du noch per USB auf den Saugroboter zugreifen

Firmware auf den Roborock Saugroboter flashen

Jetzt muss das patchte Firmware Image auf den Roborock Saugroboter kopiert (flashen) werden.

  1. Installiere die benötigten Programme.
    sudo apt-get install -y python3 python3-pip python3-venv python3-dev libffi-dev libssl-dev
  2. Erstell eine virtuelle Umgebung für die Python Pakete.
    python3 -m venv .venv 
  3. Installiere wheel, damit weitere Pakete automatisch installiert werden können.
    pip install wheel
  4. Installiere python-miio
    pip install python-miio
  5. Setze jetzt das WLAN des Roborock zurück, indem du die Zwei Tasten rechts und links neben dem Power Knopf gleichzeitig gedrückt hälst.
    Du kannst auch die Reset Taste unter der Klappe gedrückt halten.
  6. Verbind jetzt den Raspberry Pi mit dem WLAN des RoboRock. roborock-vacuum-s5-....
  7. Wenn der Raspberry Pi mit dem WLAN des Roborock verbunden ist, kannst du die Firmware übertragen (flashen).
    Wichtig ist das du den Dateinamen der Firmware anpasst. Lass dir den Namen mitls anzeigen.
    ls
    python flasher.py -f output/v11_001810.fullos.pkg

    Die Firmware wird übertragen. Danach wird sie auf dem RoboRock installiert.

    Das dauert ca. 5-10min. Den Saugroboter währenddessen nicht ausschalten!

    Wenn der Roborock die Start-Melodie abspielt, weisst du das die Installation beendet ist.

Valetudo Webapp öffnen/ WLAN Einstellen, Roborock Steuern

Auf dem Xiaomi Saugroboter läuft jetzt die Firmware mit Root-Zugang, die Valetudo Web-App und Dummycloud.
Wenn dein Computer noch mit dem Roborock WLAN verbunden ist, kannst du im Browser die URL http://rockrobo/ aufrufen.