Test MQTT + Domoticz avec ESP 32

Installation du Pi

cf procédure usuelle

Note : il faut que le Pi soit sur un réseau connecté à internet au moins pour la mise en place.

Installation MQTT sur le Pi

Installation du brocker Mosquitto

Installation sur le Pi se fait en 3-4 lignes de commande : https://randomnerdtutorials.com/how-to-install-mosquitto-broker-on-raspberry-pi/

< Autre page très complète ici : https://projetsdiy.fr/mosquitto-broker-mqtt-raspberry-pi/

sudo apt-get update
sudo apt-get install  mosquitto
sudi apt-get install mosquitto-clients

Activation avec :

sudo systemctl enable mosquitto.service
sudo service mosquitto start

Une fois installé, on peut tester que tout ok en faisant :

sudo service mosquitto status

Au lancement suivant, il sera actif au démarrage.

Test du broker

https://randomnerdtutorials.com/testing-mosquitto-broker-and-client-on-raspbbery-pi/

On dispose de 2 commande pour s'abonner (subscribe) ou publier (publish). Logiquement, la commande "subscribe" va écouter et la commande "publish" est exécutée en attendant la suivante.

On va ici faire un test de bon fonctionnement du broker sur le poste lui-même qui ressemble à un test de serveur sur le poste lui-même.

Abonnement

On va commencer par lancer un abonnement de test que l'on va nommer :

mosquitto_sub -d -t testTopic

On a ce moment là une activité dans le terminal qui reste ouverte, en écoute, un peu comme un serveur qu'on lance.

Publication

On peut dès lors publier dans un second terminal en faisant :

mosquitto_pub -d -t testTopic -m "Hello world!"

On remarque du coup qu'à chaque envoi d'un "Hello World!", il est reçu dans le terminal précédent "subscribe".

Test avec ESP 32 ?

OK, on va essayer de faire çà dans l'interpréteur... à priori, à partir du moment où on a toujours notre MQTT qui écoute le "testTopic", on devrait pouvoir écrire dessus.

On commence par se connecter au réseau local (qui devra ici avoir accès à internet) :

>>> import network
>>> wifi=network.WLAN(network.STA_IF)
>>> wifi.active(True)
True
>>> wifi.connect("ssid","password")
>>> wifi.isconnected()
True
On a besoin de la librairie umqttsimple (à faire seulement la première fois)

>>> import upip as pip
>>> pip.install('micropython-umqtt.robust')
>>> pip.install('micropython-umqtt.simple')

Warning

Il y a 2 paquets à installer, robust dépendant de simple. Voir : https://boneskull.com/micropython-on-esp32-part-2/

Une fois fait, on peut utiliser mqtt sur l'ESP :

from umqtt.robust import MQTTClient

Ensuite, on crée le client (l'ESP est un client, et tout ce qui n'est pas le broker est un client).

>>> client = MQTTClient("123456789","192.168.0.52") # id,ipdubroker
>>> client.connect() # renvoie 0 ou erreur
0
>>> client.publish('testTopic', "72")
>>> client.publish('testTopic', "Hello  !")

Si tout est OK, vous devez voir dans la fenêtre de "subscribe" créée précédemment arriver les messages envoyés...

On peut aussi s'abonner à un "topic" et le topic ici est "testTopic".

>>> client.publish('testTopic', "72")
>>> client.publish('testTopic', "Hello  !")
>>> def reception(topic,msg):
    print(topic,":",msg)

>>> client.set_callback(reception)
>>> client.connect()
0
>>> client.publish('testTopic', "Hello  !")
>>> client.subscribe('testTopic')
>>> client.connect()
0
>>> client.publish('testTopic', "Hello  !")

Ensuite, on peut envoyer message sur "testTopic" depuis terminal du Pi.

Pour moi, je n'arrive pas voir le message qui censé être reçu par ESP envoyé depuis terminal "publish" du Pi. quelque chose ne doit pas être OK, mais c'est déjà très bien de pouvoir avoir la data en provenance de l'ESP.

En fait, il faut que le nom du topic soit au format bytes suivi d'un '/#' selon :

>>> topic='testTopic'.encode()+b"/#"
>>> topic
b'testTopic/#'
>>> client.subscribe(topic)
b'testTopic' : b'Hello world!'
b'testTopic' : b'Hello  !'
b'testTopic' : b'Hello world!'
>>> client.subscribe(topic)
>>> client.subscribe(topic)
b'testTopic' : b'Hello world!'
b'testTopic' : b'Hello world!'
b'testTopic' : b'Hello world!'
b'testTopic' : b'Hello world!'
Par contre, on a les messages à l'appel de client.subscribe() mais on n'a pas de retour de la fonction de callback, du moins dans l'interpréteur. A ce stade, je suis obligé d'appeler subscribe() pour lire le flux entrant. A voir si on peut faire mieux... Mais c'est déjà pas mal du tout.

https://www.programcreek.com/python/example/115319/umqtt.simple.MQTTClient

Installation de Domoticz et test

cf déjà fait... ?

curl -sSL install.domoticz.com | sudo bash
sudo apt-get upgrade

voir : https://projetsdiy.fr/installer-domoticz-raspbian-raspberry-pi3/

Ensuite, on peut se connecter sur ip.du.poste:8080 en http et 443 en https

On obtient assez facilement l'interface de domoticz.

Ensuite, si on veut utiliser avec MQTT : https://www.domoticz.com/wiki/MQTT

Il y a une procédure liée à l'interface à prendre en main :

  • ajouter un hardware qui va être un Virtual MQTT
  • ensuite créer via setup > hardware un Dummy (via liste déroulante)
  • dans la liste qui apparaît, le nouvel item a un bouton créer nouveu device > créer un "température"
  • ensuite créer un message de la forme : mosquitto_pub -h localhost -m '{ "idx" : 1, "nvalue" : 0, "svalue" : "25.0" }' -t 'domoticz/in' si depuis un terminal de test

ou bien si on envoie depuis l'interpréteur :

client.publish('domoticz/in', '{ "idx" : 1, "nvalue" : 0, "svalue" : "43.0" }')

C'est la forme minimale de message. Le "fléchage" de la donnée reçue se fait via l'index

Point important : il faut que l'idx soit le numéro du devive obtenu à partir de MQTT.

Noter qu'il est possible de configurer assez finement ce que l'on reçoit par MQTT ou ce que l'on ré-envoie. MQTT to Domiticz ou l'inverse.

Un truc important : domoticz reçoit bien mais ne "mémorise" que toutes les 5 minutes. Et le graphique ne se met pas à jour à l'arrivée d'une nouvelle data. Donc Domoticz, c'est pour du datalogging longue durée.

Ce qui est cohérent, c'est de faire un serveur du capteur lui-même qui permet le visuel live du capteur. Et d'utiliser MQTT vers Domoticz pour avoir la data longue-durée.

Des alternatives à Domoticz : https://alternativeto.net/software/domoticz/

notamment :

  • openHAB
  • Jeedom

Test avec Node JS

Node JS, notamment avec le JS Chart est une bonne alternative pour de la visualisation "multi-canal" dans une même interface.

D'autant que c'est assez léger au final lorsque çà tourne sur un Pi.

De plus, les messages MQTT peuvent être traités simultanément par MQTT et NodeJS, le broker faisant le lien.