Archives par étiquette : mqtt

MQTT : origine, utilisation, domotique

Le protocole MQTT (Message Queuing Telemetry Transport) est un protocole de communication léger, largement utilisé dans l’Internet des objets (IoT). Il a été conçu pour permettre aux appareils connectés de communiquer efficacement avec les serveurs, même dans des conditions de connectivité intermittente ou à faible bande passante. Dans cet article, nous allons explorer le protocole MQTT et son utilisation dans la domotique.

Le fonctionnement du MQTT :

MQTT est un protocole de communication de type publish-subscribe. Les appareils qui publient des messages (appelés éditeurs ou publishers) envoient des données à un serveur central, appelé courtier (broker). Les appareils qui reçoivent des messages (appelés abonnés ou subscribers) s’abonnent à des canaux spécifiques sur le courtier pour recevoir les données publiées par les éditeurs. MQTT fonctionne sur un modèle de messagerie à trois niveaux. Le premier niveau est celui des connexions, qui permettent aux appareils de se connecter au courtier. Le deuxième niveau est celui des sessions, qui permettent aux appareils de se reconnecter automatiquement en cas de déconnexion imprévue. Le troisième niveau est celui des abonnements, qui permettent aux appareils de s’abonner aux canaux de leur choix.

MQTT utilise un système de qualité de service (QoS) pour garantir la fiabilité de la transmission des messages. Il existe trois niveaux de QoS : QoS 0 (au plus une fois), QoS 1 (au moins une fois) et QoS 2 (exactement une fois). Les niveaux de QoS supérieurs garantissent une livraison plus fiable, mais au prix d’une surcharge de bande passante et de temps de latence plus longs.

 

MQTT dans la domotique :

Dans la domotique, MQTT est utilisé pour permettre aux appareils de communiquer entre eux de manière fiable et efficace. Les appareils domotiques sont généralement des périphériques à faible consommation d’énergie et à faible bande passante, ce qui les rend parfaitement adaptés à l’utilisation de ce protocole.

MQTT est souvent utilisé pour connecter des capteurs et des actionneurs à un système domotique centralisé. Les capteurs peuvent être configurés pour publier des données sur des canaux spécifiques sur le courtier MQTT, tandis que les actionneurs peuvent être configurés pour écouter ces canaux et réagir en conséquence. Par exemple, un thermostat intelligent pourrait publier des données de température sur un canal spécifique, tandis que des actionneurs, tels  des radiateurs ou des climatiseurs pourraient écouter ce canal et ajuster leur comportement en conséquence. De même, des capteurs de mouvement ou de lumière pourront publier des données sur des canaux spécifiques, tandis que des lumières ou des volets roulants pourront eux écouter ces canaux et réagir en conséquence.

Les avantages de l’utilisation de MQTT en domotique :

L’utilisation de MQTT dans la domotique offre plusieurs avantages par rapport à d’autres protocoles de communication. En voici quelques-uns :

  1. Faible consommation d’énergie : Les appareils domotiques sont souvent alimentés par des piles ou des batteries et doivent donc être conçus pour consommer très peu d’énergie. MQTT est un protocole léger et optimisé pour la faible consommation d’énergie, ce qui le rend parfaitement adapté aux appareils domotiques.
  2. Fiabilité : MQTT utilise un système de qualité de service (QoS) pour garantir la fiabilité de la transmission des messages. Les niveaux de QoS supérieurs garantissent une livraison plus fiable, ce qui est particulièrement important dans les systèmes domotiques où une mauvaise communication pourrait avoir des conséquences graves.
  3. Efficacité : MQTT est conçu pour être efficace en termes de bande passante, de mémoire et de temps de latence. Cela permet aux appareils domotiques de communiquer de manière efficace, même dans des conditions de connectivité intermittente ou à faible bande passante (réseau Freemobile, 3G ou 2G par exemple).
  4. Facilité d’utilisation : MQTT est un protocole simple à utiliser et à configurer, ce qui le rend accessible même aux utilisateurs non geeks. Les développeurs peuvent facilement intégrer MQTT dans des applications domotiques, et les utilisateurs peuvent facilement configurer des appareils pour se connecter à un courtier MQTT.
  5. Évolutivité : MQTT est un protocole évolutif, ce qui signifie qu’il peut être utilisé pour connecter un grand nombre d’appareils sans compromettre les performances. Cela permet aux systèmes domotiques de s’adapter facilement à l’ajout de nouveaux appareils, pratiquement à l’infini.

