Archives par étiquette : domotique

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.

Tasmota : la domotique facile

Peut-être ne connaissez vous pas Tasmota, un firmware domotique qui permet de re-flasher certains modules, vous savez ceux qui discutent avec d’obscures serveurs chinois, ceux qui demandent à associer une application Android par marque.

Avec Tasmota, terminé : vous unifiez tous vos modules avec un seul et même firmware, vous les faites pointer vers votre broker MQTT et vous gérez vous même vos besoins en domotique.

Voici un test avec un interrupteur mural Sonoff T1 1CH. Commençons par le démonter :

Sur la droite, le connecteur J3 avec GND, TXD, RXD, VCC. Soudez y des fils, branchez les en croisant Txd / RxD sur un adaptateur USB/TTL et ne reliez pas encore l’adapteur sur son port USB.

Mais ce n’est pas tout. Retournez la platine :

En bas à droite, le dernier plot du connecteur 4 points est GND, la masse. Venez brancher un fil entre ce point et le point TP2:

Maintenez la connexion sur TP2 puis branchez l’adapteur USB : votre module est alors en mode programmation !

Téléchargez tasmota-lite.bin dans sa dernière version depuis le Github Tasmota.

Ouvrez un terminal Linux ou MacOS, passez en admin puis lancez :

esptool.py --port /dev/tty.SLAB_USBtoUART --baud 115200 write_flash -fm dout -fs 1MB 0x00000 tasmota-lite.bin 

Vous adapterez /dev/tty.SLAB_USBtoUART selon le nom de votre interface USB/TTL. Quelques minutes plus tard, un nouveau réseau WiFi va apparaitre, à vous de jouer désormais pour accéder à l’interface de gestion :

 

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.

 

Volet roulant électrique : ajoutez un servo-moteur !

Vous avez des volets roulants électriques avec des commandes intégrées au bloc fenêtre ? C’est souvent le cas sur des fenêtres posées en rénovation : le poseur ne va pas s’embêter à poser la fenêtre puis tirer des câbles, non, tout est directement dans le bâti. Et là, sortir des fils, venir se brancher sur le moteur, c’est mission impossible sans tout casser ou tout dégrader. Certes, mon installateur me propose de venir ajouter un module radio Somfy, moyennant une bonne heure de boulot et 200 € de devis, totalement dingue, même si cela fonctionne déjà fort bien sur 2 volets. La solution que je vais vous présenter, certes externe et donc visible, c’est 5 € de matériel !

Comment alors venir appuyer en haut ou en bas du bouton de commande ? Et si la solution nous venait d’un simple servo-moteur, tel ce SG90 tout simple, disponible pour un peu moins de 1 € en Asie :

Un coup à droite et il presse le haut, un coup à gauche et c’est le bas de l’interrupteur, qui dit mieux ?

Posons le avec du velcro double face pour voir :

Ah yes, donc là on se positionne à 110, et il est centré, on le positionne à 75 et il vient appuyer en haut, à 140 il appuie en bas. De quoi je parle ? Tout simplement d’une commande http à envoyer via ESP Easy installé sur un p’tit ESP8266 par exemple. Dans mon cas précis, j’utilise la commande :

http://192.168.1.132/control?cmd=Servo,1,4,140

192.168.1.132 est l’IP de mon petit Wemos D1, 4 le port GpIo utilisé, et 140 la position basse, je dois demander :

http://192.168.1.132/control?cmd=Servo,1,4,140
http://192.168.1.132/control?cmd=Servo,1,4,1110

Ce qui se traduit par « appuie vers le bas » et « remets toi au milieu sans rien toucher » ! A chaque commande le module retourne une réponse :

Il faut maintenant venir fixer le servo-moteur de façon rigide, via cette pièce de fixation disponible elle aussi en Asie :

Ainsi le servo ne bougera pas et pourra faire basculer notre interrupteur avec la fermeté d’un doigt qui appuierait dessus. Si vous disposez d’une imprimante 3D, vous pourrez imprimer un support via les fichiers de Thingiverse.

Je vais attendre pour valider totalement la solution, en alu ou en 3D, nous verrons bien. Une fois la fixation mécanique validée, le reste n’est que de la programmation, simplissime pour n’importe quelle solution domotique. Et puis si mon petit Wemos D1 peut contrôler le volet, il pourra aussi me donner la température de la pièce, voir la température extérieure, simplement en ajoutant 2 composants sur le boîtier : pratique, compact, simple, et communiquant à souhait !

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 😉

