[Tuto] jMQTT + Mosquitto + ZWaveJS2MQTT

Tags: #<Tag:0x00007fa7ac66a0e8> #<Tag:0x00007fa7ac669fd0>

Références

https://community.jeedom.com/t/openzwave-1-6-zwave2mqtt-jmqtt
https://community.jeedom.com/t/configuration-jmqtt-et-zwavejs2mqtt
https://community.jeedom.com/t/jmqtt-nouveau-demon-en-beta
https://domochip.github.io/jMQTT/fr_FR
https://zwave-js.github.io/zwavejs2mqtt

Version n°2 du 21/06/2021 avec quelques modification mineurs et tips.

Introduction

Ce tuto vous guidera à la mise en place d’une architecture basée sur MQTT pour travailler avec Z-Wave. Elle vient donc en remplacement du plugin Z-Wave de Jeedom qui est basé sur une version assez ancienne d’OpenZWave.

Ce tuto n’a pas pour vocation d’être la référence en la matière et contient surement encore des imperfections et des erreurs, il s’agit de la manière dont j’ai procédé mais il y en a d’autres. Il permettra je l’espère à ceux qui veulent se lancer d’éviter les difficultés de compréhension et de configuration que j’ai rencontré.

Que les experts en la matière n’hésite pas à apporter leurs lumières constructives (et non cassantes) pour permettre à ce tuto d’évoluer dans le bon sens :slight_smile:

Je précise que :

  • je n’incite pas particulièrement à quitter le plugin Z-Wave. J’admire et remercie l’équipe Jeedom parce qu’on se rend compte assez vite de la facilité d’utilisation du plugin quand on cherche à migrer
  • ces opérations s’adressent à un public averti et qu’il faudra, suivant le nombre d’équipement Zwave en place, pas mal d’heures de travail pour adapter designs, scenarios etc …

Mes observations :

  • Un démarrage du réseau ZWave en quelques secondes contre environ 300 secondes via le plugin Z-Wave
  • Des ordres qui passent plus vite
  • Pas d’ordres perdus jusque ici grâce à un principe de QoS qui se charge de vérifier que l’ordre est bien passé !

Préparation

Conseil avant de se lancer : Vérifier que vos équipements sont inclus en mode non sécurisé (le cadenas non fermé de la page santé du plugin Z-Wave) et si ce n’est pas le cas faite le. Cela pourrait résoudre bien des problèmes avec le plugin Z-Wave et vous n’aurez pas à réinclure ces périphériques sécurisés sur le nouveau système.
Note : Il a été indiqué par @bart11064 que les modules sécurisés ont été récupérés, à confirmer avec d’autres installation.

Besoin :

  • Proxmox (serveur de virtualisation) pour créer une nouvelle VM mais l’installation pourra se faire sur un autre matériel. Il est aussi possible d’utiliser un Doker, c’est ce qui est indiqué en premier dans la documentation
  • Le Broker Mosquitto et le programme ZWaveJS2MQTT que nous installerons sur une nouvelle VM afin de séparer un peu les processus
  • Le plugin jMQTT que nous installerons sur la VM Jeedom

Lien vers la documentation du plugin jMQTT et explication sur le principe de communication : https://domochip.github.io/jMQTT/fr_FR/
Lien vers la documentation de ZWaveJS2MQTT qui décris également les méthodes d’installation : https://zwave-js.github.io/zwavejs2mqtt

Mosquitto est un serveur MQTT (Message Queuing Telemetry Transport). Le MQTT est un protocole qui fonctionne sur un principe de souscription et de publication.
jMQTT est connecté à Mosquitto afin de recevoir les messages souscrits et publier ses propres messages.
ZWaveJS2MQTT interagi lui avec les équipements Zwave pour recevoir et envoyer les messages des équipements.

Il faut donc voir les communications sur ce principe, Mosquitto étant au centre du dispatching des messages:
Jeedom (jMQTT) <> Mosquitto <> ZWaveJS2MQTT <> Equipements ZWave

Créer, installer et configurer une VM mqtt

Créer une nouvelle VM (1vCPU pour 2 Go de RAM) sur Proxmox puis installer Debian 10.

su -
apt-get install sudo
usermod -aG sudo mqtt
reboot
sudo apt update

Installer Mosquitto

sudo apt install mosquitto
systemctl status mosquitto

Note : port d’écoute de Mosquitto 1883

Installer SNAP

sudo apt install snapd
sudo snap install core

Installer zwavejs2mqtt avec SNAP

sudo snap install zwavejs2mqtt

sudo snap connect zwavejs2mqtt:raw-usb
sudo snap connect zwavejs2mqtt:hardware-observe

sudo snap start --enable zwavejs2mqtt
sudo snap services zwavejs2mqtt

sudo snap set zwavejs2mqtt server.host=0.0.0.0
sudo snap set zwavejs2mqtt server.ssl=true

Note : port d’écoute de zwavejs2mqtt 8091

Bascule du contrôleur ZWave vers zwavejs2mqtt

Stopper le daemon Zwave puis stopper la VM Jeedom
Stopper la VM mqtt
Attribuer le contrôleur ZWave à la nouvelle VM mqtt et retirer l’attribution de la VM Jeedom
Attention pour rappel : Dans Proxmox décocher impérativement « Use USB3 »

Démarrer la VM mqtt puis la VM Jeedom
Exécuter « lsusb » dans la nouvelle VM mqtt pour vérifier si votre contrôleur est bien découvert par Debian

Accès et configuration de zwavejs2mqtt

Accéder à l’adresse : https://ip_nouvelle_VM:8091/

Note : Le site étant protégé par un certificat auto-généré il faut cliquer sur Avancé puis « Continuer »
image

Roue cranté section Zwave :

  • Serial Port : /dev/ttyACM0 (Il se pourrait que ce soit un autre port /dev chez vous)
  • Network Key : La key de votre contrôleur est à récupérer dans ce fichier : /var/www/html/plugins/openzwave/resources/openzwaved/ozwave/manager_utils.py à la ligne 24 (merci @naboleo).
    Attention la Network Key est constituée de 32 caractères vous devez donc la transformer.
    Si dans le fichier vous avez une chaine de caractères : 0x01, 0x02, 0x03 …. Alors votre Network Key sera 010203…

Roue cranté section Mqtt :

  • name : zwavejs2mqtt
  • host : localhost
  • Port : 1883
  • Reconnect period : 3000
  • Prefix : zwave [c’est ce préfix qui servira à souscrire et publier des messages depuis jMQTT]
  • QoS : 1
  • Retain : ON
  • Clean : ON
  • Store : OFF

Option : Vous pouvez choisir de changer la typologie des messages envoyés au broker dans la section Gateway. Par exemple, on peut mettre des noms un petit peu plus explicite plutôt que « /38/1/ », ou retirer la Time-Value de chaque message.

Vérifiez en haut à droite que l’opération de découverte des équipements Zwave est en cours (sur cette capture le scan est terminé) :
image

Installation et configuration du plugin jMQTT

  1. Installer le plugin jMQTT sur Jeedom - version au moment du tuto : bêta 2021-06-02 21:57:47
    J’ai remarqué des déconnexions avec la version stable c’est pourquoi je suis passé sur la bêta.
  2. Décocher la case « Installer Mosquitto localement » puis installer les dépendances
    image
  3. Activer la « Gestion automatique » puis démarrer le Daemon
  4. Ajouter un Broker et indiquer l’adresse IP de votre nouvelle VM mqtt :
    image

Le client MQTT doit passer en status OK :
image

Ajout de vos équipements dans le plugin jMQTT

Télécharger l’outil MQTT-Explorer pour vous aider à mieux comprendre ce qui ce passe quand les informations sont publiées dans les topics : https://mqtt-explorer.com/

Dans ZWaveJS2MQTT menu Control Panel dérouler l’un des équipements dont l’interview est « Complete »
Cliquer sur « ADVANCED » puis sur EXPORT et ouvrir le fichier .json avec un éditeur de texte

Exemple avec un capteur de température:
image

Dans le fichier .json chercher « topic » pour identifier à quoi va ressembler l’une des commandes
servant à récupérer/envoyer des informations.