En résumé, l’utilisation de MQTT dans la domotique offre des avantages significatifs en termes de consommation d’énergie, de fiabilité, d’efficacité, de facilité d’utilisation et d’évolutivité. Cela en fait un choix populaire pour les développeurs et les utilisateurs de systèmes domotiques.

Test platine relai Tuya Zigbee

Sur Aliexpress vous trouverez un nombre impressionnant de platines relais Zigbee. J’ai choisi d’en tester une, la plus simple, donnée comme fonctionnant avec Tuya, mais ce n’est pas ce qui nous intéresse le plus au final : sans cloud chinois, la vie est plus simple, plus folle 😉

Livrée avec un bout de documentation, cette platine fait parfaitement le boulot : elle s’alimente entre 7 et 32V (on ne rigole pas…), dispose d’un bouton d’apairage et d’un bouton de commutation Marche/Arrêt du relai intégré.

Je l’ai mise en association dès l’allumage et mon zigbee2mqtt me l’a immédiatement intégrée au réseau local Zigbee de la maison :

Restait donc à pouvoir commander la bête, switch, c’est le p’tit nom que je lui ai donné après l’avoir renommé dans la console zigbee2mqtt.

Après un peu de recherche sur Zigbee2Mqtt, il semblait évident qu’une trame MQTT avec le mot SET devait déclencher notre Switch, soit avec ON, OFF, ou TOGGLE pour le faire changer d’état. Nous obtenons donc une commande toute simple avec Mosquitto sous Linux :

mosquitto_pub -h mon_serveur_mqtt -u mon_login -P mon_mot_de_passe -t "zigbee2mqtt/switch/set" -m 'ON'

et voici le relai sitôt collé ! Replacez ON par OFF, ou par TOGGLE, et le module continuera de vous répondre. Simple non ?

Pour les plus néophytes, il s’agit ici de discuter avec le serveur Zigbee2Mqtt installé à la maison, répondant au doux nom de zigbee2mqtt, de lui dire que nous parlons à switch et de lui spécifier que nous avons l’intention de changer (set) d’état la position du relai.

Allons plus loin, demandons à la platine l’état du relai :

 mosquitto_pub -h mon_serveur_mqtt -u mon_login -P mon_mot_de_passe -t  "zigbee2mqtt/switch/get" -m '{"state": ""}

et nous recevons ainsi tout un tas d’informations, dont l’état OFF de notre module de test :

zigbee2mqtt/switch/get {"state": ""}

zigbee2mqtt/bridge/logging {"level":"info","message":"MQTT publish: topic 'zigbee2mqtt/switch', payload '{\"linkquality\":171,\"state\":\"OFF\"}'"}

zigbee2mqtt/switch {"linkquality":171,"state":"OFF"}

Notez que la qualité du lien radio est indiqué sur linkquality, pratique pour savoir si votre module est à portée ou en limite de la zone de couverture.

Je vous laisse le soin d’intégrer ces éléments en fonction de vos applications domotiques et de vos besoins précis.

Pour commander la platine sur le site chinois Aliexpress, c’est par ici, lien non affilié, garanti sans publicité : https://fr.aliexpress.com/item/1005002334703783.html

WemosD1 et OpenMQTTGateway

Le petit Wemos D1, un ESP8266 utilisable avec MicroPython, EspEasy ou juste l’IDE d’Arduino permet de créer à moindre frais une passerelle 433 MHz vers MQTT en utilisant OpenMQTTGateway.

Voici l’intégration du Wemos D1 dans un petit boîtier, 2 antennes, une pour l’émission, l’autre pour la réception. Pas de platine sophistiquée ici, juste des fils reliés aux modules 433 MHz (invisibles sur la photo), une connexion USB pour l’alimentation et le tour est joué :

Le serveur MQTT va ainsi recevoir une écoute 433 MHz sous la forme :

/433rf/433toMQTT 11627618

