MQTT, un protocole pour tous les rassembler - Partie 2 : publier et souscrire
Nous avons vu dans la première partie de cet article ce qu'était le protocole MQTT et comment mettre en place un broker.
Nous allons continuer avec la configuration de différents types d'objets connectés : modules wifi Shelly, capteurs Xiaomi, ampoules Ikea ou encore la téléinfo.
Les modules wifi Shelly sont nativement compatibles MQTT
Le premier module que je vais inclure sera une prise Shelly Plug S (achat sur le site officiel Shelly, sur Amazon ou encore sur la boutique Quintium), tout simplement parce qu'il n'y a besoin d'aucun composant supplémentaire pour le piloter à l'aide de notre broker mosquitto, les modules Shelly étant nativement compatibles MQTT.
Commençons par activer le MQTT sur notre prise Shelly. (Attention, l'activation du MQTT sur les modules Shelly coupe leur accès par le cloud. Ils pourront toujours être pilotés depuis l'application Shelly en réseau local, mais plus à distance.) Pour cela, suivez les quelques étapes ci-dessous :
- Se rendre avec un navigateur sur l'interface web du module Shelly : 192.168.1.110 pour moi.
- On choisit "Internet & Security" puis "ADVANCED - DEVELOPER SETTINGS"
- On coche "Enable action execution via MQTT" et on rentre l'adresse de notre broker, qui sera donc 192.168.1.2:1883 pour moi.
- On peut cocher "Use custom MQTT prefix" et définir sous quel nom le module s'annoncera auprès du broker.
- On renseigne les valeurs suivantes : 2 pour "Min reconnect timeout", 60 pour "Max reconnect timeout", 60 pour "Keep alive"
- Et enfin on sauvegarde.
Maintenant, nous allons utiliser MQTT Explorer pour vérifier que le module Shelly remonte correctement ses infos à notre broker, et qu'il est également possible de le contrôler à partir de celui-ci. Voici toutes les informations que nous obtenons.
Les modules Shelly remontent dans un topic shellies sur notre broker, sous un nom se composant du modèle et d'un identifiant (prise pour ma part). Nous pouvons observer plusieurs sous-topics, notamment online qui nous indique si le module est connecté, announce qui permet de remonter diverses informations (dont l'ID, le modèle du module, son adresse IP ainsi que son adresse MAC, la version du firmware installée et si une mise à jour de ce dernier est disponible), et la température du module (en °C et °F).
Un sous-topic relay/0 est également publié sur notre broker, avec le statut comme information principe et la puissance instantanée ainsi que la consommation du module.
Pour commander la prise, il va falloir qu'on publie sur le broker une commande qui va demander au module de s'allumer ou de s'éteindre.
Pour la prise Shelly Plug S, il faut publier sur le topic shellies/shellyplug-s-ID-Shelly/relay/0/command les valeurs "on" ou "off", ce qui va faire apparaître le topic command dans MQTT Explorer.
Déplier les topics afin d'arriver au sous-topic command et dans la partie droite de MQTT Explorer, indiquez la valeur "on" puis cliquez sur "Publish". Votre prise devrait s'allumer, et le sous-topic power devrait être mis à jour avec la consommation instantanée en Watts. Envoyez la valeur "off" pour éteindre la prise.
Vous retrouverez toutes les informations sur le MQTT des modules Shelly sur leur site.
Connecter un réseau Zigbee en MQTT
Passons à présent aux modules Xiaomi. Ceux-ci fonctionnent initialement avec une passerelle de la même marque, et peuvent être visibles dans nos solutions domotiques grâce à une API et l'exploitation de celle-ci à l'aide de plugins / intégrations. Des alternatives à la passerelle Xiaomi sont apparues, avec la démocratisation des modules Zigbee, sous forme de clé USB compatible Zigbee : un simple sniffer Zigbee CC2531 (qu'il est possible d'assembler soi-même en achetant les composants, et sur lequel il faudra flasher un firmware de contrôleur zigbee), une Zigate (projet français) ou encore la Phoscon Conbee 2.
J'ai choisi la clé Conbee 2, qui a une très bonne réputation, est produite par une société allemande qui ne risque pas de fermer prochainement (quoi que, on n'est jamais vraiment à l'abri).
L'avantage d'une telle clé est qu'elle est compatible avec une grande diversité de produits Zigbee, que ce soit les capteurs Xiaomi, mais aussi les produits Philips Hue, les lampes Ikea, et bien d'autres encore ...
On en vient à un grand avantage de la clé Conbee 2, et ce qui m'a conforté dans le choix de remplacer la passerelle Xiaomi par une solution plus pérenne. Elle va me permettre de remplacer plusieurs passerelles : 2 passerelles Xiaomi, 1 passerelle Philips Hue et 1 passerelle Ikea TRÅDFRI, ce qui va me libérer 4 prises de courant et 2 prises RJ45 !
Une fois le matériel choisi, nous devons étudier comment nous allons appairer les différents produits dont nous disposons à la clé Conbee 2 et les faire remonter dans nos solutions domotiques. Il existe plusieurs plugins supportant le Zigbee sous Jeedom (Deconz, Zigbee, Abeille, Raspbee), une intégration Deconz pour Home Assistant.
Une autre solution est de mettre en place un logiciel permettant d'interpréter les trames Zigbee et de diffuser les informations en MQTT à notre broker, puis de souscrire aux topics des différents modules depuis votre solution domotique grâce à un plugin ou une intégration MQTT, il s'agit de Zigbee2MQTT. Vous trouverez dans la liste des produits compatibles les produits des marques Ikea, Xiaomi, Philips, OSRAM, et bien d'autres encore.
Nous allons mettre en place ce dernier dans un conteneur Docker, en créant une nouvelle stack ou en ajoutant les services suivants dans la stack mqtt avec le conteneur déjà existant mosquitto.
version: '2'
services:
zigbee2mqtt:
container_name: zigbee2mqtt
volumes:
- volume-zigbee2mqtt:/app/data
- /run/udev:/run/udev:ro
ports:
- 8080:8080
devices:
- /dev/ttyACM0
environment:
- TZ=Europe/Paris
privileged: true
image: koenkk/zigbee2mqtt
restart: always
Notez que nous spécifions le chemin /dev/ttyACM0
pour notre clé Conbee 2.
Le paramètre privileged
accompagne le montage en tant que volume du répertoire /run/udev
en lecture seule, pour autodétecter le port. Ce volume et le paramètre associé sont optionnels.
Il reste une dernière étape de configuration manuelle à faire, à savoir indiquer à zigbee2mqtt à quel broker envoyer les informations qu'il devra lui remonter. En SSH, rendez-vous dans le répertoire du volume du conteneur zigbee2mqtt avec la commande cd /var/lib/docker/volumes/volume-zigbee2mqtt/_data
, et éditez le fichier de configuration avec la commande nano configuration.yaml
pour modifier l'adresse IP du broker. Ajoutez également les lignes suivantes pour activer l'interface web de gestion et visualisation des modules appairés :
frontend:
port: 8080
experimental:
new_api: true
Si vous avez une clé Conbee, il est conseillé d'ajouter les lignes suivantes pour en assurer la compatibilité et éviter un problème de démarrage de Zigbee2MQTT :
serial:
adapter: deconz
Votre fichier devrait ressembler à ça :
homeassistant: false
permit_join: true
mqtt:
base_topic: zigbee2mqtt
server: 'mqtt://192.168.1.2'
serial:
port: /dev/ttyACM0
adapter: deconz
frontend:
port: 8080
experimental:
new_api: true
Vous remarquerez la présence de 2 paramètres, homeassistant: false
et permit_join: true
, le premier sera abordé dans le prochain article, et le second sera à désactiver quand vous aurez terminé d'inclure tous vos modules.
Il existe également un autre conteneur permettant d'ajouter une interface web à Zigbee2Mqtt, il s'agit de Zigbee2MqttAssistant, dont voici le docker-compose.
version: '2'
services:
zigbee2mqttassistant:
container_name: zigbee2mqttassistant
ports:
- 8880:80
environment:
- Z2MA_SETTINGS__MQTTSERVER=192.168.1.2
#- Z2MA_SETTINGS__MQTTUSERNAME=<mqttusername>
#- Z2MA_SETTINGS__MQTTPASSWORD=<mqttpassword>
- TZ=Europe/Paris
restart: always
image: carldebilly/zigbee2mqttassistant
J'en parle ici parce que j'avais commencé à l'utiliser avant qu'on me parle de l'interface incluse dans Zigbee2Mqtt. Ma préférence va à celle intégrée dans Zigbee2Mqtt, car même si un conteneur est léger et peu consommateur, cela en fait toujours un de moins. De plus, il se trouve que l'interface intégrée est plus complète, elle permet de visualiser les informations remontées par les modules et même de les contrôler, elle permet également de gérer les groupes ou encore de visualiser les logs.
Les captures d'écran dans l'article seront donc faites avec ces 2 interfaces, vous laissant le choix de celle que vous souhaitez utiliser.
Une fois que le conteneur est configuré et tourne au côté de notre broker, nous allons pouvoir passer à l'inclusion d'un premier module Xiaomi, un capteur de température, ainsi que d'une ampoule Ikea TRÅDFRI.
Pour le capteur de température Xiaomi, appuyez sur le bouton de réinitialisation (le petit bouton en haut) et maintenez-le enfoncé pendant environ 5 secondes, jusqu'à ce que le voyant bleu commence à clignoter.
Le capteur rejoindra automatiquement le réseau de la clé Conbee 2.
Vous pouvez vérifier dans l'interface web de Zigbee2Mqtt ou dans Zigbee2MqttAssistant que le capteur apparaît, ainsi que dans MQTT Explorer. Les informations de température, d'humidité, d'indicateur de batterie ou de qualité du lien remontent correctement.
Passons à la l'ampoule Ikea, annoncée compatible. Comme pour les modules Xiaomi, il faut procéder à un reset de l'ampoule pour qu'elle puisse se connecter au réseau zigbee de la Conbee 2. Faites cette procédure au plus proche de la clé Conbee, éteignez et rallumez 5 fois de suite et assez rapidement l'ampoule. Allumez-la une 6ème fois et elle devrait se mettre à varier d'intensité, signe que le reset à bien fonctionner.
Vous devriez également la voir apparaître dans les 2 interfaces web de Zigbee2Mqtt et Zigbee2MqttAssistant et MQTT Explorer.
Pour commande l'ampoule et l'allumer ou l'éteindre, vous devez publier "on" ou "off" sur le topic zigbee2mqtt/<FRIENDLY-NAME-LAMPE>/set
. L'interface web de Zigbee2Mqtt permet également de commander l'ampoule.
Après avoir inclus vos différents modules, vous les retrouverez dans Zigbee2MqttAssistant ou encore dans le fichier configuration.yaml
. Vous pouvez changer le "friendly_name" pour que les équipements remontent avec un nom plus sympa qu'un ID incompréhensible.
Petit bonus, il est possible de faire des mises à jour de firmware en OTA (Over The Air) avec Zigbee2Mqtt. Les produits Ikea TRÅDFRI ou encore Philips Hue sont supportés notamment.
Si vous avez une lampe qui vous indique la valeur "true" pour "update_available", une mise à jour du firmware est disponible. Il vous suffit d'envoyer l'identifiant unique du module dans un topic spécifique pour lancer la mise à jour. La mise à jour OTA d'un équipement est également possible depuis l'interface web de Zigbee2Mqtt.
Attention, la mise à jour en OTA peut être un peu longue (entre 5 et 30 minutes) et il est parfois nécessaire pour les modules sur pile de les réveiller régulièrement.
Il est également possible de le faire depuis Zigbee2MqttAssistant.
Voici un extrait des logs de Zigbee2Mqtt pendant le déroulement de cette mise à jour :
info 2020-11-08 17:39:10: Update available for 'lampe_coeur'
info 2020-11-08 17:44:57: Updating 'lampe_coeur' to latest firmware
info 2020-11-08 17:45:09: Update of 'lampe_coeur' at 0.00%
info 2020-11-08 17:45:09: MQTT publish: topic 'zigbee2mqtt/bridge/log', payload '{"message":"Update of 'lampe_coeur' at 0.00%","meta":{"device":"lampe_coeur","progress":0,"status":"update_progress"},"type":"ota_update"}'
info 2020-11-08 17:54:12: MQTT publish: topic 'zigbee2mqtt/bridge/log', payload '{"message":"Update of 'lampe_coeur' at 31.04%, +- 20 minutes remaining","meta":{"device":"lampe_coeur","progress":31.04,"status":"update_progress"},"type":"ota_update"}'
info 2020-11-08 18:12:53: MQTT publish: topic 'zigbee2mqtt/bridge/log', payload '{"message":"Update of 'lampe_coeur' at 98.45%, +- 1 minute remaining","meta":{"device":"lampe_coeur","progress":98.45,"status":"update_progress"},"type":"ota_update"}'
On continue avec ... la teleinfo !
La télé-information (ou TIC) permet de relever des informations sur l'abonnement ou la consommation depuis le compteur électrique de votre fournisseur d'énergie, telles que la consommation instantanée ou totale, l'intensité souscrite ou instantanée, ...
Différents systèmes permettent de relever ces informations, comme l'Eco-Devices de GCE ou encore le module téléinformation USB GCE. La machine qui me sert à héberger mes conteneurs Docker étant juste à côté du compteur Linky, et au vu du coût plus faible du module USB, c'est celui-ci que j'ai choisi.
Pour continuer sur notre lancée, nous allons ajouter un conteneur dans notre stack mqtt :
version: '2'
services:
teleinfo-mqtt:
container_name: teleinfo2mqtt
environment:
- MQTT_URL=mqtt://192.168.1.2:1883
- MQTT_TOPIC=teleinfo/compteur
devices:
- /dev/ttyUSB0
restart: always
image: fmartinou/teleinfo-mqtt
Il vous faut indiquer l'adresse IP et le port de votre broker MQTT, ainsi que le topic sur lequel vous souhaitez que les informations soient publiées. N'oubliez pas de préciser sur quel port USB est branché le module teleinfo GCE.
Le module teleinfo USB envoie ses données en temps réel, on peut donc observer très rapidement dans MQTT Explorer les informations publiées.
{"ADCO": {"raw": "XXXXXXXXXXXX","value": 123456789},
"OPTARIF": {"raw": "BASE","value": "BASE"},
"ISOUSC": {"raw": "45","value": 45},
"BASE": {"raw": "008181023","value": 8181023},
"PTEC": {"raw": "TH..","value": "TH"},
"IINST": {"raw": "002","value": 2},
"IMAX": {"raw": "090","value": 90},
"PAPP": {"raw": "00600","value": 600},
"HHPHC": {"raw": "A","value": "A"}}
On retrouve le numéro d'identifiant du compteur (ADCO), l'abonnement souscrit (OPTARIF qui vaut BASE dans mon cas), l'Index (BASE qui vaut 8181023), la Puissance apparente (PAPP, soit 600 Va à ce moment), ...
Petite astuce avec MQTT Explorer, vous pouvez affichez un graphique de l'évolution d'une valeur, en cliquant sur la petite icône à côté de la valeur quand vous affichez les détails d'un topic.
Maintenant que nos différents produits remontent leurs informations et sont pilotables en mqtt, le prochain article nous aidera à appréhender comment nous allons les intégrer dans notre solution domotique préférée, que ce soit Home Assistant, Gladys, Domoticz, Jeedom, ou d'autres que je n'aurais cité ... .