#Test de Zigbee2MQTT. Partie 2, inclure les équipements domotiques Xiaomi Aqara ou Mijia à Domoticz avec Node-RED [Màj]

Nous allons voir comment intégrer des accessoires Xiaomi Aqara ou Mijia sans avoir besoin de la gateway officielle à une serveur Domoticz. En juin dernier, nous avons avons pu tester le projet zigbee2mqtt qui permet d’intercepter les mesures en provenance de différents accessoires Xiaomi Aqara. le projet Zigbee2mqtt utilise un sniffer Zigbee que l’on connectera à un Raspberry Pi. Les messages interceptés sont ensuite publiés vers un serveur MQTT. Si vous avez loupé l’épisode précédent, vous pouvez lire le replay ici.

 

Je vous propose de tester plusieurs accessoires Aqara. Le capteur d’ambiance (température, humidité, baromètre), le détecteur d’ouverture de porte ou fenêtre et le détecteur de présence infrarouge. J’ai toutefois rencontré des difficultés pour créer un Dummy device qui combine les mesures de température, d’humidité et de pression atmosphérique (capteur Aqara WSDCQ11LM). Je ne désespère pas de trouver la solution mais en attendant, les mesures seront présentées dans des Devices séparés. Pour intégrer les sondes de température et d’humidité (ou température, humidité et pression atmosphérique), il faut remplir avec un zéro les données inconnues.

Préparer la gateway Zigbee2mqtt pour les accessoires Aqara et Mijia

Vous aurez donc besoin de fabriquer la gateway Zigbee2mqtt et d’installer le projet sur le serveur Domoticz. Si la couverture Zigbee est insuffisante, vous pouvez fabriquer plusieurs gateway. Je vous conseille toutefois de ne pas inclure un même accessoire Aqara sur plusieurs passerelles pour ne pas multiplier inutilement les messages MQTT.

Le pont zigbee2mqtt utilise un sniffer basé sur le circuit CC2531 de Texas Instrument. Vous aurez besoin d’acheter un CC Debugger de Texas Instrument (environ 16€) pour installer et mettre à jour le firmware sur le sniffer ainsi qu’un câble spécifique (GBAN) qui permet de relier le CC Debugger au Sniffer CC2531 (environ 2€) à chaque fois que vous voulez mettre à jour le firmware.

Suivez le tutoriel précédent pour la fabrication de la gateway Zigbee. J’ai également publié un boitier à imprimer en 3D sur Thingiverse ici.

cc2531 zigbee2mqtt gateway 3d printed case

Installer un serveur MQTT (Mosquitto) sur le Raspberry

Vous aurez également besoin d’un serveur MQTT. Le plus simple est de l’installer sur le même Raspberry Pi sur lequel est installé Domoticz. Exécutez la commande suivante pour installer le serveur et le client MQTT Mosquitto sur Raspbian. L’installation du client est optionnelle mais toutefois fortement conseillée pour tester et suivre les messages MQTT publiés par la passerelle Zigbee.

sudo apt-get update
sudo apt-get install mosquitto mosquitto-clients

Pour en savoir plus sur MQTT et comment sécuriser l’accès au serveur, vous pouvez lire ce tutoriel.

Inclure les accessoires Aqara ou Mijia au pont Zigbee2mqtt

Comme nous l’avons vu dans la première partie, il suffit d’appuyer sur le micro-interrupteur d’inclusion disponible sur chaque accessoire. L’astuce consiste à appuyer plusieurs fois (chaque secondes) une dizaine de fois pour empêcher celui-ci de se “rendormir” (la durée de vie de la batterie est vraiment excellente sur les accessoires Aqara). Voici deux illustration du bouton d’inclusion pour le contacteur de porte et le capteur de température/humidité/baromètre.

xiaomi aqara inclusion button door window redd switch xiaomi aqara inclusion button sht30 temperature humidity

Lancez le script de la gateway

cd /opt/zigbee2mqtt
npm start

Attendez d’avoir le message Zigbee: allowing new devices to join.

