Faire communiquer votre aspirateur robot Xiaomi Roborock en MQTT

Comme beaucoup d'utilisateurs, je ne suis pas fan des solutions cloud (même si ça peut parfois être pratique), mais je n'avais pas encore pris le temps de regarder comment libérer mon aspirateur Xiaomi Roborock S5. Voilà chose faite, et c'est l'occasion de partager ça avec vous :)

Alors, pourquoi m'être penché dessus alors que je l'ai depuis maintenant plusieurs années ? Pour plusieurs raisons :

  • Ne plus être dépendant d'un plugin spécifique, dans le cas de l'aspirateur c'est le plugin Xiaomi Home et les soucis récurent de ce dernier.
  • Maitriser les mises à jour du firmware du robot.
  • Et le plus important, passer par le protocole MQTT, comme pour les autres appareils et capteurs de la maison.

Dans cet article nous verrons :

  • La mise en place d'un firmware alternatif
  • La configuration du robot
  • La communication en MQTT
  • L'intégration dans Jeedom
  • Et l'intégration dans Home Assistant
Info ! L'opération est réversible, un retour sous le firmware d'origine Xiaomi est possible
avec un simple reset usine, décrit dans l'article.

Mise en place du firmware alternatif

Il y a deux firmwares pour ce robot (les versions indiquées sont celles disponibles au moment de l'écriture de cet article) :

J'ai essayé les deux versions, et je me suis arrêté sur la version Valetudo RE, qui a l'avantage de permettre l'ajout des voix françaises et apporte quelques optimisations.

Pour générer le firmware, le plus simple est de passer par le site suivant :

DustBuilder
Dustbuilder is the tool to automatically build custom firmware to get root access to Xiaomi (v1) / Roborock (S4,S5,S6) vacuum robot cleaners.

Après avoir choisi la version de votre aspirateur, il vous reste à spécifier une adresse email pour recevoir le lien du firmware qui sera compilé, le type de clef SSH (la votre ou une qui sera générée par le site), mais aussi la version de Valetudo qui sera installée.
Si vous voulez utiliser la version RE, il ne faut pas oublier de cocher la case adéquate. Comme vous pouvez le voir, la version sera en 0.10.13 et nous verrons comment la mettre à jour ultérieurement.

A la réception du mail, récupérez l'image et les clés qui vous seront utiles pour vous connecter en SSH sur le robot, si besoin.

Le plus problématique pour installer ce firmware alternatif est de se mettre dans de bonnes conditions. Pour la procédure de flashage, différentes possibilités existent :

  • Une machine linux qui possède une connexion wifi, comme un ordinateur portable sous Linux, ou bien une machine virtuelle sous VirtualBox si celui-ci est sous Windows. (Attention avec une VM sous ESXi, j'ai essuyé plusieurs échecs)
  • Un appareil Apple sous IOS 8 minimum
  • Un smarpthone sous Android 4.4 minimum

Nous allons vous détailler l'utilisation de 2 méthodes, celle d'une VM Linux sur un PC sous Windows, ainsi qu'un smartphone sous Android, solution qui nous paraît la plus simple.

Reset du robot aspirateur Roborock V1

Pour réinitialiser l'aspirateur V1, voici la procédure à suivre :

  • Appuyer sur les boutons reset et Home pendant 10 secondes.
  • Relâcher le bouton reset tout en gardant le bouton Home appuyé.
  • Rester appuyer sur le bouton Home jusqu'au moment où la voix féminine aura fini de parler (c'est un peu long).
  • Suite à cela, l'aspirateur va redémarrer dans sa configuration d'usine.
Attention ! l'aspirateur doit être sur sa base pour le flasher
(j'ai perdu de longues heures à cause de cela).

Reset du robot aspirateur Roborock S5

1ère méthode : une VM sous Linux

Nous allons préparer l'environnement sur le portable Linux ou la VM que vous avez mis en place.
Ma VM est sous Debian Buster, les commandes sont à adapter en fonction de votre OS :

apt-get update && sudo apt-get upgrade
apt-get install python3 python3-pip python3-venv python3-dev
cd ~
mkdir vacuum
cd vacuum
python3 -m venv venv

pip3 install wheel
pip3 install python-miio
Info ! Pour l'exécution sans être root, ne pas oublier de mettre sudo devant vos commandes.

Pour corriger certaines erreurs, j'ai dû relancer une maj de pip :

pip3 install --upgrade pip

Récupérons l'image :

wget https://builder.dontvacuum.me/jobs/xxxxxxxxxx/xxxxxx/v11_002034.pkg
wget https://builder.dontvacuum.me/jobs/xxxxxxxx/xxxxxxx/jxxxxx-keys.zip
Info ! Remplacez les URL du paquet et les clefs avec celles recues par mail suite à la génération du firmware.

Votre environnement est prêt, il faut maintenant suivre le processus suivant :

  • Connectez votre portable ou VM au hotspot wifi créé par le robot.
  • Redémarrez ou renouvelez la connexion réseau de votre PC ou VM afin de récupérer une adresse IP du hotspot roborock.
  • Lancez un scan :
mirobo discover --handshake true

INFO:miio.miioprotocol:Sending discovery to  with timeout of 5s..

INFO:miio.miioprotocol:  IP 192.168.8.1 (ID: 070822a4) - token: b'xxxxxxxxxx'
INFO:miio.miioprotocol:Discovery done

Vous pourrez récupérer ici le token nécessaire pour la mise à jour.

  • Lancez la mise à jour :
mirobo --token 'xxxxxxxxx' --ip 192.168.8.1 -d update-firmware v11_002034.pkg
Pour information, la commande est lancée en mode debug.
Pour lancer la commande en mode normal, il vous faut supprimer le "-d".

Dans mon cas, j'ai dû lancer 2 fois la mise à jour. La première fois, j'ai eu un timeout sur la connexion, et la seconde fois la mise à jour s'est effectuée, et une barre de progression vous permet de suivre le processus.

Le robot met une dizaine de minutes à se mettre à jour.

Bravo ! Votre robot est flashé !

2ème méthode : un smartphone Android

Commencez par télécharger le fichier apk du programme Android XVacuum Firmware et installez-le. Profitez-en également pour récupérer le fichier avec l'extension .pkg dont vous avez reçu le lien par mail.

Vous avez 2 possibilités d'utilisation du logiciel : sans réinitialiser l'aspirateur (mais seulement si vous connaissez déjà son token) ou avec un reset usine. Nous allons utiliser la deuxième option.

On va passer au flash de l'aspirateur à proprement dit :

  • Connectez votre téléphone au réseau wifi hotspot de l'aspirateur.
  • Ouvrir l'application XVacuum Firmware.
  • Si l'aspirateur est bien détecté, le token devrait s'afficher en haut.
  • Cliquez sur "FLASH FIRMWARE".
  • Sélectionner le fichier v11_004018.pkg (ou version ultérieur)

Le Flash devrait commencer cela est long et dure de longue minutes

  • Attendre le reboot de l'aspirateur, une petite mélodie vous préviendra.
Bravo ! Votre robot est flashé !

La configuration de l'aspirateur

Après le reboot du robot, il faut se reconnecter au hotspot wifi de celui-ci.
Ouvrez un navigateur sur l'adresse du robot,http://192.168.8.1par défaut.

Rendez-vous dans la page "Settings" puis l'onglet "Wifi". En bas de la page, rentrez les identifiants de votre réseau wifi auquel vous souhaitez connecter l'aspirateur.

Attention ! En car d'erreur de saisie dans les informations de votre réseau wifi, il faudra refaire un reset de la configuration wifi.


L'aspirateur va se connecter à votre réseau local et vous pourrez vous reconnecter à l'interface web avec l'adresse IP distribuée par votre routeur.

Vous pouvez passer l'interface du robot en français depuis la page "Settings" puis "Web Interface". Choisissez "French" dans la liste, et sauvegardez.

Dans les paramètres système, activez la persistance des données.

Attention ! La persistance des données n'est pas disponibles pour les robots de 1ère génération.

Changer la voix du robot

Si vous souhaitez changer la langue dans laquelle votre aspirateur vous parle :

  • Téléchargez le pack de voix de votre choix et correspondant à votre robot sur ce site.
  • Rendez-vous sur l'adresse IP de l'aspirateur depuis un navigateur.
  • Dans l'onglet "Paramètres", choisissez "Son et Voix".
  • Parcourir vos fichiers, sélectionnez le fichier de voix que vous avez téléchargé et cliquez sur "Télécharger le pack vocal".
  • Il ne vous reste plus qu'à tester en cliquant sur le bouton "Tester le volume sonore".

Mise à jour de Valetudo RE

Récupérez l'URL du dernier paquet et le MD5 associé :

Release Valetudo RE 0.10.5 · rand256/valetudo
This is the service update for 0.10 RE release, verified on S55 (fw 2034).Changes in this version: Fix for map canvas issue (seems only on newer chrome engine);Node.js updated to v.12.21.0 (some...

Dans "Paramètres" puis "Info", cliquez sur [envoyer la demande] et spécifiez l'URL du paquet (par exemple https://github.com/rand256/valetudo/releases/download/0.10.5/vacuum_2034_valetudo_re_0_10_5.pkg pour la version 0.10.5 correspondant au firmware 2034) puis le contenu du fichier MD5.

Après installation de la nouvelle version, vous devriez être à jour :


Communication en MQTT

Pour découvrir le protocole MQTT, je vous renvoie vers cette série d'articles :

MQTT, un protocole pour tous les rassembler - Partie 1 : le broker
MQTT (Message Queuing Telemetry Transport) est un protocole de messagerie de type publication-abonnement basé sur le protocole TCP/IP et assure une communication bi-directionnelle entre 2 appareils.
MQTT, un protocole pour tous les rassembler - Partie 2 : publier et souscrire
Nous avons vu dans la première partie de cet article[/mqtt-un-protocole-pour-tous-les-rassembler-partie-1-le-broker/] ce qu’était leprotocole MQTT et comment mettre en place un broker.Nous allons continuer avec la configuration de différents types d’objetsconnectés : modules wifi Shelly, capteur…
MQTT, un protocole pour tous les rassembler - Partie 3 : interactions avec la domotique
Cet article est le dernier de la série sur le protocole MQTT (après la partie 1sur le broker [/mqtt-un-protocole-pour-tous-les-rassembler-partie-1-le-broker/] et la partie 2 sur l’inclusion de modules[/mqtt-un-protocole-pour-tous-les-rassembler-partie-2-publier-et-souscrire/]),et nous allons voi…

Pour l'intégration MQTT, rien de plus simple, rendez-vous dans "Paramètres" puis "MQTT", et renseignez les informations de votre broker MQTT.

Vous pouvez vérifier dans MQTT Explorer le bon fonctionnement et la remontée des informations de votre aspirateur :

Vous trouverez sur la page suivante la liste complète des informations et commandes disponibles en MQTT :

rand256/valetudo
Valetudo RE - experimental vacuum software, cloud free - rand256/valetudo

Afficher la carte des passages du robot

Un peu gadget pour certains, elle permet pour d'autres de s'assurer que le robot aspirateur est bien passé dans tous les recoins de votre domicile.

Il est possible d'utiliser une URL http directe pour afficher la carte du robot, ou bien utiliser un service tiers pour générer le rendu de la carte en PNG.

Pour la carte directement mise à disposition par le firmware alternatif du robot, elle est disponible en vous rendant depuis un navigateur sur l'adresse http://IP.DE.L'ASPIRATEUR/api/simple_map. Attention toutefois, il n'est pas recommandé de faire trop de requêtes, ce rendu consommant pas mal de ressources.

Il existe le script suivant qui est installable en tant que service NodeJS ou via un conteneur Docker. Cela permet de faire plus de requêtes sans surcharger l'aspirateur.

Hypfer/ICantBelieveItsNotValetudo
A Valetudo companion service which renders maps to pngs - Hypfer/ICantBelieveItsNotValetudo

De mon côté, j'ai une petite préférence pour Docker, je vous partage pour information mon fichier docker-compose :

version: '3.8'

networks:
  lan:
    external: true

services:
    mapdata:
        image: rand256/valetudo-mapper
        container_name: mapdata
        networks:
            - lan
        ports:
            - 3002:3000
        environment:
            user: 1000:998
        restart: unless-stopped
        volumes:
            - ./conf/config.json:/app/config.json
        restart: always

Et le fichier config.json associé :

{
  "mqtt": {
    "identifier": "rockrobo",
    "topicPrefix": "valetudo",
    "autoconfPrefix": "homeassistant",
    "broker_url": "mqtt://192.168.0.xxx:1883",
    "caPath": "",
    "mapDataTopic": "valetudo/rockrobo/map_data",
    "minMillisecondsBetweenMapUpdates": 10000,
    "publishMapImage": true,
    "publishMapData": true
  },
  "mapSettings": {
    "colors": {
      "background": "#33a1f5",
      "background2": "#046cd4",
      "floor": "#56affc",
      "obstacle_strong": "#a1dbff",
      "path": "white",
      "forbidden_marker": "red",
      "forbidden_zone": "rgba(255, 0, 0, 0.38)",
      "cleaned_marker": "rgba(53, 125, 46, 1.0)",
      "cleaned_zone": "rgba(107, 244, 66, 0.3)",
      "cleaned_block": "rgba(107, 244, 36, 0.34)"
    },
    "drawPath": true,
    "drawCharger": true,
    "drawRobot": true,
    "drawCurrentlyCleanedZones": false,
    "drawCurrentlyCleanedBlocks": false,
    "drawForbiddenZones": true,
    "drawVirtualWalls": true,
    "scale": 4,
    "gradientBackground": true,
    "autoCrop": 20,
    "crop_x1": 30,
    "crop_y1": 70,
    "crop_x2": 440,
    "crop_y2": 440,
    "rotate": 90
  },
  "webserver": {
    "enabled": true,
    "port": 3000
  }
Attention ! Ne pas oublier de modifier l'adresse de votre broker MQTT.
Si vous avez mis en place l'authentification sur votre broker, l'adresse devra être de la forme :
mqtt://user:password@IP:port

L'intégration dans Jeedom

Le plus simple est de suivre le tutoriel suivant pour la mise en place de jMQTT :

MQTT, un protocole pour tous les rassembler - Partie 3 : interactions avec la domotique
Cet article est le dernier de la série sur le protocole MQTT (après la partie 1sur le broker [/mqtt-un-protocole-pour-tous-les-rassembler-partie-1-le-broker/] et la partie 2 sur l’inclusion de modules[/mqtt-un-protocole-pour-tous-les-rassembler-partie-2-publier-et-souscrire/]),et nous allons voi…

Ne pas oublier d'ajouter les commandes Stop / Start / Locate / Return_to_base / Pause... dans l'équipement jMQTT :

De mon côté, je préfère organiser mes équipements avec des virtuels, voici les informations utiles que j'ai gardé :

Le rendu du widget sur le dashboard :


Intégration dans Home Assistant

Sur votre interface Home Assistant, dans Configuration, Intégrations, recherchez MQTT si ce n'est pas déjà installé.

Renseignez les informations de votre broker mosquitto.

Lancez une action sur l'aspirateur et attendez un peu pour qu'il soit détecté automatiquement.

Pour ajouter l'aspirateur sur l'interface lovelace, nous allons utiliser une carte personnalisée grâce à HACS.

Info ! L'article sur l'installation de HACS arrive d'ici quelques jours.

Dans HACS, faîtes une recherche dans "Front end" avec les mots "vacuum Card" et installez le composant.

Sur votre interface lovelace, cliquez sur "Ajouter une carte" et sélectionnez "vacuum Carte".

La bonne entité devrait être sélectionnée automatiquement.

Il est également possible d'afficher la carte à l'aide du conteneur Hypfer/Icantbelieveitsnotvaletudo présenté plus haut. Pour cela, ajoutez une carte de type "Entité image",  et dans le chemin de l'image, renseignez l'adresse http://192.168.0.xx:3000/api/map/image.


Bonus : Contrôle avec un bot Telegram

Il est possible de connecter l'aspirateur directement à un bot Telegram pour le contrôler par écrit. Je vous conseille de créer un bot dédié à cette utilisation.

Commencez par discuter avec "BotFather" et envoyez le message /newbot. Donnez un nom à votre bot et vous obtiendrez en retour un token HTTP API, qu'il suffit de coller dans l'onglet "telegram bot" de la page Paramètres du robot. Vous pouvez définir un mot de passe pour que personne ne puisse contrôler votre aspirateur simplement en parlant à votre bot.

Suite à cela, rendez-vous sur Telegram pour initialiser une discussion avec votre bot, et envoyez le mot de passe avec la commande  /setme password, et enfin /start pour afficher les interactions possibles.

Vous pouvez maintenant contrôler votre aspirateur par Telegram, ainsi que recevoir des informations de celui-ci.


Conclusion

Après l'article vous présentant comment vous passer du plugin Xiaomi Home dans Jeedom pour les périphériques fonctionnant en Zigbee, celui-ci vous permet également de basculer le contrôle de votre robot-aspirateur en MQTT.

Si vous avez des questions ou simplement souhaitez échanger avec nous, n'hésitez pas à laisser des commentaires ou à venir sur notre groupe Telegram.

Information ! Sachez que les autres robots aspirateurs de la marque
disposent aussi d'un firmware alternatif :
lien pour le Gen2 / lien pour le Gen3