Ici, 433rf est le nom du module installé, 11627618 le code de la trame 433 MHz reçue, dans notre cas un bête interrupteur sans fil commandé chez Aliexpress. A vous alors d’interpréter la trame et son contenu pour faire réagir votre domotique : allumer une lampe, ouvrir un volet, etc.

La compilation du script Arduino se fait sans difficultés via l’IDE Arduino, avec l’installation des quelques librairies manquantes par défaut, cf les erreurs à la compilation.

Raspberry Pi Pico W : MQTT et commande de la LED interne

Comment commander la LED interne en toute simplicité sur un Raspberry Pi Pico W ?

Suivez le code ci-après et envoyer le via Thonny par exemple :

import machine
import time
from umqtt.simple import MQTTClient
import network

# Configuration WiFi
ssid = "nom_du_reseau_wifi"
password = "mot_de_passe_wifi"

station = network.WLAN(network.STA_IF)
station.active(True)
station.connect(ssid, password)

while not station.isconnected():
    pass
print("Connexion Wi-Fi établie")


# Configuration client MQTT
mqtt_server = "adresse_serveur_mqtt"
mqtt_port = 1883
mqtt_user = "login_mqtt"
mqtt_password = "mot_de_passe_mqtt"
mqtt_topic = b"/maison/led"
client_id = "wemosd1"
client = MQTTClient(client_id, mqtt_server, mqtt_port, mqtt_user, mqtt_password)

# Set up LED pin
led = machine.Pin("LED", machine.Pin.OUT)

# Define MQTT callback function
def mqtt_callback(topic, msg):
    if topic == mqtt_topic:
        if msg == b"on":
            led.value(1)
            print("LED allumée")
        elif msg == b"off":
            led.value(0)
            print("LED éteinte")

# Subscribe to MQTT topic
client.set_callback(mqtt_callback)
client.connect()
client.subscribe(mqtt_topic)

# Main loop
while True:
    client.check_msg()
    time.sleep(1)

Vous allez pouvoir maintenant tester votre nouveau script en micro-python, par exemple depuis un terminal sous Linux, et allumer la LED interne :

mosquitto_pub -h mon_serveur_mqtt -u mon_login -P mon_mon_de_passe -t "/maison/led" -m "on"

Simple non ? Ce script a été généré à la base par ChatGPT, mais a par la suite été modifié pour corriger quelques erreurs.

 

 

ESP8266 : Wifi Kit 8 en test

Découverte récente sur Amazon du Wifi Kit 8 produit par Heltec :

Sur cette image, nous lui avons monté une sonde de température DS18B20, histoire de faire travailler la bestiole en charge. Cette sonde transmet ses données toutes les 2 minutes sur notre broker MQTT Mosquitto, via une connexion WiFi.

Ce petit ESP8266 dispose d’un écran LCD mais surtout d’une alimentation pour batterie, avec gestion de charge intégrée :

Un simple batterie LiPo de 1000 mAh et vous voici protégé d’une coupure de courant, c’est simple et pourtant radical. Venez ajouter un chargeur solaire sur la prise micro-USB et vous voici en totale autonomie avec un petit IoT très sympa.

Son brochage reste simple, avec de multiples E/S et une unique entrée analogique :

Le flashage sous ESPeasy est possible, il n’a fonctionné ici qu’avec Esptools depuis Ubuntu : jamais Winchose 10 n’a réussi à le flasher, jamais il n’a trouvé le bon port COM. Amis Linuxiens, la solution reste et restera toujours le libre pour bricoler en paix 😉

Retenez par contre qu’ESPeasy nécessitera d’ajouter cette rule pour valider l’afficheur au boot de l’IoT :

On System#Boot do
gpio,16,1
endon

En effet, sans valider le GPiO 16, point d’Oled, c’est ainsi, un petit bug connu sur ce modèle, facile à contourner comme vous pouvez le voir.

Un bon p’tit ESP8266 donc, pas le moins cher, mais sympa si vous avez besoin d’afficher 2 ou 3 lignes d’informations, capable d’être autonome en prime, pas de raison de se priver donc.

ESPeasy : afficher les valeurs de vos capteurs

Avec ESPEasy installé sur un ESP8266, vous pouvez brancher de multiples capteurs et transmettre leurs valeurs en MQTT sur votre broker Mosquitto, en http sur votre domotique, etc.

Seulement il y a encore plus simple pour juste visualiser les valeurs obtenues, juste avec un http://IP_ESP8266/tempe.esp par exemple.  IP_ESP8266 est l’adresse IP utilisée par votre ESP sur votre réseau local, des fois que…

ESP01 avec platine relai + sonde température DS18B20

Prenons comme exemple notre petit ESP01 muni d’une sonde DHT11, configurée comme suit :

Retenez le Name de la sonde, ici temperature et les Values reçues via cette sonde, à savoir Temperature et Humidity. Nous allons donc lire les valeurs de cette sonde via un fichier injecté sur l’ESP. Commencez par créer un fichier tempe.esp comme suit :

<html>
<head>
</head>
<body>
Temperature : [temperature#Temperature] C
<br>
Humidite : [temperature#Humidity] %
<br>
</body>
</html>

Nous retrouvons ici le nom de la sonde en minuscules, et les noms des valeurs mesurées avec une lettre majuscule à chaque fois. S vous aviez une sonde appelée ds18b20 par exemple, il vous suffirait d’utiliser ce nom générique, tout simplement.

Chargeons le fichier tempe.esp sur http://IP_ESP8266/upload et rendons-nous sur :

http://IP_ESP8266/tempe.esp

pour visualiser les mesures :

Temperature : 26.00 C
Humidite : 43.00 %

Ce type d’affichage simplifié peut bien entendu évoluer vers plus compliqué, ceci n’est qu’un exemple de débutant 😉

TP-Link Kasa et IFTTT

If This Then That, IFTTT, Si Ceci Alors Cela en français, un site qui permet de créer des Applets destinées à interagir avec votre domotique, votre Google Home, votre Alexa, vos modules TP-Link, eWelink, etc.

Aujourd’hui, nous allons créer une applet permettant de venir activer une prise Kasa (TP-Link) via un simple appel https. Cet appel pourra être lancé avec un simple curl depuis votre Raspberry Pi, un bouton sur Domoticz ou autre application de domotique, voir même depuis un IoT ESPeasy, ou un tableau de bord Node Red : vous l’aurez compris, TOUT est permis, TOUT est envisageable !

Commencez par vous inscrire sur https://ifttt.com/ puis depuis votre compte en haut à droite, cliquez sur CREATE :

Nous allons choisir WEBHOOKS pour pouvoir venir activer votre prise via https :

Choisissons Receive a web request puisque telle est notre intention, cqfd :

et donnons le nom radiateurmarche pour pouvoir l’indiquer dans notre requête web par la suite :

Nous venons de créer le déclencheur, trigger, il faut maintenant choisir le service qui sera activé, dans notre cas Kasa de TP-Link sur lequel nous possédons déjà un compte et une App android active. Les prises ont déjà un nom, faciles à retrouver :

Il vous sera demandé email et mot de passe de votre compte Kasa.
Que voulons-nous faire ? Choisissons Turn On pour ALLUMER notre prise :

Quelle prise voulons-nous activer ? La salle de bain, choisissons là :

et on termine en cliquant sur Create Action.

Voyons le résumé, puis validons :

Maintenant, il nous faut récupérer la clé d’activation, sans cela IFTTT ne pourra pas savoir qui demande quoi. Rendez-vous dans l’Applet Webhooks :

et cliquons sur SETTINGS en haut à droite :

Cliquez et copiez l’URL, cachée ici, pas fou 😉

Vérifions notre applet :

Vous pourrez désormais activer le chauffage en envoyant :

https://maker.ifttt.com/trigger/radiateurmarche/with/key/xxxxxxxxx

où xxxxxxxx doit être utilisé avec votre propre clé.

A vous de jouer maintenant pour créer une applet radiateurarret et utiliser le lien https://maker.ifttt.com/trigger/radiateurarret/with/key/xxxxxxxxxxxxx pour désactiver la prise.

Simple non ?

 

 

 

 

ESP-01 : platine relai et sonde DS18B20

Dans le monde fabuleux des IoT, nous avons déjà parlé des ESP8266, et nous parlerons ici de l’ESP01, une version avec 1 Mo de mémoire flash et très peu de GPiO utilisables : 0 pour la platine relai, 2 pour la sonde de température que nous allons lui ajouter.

Voyons un peu ce que cela donne visuellement :

A gauche, l’ESP01, programmé avec ESP Easy, enfiché sur sa platine relai, et collé sur le relai la sonde DS18B20. Sur cette platine DS18B20, de gauche à droite la masse (bleu), le +5Vcc (orange) et le signal (jaune), à relier comme suit sur le côté soudures de la platine relai :

Du coté configuration d’ESP Easy :

Pour contrôler le relai, envoyez par ex http://192.168.1.140/control?cmd=GPIO,0,1 (ici l’ESP à l’IP 192.168.1.140) pour couper le relai, ou http://192.168.1.140/control?cmd=GPIO,0,0 pour l’activer.

A vous de jouer maintenant, vous disposez désormais d’une sonde tout-en-un, parfaitement capable de détecter une température et de faire agir le relai en fonction du résultat, pour un chauffage par exemple.

 

Domoticz : script Python pour envois MQTT simples

On le lit ici et là, Domoticz utilise une façon bien à lui pour publier du MQTT, avec ce Json qui n’est pas forcément toujours très utile ni très pratique. Personnellement, il est même plutôt hermétique j’avoue

Voici donc la raison d’exister de ce petit script Python, mqttpub.py, destiné à être appelé depuis un interrupteur Domoticz par exemple.

Le script pour commencer :



#
#
# Récuperation du topic et du message à envoyer en MQTT :
# python mqttpub.py domoticz/in 1234 par ex
#
sujet = sys.argv[1]
msg = sys.argv[2]
#
# Informations de connexion à votre broker MQTT : 
# adresse IP, login, mot de passe
broker = "192.168.1.200"
login = "login_a_moi"
pwd = "mon_password"
#
# on se connecte au broker et on publie le message sur le topic
#
client = mqtt.Client()
client.username_pw_set(username=login,password=pwd)
client.connect(broker, 1883, 60)
client.publish(sujet, msg, qos=0, retain=False)

Sauvegardez ce script dans /home/pi/domoticz/scripts/python et rendez le exécutable avec un chmod +x mqttpub.py

Sur un switch de Domoticz, vous allez alors ajouter dans On Action et Off Action la ligne :



script://python/mqttpub.py home/sonoff/commands/MQTTtoSRFB 4195665

Ceci est un exemple qui diffuse la trame radio 4195655 sur un Sonoff Bridge flashé avec OpenMQTTGateway : à vous de l’adapter à vos trames MQTT. 

Sonoff RF bridge : une passerelle radio/MQTT à 10 €

Vous avez peut-être craqué pour cette petite passerelle radio 433 MHz, la Sonoff RF Bridge proposée à quelques Euros chez des tas de vendeurs chinois :

A l’origine cette passerelle radio se relie au cloud chinois de Sonoff et permet de recevoir les trames radio des télécommandes ordinaires, sans rotation de code.

Il est par contre possible de flasher la passerelle avec OpenMQTTGateway pour transformer l’appareil en passerelle MQTT : une trame radio arrive, le Sonoff va alors publier la trame sous la forme suivante :

home/sonoff/SRFBtoMQTT {"raw":"2A7601AE0460400551","value":4195665,"delay":1087,"val_Thigh":430,"val_Tlow":1120}

Ici, value nous intéresse, il s’agit de la trame radio reçue.

De la même façon, il est possible d’envoyer une trame radio via une trame MQTT :

mosquitto_pub -t home/sonoff/commands/MQTTto433 -m 4195665

Le Sonoff va alors passer en émission et remplacer votre télécommande radio habituelle, pratique et compact surtout !

Pour la procédure de flashage, reportez-vous à cet excellent billet sur Projets DIY : tout y est décrit en détail, mais retenez simplement qu’il vous faudra copier le contenu du répertoire /lib contenu dans le zip d’OpenMQTTGateway vers le répertoire /lib de votre projet arduino.

A vous maintenant de venir intégrer cette passerelle MQTT dans votre domotique habituelle : vous ajoutez un interrupteur qui enverra la trame radio voulue, et le tour sera joué ! Simple, ou presque 😉