Dès que le premier message arrive (détection de mouvement, mesure de température…), c’est terminé, votre accessoire Zigbee est maintenant associé.

2018-6-4 12:37:41 INFO Zigbee: allowing new devices to join.
2018-6-4 12:37:48 WARN Message without device!
spinlock: false []
2018-6-4 12:38:04 INFO New device with address 0x00158d000155d2b7 connected!
2018-6-4 12:38:04 INFO MQTT publish, topic: 'zigbee2mqtt/bridge/log', payload: '{"type":"device_connected","message":"0x00158d000155d2b7"}'
2018-6-4 12:38:08 INFO Connecting with device...
2018-6-4 12:38:08 INFO MQTT publish, topic: 'zigbee2mqtt/bridge/log', payload: '{"type":"pairing","message":"connecting with device"}'
2018-6-4 12:38:13 INFO Connecting with device...

Je vous conseille ensuite de renommer chaque accessoire (par défaut, c’est le numéro de série qui est attribué comme nom de device).

nano /opt/zigbee2mqtt/data/configuration.yaml

En bas du fichier de configuration, vous allez trouver une nouvelle section nommée devices. Indiquez le nom de chaque accessoire avec la clé friendly_name. Evitez de mettre des espaces dans le nom des accessoires pour éviter les problèmes de Topic avec MQTT.

devices:
  '0x00158d000155d2b7':
    friendly_name: 'MiSWitch'
    retain: false

 

Relancez le script de la gateway lorsque c’est fait.

Installer Node-RED

Le pont Zigbee2mqtt publie les mesures et les états des capteurs Xiaomi vers un serveur MQTT. Ce sont des messages génériques qu’il va falloir ensuite “re-traiter” pour être utilisable par un serveur domotique par exemple. Pour le moment, le projet n’est compatible qu’avec Home Assistant nativement

architecture zigbee mqtt xiaomi aqara

Pour envoyer des messages compréhensibles par Domoticz, je vous propose d’utiliser Node-RED. On aura juste besoin de 3 blocs (nodes) pour publier les mesures sur le connecteur MQTT de Domoticz. Je vous conseille également d’installer Node-RED sur le même serveur qui héberge Domoticz en exécutant la commande suivante.