Important : Sur cette capture on voit le préfix zwave, le nom de l’équipement nodeID_12, puis la suite du topic permettant de récupérer la température d’un capteur MultiSensor 6
image

Dans les captures suivantes j’ai choisi d’affecter un « Name » et une « Location » à mes équipements depuis ZWaveJS2MQTT. En conséquence le topic de cette commande devient zwave/bureau/sensor/49/0/Air_temperature à la place de zwave/nodeID_12/49/0/Air_temperature

Si vous faites de même il faudra attendre que les équipements communiquent à nouveau sinon ils communiqueront sur les anciens topics

image

Création d’un équipement pour voir l’ensemble des commandes de type informations (ce ne sera pas notre équipement final et je le désactiverai)

Topic : zwave/bureau/sensor/#
Le « # » sert à souscrire à l’ensemble des topics de l’équipement donc l’ensemble des commandes
Laisser la case « Ajout automatique des commandes » cochée pour que le plugin fasse le travail :
image

Une fois l’équipement crée, dans l’onglets des commandes cliquer sur JSON pour mieux voir les résultats :
image

On retrouve la commande vue dans le fichier json un peu plus haut et qui sert à récupérer la température ici à 25.9 °C :
image

Exécuter « MQTT Explorer » et observer les topics. On retrouve la valeur de 25.9°C. Cette value associée au time (qui est le timestamps à laquelle cette valeur a été mise à jour) constitue un payload.

Cet outil vous permettra ensuite de retrouver des informations ou de comprendre pourquoi certaines actions ne produisent pas d’effet

image

Création d’un équipement qui sera notre équipement final et qui servira de template si vous avez plusieurs équipement du même modèle à créer

Faire un template vous permettra de gagner beaucoup de temps lorsqu’il s’agira de créer d’autres équipements identiques (une série de volets par exemple).

Attention cette fois il faut décocher « Ajout automatique des commandes » avant de sauvegarder afin de créer les commandes à la main.

image

Ajouter les commandes voulues puis Sauvegarder :
image

A la prochaine communication du module, les informations doivent remonter :
image

Pour un équipement sur lequel il y aura des commandes à envoyer c’est moins évident car elle n’apparaissent pas dans les commandes crées automatiquement et elles sont parfois plus difficiles à trouver (exemple avec le STOP d’un module FGR-223).

Dans le fichier .json d’un FGR-223 on observe que pour envoyer une position il faudra le passer un topic « /targetValue/set » et transmettre une valeur entre 0 et 99 :
image

Commandes d’un FGR-223 pour mieux comprendre (j’ai mis la commande STOP au passage qui est pénible à récupérer) :
image

Une fois l’équipement modèle crée nous pouvons créer le template puis l’appliquer sur les futurs équipements.

Cliquer sur « Créer Template » :
image

Créer un nouvel équipement sans rien remplir puis cliquer sur « Appliquer un Template » :
image

Selectionner le template et indiquer le topic de votre nouvel équipement (ici c’est pour créer le volet « parents ») :
image

Vous observerez que l’ensemble des commandes est remplacé :
image

Compléments

Pour comprendre comment envoyer ou récupérer certaines commandes vous pouvez aussi faires des actions dans l’interface de ZWaveJS2MQTT et regarder dans MQTT Explorer ce qu’il se passe pour essayer de le reproduire.

La currentValue est 25 et je vais envoyer la targetValue 40 en cliquant sur la flèche :
image

Dans MQTT Explorer on observe bien la mise à jour de la valeur et l’historique de la valeur :
image

Concernant la bascule à proprement dite puisqu’il s’agit de modifier les commandes un peu partout (scénario, design, …) il y a 2 méthodes :

  • Créer les doublons et y adapter avec les nouvelles commandes
  • Utiliser la fonction « cette commande remplace la commande » de Jeedom

C’est la fin de ce tuto merci à @Tonio16, @olive, @SWR, @naboleo et @lguezennec pour m’avoir donné un coup de main sur le démarrage et bien sûr merci à @Domochip pour ce plugin jMQTT

Merci également à @bart11064, @chris_77 et @jerome6994 pour leurs premiers retours et mise en pratique.

17 J'aimes

