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

Cloud Free Xiaomi Roborock Saugroboter mit Valetudo und Dummycloud

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

Update
19.05.2019: Deutsche Sprachdatei hinzugefügt (Schritt 12)
15.09.2019: Python Befehle an Python 3 angepasst Firmware Flashen Teil. Danke an Benjamin und den anderen Hilfreichen Kommentatoren.

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 die Valetudo 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. Du benötigst noch eine Sprachdatei. Diese findest du hier.
    Lade mit folgendem Befehl die deutsche Sprachdatei herunter (in den Firmware Ordner).
    wget https://dustbuilder.xvm.mit.edu/pkg/voice/de.pkg
  13. 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
    │   └── de.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.

    ssh-keygen

    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. Durch Backslash \ 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/de.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/de.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.
    pip3 install wheel
  4. Installiere python-miio
    pip3 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 mit ls anzeigen.

    ls output
    python3 ~/rockrobo/dustcloud/devices/xiaomi.vacuum/firmwarebuilder/flasher.py -f output/v11_001810.fullos.pkg

    Diesen Befehl im images Ordner ausführen. ~/roborock/images

    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://192.168.8.1 aufrufen.
Valetudo WEB App Benutzeroberfläche

  • Saugroboter mit deinem WLAN verbinden.
    In der Valetudo Web-App unter Settings -> WIFI -> WIFI Settings kannst du deinen WLAN Namen und Passwort eingeben.

    Nach dem Bestätigen des Button „Save new Wifi configuration“, startet der Saugroboter neu und verbindet sich mit deinem WLAN Netzwerk (das Roborock eigene WIFI verschwindet).
    Verbinde dein Computer mit dem zuvor eingestelltem WIFI und rufe die URL http://rockrobo/ auf.

  • Valetudo App startet nicht/ ist nicht erreichbar.
    Falls die Valetudo Web-App sich nicht im Browser öffnet, kann es sein das sie manuell gestartet werden muss.
    Verbinde dich dazu per SSH mit deinem Roborock Saugroboter.
    Dein Computer muss mit dem WIFI des Roborock verbunden sein.
    Führe folgenden Befehl im Terminal aus, um dich per SSH zu verbinden.
    Es sollte der selbe Computer/Raspberry Pi sein, auf dem du vorher den SSH Key erstellt hast, oder du kopierst den Public SSH Key auf einen anderen Rechner.

    ssh root@rockrobo

    Starte jetzt valetudo service.

    service valetudo start

Gib deine Stimme ab!

17 Likes
Upvote Downvote

Total votes: 10

Upvotes: 10

Upvotes percentage: 100.000000%

Downvotes: 0

Downvotes percentage: 0.000000%

Geschrieben von Ben

#Blogger #Designer #RaspeberryFan #Self-Employed #Developer #Javascript
TwitterGithubThingiverse

17 Kommentare

