IoT
openHAB 3.0 - contrôle d'une prise connectée Z-Wave via MQTT

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:


Création d’un Generic MQTT Thing

  • SettingsThingsBlue « + »MQTT BindingGeneric MQTT Thing
    • Label = Generic MQTT Thing 002
    • Parent Bridge = MQTT Broker (cf. tests précédents ici)
  • le Generic MQTT Thing apparaît dans la liste des Things et est ONLINE

Generic MQTT Thing 002 - 1
Generic MQTT Thing 002 - 1

Generic MQTT Thing 002 - 2
Generic MQTT Thing 002 - 2

Generic MQTT Thing 002 - 2
Generic MQTT Thing 002 - 2


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: SettingsThingsGeneric MQTT Thing 002ChannelsAdd Channel
    • Id = mqttchannelsmartplug
    • Label = MQTT Channel Smart Plug, On/Off Switch
    • Channel type = On/Off Switch
    • MQTT State Topic = smartplug
    • cliquer sur Create

MQTT Channel Smart Plug - 1
MQTT Channel Smart Plug - 1

MQTT Channel Smart Plug - 2
MQTT Channel Smart Plug - 2

  • connexion d’un Item existant (le Switch de la prise connectée) à ce Channel: SettingsThingsGeneric MQTT Thing 002ChannelsAdd 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

MQTT Channel Smart Switch - 1
MQTT Channel Smart Switch - 1

MQTT Channel Smart Switch - 2
MQTT Channel Smart Switch - 2

MQTT Channel Smart Switch - 3
MQTT Channel Smart Switch - 3

MQTT Channel Smart Switch - 4
MQTT Channel Smart Switch - 4

MQTT Channel Smart Switch - 5
MQTT Channel Smart Switch - 5

  • revenons maintenant sur notre Item Smart Plug Switch: SettingsThingsSmart Plug Switch
    • sélectionner le Channel Link correspondant à Z-Wave Node 003: FGWP102 Metered Wall Plug Switch et configurer le Profile sur Default
    • 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

MQTT Channel Smart Switch - Channels 1
MQTT Channel Smart Switch - Channels 1

MQTT Channel Smart Switch - Channels 2
MQTT Channel Smart Switch - Channels 2

MQTT Channel Smart Switch - Channels 3
MQTT Channel Smart Switch - Channels 3

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

  • RulesBlue « + » → Name = « Smart Plug Changed »

  • WhenAdd TriggerItem EventSmart Plug SwitchPickchanged

  • ThenAdd ActionRun ScriptECMAScript

    events.sendCommand("ZWaveNode003FGWP102MeteredWallPlugSwitch_Switch", itemRegistry.getItem("ZWaveNode003FGWP102MeteredWallPlugSwitch_Switch").getState())
    
  • Save

Rule Smart Switch Changed - 1
Rule Smart Switch Changed - 1

Rule Smart Switch Changed - 2
Rule Smart Switch Changed - 2

Rule Smart Switch Changed - 3
Rule Smart Switch Changed - 3

Lors d’une première tentative, j’avais créé la règle pour qu’elle soit activée sur l’événement was updated. Ceci était une grosse erreur, car le script exécuté par cette règle fait un 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 ou OFF
  • seules les chaînes de caractères ON et OFF 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.

  • ItemsBlue « + »Add Item → Name = SmartPlugSwitchRemoteRPi, Label = « Smart Plug Switch (remote RPi) », Type = SwitchCreate
  • le nouveau switch on/off est dispo dans l’interface sous l’onglet Items

Switch Item - 1
Switch Item - 1

Switch Item - 2
Switch Item - 2

Switch Item - 3
Switch Item - 3

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.

  • RulesBlue « + » → Name = « Smart Plug Remote Switch Update »

  • WhenAdd TriggerItem EventShow non-semanticSmart Plug Switch (remote RPi)Pickwas updatedDone

  • ThenAdd ActionRun ScriptECMAScript

    actions.get("mqtt","mqtt:broker:ccc94a5065").publishMQTT("smartplug", itemRegistry.getItem("SmartPlugSwitchRemoteRPi").getState().toString())
    
  • Save

Rule Remote Switch - 1
Rule Remote Switch - 1

Rule Remote Switch - 2
Rule Remote Switch - 2

Rule Remote Switch - 3
Rule Remote Switch - 3

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.

Remote Switch Test - 1
Remote Switch Test - 1

Remote Switch Test - 2
Remote Switch Test - 2

Remote Switch Test - 3
Remote Switch Test - 3

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.