Bonjour @Bison

Bravo pour l’esprit community

et merci de tout ce travail.

:heart: :+1:

2 J'aimes

+1 Bravo @Bison :wink: et Merci !

1 J'aime

Bonjour Bison,

J’ai pas de zwave mais bravo pour ce tutoriel et surtout ton partage pour la communauté :+1: :clap:

1 J'aime

Super tuto @Bison

J’ai retrouvé les différents tutos et infos trouvées sur le net pour me lancer dans l’aventure ZWaveJS2MQTT dans ton tuto, juste que je suis passé sur un container au lieu d’une VM.

Merci pour l’astuce sur les templates… :smiley:

Je le garde sous le coude au cas où j’aurai à réinstaller !

Top !
Ca fait un moment que je me tate pour améliorer la stabilité zwave, ton tuto tombe parfaitement. :raised_hands:
Du coup, tu confirmes que tu n’as pas eu à réassocier les endpoints avec le controleur ? Tu as juste basculé le dongle vers zwavejs2mqtt et il y a eu un rediscover de tous les items (si non sécurisé) ?

1 J'aime

Salut @chris_77, merci :smile:

Salut @bart11064, en effet, pas besoin de ré-associer les modules si l’inclusion était en non sécurisée.
Il faut juste bien faire attention à utiliser la bonne Network Key car chez moi elle avait été générée sans correspondre à celle de mon contrôleur. Chez d’autres apparemment c’était OK tout de suite …

Après la bascule du contrôleur, zwavejs2mqtt redécouvre tout ce qui se trouve sur le dongle.

Si certaines choses semble manquer tu pourras au cas par cas faire un re-interview au niveau du node :
image

N’hésites pas à faire un retour si tu te lances afin d’améliorer le tuto :wink:

2 J'aimes

Et bien je n’ai pas résisté longtemps ! ^^
J’ai tout basculé hier, et tout à l’air de bien tourner, à confirmer avec le temps.

De mon côté c’est légèrement différent : j’avais déjà un serveur MQTT dédié sur un conteneur, je n’ai eu qu’à connecter zwavejs2mqtt dessus.

Ce tuto m’a bien aidé pour démarrer, en particulier la conf initiale de Z2M. La network key récupérée a très bien permis l’import, et cela m’a même importé les modules en mode sécurisé !

Quelques petits tips :

  • arrêter le daemon zwave sur jeedom simplement, ca permet de garder l’accès aux équipements précédents et récupérer des infos si nécessaire
  • si vous voulez simplifier, vous pouvez changer la typologie des messages envoyés au broker dans la section gateway des options. (Par exemple, on peut mettre des noms un petit peu plus explicite plutôt que « /38/1/ », ou retirer la value time de chaque message)
  • mettre à jour dès le départ Name et Location de chaque noeud, ca évite de devoir refaire
  • enchainer avecadvanced -> clear retained puis refresh values, ca permet de nettoyer le broker mqtt des anciens topics puis de forcer le chargement des nouveaux, lors du discover sur jMQTT ca simplifie beaucoup
  • travaillez bien vos templates sur jMQTT, ca fait gagner un temps fou (mettre le type, les liaisons d’état, l’affichage widget, etc…). Une fois qu’un template est fait pour un type de produit, les suivants ca va trèèèèès vite !
  • pour migrer vers les nouveaux équipements via jMQTT, la fonction « cette commande remplace la commande » de jeedom est ton meilleur ami !! :smiley: Et la copie de l’historique sur la nouvelle commande aussi.

Merci @Bison pour ce tuto qui m’a permis de me lancer, et de basculer avec succès !

5 J'aimes

Hello @bart11064 merci pour ce retour.

Plusieurs tips sympa notamment pour faire le clear retained et la migration vers les nouveaux équipements. Je n’ai pas du tout pensé à cette fonction du coup j’ai presque tout dupliqué en MQTT :face_with_hand_over_mouth:

J’avais également stoppé le daemon pour avoir les équipements du plugin Z-Wave sous la main.

Ça ne te dérange pas si j’ajoute certains tips dans le tuto ?

