Ma domotique IV : MQTT

Le protocole MQTT est un des piliers de ma domotique, toutes les informations relatives la gestion de ma maison passent par lui.

MQTT signifie Message Queuing Telemetry Transport, c'est un protocole de messagerie publish-subscribe basé sur le protocole TCP/IP. Ses avantages sont sa rapidité, sa légèreté, la possibilité de gérer de multiple sessions, ou encore de retenir ou non les messages. Bref il est parfait pour la domotique.
Chacun de mes protocoles domotique va publier ses messages vers un topic dédié du serveur MQTT central :

  • Zigbee avec zigbee2mqtt vers le topic /zigbee
  • Zwave avec zwave-js-ui vers le topic /zwave
  • RfxCOM avec rfxcom2mqtt vers le topic /rfxcom2mqtt
  • TiC avec teleinfo2mqtt vers le topic /telefinfo
  • Bluetooth avec theengsgateway vers le topic /ble
  • Monitoring avec des scripts perso vers le topic /monitoring
  • Noyau domotique Node-RED vers le topic /iotnode
  • Assistant vocal local avec Rhasspy vers les topic /hermes et /rhasspy

Et oui MQTT transporte même les échantillons audio !
Chacun de ces protocoles domotiques est géré par un conteneur docker sur un VM dédié, cela permet de bien cloisonner les choses et de mettre en place, sauvegarder ou modifier uniquement la partie souhaiter sans casser le reste. Avec le temps je me suis rendu compte que de multiplier les VM ne surchargeait pas plus que ça le serveur Proxmox, couplé à des templates de VM, la mise en œuvre est ultra rapide.
Un logiciel tel MQTT Explorer va permettre de facilement voir tout ce qu'il s'y passe.

MQTT Explorer - topic
Exemple de topic dans le logiciel MQTT Explorer, mars 2024


Le noyau domotique (que j'ai nommé iotnode) va écouter tous ces topics et en récupérer les informations utiles, les traiter et les republier en version propre sur le topic MQTT /ionode, j'ai ainsi une vue simple de l'état de ma domotique. Le noyau va également se charger de publier les ordres vers chacun de ces protocoles.
Par exemple, le noyau va publier la valeur true vers le topic /zwave/10/37/0/targetValue/set pour allumer une lampe. Et il va écouter le topic /zwave/10/37/0/currentValue pour savoir si la lampe est allumée. Il va également reporter cette information dans le topic /iotnode/douche/lumiere/plafonnier ce qui est plus lisible pour le commun des mortels :)

MQTT Explorer - message
Exemple de valeur dans le logiciel MQTT Explorer, mars 2024



Installation du serveur MQTT

Dans le précédent billet sur la virtualisation, on a vu comment j'utilise mes machines virtuelles ainsi que l'installation du gestionnaire de Docker nommé Portainer. On va ici cloner un template de VM et utiliser Portainer pour installer notre Docker contenant le serveur MQTT.

On se rend dans le shell de notre serveur Proxmox et on créer notre machine virtuelle à partir du template docker et on lui adresse une IP fixe :

qm clone 910 121 --name mqtt
qm set 121 --ipconfig0 ip=10.1.4.121/23,gw=10.1.4.1


On peut démarrer notre VM.
Maintenant on se rend dans l'interface web de Portainer (cf billet précédent). Dans le menu de gauche Environements ou clique en haut à droite sur Add environement,.

Docker MQTT Install 01
Portainer, menu ajout d'environnement, avr. 2024


On choisie le type Docker Standalone puis Start wizard.

Docker MQTT Install 02
Portainer, sélection nouvel environnement, avr. 2024


Et on indique un nom et l'adresse de liaison qui sera l'IP de la VM sur le port 9001 et on clique sur Connect. Rien besoin de faire sur la VM puisque notre template est déjà prêt.

Docker MQTT Install 03
Portainer, configuration agent, avr. 2024


Notre VM Docker est désormais liée à Portainer d'où on gèrera le conteneur.
Maintenant on va créer notre conteneur MQTT toujours depuis Portainer. Pour cela on se rend dans le menu Stacks de notre environnement fraichement créé, et on clique sur Add stack, on lui donne un nom et on va remplir la fenêtre d'édition avec la configuration nécessaire à notre Docker MQTT :

Docker MQTT Install 04
Portainer, ajout de stack, avr. 2024


Le configuration sera celle ci-dessous. Puis on clique sur Update the stack. Notre serveur est en fonction.

version: "3.8"
services:
  mosquitto:
    image: eclipse-mosquitto:latest
    container_name: mqtt
    restart: always
    volumes:
      - config:/mosquitto/config
      - data:/mosquitto/data
      - log:/mosquitto/log
    ports:
      - 1883:1883
      - 8883:9001
volumes:
  config:
  data:
  log:


Quelques explications, on lui donne l'image docker du serveur mqtt qu'on désire eclipse-mosquitto:latest, le conteneur se nommera mqtt, il redémarrera dans tous les cas, et il écoutera sur les ports 1883 et 8883 (le port 9001 étant déjà utilisé par l'agent Portainer), ensuite on lui indique les différents volumes à utiliser, ici config, data et log. Ces volumes seront accessible dans la VM dans /var/lib/docker/volumes/mqtt_config/_data/xxx. A noter qu'on va faire en sorte à chaque création de configuration que ce chemin d'accès soit identique pour toutes les VMs cela évite de chercher on se trouve les fichiers de config d'une installation à une autre. ET cela peut-être utile pour des sauvegardes, mais personnellement je sauvegarde la VM entière.
On va aller modifier le fichier de configuration du serveur MQTT pour coller au besoin de notre domotique. Pour cela on se rend dans la console Proxmox de notre VM (ou par ssh) et on édite le fichier de configuration :

sudo nano /var/lib/docker/volumes/mqtt_config/_data/mosquitto.conf

Il doit contenir cela :

listener 1883
listener 9001
protocol websockets
persistence true
persistence_location /mosquitto/data
allow_anonymous false
password_file mosquitto/config/mqtt_passwd

Pour faire simple, on écoute sur les port 1883 et 9001, ici on est dans le conteneur donc le port d'écoute est bien le 9001 à l'intèrieur de conteneur alors qu'à l'extèrieur on écoute le port 8883. On autorise les websockets. on interdit les connexions anonymes et on utilise un fichier pour les mots de passe de connexions. Ce fichier de mot de passe est encrypté par le serveur MQTT il faut donc passer par lui pour le créer, pour cela toujours depuis notre console VM, on lance une session docker :

docker exec -it mqtt sh

Pour ajouter un login/mot de passe, on exécute la commande :

mosquitto_passwd mosquitto/config/mqtt_passwd un_login

Il va nous demander un mot de passe pour ce login. Ensuite on sort de la session en tapant exit.
Pour prendre en compte ces changement on relance le conteneur MQTT depuis Portainer depuis le menu de notre environement Containers -> mqtt -> Restart.
Voila notre serveur MQTT domotique prêt. Et vous incollable sur Portainer.
Ne pas hésiter à se promener dans les menus de Portainer et voir tout ce qu'il est possible de faire comme mettre à jour le stack, une image ou modifier un conteneur.

Dans le prochaine billet on va voir l'installation et le début de programmation du cœur de ma domotique sous Node-RED.

Ajouter un commentaire

Les champs suivis d'un * sont obligatoires

Les commentaires peuvent être formatés en utilisant une syntaxe wiki simplifiée.

Ajouter un rétrolien

URL de rétrolien : https://chez.jcdenis.fr/trackback/462

Haut de page