Introduction à MQTT

Qu’est ce que MQTT ?

MQTT pour Message Queuing Telemetry Transport est un protocole de communication basé sur TCP/IP fonctionnant sur un modèle publish/subscribe (littéralement : publier-s’abonner).

Idéal pour vos projets IOT, domotique, …

Il a été initialement développé par Andy Stanford-Clark (IBM) et Arlen Nipper (EuroTech). Il est conçu pour les connexions avec des sites distants où la bande passante du réseau est limitée.Wikipédia

Les clients sont tous connectés en publish ou subscribe à un serveur appelé broker.

Source: https://mqtt.org/

Sécurité & fiabilité

Il est possible de sécuriser les échanges de plusieurs manières :

  • Authentification des comptes (sondes, …) par login & mot de passe ou par certificats.
  • Configuration des permissions par utilisateur sur le broker comme Mosquitto par exemple.
  • Chiffrer les communications entre client et broker en SSL/TLS.

Nativement MQTT propose une QOS (Qualité de service) sur 3 niveaux

  • 0 = Le message sera envoyé sans aucune garantie, aucun retour du broker,
  • 1 = Le message sera reçu au moins une fois,
  • 2 = Le message sera reçu une seule fois

Topics

Un topic n’a pas de nomenclature imposée par MQTT. Sauf $SYS qui est réservé au broker. Il est important de bien réfléchir à l’avance ses topics et leur arborescence.

Voici un exemple de topics dans le cadre d’une maison :

/maison/cuisine/temperature
/maison/cuisine/humidite
/maison/salon/temperature
/maison/salon/humidite

Wildcards « jokers »

Il est possible de s’abonner à des topics en utilisant les wildcards # ou +.

Obtenir tous les capteurs de la cuisine :

/maison/cuisine/#

Obtenir tous les capteurs de température :

/maison/+/temperature

Si vous voulez tous voir passer, il suffit de s’abonner à #

Last Will & Testament

Un client peut à la connexion envoyer au broker son testament au moment de sa connexion.

En cas de déconnexion soudaine, le broker enverra le « testament » du client aux abonnés sur le topic défini.

Utilisation

Voici, une petite liste non-exhaustive pour vous lancer avec MQTT.

Evidement Node-RED propose nativement des connecteurs MQTT


Sources & Ressources :

Installer un broker MQTT – Mosquitto – Ubuntu

Pour ma domotique, j’utilise principalement MQTT pour la communication entre les sondes, actuateurs, services et serveur.

MQTT est un protocole de messagerie fonctionnement par publication / souscription. Tous les clients se connectent au serveur (le broker) pour publier des messages ou souscrire afin de recevoir les messages ou les deux à la fois.

Installation de Mosquitto

Actuellement, je fonctionne avec Ubuntu 18.10 dans un container sous Proxmox PVE.

Le tuto est établi sur Ubuntu 18.10, mais il devrait parfaitement être applicable également sur des versions supérieures.

Commençons par le début, un update/upgrade

sudo apt update && apt upgrade

Installation de Mosquitto

sudo apt install mosquitto

En l’état, vous avez un Mosquitto parfaitement fonctionnel, mais sans la moindre sécurité.

Placez-vous dans le dossier de Mosquitto. Par défaut /etc/mosquitto

cd /etc/mosquitto

Créer le fichier d’authentification et le premier utilisateur. Après la commande, il vous sera demandé de renseigner un mot de passe.

Configuration de Mosquitto

sudo mosquitto_passwd -c passwordfile VOTRE_PREMIER_UTILISATEUR

Attention ! Le paramètre -c permet de créer le passwordfile si vous l’utilisez par la suite le fichier sera écrasé, et donc tous les utilisateurs perdus.

Créer un autre utilisateur.

sudo mosquitto_passwd passwordfile UTILISATEUR_SUIVANT

Modifiez le fichier de configuration de Mosquitto afin de limiter son accès aux utilisateurs avec un compte. (Positionnez-vous dans /etc/mosquitto)

sudo nano mosquitto.conf

Ajoutez ces deux lignes en fin de fichier et sauvegardez.

allow_anonymous false
password_file /etc/mosquitto/passwordfile

Voilà ! Il est possible d’aller plus loin avec Mosquitto et par exemple, restreindre un utilisateur en lecture ou de restreindre la publication à un seul topic, … Pour cela, penchez-vous sur les ACL. Il est également possible de chiffrer les communications avec le broker et d’y installer un certificat SSL.

Vous pouvez maintenant créer un petit capteur communicant en MQTT


Sources :

Domotique DIY #1 – Capteur distance MQTT + Home Assistant

Pour monitorer le bon fonctionnement de mon adoucisseur d’eau, j’ai besoin de connaitre la hauteur de sel dans le réservoir. L’appareil fait déjà ce monitoring, mais se contente d’un beep dans la cave que personne ne remarque.

Ce petit « tuto » peut-être appliqué pour n’importe quelle mesure de distance avec un capteur ultrason HC-SR04 (présence d’une voiture dans le garage, …)

Le HC-SR04 est un capteur ultrason permettant une mesure (plus ou moins précise) entre 2 cm et 400 cm (en théorie). J’ai porté mon choix sur ce capteur pour son prix et l’absence de la nécessité d’une mesure précise.

Selon gadgetsthatgo.com, le capteur émet 8 cycles d’un ultrason à 40 kHz depuis sa partie émettrice (Trig). Ce son rebondi sur l’objet présent devant le capteur et revient à ce dernier (Echo). La vitesse du son étant connue et en ignorant sur une si courte distance que la vitesse du son n’est pas une constante. Il suffit de diviser le temps de parcours du son par 58 pour obtenir l’information en centimètres. Je vous invite à lire les sources pour plus d’informations.

Si vous souhaitez installer un serveur (broker) MQTT suivez mon article : Installer un broker MQTT (Mosquitto).

Liste des courses

  • ESP8266 (Wemos D1 Mini dans mon cas) -1€,
  • Capteur ultrason HC SR-04 -1€,
  • Un peu de fil,
  • Câble + Alim USB.

Dans mon cas, j’ai déjà un serveur MQTT fonctionnant déjà en local pour ma domotique.

Montage

Schéma de connexion du capteur au Wemos

HC-SR04 -> Wemos

VCC -> 5V

Trig -> D5

Echo -> D6

GND -> G

Code source

Ligne 81, 82 & 84 : la valeur 80 est la hauteur du réservoir de sel dans mon cas afin de permettre le calcul du pourcentage de sel restant dans la cuve.

Le code est donné en l’état sans garantie et sans support.

Intégration à Home Assistant

Dans mon configuration.yaml j’ajoute simplement :

  - platform: mqtt
    name: "Niveau Sel"
    state_topic: "42/cave/sensors/sel"
    unit_of_measurement: 'Cm'
    value_template: "{{ value_json.niveaucm }}"
  - platform: mqtt
    name: "Niveau Sel"
    state_topic: "42/cave/sensors/sel"
    unit_of_measurement: '%'
    value_template: "{{ value_json.remplissage }}"

Résultat

Pour le moment, le capteur est simplement collé avec un morceau de collant double face épais en attendant une petite boite imprimée en 3D.

Le résultat de la mesure arrive bien dans Home Assistant, ce qui me permet d’avoir une bonne idée du niveau de sel.

Les prochaines étapes :

  • Ajouter une alerte et notification si le niveau devient trop bas pour le fonctionnement de la machine,
  • Passer la sonde en OTA,
  • Ajouter un deep sleep plutôt qu’un delay.

Observations

@andreadonno m’a fait remarqué l’existence du projet ESPHome qui semble faciliter la vie pour l’intégration à Home Assistant. Voir le tweet.

Sources