Je pense effectivement qu’il est préférable d’utiliser une variante container, ca limitera la maintenance de l’os sur lequel ca tourne.
Mais sinon c’est une belle option pour éviter d’avoir les limitations actuelles du plugin zwave, et ça rend même le réseau plus fiable.
Mais c’est moins intégré, on ne peut pas tout avoir ^^

Pas de problème !
Par contre, c’est peut-être lié à ma conf MQTT.

Je proposerai plutôt ca qui à l’air de marcher à tous les coups :
faire la configuration de la typo des messages dans les options, puis faire la MAJ Name et Location sur chacun des nodes => ensuite redémarrer le deamon MQTT, et enfin faire un refresh values
Ca devrait flusher tous les messages existants précédemment (le redémarrage du daemon) et reload les topics nécessaires.
Quelqu’un peut tester avec le daemon de jMQTT ? :slight_smile:

Oui c’est vrai que c’est plus sympa pour ma part.
Mosquitto, Zigbee2MQTT, et ZWaveJS2MQTT sous docker tout tournent tranquille.

Pour le moment pas assez de recul mais au moins je peux redémarrer mon Jeedom si besoin sans me soucier et me poser la question est-ce que le zwave va remonter (trop souci…) !!

C’est vrai mais l’aventure est sympa. Juste mettre les mains dans le cambouis pour récupérer ses petits.

Bonjour
Merci à tous. Je ne suis pas un expert mais tout cela donne envie de tenter l’aventure. Mais je n’ai qu’un PI4 sur lequel tourne déjà Mosquitto et JMQTT pour recupérer les équipements de ma Thombox. En parallèle plusieurs équipements zwave avec cle zwave usb.
La charge actuelle de mon pI4 actuelle est en moyenne de 0,2 donc il me semble qu’il y a encore de la capacité.
N’est il pas possible d’installer ZwaveJS2MQTT en sus sur mon PI4 ?
Si oui quelle procédure suivre car le tuto est dédié à une autre architecture.

Merci de vos avis et de votre aide

Salut

Utilise ce tuto pour l’installation sous docker:

Je l’ai utilisé et cela marche très bien.

Antoine

1 J'aime

moi je l’ai installer en direct sur la machine ave cette procedure :
Insallation zwavejs2mqtt

…pour installer zwavejs2mqtt dans les grandes lignes sur un debian 10.x :

git clone https://github.com/zwave-js/zwavejs2mqtt /opt/zwavejs2mqtt
cd /opt/zwavejs2mqtt
npm install
npm run build
npm start

nano /etc/systemd/system/zwavejs2mqtt.service

[Unit]
Description=zwavejs2mqtt
After=network.target

[Service]
ExecStart=/usr/bin/npm start
WorkingDirectory=/opt/zwavejs2mqtt
StandardOutput=inherit
StandardError=inherit
Restart=always
User=root

[Install]
WantedBy=multi-user.target

inscription au démarrage :

systemctl enable zwavejs2mqtt.service

Démarrage du service :

systemctl start zwavejs2mqtt

J’ai actuellement un PI4 (2Go) sur lequel tourne docker avec 5 containers
Portainer
Mosquitto
Zigbee2MQTT
ZwaveJS2MQTT
Watchtower (mise à jour des containers auto)

Aucun ralentissement, et j’oubliai, il y a aussi une antenne BLEA

1 J'aime

Merci de vos retours.

Bonsoir

Merci bcp pour tout ça c’est top
Cela faisait un moment que je regardais un peu tout pour faire la bascule mais là cela donne plus qu’envie d’y aller.

Je suis déjà avec une VM specifique serveur MQTT et le client MQTTsur Jeedom pour le zigbee2mqtt.
Du coup si je comprends bien je peux passer directement à l’étape Installer SNAP sur la VM de mon serveur MQTT c’est ça ?
Les étapes précédentes ne sont pas nécessaires ?

Bonsoir,

En effet si tu as déjà une VM qui fait tourner Mosquitto tu peux attaquer par l’étape avec SNAP pour installer ensuite zwavejs2mqtt.

D’autres on fait le choix du conteneur mais je n’ai jamais essayé donc j’ai choisi le genre de technique plus classique et que je connaissais.