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. Optional: Erstell eine virtuelle Umgebung für die Python Pakete.
    Eine genaue Erklärung findest du in den Kommentaren.

    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!

28 Likes
Upvote Downvote

Total votes: 21

Upvotes: 21

Upvotes percentage: 100.000000%

Downvotes: 0

Downvotes percentage: 0.000000%

Geschrieben von Ben

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

40 Kommentare

Kommentar verfassen
  1. Super Anleitung habe es bei meinem Gen 1 mit Valetudo 0.3.1 und der Firmware 3.3.9 003452 erfolgreich geschafft.
    Nun meine Frage. Wie kann ich nun auf Valetudo 0.4 und eine aktuelle Firmware upgraden … muss ich das Szenario nochmal durchspielen ?

    Danke nochmal ! Super !

  2. Schöne Anleitung.
    Bei Image bauen bekomme ich die Ausgabe:

    
    Trying to patch rrlogd
    /home/pi/rockrobo/image/fw.AFsncR /home/pi/rockrobo/image
    Patch has failed
    /home/pi/rockrobo/image
    install: der Aufruf von stat für '/home/pi/rockrobo/image/fw.AFsncR/rrlogd_patch' ist nicht möglich: Datei oder Verzeichnis nicht gefunden
    Successfully patched rrlogd
    

    Ist das Patch has failed OK?

    Bei installieren von python-miio kommt:

    python-miio requires Python '>=3.6' but the running Python is 3.5.3
    

    Die 3.5.3 ist aber bei Raspian die aktuelle Version.

    Mit welche Python Version hast du gearbeitet?

  3. Hallo,

    und besten Dank für die Super Anleitung. ichhabe alles auch einem Linux MINT nachgekocht. Das Optional habe ich aus gelassen. bin auch beim
    „pip3 install python-miio“
    hängen geblieben. Die Fehlermeldung war allerdings:

    Command „python setup.py egg_info“ failed with error code 1 in /tmp/pip-build-veexgkmv/cryptography/

    das selbe dann nochmal mit der optionalen (virtuellen) variante, brachte den selben Fehler.

    was tun?
    Und dann vielleicht noch. Ich habe den S50 und habe daher die Firmware 3.3.9_001856 runtergeladen. Ist doch richtig oder. Und wo ich schon soviel frage. Ist doch richtig das der Roborock bei einem Hardware reset dann wieder im Originalzustand ist oder?

    Vielen dank schon mal

  4. Hallo Ben, *
    vielen Dank für dieses Tutorial sowie die Kommentare!!

    Ich betreibe meine PI’s Headless im LAN, habe jetzt aber Tastatur/Maus und Fernseher als Notlösung an einen RASP 4 angeschlossen. ein ping auf 192.168.8.1 zeigte mir eine existierende Verbindung.
    +++++++
    Zunächst erhielt ich beim Flashen die Meldung:

    
    flasher.py -f output/v11_003452.pkg
    Flasher for Xiaomi Vacuum
    Address is not set. Trying to discover.
    No devices discovered.
    unquote.
    

    Es suggerierte mir, dass die IP Adresse nicht bekannt ist.
    Ich habe dann den Flashbefehl um ein „-a 192.168.8.1“ ergänzt – und habe folgende Quittung erhalten:

    
    flasher.py -f output/v11_003452.pkg -a 192.168.8.1
    Flasher for Xiaomi Vacuum
    Connecting to device 192.168.8.1...
    Sending handshake to get token
    Starting local http server...
    Serving http server at 192.168.111.44:39819
    Sending ota command with parameters: {"mode": "normal", "install": "1", "app_url": "http://192.168.111.44:39819/v11_003452.pkg", "file_md5": "edea143d334907c3facaf9b2f6a81f83", "proc": "dnld install"}
    Ota started!
    Firmware downloaded successfully.
    Exiting.
    

    Alles schien gut aber der befreiende Klingelton nach erfolgter Initialisierung will sich nicht einstellen.

    Ich bin ratlos -hat jemand vielleicht eine Idee?
    Danke

    • Hallo Peter,

      das selbe Problem trat bei mir auch auf. Ich hatte mich per LAN mit dem Raspberry verbunden und über SSH bedient, der Raspberry war per WLAN mit dem Roborock verbunden. Nachdem ich die LAN-Verbindung getrennt habe (Stecker im Raspberry gezogen) und mich mit meinem Computer über das WLAN des Roborock mit dem Raspberry verbunden habe, funktionierten auch beide von dir angesprochenen Befehle ohne Probleme. Die Eingabe der IP-Adresse des Roborock beim Flashprozess war also nicht mehr erforderlich.

      • Hallo Marc,
        vielen Dank für den Kommentar. Umständehalber kann ich das erst in 1-2 Wochen verifizieren.
        Ich war zum Zeitpunkt der Quittungsmeldung mit dem Netzwerk (LAN) verbunden.
        Gestartet hatte ich es allerdings direkt über die angeschlossene Tastatur. Möglicherweise reicht ja schon eine bereits vorhandene LAN-Verbindung zu dieser Irritation. Ich melde mich. Danke nochmals.
        Peter

  5. Noch eine Wichtige Info!
    Nachdem von 192.168.8.1 auf euren WLAN gewechselt seid, kann es sein das die Valetudo Oberfläche Fehler anzeigt bzw. die Werte nicht lädt.

    Folgender Workaround hat mir geholfen
    Logt euch in euren RassspberryPI ein mi folgenden Befehl verbindet ihr euchg auf euren Roborock ssh root@192.168.8.1 sobald ihr drauf seid folgenden Befehl ausführen

    service valetudo restart

    danach lief Valetudo (0.4) problemlos unter neuer IP

    @Ben kannst du evtl meine Beiträge zusammenfassen?

  6. Viele Probleme lassen sich vermeiden (siehe mein vorheriges Beitrag) wenn ihr ein stärkeres oder originales Raspberry PI Netzteil benutzt, beim Debuggen (wieso Firmwareupload öfters abbricht) habe ist festgestellt Unregelmäßigkeiten im Firmwareupload (Abbruch mal bei 60% mal 30% mal nicht erreichbar etc.) und enorme Ping Schwankungen, dieser Sachverhalt brachte mich auf die Idee, das es an der Unterversorgung des W-Lans Moduls liegen kann und so war es! Nachdem ich ein Originales Netzteil (2A) benutzt habe lief die hier ebschrieben Setup Routine ohne Probleme!

    @Frosti

    gib mal den Folgenden Befehl als ganzes ein (weil ich den selben Fehler hier mit dem Copy Button hatte, so hatte ich dadurch einen Umbruch)

    sudo apt-get install -y python3 python3-pip python3-venv python3-dev libffi-dev libssl-dev

    • Hi Viktor!
      Danke für deinen Tipp, leider liegt es nicht daran, die Pakete sind alle installiert, s.u.

      Ich versuche die Anleitung übrigens auf einem PC mit Linux Mint (18.3 64bit was Ubuntu 16.04 entspricht) umzusetzen.
      Auch habe ich schon versucht dieses netifaces separat zu installieren.

      Paketlisten werden gelesen… Fertig
      Abhängigkeitsbaum wird aufgebaut.
      Statusinformationen werden eingelesen…. Fertig
      libffi-dev ist schon die neueste Version (3.2.1-4).
      python3 ist schon die neueste Version (3.5.1-3).
      python3-dev ist schon die neueste Version (3.5.1-3).
      python3-venv ist schon die neueste Version (3.5.1-3).
      libssl-dev ist schon die neueste Version (1.0.2g-1ubuntu4.15).
      python3-pip ist schon die neueste Version (8.1.1-2ubuntu0.4).
      0 aktualisiert, 0 neu installiert, 0 zu entfernen und 72 nicht aktualisiert.

      • Hi Forsti, konnte bei mir auch alles unter Mint durchführen, daran kann es nicht liegen. Hast du es mal mit dem (optionalen) zweiten Schritt versucht, der virtuellen Python-Umgebung? Dabei werden die Abhängigkeiten ja in der venv-Umgebung separat installiert, vielleicht kannst du so dein Problem „umgehen“?

      • Hi Lars!

        Ja, das habe ich auch schon probiert, half aber leider nichts.

        Wie dem auch sei, ich habs aufgegeben, aber das Rooting jetzt über einen alten Rpi 1 B mit Raspbian probiert und das klappte völlig problemlos.
        Ferner konnte ich den rockrobo Ordner direkt auf den Raspberry kopieren, d.h. ich musste nicht alles doppelt machen sondern nur noch flashen.

        Habe jetzt „Mr.Robot“ gerootet, Valetudo drauf und das geniale Programm von Thomas Löwe (Roborock Control Center) tut auch!
        Bin somit zufrieden 🙂

        Danke @Ben für das ausführliche Tutorial 🙂

  7. Bei mir funktioniert es leider nicht.
    Der Fehler tritt auch bei einigen anderen auf wenn ich die Kommentare so durchlese.

    Ich habe ein Problem bei dem Befehl:

    pip3 install python-miio
    

    Es wird nicht installiert, erster Fehler ist:

    
    Building wheels for collected packages: netifaces
      Building wheel for netifaces (setup.py) ... error
      ERROR: Command errored out with exit status 1:
    

    Kann jmd. helfen ?

  8. Hallo Ben, vielen Dank für dein Anleitung, der Weg war beschwerlich und ich will hier einigen mit paar Hinweisen helfen.

    Bei Problemen mit:

    
    Flasher for Xiaomi Vacuum
    rockrobo/dustcloud/devices/xiaomi.vacuum/firmwarebuilder/flasher.py", line 210, in 
        main()
      File "/home/pi/rockrobo/dustcloud/devices/xiaomi.vacuum/firmwarebuilder/flasher.py", line 188, in main
        r = vacuum.send('miIO.ota', ota_params)
      File "/home/pi/.local/lib/python3.7/site-packages/miio/device.py", line 278, in send
        self.__id = m.data.value["id"]
    TypeError: 'NoneType' object is not subscriptable
    

    Problem liegt daran, dass Ihr die 3.3.5 Firmware auf eurem Roboter habt (hier Spreche ich von der Gen1) Ihr müsst euren Roboter Hard-Reseten

    Roboter vom Dock entfernen
    Haus-Taste drücken und gedrückt halten
    Resetknopf unterhalb der Wartungsklappe mit Kugelschreiber, Büroklammer etc. kurzzeitig drücken, anschließend los lassen
    Haus-Taste gedrückt halten, bis Sprachhinweis zum Zurücksetzen in den Werkszustand erfolgt (Merkt ihr an anderer Soundausgabe)
    Haus-Taste los lassen
    Roboter nicht bedienen und auf Erfolgsmeldung durch Sprachhinweis warten

    Im Falle von

    
    Taceback (most recent call last):
      File "/home/pi/rockrobo/dustcloud/devices/xiaomi.vacuum/firmwarebuilder/flasher.py", line 210, in 
        main()
      File "/home/pi/rockrobo/dustcloud/devices/xiaomi.vacuum/firmwarebuilder/flasher.py", line 198, in main
        ota_progress = vacuum.send('miIO.get_ota_progress')[0]
      File "/home/pi/.local/lib/python3.7/site-packages/miio/device.py", line 310, in send
        return self.send(command, parameters, retry_count - 1)
      File "/home/pi/.local/lib/python3.7/site-packages/miio/device.py", line 310, in send
        return self.send(command, parameters, retry_count - 1)
      File "/home/pi/.local/lib/python3.7/site-packages/miio/device.py", line 310, in send
        return self.send(command, parameters, retry_count - 1)
      File "/home/pi/.local/lib/python3.7/site-packages/miio/device.py", line 313, in send
        raise DeviceException("No response from the device") from ex
    miio.exceptions.DeviceException: No response from the device
    

    WiFi von Roborock reseten (resetknopf) bis neustart drücken euren Raspberry ebenfalls reseten!.

    Flashvorgang wurde mit der offenen Klappe von Roborock durchgeführt!!!

    Falls Ihr Rasbian Lite (Version ohne Desktop benutzt) könnt ihr über LAN flashen
    unter sudo nano /etc/wpa_supplicant/wpa_supplicant.conf
    Trägt ihr die WLAN SSID von euren Roborock

    Mit

    python3 ~/rockrobo/dustcloud/devices/xiaomi.vacuum/firmwarebuilder/flasher.py -a 192.168.8.1 -f output/v11_003468.fullos.pkg

    (hier die richtige OS Version angeben) könnt Ihr direkt die IP Adresse des Roborock ansprechen

  9. Hallo,
    deine Anleitung ist echt toll.

    Ich hab alle Schritte durchgeführt und das gepatchte Image
    erstellt.
    Aber wenn ich versuche, es zu flashen, kommt es nach einiger Zeit zu folgender Fehlermeldung:

    
    tsgebert@ubuntusrv:~/rockrobo/image$ ~/flashit
    Flasher for Xiaomi Vacuum
    Address is not set. Trying to discover.
    Connecting to device 192.168.8.1...
    Sending handshake to get token
    Starting local http server...
    Serving http server at 192.168.8.9:46805
    Sending ota command with parameters: {"mode": "normal", "install": "1", "app_url": "http://192.168.8.9:46805/v11_003468.fullos.pkg", "file_md5": "3fceb0af59b5cfe6eed9945a4262d1c7", "proc": "dnld install"}
    Ota started!
    192.168.8.1 - - [20/Oct/2019 18:42:56] "GET /v11_003468.fullos.pkg HTTP/1.1" 200 -
    Unable to discover a device at address 192.168.8.1-----------| 5.0%
    Traceback (most recent call last):
      File "/home/tsgebert/.local/lib/python3.6/site-packages/miio/device.py", line 259, in send
        data, addr = s.recvfrom(1024)
    socket.timeout: timed out
    
    During handling of the above exception, another exception occurred:
    
    Traceback (most recent call last):
      File "/home/tsgebert/rockrobo/dustcloud/devices/xiaomi.vacuum/firmwarebuilder/flasher.py", line 210, in 
        main()
      File "/home/tsgebert/rockrobo/dustcloud/devices/xiaomi.vacuum/firmwarebuilder/flasher.py", line 198, in main
        ota_progress = vacuum.send('miIO.get_ota_progress')[0]
      File "/home/tsgebert/.local/lib/python3.6/site-packages/miio/device.py", line 290, in send
        return self.send(command, parameters, retry_count - 1)
      File "/home/tsgebert/.local/lib/python3.6/site-packages/miio/device.py", line 224, in send
        self.do_discover()
      File "/home/tsgebert/.local/lib/python3.6/site-packages/miio/device.py", line 162, in do_discover
        raise DeviceException("Unable to discover the device %s" % self.ip)
    miio.exceptions.DeviceException: Unable to discover the device 192.168.8.1
    

    Irgendeine Idee, was da schief geht?
    Gruß
    Thomas

    • Hallo,
      war wohl ein Problem mit den Energieeinstellungen des Laptops.
      Am Strom hat jetzt alles geklappt. Tolle Anleitung!
      Hat super geklappt!!!

  10. Hallo Ben,

    habe alles nach deiner Anleitung ausgefürt und kann mich auch über das W-Lan des Roboters mit dem Robot verbinden.

    Wenn ich dort dann in die W-Lan Einstellungen gehen und versuche den Roboter mit meiner Fritz Box zu verbinden. Scahltet dieser kurz sein eigenes W-Lan ab und schaltet es nach ca. 1min wieder an und verbindet sich nicht mit der Fritz Box.

    Was könnte mein Porblem sein?

    • Ist das WLAN ein 2.4Ghz oder 5Ghz Funknetzwerk? Ich glaube der Roborock kann nur 2.4Ghz.
      Einen MAC Filter oder ähnliches hast du in der Fritzbox nicht aktiv oder?
      Habe selbst auch eine Fritzbox und es hat gut funktioniert.

  11. Hallo
    Vielen Dank für diese tolle Anleitung.
    Es hat super funktioniert.
    Was ich jetzt noch suche wo und wie kann ich die Einstellungen für meinen MQTT Server tätigen?
    Gruss
    Wolfgang

  12. Hallo Ben, tolle Anleitung, schön beschrieben, man kann alles sehr gut nachvollziehen.
    Ich bin auch am Ende gestolpert, beim Firmware flashen:
    Im zweiten Step erstellst du ja mit
    python3 -m venv .venv
    eine „virtuelle Python Umgebung“ im Ordner „.venv“. Damit du in dieser jedoch arbeiten kannst, musst du sie erst mit folgendem Befehl aktivieren:
    source .venv/bin/activate
    Dieser Schritt fehlt in deiner Anleitung. Danach ändert sich auch der Shell-Prompt, es wird ein (.venv) vorangestellt! So erkennst du, dass du ab sofort in der virtuellen Umgebung arbeitest. Die nachfolgenden Schritte (3. und 4.) in dieser virtuellen Umgebung ausgeführt, sorgen dafür, dass die python-miio Pakete auch nur in der virtuellen Umgebung existieren. Und nicht global in deiner gesamten Python Installation.

    Deine Anleitung bzgl. des flasher.py Pfades hast du ja bereits angepasst, Schritt 7 wird also (ebenfalls in der virtuellen Umgebung) identisch ausgeführt und so weiß Python auch, welches Skript auszuführen ist.

    Am Ende wird die virtuelle Umgebung mit deactivate verlassen und alle installierten miio-Pakete verbleiben im .venv Ordner, können bei Bedarf wieder wie oben beschrieben als virtuelle Umgebung gestartet und genutzt werden.

    • Hi Lars,
      vielen Dank für die ausführliche Erklärung.
      Was denkst du ist es nicht einfacher die virtuelle Umgebung wegzulassen, um die Anleitung einfacher zu machen?

      • Hi Ben,
        im Prinzip kann man den Schritt mit der virtuellen Umgebung weglassen. Du hast dein Tutorial ja auch auf eine Clean-Raspbian Installation bezogen. Wenn man den Raspberry nur für das Durchführen des Rooten/Firmwareflashens nutzt, sind einem die sonstigen Systemabhängigkeiten ja eigentlich auch egal. Wenn man jetzt ein bestehendes Linux-System nutzt, kann jeder selbst entscheiden, ob er die Abhängigkeiten global, oder in einer virtuellen Umgebung installieren/durchführen möchte. Ich wollte nur kurz zum Verständnis erläutern, was es mit Schritt 2 des Firmware-Flashen-Teils auf sich hat, welcher dann übersprungen werden kann (die Anleitungen im Wiki von Valetudo/dustcloud enthalten ja ebenfalls beide den Weg über die virtuelle Umgebung).

      • Ich hab den Schritt als Optional gekennzeichnet und auf dein Kommentar verlinkt.
        Vielen Dank noch einmal. Hast du nicht Lust mal eine eigene Anleitung über etwas ähnliches zu schreiben?
        Es gibt auch etwas kleines dafür 🙂

  13. 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.

  14. 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 😉

  15. 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.

  16. 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.

  17. 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!

  18. 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!

  19. 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.