openHAB 3.0 - contrôle d'une prise connectée Z-Wave via MQTT
Voici en quelque sorte l’aboutissement de la première étape de mes expérimentations avec openHAB 3.0, des périphériques en Z-Wave, et une architecture MQTT: configurer un Switch (sur une instance d’OH3) pour qu’il envoie des messages MQTT ON
/ OFF
sur un topic donné afin de piloter à distance une prise connectée Z-Wave (sur une seconde instance d’OH3) configurée pour modifier son état à la réception de ces messages MQTT.
NB: Je sais qu’il est tout à fait possible de “connecter” directement deux instances d’OH3, mais dans le cadre d’un autre projet j’ai besoin de passer par MQTT.
Pour ce tutoriel, les configurations utilisées sont d’un côté un Raspberry Pi 3 B+ avec l’infrastructure Z-Wave, et de l’autre un laptop sous Ubuntu pour le Switch de commande à distance. Pour les détails:
- pour la partie Z-Wave, voir mon tuto openHAB 3.0 - installation et configuration d’une prise connectée Z-Wave
- le broker MQTT est déjà configuré dans openHAB (cf. mon précédent tutoriel openHAB 3.0 - création d’un switch qui publie son état via des messages MQTT) sur les 2 machines
- là aussi, pas de fioritures sur le nommage des topics; nous utiliserons un topic simplement nommé
smartplug
… - et les différentes étapes sont toujours réalisées via l’interface graphique d’OH3
Création d’un Generic MQTT Thing
- Settings → Things → Blue « + » → MQTT Binding → Generic MQTT Thing
- Label =
Generic MQTT Thing 002
- Parent Bridge =
MQTT Broker
(cf. tests précédents ici)
- Label =
- le Generic MQTT Thing apparaît dans la liste des Things et est ONLINE
Configuration de la prise connectée pour réagir aux valeurs reçues sur le topic MQTT
- création d’un Channel de type Switch: Settings → Things → Generic MQTT Thing 002 → Channels → Add Channel
- Id =
mqttchannelsmartplug
- Label =
MQTT Channel Smart Plug, On/Off Switch
- Channel type =
On/Off Switch
- MQTT State Topic =
smartplug
- cliquer sur Create
- Id =
- connexion d’un Item existant (le Switch de la prise connectée) à ce Channel: Settings → Things → Generic MQTT Thing 002 → Channels → Add Link to Item
- sélectionner le Channel précédemment créé →
MQTT Channel Smart Plug, On/Off Switch
- choisir Use an existing Item
- cliquer sur Item to Link et sélectionner
Smart Plug Switch (ZWaveNode...)
- valider en cliquant sur Link
- le Switch de notre prise connectée est maintenant lié au Channel de notre Generic MQTT Thing
- sélectionner le Channel précédemment créé →
- revenons maintenant sur notre Item
Smart Plug Switch
: Settings → Things → Smart Plug Switch- sélectionner le Channel Link correspondant à
Z-Wave Node 003: FGWP102 Metered Wall Plug Switch
et configurer le Profile surDefault
- d’après la documentation d’openHAB: “If you don’t specify any Profile, this Profile will be used. For State Channels, this means that states and commands are just propagated from the Channel to the Item and vice versa without any changes.”
- idem pour le second Channel Link correspondant à
Generic MQTT Thing 002
- sélectionner le Channel Link correspondant à
Remarque
Nous pouvons alors utiliser n’importe quel client MQTT pour envoyer les messages ON
ou OFF
sur le topic smartplug
du broker MQTT du Raspberry Pi 3 B+ → la valeur de l’Item Smart Plug Switch
est bien mise à jour. Problème: l’état de l’Item est mis à jour, mais aucune commande n’est envoyée à la prise…
Contrôle de la prise connectée
Nous allons donc créer une règle pour envoyer une commande au périphérique physique quand l’état de l’Item est modifié.
-
Rules → Blue « + » → Name = « Smart Plug Changed »
-
When → Add Trigger → Item Event →
Smart Plug Switch
→ Pick → changed -
Then → Add Action → Run Script →
ECMAScript
events.sendCommand("ZWaveNode003FGWP102MeteredWallPlugSwitch_Switch", itemRegistry.getItem("ZWaveNode003FGWP102MeteredWallPlugSwitch_Switch").getState())
-
Save…
sendCommand
, lequel fait une mise à jour de l’état, et donc redéclenche la règle → boucle infinie !
Remarques
- les premiers tests ont d’abord été réalisés avec MQTT Explorer afin d’émuler le fonctionnement d’un interrupteur en envoyant manuellement des messages MQTT contenant
ON
ouOFF
- seules les chaînes de caractères
ON
etOFF
sont « acceptées » pour mettre à jour l’Item, ce qui est logique étant donné qu’il s’agit d’un switch on/off…
Création d’un switch distant
Sur la base de mon précédent tutoriel openHAB 3.0 - création d’un switch qui publie son état via des messages MQTT nous allons maintenant créer un switch sur une seconde instance d’openHAB fonctionnant sur un autre ordinateur.
- Items → Blue « + » → Add Item → Name =
SmartPlugSwitchRemoteRPi
, Label = « Smart Plug Switch (remote RPi) », Type =Switch
→ Create - le nouveau switch on/off est dispo dans l’interface sous l’onglet Items
Nous ajoutons ensuite une nouvelle règle qui publiera l’état de ce switch (ON
ou OFF
) sur le topic smartplug
à chaque fois que l’état du switch SmartPlugSwitchRemoteRPi
sera mis à jour.
-
Rules → Blue « + » → Name = « Smart Plug Remote Switch Update »
-
When → Add Trigger → Item Event → Show non-semantic →
Smart Plug Switch (remote RPi)
→ Pick → was updated → Done -
Then → Add Action → Run Script →
ECMAScript
actions.get("mqtt","mqtt:broker:ccc94a5065").publishMQTT("smartplug", itemRegistry.getItem("SmartPlugSwitchRemoteRPi").getState().toString())
-
Save…
Nous pouvons alors actionner ce switch Smart Plug Switch (remote RPi)
sur l’OH3 de la machine A (Ubuntu), ce qui déclenche la règle Smart Plug Remote Switch Update
qui publie l’état de ce switch (ON
ou OFF
) sur le topic smartplug
du broker MQTT. Sur l’OH3 de la machine B (Raspberry Pi), le switch Smart Plug Switch (ZWaveNode…)
reçoit le message MQTT et met à jour son état. Si celui-ci est modifié, la règle Smart Plug Changed
est déclenchée pour commander la prise physique.
Remarque
Ces différentes expérimentations ont eu lieu dans le cadre d’un projet plus global où il était nécessaire d’avoir un broker MQTT local sur chaque machine. Afin de pouvoir rediriger les messages MQTT arrivant sur le topic smartplug
du broker de la machine A vers le (même topic smartplug
du) broker de la machine B j’ai écrit un script Python mqtt_bridge.py
qui fait le pont entre les 2 brokers. Il est composé de 2 clients MQTT: 1 client qui souscrit (subscribe) au topic sur le 1er broker, et 1 client qui republie (publish) le même message sur le même topic du 2nd broker.
NB: À l’aide de ce script il est par conséquent tout à fait possible de passer par plusieurs brokers MQTT pour acheminer les messages… ;-)
Conclusion
Après de multiples tests avec openHAB, Z-Wave, MQTT, etc. voici donc le résultat tant attendu: avoir un Switch (sur une instance d’OH3) qui envoie des messages MQTT contenant ON
/ OFF
sur un topic donné afin de piloter à distance une prise connectée Z-Wave (sur une seconde instance d’OH3) configurée pour modifier son état à la réception de ces messages MQTT. Le tout avec des messages MQTT pouvant transiter par plusieurs brokers MQTT avant d’arriver à destination.
Pour toutes remarques ou suggestions, n’hésitez surtout pas à me contacter sur manuel.munier@univ-pau.fr.