bash <(curl -sL https://raw.githubusercontent.com/node-red/raspbian-deb-package/master/resources/update-nodejs-and-nodered)

 

Cette commande lance le script d’installation qui s’occupe de tout !

Pour aller plus loin avec Node-RED, rendez-vous ici. Voici quelques articles qui pourraient également vous intéresser

Préparer Domoticz, ajouter un connecteur MQTT et un Dummy Device

Avant d’envoyer des messages à Domoticz, il faut connaître l’IDX du device qui va recevoir les mesures (ou les états On/Off). Lancez Domoticz et ouvrez le menu Setup puis hardware (matériel)

domoticz setup hardware

Dans la liste des matériels, sélectionnez MQTT Client Gateway with LAN Interface. Indiquez l’adresse sur serveur MQTT. S’il est installé sur le même Raspberry Pi que Domoticz, indiquez locolhost. Par défaut le port est 1883 sauf si votre configuration est différente. Si vous avez activé la protection par utilisateur/mot de passe, indiquez le dans les champs Username et Password. Cliquez enfin sur Add pour ajouter le matériel.

Domoticz écoute maintenant tous les messages qui sont publiés sur le topic domoticz/in.

domoticz add mqtt hardware

Dans la liste, choisissez maintenant le matériel Dummy. C’est un matériel qui permet de créer des appareils virtuels qui viendront afficher les mesures et les états renvoyés par les accessoires Xiaomi Aqara (ou n’importe quel autre accessoires ou objet connecté DIY d’ailleurs). Pour en savoir plus, vous pouvez lire ce tutoriel.

domoticz add dummy device

Maintenant, à chaque fois que vous voulez ajoutez un accessoire Xiaomi à Domoticz, cliquez sur le bouton Create Virtual Sensors situé sur la ligne du matériel.

domoticz create virtual sensors

Attention, le vocabulaire et l’organisation des éléments n’est pas toujours très évidente. Il faut souvent chercher un peu pour trouver le bon capteur. On va commencer par créer un appareil de type contacteur de porte. Dans la liste, choisissez le type Switch.

domoticz create virtual sensor switch

Dans la liste des appareils (depuis le menu Réglages – Setup), vous trouverez l’appareil que l’on vient de créer. On en profite pour noter son IDX. Comme vous pouvez le voir, c’est un type Light/Switch

domoticz virtual device light switch

Rendez vous dans les Interrupteurs (Switchs). Par défaut, l’appareil prend la forme d’une lampe. Cliquez sur le bouton modifier (Edit) situé en bas.

domoticz switchs list

Dans la liste des types d’interrupteurs, choisissez  le type Door Lock et enregistrez la modification.

domoticz door lock device

Voilà, tout est prêt.

Inclure le détecteur d’ouverture de porte et fenêtre Xiaomi Mijia (modèle MCCGQ01LM) à Domoticz

Le premier accessoire que je vous propose d’inclure est le détecteur de porte et fenêtre. C’est un contacteur magnétique (reed switch). Comme tous les accessoires Xiaomi, il est fixé à l’aide d’un autocollant. La détection d’ouverture (ou de fermeture) se déclenche au delà de 15mm. La capteur fonctionne à l’aide d’une batterie 3V CR1632. Petit défaut lié au principe du capteur, le détecteur ne fonctionne pas (ou mal) sur les surfaces métalliques. Par exemple, si vous voulez surveiller l’accès à un frigo ou un congélateur, il faudra prévoir un support pour décaler le capteur de la surface de l’ouvrant.

Voici le payload (message) renvoyé pour un contacteur de porte. Le JSON contient trois clés. L’état du contacteur (true s’il est fermé, false s’il est ouvert), la tension de la batterie et l’équivalent (0 à 100% de charge)

{
"contact":true,
"battery":"100.00",
"voltage":3045
}

Ouvrez Node-RED et importez ce flow. Le premier Node se connecte à serveur MQTT puis écoute les messages publiés sur le topic du capteur de porte.

[{“id”:”7f356e5c.dafc6″,”type”:”mqtt out”,”z”:”8cb500b2.1fda4″,”name”:””,”topic”:”domoticz/in”,”qos”:”2″,”retain”:””,”broker”:”72f9bb18.b361b4″,”x”:830,”y”:320,”wires”:[]},{“id”:”a22ad10c.51a01″,”type”:”mqtt in”,”z”:”8cb500b2.1fda4″,”name”:”Door/Windows Aqara Sensor”,”topic”:”zigbee2mqtt/ContacteurPorte”,”qos”:”2″,”broker”:”8687cf12.76eee”,”x”:260,”y”:300,”wires”:[[“b6337ad1.688718”]]},{“id”:”b6337ad1.688718″,”type”:”json”,”z”:”8cb500b2.1fda4″,”name”:””,”property”:”payload”,”action”:””,”pretty”:false,”x”:470,”y”:300,”wires”:[[“eb08f4b7.7da738”]]},{“id”:”eb08f4b7.7da738″,”type”:”function”,”z”:”8cb500b2.1fda4″,”name”:”Split”,”func”:”msg1={};\n\nif ( msg.payload.contact ) {\n msg1.payload = {\n \”command\” : \”switchlight\”,\n \”idx\” : 1,\n \”switchcmd\” : ‘Off’\n }\n} else {\n msg1.payload = {\n \”command\” : \”switchlight\”,\n \”idx\” : 1,\n \”switchcmd\” : ‘On’\n }\n}\n\n\nreturn [msg1];\n\n”,”outputs”:1,”noerr”:0,”x”:650,”y”:300,”wires”:[[“7f356e5c.dafc6″,”8179c4a2.d53af8″]],”inputLabels”:[“json”],”outputLabels”:[“Etat”]},{“id”:”8179c4a2.d53af8″,”type”:”debug”,”z”:”8cb500b2.1fda4″,”name”:””,”active”:true,”tosidebar”:true,”console”:false,”tostatus”:false,”complete”:”false”,”x”:830,”y”:280,”wires”:[]},{“id”:”72f9bb18.b361b4″,”type”:”mqtt-broker”,”z”:””,”broker”:”localhost”,”port”:”1883″,”clientid”:””,”usetls”:false,”compatmode”:true,”keepalive”:”60″,”cleansession”:true,”birthTopic”:””,”birthQos”:”0″,”birthPayload”:””,”willTopic”:””,”willQos”:”0″,”willPayload”:””},{“id”:”8687cf12.76eee”,”type”:”mqtt-broker”,”z”:””,”name”:”MQTT Local”,”broker”:”localhost”,”port”:”1883″,”clientid”:””,”usetls”:false,”compatmode”:true,”keepalive”:”60″,”cleansession”:true,”birthTopic”:””,”birthQos”:”0″,”birthPayload”:””,”closeTopic”:””,”closeQos”:”0″,”closePayload”:””,”willTopic”:””,”willQos”:”0″,”willPayload”:””}]

On doit mettre en forme le message MQTT pour qu’il soit conforme à l’API JSON de Domoticz. Elle est très bien détaillée sur la documentation officielle. Un contacteur de porte est une commande de type switchlight qui prend l’état On ou Off (attention, il faut respecter la majuscule sinon ça ne fonctionne pas). On indique également l’IDX de l’appareil Domoticz (ici c’est le 5).

msg1={};

if ( msg.payload.contact ) {
msg1.payload = {
"command" : "switchlight",
"idx" : 5,
"switchcmd" : 'Off'
}
} else {
msg1.payload = {
"command" : "switchlight",
"idx" : 5,
"switchcmd" : 'On'
}
}

return [msg1];

 

Enfin le bloc MQTT publie le message sur le topic domoticz/In. Il ne vous reste plus qu’à déployer le flow et jouer avec le capteur pour voir l’état changer sur Domoticz. Ne vous inquiétez pas, il faut quelques secondes pour que le pictogramme change mais c’est très rapide dans les faits. C’est simplement l’actualisation coté navigateur internet qui est plus lente sur Domoticz.

domoticz xiaomi aqara mijia door windows reed switch closed domoticz xiaomi aqara mijia door windows reed switch open

Détecteur de présence

Le détecteur de présence fonctionne exactement comme le contacteur de porte. L’état de la pièce est contenu dans la clé occupancy (présence) qui prend la valeur true ou false

{
"occupancy":true,
"battery":"100.00",
"voltage":3055
}

 

On testera donc la clé msg.payload.occupancy dans le code javascript du flow Node-RED à la place de la clé contact.

[{“id”:”3a090091.ae4c8″,”type”:”mqtt out”,”z”:”8cb500b2.1fda4″,”name”:””,”topic”:”domoticz/in”,”qos”:”2″,”retain”:””,”broker”:”72f9bb18.b361b4″,”x”:830,”y”:520,”wires”:[]},{“id”:”b8e32d3e.8889b”,”type”:”mqtt in”,”z”:”8cb500b2.1fda4″,”name”:”Temp+Hum+Baro Xiaomi”,”topic”:”zigbee2mqtt/THPsensor”,”qos”:”2″,”broker”:”8687cf12.76eee”,”x”:250,”y”:500,”wires”:[[“e434303b.43603”]]},{“id”:”e434303b.43603″,”type”:”json”,”z”:”8cb500b2.1fda4″,”name”:””,”property”:”payload”,”action”:””,”pretty”:false,”x”:450,”y”:500,”wires”:[[“61ca028f.8e6e5c”]]},{“id”:”61ca028f.8e6e5c”,”type”:”function”,”z”:”8cb500b2.1fda4″,”name”:”Split”,”func”:”msg1={};\nsvalue = msg.payload.temperature+\”;\”+msg.payload.humidity+\”;0;\”+msg.payload.pressure+\”;0\”;\nsvalue = svalue.toString()\nconsole.log(svalue);\nmsg1.payload = {\n \”command\” : \”udevice\”,\n \”idx\” : 2,\n \”nvalue\” : 0,\n \”svalue\” : svalue\n}\n\n\nreturn [msg1];\n\n”,”outputs”:1,”noerr”:0,”x”:630,”y”:500,”wires”:[[“3a090091.ae4c8″,”e297dcc8.3cb87″]],”inputLabels”:[“json”],”outputLabels”:[“Etat”]},{“id”:”e297dcc8.3cb87″,”type”:”debug”,”z”:”8cb500b2.1fda4″,”name”:””,”active”:true,”tosidebar”:true,”console”:false,”tostatus”:false,”complete”:”false”,”x”:830,”y”:480,”wires”:[]},{“id”:”72f9bb18.b361b4″,”type”:”mqtt-broker”,”z”:””,”broker”:”localhost”,”port”:”1883″,”clientid”:””,”usetls”:false,”compatmode”:true,”keepalive”:”60″,”cleansession”:true,”birthTopic”:””,”birthQos”:”0″,”birthPayload”:””,”willTopic”:””,”willQos”:”0″,”willPayload”:””},{“id”:”8687cf12.76eee”,”type”:”mqtt-broker”,”z”:””,”name”:”MQTT Local”,”broker”:”localhost”,”port”:”1883″,”clientid”:””,”usetls”:false,”compatmode”:true,”keepalive”:”60″,”cleansession”:true,”birthTopic”:””,”birthQos”:”0″,”birthPayload”:””,”closeTopic”:””,”closeQos”:”0″,”closePayload”:””,”willTopic”:””,”willQos”:”0″,”willPayload”:””}]

 

Editez l’appareil et choisissez le type Motion Detector dans la liste des appareils.

domoticz xiaomi motion sensor aqara

Et voilà, l’intégration est parfaite !

xiaomi aqara motion detection sensor off

Capteur de température, humidité et pression atmosphérique Aqara

Le capteur de THP de la gamme Aqara 2018 est souvent moins chère que l’ancien modèle Mijia et embarque en bonus un capteur de pression atmosphérique.

Le message MQTT renvoi également le niveau de la batterie (0 à 100%, la tension délivrée par la batterie). la température est exprimée en degrés Celcius. L’humidité en %. La pression atmosphérique en Pascal.

{
"battery":"100.00",
"voltage":3055,
"temperature":22.38,
"humidity":61.33,
"pressure":972
}

 

Comme je l’ai dit en introduction, il faut compléter les informations manquantes avec un zéro pour que Domoticz décode correctement le message MQTT. Par exemple Domoticz attend une savlue de la forme svalue=TEMP;HUM;HUM_STAT;BAR;BAR_FOR ou HUM_STAT et BAR_FOR prennent une valeur comprise en 0 et 4. Il faut absolument indiquer 0 (ce qui correspond à No Info) et pas laisser un espace vide (mon erreur !) Domoticz décode mal le message MQTT (probablement un bug de la version actuelle) si on combine les trois mesures sur un même capteur. Un zéro est ajouté ce qui décale totalement les mesures comme vous pouvez le voir. Si vous avez la solution, n’hésitez pas à partager.

Si on laisse vide les états, Domoticz décode mal le JSON

domoticz mqtt temp hum baro error

Alors qu’en complétant avec un zéro, c’est nickel

domoticz decodage correct mqtt temperature humidity pressure xiaomi aqara sensor

Pour intégrer la sonde d’ambiance, il faudra donc créer un capteur pour chaque mesure (température, humidité, pression atmosphérique). Du moins jusqu’à ce qu’une solution soit trouvée ou que le problème soit corrigé sur Domoticz.

[{“id”:”4fef80ac.ab9e1″,”type”:”mqtt out”,”z”:”8cb500b2.1fda4″,”name”:””,”topic”:”domoticz/in”,”qos”:”2″,”retain”:””,”broker”:”72f9bb18.b361b4″,”x”:830,”y”:580,”wires”:[]},{“id”:”fc3a2d7c.cf34a”,”type”:”mqtt in”,”z”:”8cb500b2.1fda4″,”name”:”Temperature”,”topic”:”zigbee2mqtt/THPsensor”,”qos”:”2″,”broker”:”8687cf12.76eee”,”x”:230,”y”:560,”wires”:[[“8dcc4e45.d50f6”]]},{“id”:”8dcc4e45.d50f6″,”type”:”json”,”z”:”8cb500b2.1fda4″,”name”:””,”property”:”payload”,”action”:””,”pretty”:false,”x”:470,”y”:560,”wires”:[[“980977ea.477a68”]]},{“id”:”980977ea.477a68″,”type”:”function”,”z”:”8cb500b2.1fda4″,”name”:”Split”,”func”:”msg1={};\nmsg1.payload = {\n \”command\” : \”udevice\”,\n \”idx\” : 4,\n \”nvalue\”: 0,\n \”svalue\” : msg.payload.temperature.toString(),\n \”battery\”: msg.payload.battery\n}\n\nreturn [msg1];”,”outputs”:1,”noerr”:0,”x”:650,”y”:560,”wires”:[[“4fef80ac.ab9e1″,”2f3b9fd2.c57b8″]],”inputLabels”:[“json”],”outputLabels”:[“Etat”]},{“id”:”2f3b9fd2.c57b8″,”type”:”debug”,”z”:”8cb500b2.1fda4″,”name”:””,”active”:true,”tosidebar”:true,”console”:false,”tostatus”:false,”complete”:”false”,”x”:830,”y”:540,”wires”:[]},{“id”:”72f9bb18.b361b4″,”type”:”mqtt-broker”,”z”:””,”broker”:”localhost”,”port”:”1883″,”clientid”:””,”usetls”:false,”compatmode”:true,”keepalive”:”60″,”cleansession”:true,”birthTopic”:””,”birthQos”:”0″,”birthPayload”:””,”willTopic”:””,”willQos”:”0″,”willPayload”:””},{“id”:”8687cf12.76eee”,”type”:”mqtt-broker”,”z”:””,”name”:”MQTT Local”,”broker”:”localhost”,”port”:”1883″,”clientid”:””,”usetls”:false,”compatmode”:true,”keepalive”:”60″,”cleansession”:true,”birthTopic”:””,”birthQos”:”0″,”birthPayload”:””,”closeTopic”:””,”closeQos”:”0″,”closePayload”:””,”willTopic”:””,”willQos”:”0″,”willPayload”:””}]

 

Il faut convertir la mesure en chaine à l’aide de la fonction Javascript toString() pour que Domoticz puisse interpréter correctement le message.

domoticz zigbee2mqtt temperature humidity pressure xiaomi aqara sensor

 

Voilà, le principe est similaire dans la plupart des cas. L’intégration d’autres appareils ne devait pas vous poser trop problème. Il faut à chaque fois utiliser qui correspond à l’accessoire Xiaomi. En voici quelques-uns d’après le code source du projet Zigbee2mqtt

  • occupancy, détection de présence (vu précédemment)
  • contact, contacteur de porte (vu précédemment)
  • water_leak, détecteur de fuite d’eau
  • smoke, détecteur de fumée
  • temperature,
  • humidity
  • pressure
  • click
  • power
  • action, probablement pour récupérer les actions du Magic Cube
  • light
  • brightness…

Bref, de quoi intégrer tous les accessoires domotiques Xiaomi

Dans le prochain article, nous verrons comment intégrer le détecteur de fumée Honeywell de Xiaomi et envoyer des notifications sur un smartphone avec PushOver.

 

Mises à jour 

  • [12/09/2018] Mise en forme correct des messages MQTT pour les capteurs combinés temp+hum+pressure
Print Friendly, PDF & Email

Inscrivez-vous à la newsletter hebdomadaire

Aucun spam et aucun autre usage ne sera fait de votre email. Vous pouvez vous désinscrire à tout moment.

Comparateur de prix

Bons plans

Les offres suivantes se terminent bientôt. Utilisez le coupon indiqué pour profiter du prix promo

Domotique et objets connectés à faire soi-même