TUTOS.EU

Installer le serveur MQTT mosquitto


Comme indiqué sur projetsdiy.fr, MQTT (Message Queuing Telemetry Transport) est un protocole de messagerie qui fonctionne sur le principe de souscription / publication qui a été développé à la base pour simplifier la communication entre les machines et qui est maintenant un standard international pour la communication entre machines (M2M) et les objets (IoT). Pour économiser au maximum la batterie des appareils mobiles. MQTT consomme 11 fois moins d’énergie pour envoyer des messages et 170 fois moins pour en recevoir que le protocole HTTP. MQTT est également 93 fois plus rapide que le protocole HTTP.

Pour cela il nécessite un serveur/broker. C'est ce que l'on va faire ici en installant Mosquitto sur un Raspberry.

 

La commande pour installer Mosquitto sous Linux est

sudo apt install mosquitto
Lien vers le fichier : cliquez ici

L'installation d'un client peut très utile pour faire des tests par la suite.
Ces tests se feront avec la commande mosquitto_sub ou mosquitto_pub

sudo apt-get install mosquitto-clients
Lien vers le fichier : cliquez ici

Vérifier qu'il répond bien avec la commande

systemctl status mosquitto
Lien vers le fichier : cliquez ici

Le service peut être redémarré avec la commande

sudo systemctl restart mosquitto
Lien vers le fichier : cliquez ici

On peut visualiser le fichier de configuration avec

more /etc/mosquitto/mosquitto.conf
Lien vers le fichier : cliquez ici

Vous remarquerez qu'on demande de placer ses fichiers de configuration dans
/etc/mosquitto/conf.d/

On peut donc en créer un avec nano. On le nommera par exemple default.conf avec la commande

sudo nano /etc/mosquitto/conf.d/default.conf
Lien vers le fichier : cliquez ici

En option on peut faire en sorte qu'il faille un login/mot de passe pour pouvoir se connecter à Mosquitto.
Ce dernier n'est pas utilisé dans ce tuto.

Si vous voulez en créer un, taper

sudo mosquitto_passwd -c /etc/mosquitto/passwd NOM_UTILISATEUR
Lien vers le fichier : cliquez ici

Et déclarez le dans le fichier de conf perso, cad ici dans /etc/mosquitto/conf.d/default.conf
avec ces lignes

allow_anonymous false
password_file /etc/mosquitto/passwd
Lien vers le fichier : cliquez ici

Vous pouvez voir les logs avec la commande

tail -f /var/log/mosquitto/mosquitto.log
Lien vers le fichier : cliquez ici

Si vous avez activé le firewall sur votre Linux, il faut penser à autoriser le port 1883 avec une commande du type

#Autoriser le port 1883 en entrée pour Mosquitto
iptables -t filter -A INPUT -p tcp --dport 1883 -j LOGACCEPT
echo "Mosquitto ok"
Lien vers le fichier : cliquez ici

Comme expliqué sur https://youtu.be/FsSlgAWtGio?t=443

On peut tester que l'envoie des messages fonctionne bien en lançant 2 terminaux ssh.
Sur le premier, créer un subscriber avec une commande comme ci-dessous.
Si vous n'avez pas créé d'utilisateur sécuriser l'accès à Mosquitto, il n'est pas nécessaire de renseigner l'option -u et -P

mosquitto_sub -h localhost -u votreuser -P lepassword -t topic/test
Lien vers le fichier : cliquez ici

Dans une autre session ssh, créer un publisher et un message test avec une commande du type

mosquitto_pub -h localhost -u votreuser -P lepassword -t topic/test -m "Voici un test"
Lien vers le fichier : cliquez ici

La première session avec le subscriber doit recevoir le message de la seconde


Dans Domoticz, la déclaration de la passerelle MQTT se fait comme ci-dessous.
Dans adresse distante, c'est localhost qui est ici indiqué, car mosquitto est installé sur la même machine que Domoticz.
1883 est le port par défaut de Mosquitto.

Vous remarquerez que rien n'a été mis dans identifiant et mot de passe. Cela sera une amélioration de la configuration à faire plus tard. On a vu par exemple comment créer ce login/mot de passe au début.

Ensuite aller dans les logs

Vous devez voir que Domoticz se connecte sur Mosquitto et qu'il se déclare en tant que Subscriber

Maintenant que l'on a un serveur MQTT avec Domoticz en écoute dessus, on peut par exemple simuler l'envoi d'un ordre à Domoticz.
Pour cela je vais voir dans mes Interrupteurs, j'en prends un au hasard et je note son idx. Ici c'est 9.