Kommentar verfassen
  1. Danke für die Anleitung! Sehe ich es richtig, dass der Raspberry Pi nur einmal zur Einrichtung notwendig ist? Danach sollte der Rest im lokalen WLAN auch von jedem anderen Gerät aus möglich sein, oder?

    • Hallo,
      ja der Raspberry ist nur zum Rooten des Roborock. Du kannst auch einen PC/Laptop mit Linux Betriebssystem dafür verwenden.
      Wenn dann Valetudo auf dem Roborock Saugroboter läuft, kannst du im Lan/Wifi mit jedem anderen Gerät (iPad/iPhone/Table) darauf zugreifen.

  2. ich bekomme nach dem Verbinden mit dem WLAN und den Versuch zu flashen folgenden Fehler:
    python: can't open file 'flasher.py': [Errno 2] No such file or directory

    • Du befindest dich wahrscheinlich im falschen Ordner.
      Gib mal den Befehl pwd ein und poste die Ausgabe hier.
      Der Befehl gibt den aktuellen Ordner aus.
      Poste mal noch den Befehl bei dem der Fehler auftritt.

      • in welchem Ordner muss ich mich den befinden?


        pi@raspberrypi:~/rockrobo/image $ ls
        output ssh_host_ecdsa_key ssh_host_ed25519_key.pub
        ssh_host_dsa_key ssh_host_ecdsa_key.pub ssh_host_rsa_key
        ssh_host_dsa_key.pub ssh_host_ed25519_key ssh_host_rsa_key.pub
        pi@raspberrypi:~/rockrobo/image $ cd ~/rockrobo/image/output
        pi@raspberrypi:~/rockrobo/image/output $ ls
        v11_001720.fullos.md5 v11_001720.fullos.pkg
        pi@raspberrypi:~/rockrobo/image/output $ python flasher.py -f output/v11_001720.fullos.pkg
        python: can't open file 'flasher.py': [Errno 2] No such file or directory
        pi@raspberrypi:~/rockrobo/image/output $ cd ~/rockrobo/image/
        pi@raspberrypi:~/rockrobo/image $ python flasher.py -f output/v11_001720.fullos.pkg
        python: can't open file 'flasher.py': [Errno 2] No such file or directory
        pi@raspberrypi:~/rockrobo/image $

      • Hallo,
        du müßtest im ~/rockrobo Ordner sein.
        Wenn er die flasher.py nicht findet, dann hat was in den Schritten 1-4 nicht funktioniert.
        python-miio muss installiert sein in der Python Umgebung.

      • Hallo,
        ich hab das gleiche Problem.
        Klappt es jetzt bei dir?
        Ich hatte die Anmerkung von Reinhard berücksichtigt und pip3 bei der Installation von python-miio geschrieben, weil mir folgende Fehlermeldung angezeigt wurde:
        python-miio requires Python ‚>=3.5‘ but the running Python is 2.7.16

        Nach erfolgreicher Installation bekomme ich jetzt beim flashen die gleiche Meldung wie Ben.

        Jemand einen Tipp was ich falsch gemacht haben könnte?

        Danke im Voraus 🙂

    • (Tolles Tutorial, danke!)

      Zu deinem Problem, wenn es dich/noch jemanden interessiert bin ich auf Ubuntu18 zu folgender Lösung gekommen:
      python3 ~/rockrobo/dustcloud/devices/xiaomi.vacuum/firmwarebuilder/flasher.py -f output/v11_001810.fullos.pkg

      ausgeführt in ~/roborock/images

      Dadurch wird python3 verwendet statt python2 (was auf Ubuntu auch vorinstalliert ist). Wichtig ist davor auch nicht „pip install wheel bzw. python-miio“ sondern „pip3 install wheel bzw. python-miio“ zu verwenden.

      Flasher.py ist bei mir auch nicht im Hauptordner und ich wüsste nicht wie es durch das Tutorial da hin käme, aber der Pfad oben stimmt zumindest aktuell.

    • Hi,
      bei mir gabs die Datei flasher.py auch nicht, habs nach der offiziellen Anleitung dann mit
      mirobo –ip 192.168.8.1 –token XXXXXXXXXXXXXXXX update-firmware image/output/v11_001748.fullos.pkg
      übertragen, damit gings 😉

  3. Hm, warum nicht einfach auf dem Router dem Staubsauger verbieten, auf Internet zuzugreifen?
    Bei mir (EdgeRouter und Roomba) sieht das so aus:


    rule 40 {
    action reject
    description "Roomba bleibt zu Hause!"
    log disable
    source {
    mac-address d0:c5:d3:bd:c4:f1
    }
    }

    Und Ruhe ist.

  4. Hallo.
    Ich schon wieder 🙂
    Ein Nchtrag: Das Kommando „pip install python-miio“
    wird mit dem Fehler quittieert dass mindestens die Python Version 3.x erforderlich ist.
    Mit „pip3 install python-miio“ hat es dann geklappt.

  5. Hallo.
    Noch eine Frage zu Punkt 6. (Firmware flashen)
    „Verbind jetzt den Raspberry Pi mit dem WLAN des RoboRock.“
    Wie macht man das?
    Vielen Dank!

  6. Das läuft zumindest ohne Fehler durch.
    Aber:
    1. Fehlt dann nicht die Sprachausgabe?
    2. Ich hätte es gerne auf deutsch gestellt, gibts fertige Packages?
    3. Woher hast du dein englisch.pkg file?

    Vielen Dank!

  7. Hallo.
    Ich bekomme folgende Fehlermeldungen:


    Decrypt soundfile ..
    cp: cannot stat '/home/pi/rockrobo/firmware/english.pkg': No such file or directory
    ccrypt: /home/pi/rockrobo/image/fw.bRrjY1/sounds/english.pkg: No such file or directory
    Unpack soundfile ..
    /home/pi/rockrobo/image/fw.bRrjY1/sounds /home/pi/rockrobo/image
    tar (child): english.pkg: Cannot open: No such file or directory
    tar (child): Error is not recoverable: exiting now
    tar: Child returned status 2

    Scheinbar fehlt da ein soundfile (.pkg)

    Ich meine genau deiner Anleitung gefolgt zu sein.
    Hast du eine Idee, eine Antwort parat wo ich die Soundfiles (ev. deutsch) herbekomme?
    Vielen Dank!

    • Hallo,
      probier mal bei Firmware „patchen“ und Image erstellen Schritt 2 den Parameter --soundfile=../firmware/english.pkg wegzulassen.

      Also (Firmware Namen noch anpassen)


      sudo ../dustcloud/devices/xiaomi.vacuum/firmwarebuilder/imagebuilder.sh
      --firmware=../firmware/v11_001810.fullos.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

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.