[Tuto] jMQTT + Mosquitto + ZWave-JS-UI (anciennement ZWaveJS2MQTT)

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 (lien KO)
Z-Wave JS UI (nouveau lien)

Version n°7 du 05/03/2023 pour ajout d’informations à propos d’un problème d’accès à l’interface depuis la version 8.8.6 et dans certains cas. Merci Arthur.

Note du 09/10/2022 : Depuis le 21/09/2022 zwavejs2mqtt a été renommé zwave-js-ui

:arrow_right: Pour la migration depuis zwavejs2mqtt, voir ce post : [Tuto] jMQTT + Mosquitto + ZWave-JS-UI (anciennement ZWaveJS2MQTT) - #372 par Bison

:arrow_right: Pour une nouvelle installation, voir la suite.

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é.

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 avertis et il faudra, suivant le nombre d’équipement Zwave en place, quelques heures de travail pour adapter designs, scenarios etc … (voir à la fin du tuto). Toutefois il existe maintenant des façons de migrer bien plus rapidement que lors de la V1 de ce tuto
  • Jeedom a sorti un plugin Zwave JS (actuellement en bêta) et qui utilise le même moteur Zwave-JS.

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 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 ZWave JS UI qui décrit également les méthodes d’installation : Z-Wave JS UI
Lien vers Debian 10 pour AMD64 : https://cdimage.debian.org/cdimage/archive/10.9.0/amd64/iso-cd/debian-10.9.0-amd64-netinst.iso

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.
Z-Wave JS UI interagi lui avec les équipements Zwave pour recevoir et envoyer les messages des équipements.

Le plugin Zwave communique directement avec le contrôleur Zwave et celui-ci communique avec les modules
Le Plugin jMQTT communique avec un Broker (Mosquitto) qui dispatch les informations vers Z-Wave JS UI et c’est ce dernier qui communique avec le contrôleur Zwave et donc avec les modules

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

L’avantage du MQTT c’est qu’il est du coup possible d’envoyer et recevoir des informations provenant d’autres services. On l’utilisera ici depuis Jeedom avec le plugin jMQTT mais il serait possible de recevoir directement les informations depuis le Broker sur un autre appareil dès lors qu’il a souscrit aux topics que l’on souhaite.

Exemple (merci @olive) :

Jeedom1 (jMQTT) <> Mosquitto <> Z-Wave JS UI <> Equipements ZWave
Jeedom2 (jMQTT) <> Mosquitto <> Zigbee2MQTT  <> Equipements Zigbee
HA      ( MQTT) <> Mosquitto <> xxxxxx2MQTT  <> Equipements xxx

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 zwave-js-ui avec SNAP

sudo snap install zwave-js-ui

sudo snap connect  zwave-js-ui:raw-usb
sudo snap connect  zwave-js-ui:hardware-observe

sudo snap stop --disable  zwavejs2mqtt
sudo snap start --enable  zwave-js-ui

sudo snap set zwave-js-ui server.host=0.0.0.0
sudo snap set zwave-js-ui server.ssl=true

Note : zwave-js-ui écoute sur le port 8091

A ce stade, vous devez avoir accès à l’interface de zwave-js-ui. Si ce n’est pas le cas vous pouvez essayer de faire cette étape supplémentaire et découverte par Arthur mais à ce stade je ne sais pas sur quel OS ou matériel cela est vraiment nécessaire.

(Option) Génération d’un certificat pour accéder à l’interface (en cas de problème)

sudo openssl req -x509 -nodes -days 365 -newkey rsa:4096 -keyout key.pem -out cert.pem
sudo cp key.pem /var/snap/zwave-js-ui/current/
sudo cp cert.pem /var/snap/zwave-js-ui/current/
sudo snap restart zwave-js-ui

(Option) Désactiver les MAJ automatiques

Depuis la version 16.2.58 de snap (du 10/01/2023) il est enfin possible de désactiver la mise à jour automatique des packages snap.
Je vous recommande de passer cette ligne de commande pour contrôler la version qui tourne sur votre environnement. Il peut-être désagréable, un matin de se rendre compte que rien ne va plus à cause d’un MAJ un peu foireuse installé à votre insu.
Merci à @Jeandhom pour cette découverte :+1:

sudo snap list
sudo snap refresh core
sudo snap refresh --hold zwave-js-ui

Bascule du contrôleur ZWave vers zwave-js-u i##

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 zwave-js-ui

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 »

Roue cranté section Zwave :

  • Serial Port : /dev/ttyACM0 (Il se pourrait que ce soit un autre port /dev chez vous)
  • S0 Legacy : La clef 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 clef 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 clef « S0 Legacy » sera 010203…

Roue cranté section Mqtt :

  • name : zwavejsui
  • 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 plus explicites 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é) :

Installation et configuration du plugin jMQTT

  1. Installer le plugin jMQTT sur Jeedom
  2. Décocher la case « Installer Mosquitto localement » (normalement décochée de base) 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 :

Le client MQTT doit passer en status OK :
image

Ajout de vos équipements dans le plugin jMQTT

IMPORTANT : Depuis la v1 de ce tuto, de nombreux template ont été ajouté ans jMQTT. Il n’est donc plus forcement nécessaire de suivre les étapes ci-dessous pour savoir comment intégrer un équipement. Il suffit d’utiliser le template qui correspond à votre matériel.

Dans le cas où il n’existe pas voici en détail comment faire.

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 Z-Wave JS UI menu Control Panel dérouler l’un des équipements dont l’interview est « Complete »
Cliquer sur DEBUG INFO"

Exemple avec un capteur de température:

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

Dans les captures suivantes j’ai choisi d’affecter un « Name » et une « Location » à mes équipements depuis Z-Wave JS UI. 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

C’est ce que je vous conseille de faire mais ce n’est pas une obligation. Si vous le faite il faudra attendre que les équipements communiquent à nouveau sinon ils communiqueront sur les anciens topic. Vous pouvez forcer la mise à jour des topics depuis le menu « Advanced » de chaque équipement

image

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 :

Une fois l’équipement crée, dans l’onglet 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

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.

Ajouter les commandes voulues puis Sauvegarder :

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

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) :

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

Sélectionner 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é :

Compléments

Pour comprendre comment envoyer ou récupérer certaines commandes vous pouvez aussi faire des actions dans l’interface de Z-Wave JS UI 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 :

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

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 plus ou moins rapide :

  • Utiliser la fonction « cette commande remplace la commande » de Jeedom. A partir de Jeedom 4.3 vous avez même droit à un outil bien plus complet pour remplacer les commandes
  • Créer les doublons en indiquant les nouvelles commandes des équipements jMQTT ce qui permet de revenir rapidement sur l’ancien plugin Zwave le temps d’avancer petit à petit

Gestion des versions de zwave-js-ui avec snap (merci @Jeandhom) :

snap set system refresh.retain=3	 nb de version à conserver

snap refresh zwave-js-ui		     mise à jour zwave-js-ui

snap list zwave-js-ui --all		     liste des versions
Name         Version  Rev  Tracking       Publisher       Notes
zwave-js-ui  v8.6.2   48   latest/stable  giaever-online  disabled
zwave-js-ui  v8.8.3   71   latest/stable  giaever-online  -

snap revert zwave-js-ui			       revenir à la précédente version

snap revert zwave-js-ui --revision 48	revenir à la révision 48

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.

24 « J'aime »

Bonjour @Bison

Bravo pour l’esprit community

et merci de tout ce travail.

:heart: :+1:

2 « J'aime »

+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'aime »

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'aime »

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

1 « J'aime »

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.