Home Assistant est un portail domotique supportant le protocole de télémétrie MQTT. Voyons une intégration simpliste des deux avec un faux thermomètre.
Disposant d’un serveur Xen, j’ai installé trois machines virtuelles sous Debian Buster :
- hass.home : sur laquelle j’ai installé docker en suivant cette procédure, puis Home Assistant en suivant celle-ci. 512Mo semble le minimum.
- mqtt-relai.home : servira de broker MQTT
- mqtt-dev : une machine de développement pour Python.
Pour suivre ce tuto, il est nécessaire d’être un peu dégourdi en administration système : savoir installer un package, éditer un fichier, relancer un service.
Le relai MQTT
Le broker MQTT est un serveur relai sur lequel des clients viennent se connecter pour publier des valeurs de télémétrie et/ou les lire. Sur une machine virtuelle dénommée mqtt-relai.home sous debian , j’installe le broker MQTT Mosquitto, ainsi que les clients moquitto :
marc@mqtt-relai:~$ sudo apt-get install mosquitto marc@mqtt-relai:~$ sudo apt-get install mosquitto-clients
Les clients me seront nécessaire pour la démo ou éventuellement en debug pour voir ce qui passe.
Un premier client simple en python
Debian propose un package python3 MQTT soutenue par la fondation eclipse. Installons le sur une machine de développement appelée mqtt-dev.home :
py@mqtt-dev:~$ sudo apt-get install python3 python3-paho-mqtt
Dans un éditeur de texte créons le fichier client.py. Celui-ci se connecte au relai et, toutes les secondes, envoie une valeur aléatoire.
#!/usr/bin/python3 import paho.mqtt.client as mqtt import random import time if __name__ == '__main__': # création du client client = mqtt.Client() #connexion au relai client.connect("mqtt-relai.home", 1883, 60) # envoi d'une centaine de valeurs comprise entre 19 et 22 for i in range (1,100) : t = 19 + random.uniform(0,3) ret = client.publish('gloubi/boulga', t) print("émission de la valeur : ", t) time.sleep(1)
edit du 04/04/2020 : correction, ajout des doubles underscores entourant name et main
Rendons le exécutable par un chmod +x client.py. Puis Lançons-le :
py@mqtt-dev:~$ ./client.py émission de la valeur : 19.597503855458314 émission de la valeur : 19.086065784796318 émission de la valeur : 20.38858782022881 émission de la valeur : 21.706373083284998 émission de la valeur : 20.331756198864138 émission de la valeur : 19.183292710571795 émission de la valeur : 19.773029781040023 émission de la valeur : 19.824511122802356 émission de la valeur : 21.368812139748975
Puis côté relai exécutons un client qui capte tout :
marc@mqtt-relai:~$ mosquitto_sub -h localhost -t "#" -v gloubi/boulga 20.38858782022881 gloubi/boulga 21.706373083284998 gloubi/boulga 20.331756198864138 gloubi/boulga 19.183292710571795 gloubi/boulga 19.773029781040023 gloubi/boulga 19.824511122802356
\o/ youpi les valeurs publiées par le client apparaissent sur le serveur
Intégration Home Assistant :
Nous allons remplacer le client « mange-tout » par Home Assistant. Dans le fichier configuration.yaml (chez moi, il est dans /usr/share/hassio/homeassistant) déclarons notre broker et notre client mqtt comme une sonde (sensor) de température. Ajoutons les lignes :
mqtt: broker: mqtt-relai.home sensor: - platform: mqtt name: "blob" state_topic: "gloubi/boulga" unit_of_measurement : '°C'
Dans l’interface de Home Assistant, on clique sur l’engrenage en bas à gauche, puis ‘server control’. On commence par vérifier la configuration, puis on redémarre.

Ajoutons cette sonde à l’affichage. Sur la page d’accueil en haut à droite, cliquons sur les trois petits points verticaux, sélectionnons « configurer l’interface utilisateur ».

Cliquons sur le gros « plus » orange en bas à droite, sélectionnons « sensor ». Pour le champ ‘entité’ sélectionnons ‘sensor.blob’ (le nom que nous avons donné dans le fichier de configuration).