On va lui envoyer un ordre avec la commande mosquitto_pub.

Là où avant on avait mis "Voici un test" dans l'option -m,
ici on va mettre un ordre qui prend la forme d'une requête json.
Dans cette requête on précise l'idx, ici 9, et l'ordre, ici nvalue à 1

Dans la commande ci-dessous, vous remarquerez que le canal est ici domoticz/in
et non plus topic/test

mosquitto_pub -h localhost -u votreuser -P lepassword -t domoticz/in -m '{ "idx" : 9, "nvalue" : 1}'
Lien vers le fichier : cliquez ici

Et là BAM ! Cela s'allume bien

Et les ordres sont bien visibles dans le log de Domoticz

On peut aussi prendre un périphérique où il y a ESP Easy et y déclarer le serveur MQTT en allant sur Controllers puis Add

Si vous vous vous demandez comment on peut faire un périphérique où il y a ESP Easy, vous pouvez regarder
https://www.tutos.eu/3098

Indiquer l'adresse ip de mosquitto, activer et cliquer sur Submit

Le serveur MQTT déclaré, il faut indiquer quel type de device l'ESP représente.
Pour l'exemple on va dire qu'on est un interrupteur. L'ESP va donc indiquer quand on actionne un périphérique.
Charge après à Mosquitto de relayer l'information à Domoticz qui devra se charger ensuite d'envoyer un ordre à une lampe à allumer par exemple.

Pour cela, toujours sous ESP Easy, cliquer sur Devices puis Add

Si c'est un interrupteur, prendre switch

Nommer le device, indiquer la broche avec lequel il est reliée à votre interrupteur et renseignez le type de switch.

Ensuite il faut faire le lien dans Domoticz qui joue le rôle de tour de contrôle.
A ce titre Domoticz référence tous les objets avec un idx.
Il faut trouver celui qui correspond à l'ESP avec lequel on est en train de jouer.

Donc sous Domoticz, il vous faut déclarer un interrupteur, si ce n'est pas déjà fait.
Si vous vous demandez comment, jeter un oeil à l'article https://www.tutos.eu/6215

Noter son idx et le reporter sous ESP Easy.
Ici j'ai pris l'interrupteur 'Dummy' qui pilote la lampe de mon Gecko.

Cocher aussi send to controller

Cliquer sur Submit, suite à quoi si vous activez l'interrupteur, Domoticz recevra l'ordre via MQTT que vous devez visualiser dans ses logs.


Cet article http://www.steves-internet-guide.com/mosquitto-logging nous apprend que si on veut avoir des logs, il faut lancer Mosquitto avec l'option verbose, cad -v
De base on a rien d'intéressant.

Comment se lance Mosquitto de base ?

On trouve le fichier de configuration du service de Mosquitto dans le fichier
/lib/systemd/system/mosquitto.service

Ce dernier nous apprend que la commande qui lance le service est
/usr/sbin/mosquitto -c /etc/mosquitto/mosquitto.conf

Donc pour avec des logs, il faut commencer par arrêter son service avec la commande

sudo systemctl stop mosquitto
Lien vers le fichier : cliquez ici

Ajouter le -v dans le paramètre ExecStart du service de mosquito ne fonctionne pas. Je ne sais pas pourquoi.
Il faut relancer le programme en direct, avec le -v, avec une commande comme ci-dessous.

cd /usr/sbin
sudo ./mosquitto -v -c /etc/mosquitto/mosquitto.conf
Lien vers le fichier : cliquez ici

De là depuis une autre session ssh, si on regarde les logs de Mosquitto avec cette commande, là on verra tout ce qui se passe

sudo tail -f /var/log/mosquitto/mosquitto.log
Lien vers le fichier : cliquez ici

Exemple

Du coup, quand on reçoit un ordre de Google Assistant qui passe par Homebridge, je vois passer des ordres qui commencent par
Received PUBLISH from mqttjs_e0de85d7

Un outil très utile c'est MQTT.FX que l'on peut télécharger sur https://mqttfx.jensd.de/index.php/download
Je l'ai trouvé en lisant https://projetsdiy.fr/mosquitto-broker-mqtt-raspberry-pi/
Il permet de se connecter sur votre broker MQTT, de trouver les différents channels, de s'y abonner, de voir les messages passer et leur contenu, et ca c'est top :