H801 : vos LEDs RGB en WiFi avec Google Home

Après la découverte du H801 pour contrôler vos LEDs RGB en WiFi, intéressons-nous à leur activation à distance, via une commande lancée à votre assistant Google Home dans le salon : allume LEDéteint LED, etc.

Il faut avant toute chose préciser que le H801 semble se mettre en veille au bout d’un certain temps d’inactivité. La solution ? Lui envoyer un ping toutes les 2 mn via le Crontab du Raspberry Pi dédié à la domotique, ainsi il ne s’endormira pas :

*/2 * * * * sudo ping -c2 192.168.1.192 &> /dev/null

Ici, nous interrogeons le module placé sur 192.168.1.192 toutes les 2 minutes.
Pour la commande des LEDs, je vous invite à récupérer les commandes décrites dans la découverte du H801, tout s’y trouve.

Sur notre serveur Raspberry domotique, nous allons installer un script php dans /var/www/html, ledon.php par exemple :

<?php
exec('sudo ping -c4 192.168.1.192');
exec('sudo sendip -p ipv4 -p udp -us 30978 -ud 30977 -d 0xfbebffffff00005c59d6000 -v 192.168.1.192');
exec('sudo ping -c4 192.168.1.192');
exec('sudo sendip -p ipv4 -p udp -us 30978 -ud 30977 -d 0xfbebffffff00005c59d6000 -v 192.168.1.192');
?>

Ici, nous réveillons encore plus le contrôleur sur 192.168.1.192 avec 4 pings, on lui transmet la trame d’allumage (LEDs blanches ici) et on recommence, histoire de bien insister lourdement. Remplacez bien entendu l’IP par la votre.

Pour l’extinction, créons ledoff.php par exemple :

<?php
exec('ping -c 2 192.168.1.192');
exec('sudo sendip -p ipv4 -p udp -us 30978 -ud 30977 -d 0xfbeb00000000005c59d6000 -v 192.168.1.192');
exec('ping -c 2 192.168.1.192');
exec('sudo sendip -p ipv4 -p udp -us 30978 -ud 30977 -d 0xfbeb00000000005c59d6000 -v 192.168.1.192');
?>

Pareil, toujours des tas de ping pour réveiller la bestiole, et pensez toujours à remplacer l’IP par la bonne IP.

Maintenant, créons un compte sur le site IFTTT et venons créer une Applet :

Ici nous donnons les différentes possibilités d’allumer nos LEDs, via Google Assistant.

Voyons maintenant la requête à envoyer sur notre Raspberry Pi domotique via la fonctionnalité WEB REQUEST :

Vous l’aurez compris, il faudra :

  • disposer d’une IP fixe ou d’un dyndns car IFTTT va appeler une IP publique, hélas, votre Google Home ne pourra appeler une IP locale directement.
  • ouvrir un port public dédié (par ex 8080) et le faire pointer sur le port 80 de votre Raspberry Pi, celui de son serveur Apache2
  • pointer vers http://votre_ip_fixe:port/ledon.php
  • choisir la méthode POST sur IFTTT

Sauvegardez l’applet et testez : Dis Google, allume LED

Si tout fonctionne, vos LEDs s’activent, miracle ! Si cela ne fonctionne pas, depuis votre smartphone en 3G ou 4G testez : http://votre_ip_fixe:port/ledon.php

Si les LEDs ne s’allument pas, le soucis vient du NAT de port, permettant d’accéder au Raspberry Pi depuis l’extérieur, relisez la méthode en fonction de votre box internet (on déconseille un peu les Livebox… désolé…).

Bien entendu, coté sécurité, euh… Si vous avez un .htaccess d’activé, utilisez alors : http://login:password@votre_ip_fixe:port/ledon.php

Faites une nouvelle Applet avec l’extinction, je pense que vous avez compris le principe : éteindre LED dans ce cas, et pointez sur http://votre_ip_fixe:port/ledoff.php

 

CONCLUSION :

Certes, on peut faire largement mieux, sécuriser tout cela, voir utiliser des modules commerciaux pour activer une prise à distance, mais où serait le plaisir dans ce dernier cas ? 🙂 Ici, l’ensemble est à la fois intégré dans un système domotique maison, mais également utilisable avec l’assistant Google. Par la suite, on peut prévoir de venir passer des arguments à une seule page php, par ex : http://mon_ip/domo.php&lampe=salon&etat=on qui pourra alors transmettre l’information à un script python plus sophistiqué encore, permettant d’effectuer des traitements complexes.