Après avoir cliquer sur enregistrer, puis relancer ‘client.py’, nous voyons les chiffres changer sur l’interface.

Installation simpliste
Cette installation très simpliste manque cruellement de sécurité et de robustesse. Le broker MQTT accepte les connexions de n’importe quel client. Un client malveillant pourrait publier de fausse valeur ou encore lire des informations. Côté frontal web, la mise en œuvre d’un reverse proxy améliorerait les choses.
De plus, le client ne se reconnecte pas si nous redémarrons le broker.
P’tits trucs
Pour voir les connexions TCP établies et les ports ouverts la commande lsof (list of open files) package éponyme) est utile. L’option -i permet de restreindre l’affichage aux connexions IP. En gras ci-dessous, la connexion entre Home Assistant et le broker.
marc@mqtt-relai:~$ sudo lsof -i COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME dhclient 264 root 7u IPv4 11977 0t0 UDP *:bootpc sshd 292 root 3u IPv4 12227 0t0 TCP *:ssh (LISTEN) sshd 292 root 4u IPv6 12238 0t0 TCP *:ssh (LISTEN) mosquitto 1346 mosquitto 5u IPv4 21220 0t0 TCP *:1883 (LISTEN) mosquitto 1346 mosquitto 6u IPv6 21221 0t0 TCP *:1883 (LISTEN) mosquitto 1346 mosquitto 8u IPv6 25742 0t0 TCP mqtt-relai.home:1883->hass.home:54625 (ESTABLISHED) sshd 1873 root 3u IPv6 28910 0t0 TCP mqtt-relai.home:ssh->bureau.home:6998 (ESTABLISHED) sshd 1879 marc 3u IPv6 28910 0t0 TCP mqtt-relai.home:ssh->bureau.home:6998 (ESTABLISHED)
La commande « sudo docker exec -it homeassistant bash » permet d’exécuter un shell dans le container.
J’ai une erreur, pouvez vous m’aiderpi@raspberrypi:~ $
pi@raspberrypi:~ $ sudo apt-get install python3 python3-paho-mqtt
E: Impossible d’obtenir le verrou /var/lib/dpkg/lock-frontend – open (11: Ressource temporairement non disponible)
E: Impossible d’obtenir le verrou de dpkg (/var/lib/dpkg/lock-frontend). Il est possible qu’un autre processus l’utilise.
pi@raspberrypi:~ $ pi@raspberrypi:~ $ sudo apt-get install python3 python3-paho-mqtt
ordialement
Vous avez deux processus d’installation en cours. Par exemple le logiciel aptitude en cours d’exécution dans une autre fenêtre et vous lancez en même temps un « apt-get install ».
bonjour,
j’ai une erreur à un moment du tuto
client.py Desktop Documents Downloads MagPi Music Pictures Public Templates Videos
pi@raspberrypi:~ $ sudo chmod +x client.py
pi@raspberrypi:~ $ /client.py
-bash: /client.py: Aucun fichier ou dossier de ce type
pi@raspberrypi:~ $ ls
client.py Desktop Documents Downloads MagPi Music Pictures Public Templates Videos
je suis novice, que dois-je faire ou il y a une erreur ?
Cordialement
/client.py
tente de lancer le script python qui se trouve à la racine. Il y a un point devant le slash pour lancer le script depuis le répertoire courant./client.py
pi@raspberrypi:/usr/bin $ client
-bash: client : commande introuvable
pi@raspberrypi:/usr/bin $ sudo chmod +x client.py
pi@raspberrypi:/usr/bin $ client.py
Traceback (most recent call last):
File « /usr/bin/client.py », line 5, in
if name == ‘main’:
NameError: name ‘name’ is not defined
pi@raspberrypi:/usr/bin $ /usr/bin/client.py
Traceback (most recent call last):
File « /usr/bin/client.py », line 5, in
if name == ‘main’:
NameError: name ‘name’ is not defined
pi@raspberrypi:/usr/bin $
j’ai resaisie le tuto dpuis le début et j’ai ne nouvelle erreur, name ne serait pas défini dans client.py
Désolé, le copier/coller vers wordpress a manger les doubles undercores encadrant name et main. La syntaxe correcte est :
if __name__ == '__main__':