Premiers pas avec Home Assistant et MQTT

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()
     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)

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.

Capture écran configuration puis server control

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 ».

Capture écran 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).

Capture écran sélection sensor.blob

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

Capture écran affichage final

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.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *