Home assistant logo

L'Internet des objets (IoT) à la maison
Home Assistant + MQTT, l'excellente solution domotique

Publié le 27/03/2018 - Mis à jour le 07/10/2019 par

La partie câblage, réseau, équipements domotique est décrite dans Comment câbler sa maison ou son appartement dont la lecture est conseillée. Cet article se concentre sur la partie surveillance et pilotage de l'ensemble des équipements à la maison par une application Web qui fonctionne sur PC, tablette et mobile.

Pourquoi Home Assistant ?

Il existe de plus en plus d'équipements électroniques dans la maison (TV, musique, thermostat, rideaux, lumière) dont la plupart disposent d'une télécommande et souvent d'une application de pilotage sur mobile. La bonne nouvelle, c'est que ces équipements utilisent de plus en plus les standards de l'Internet. La mauvaise nouvelle, c'est que chaque équipement utilise ses propres protocoles sans connaissance ni accès aux autres équipements.

L'objectif d'Home Assistant est de créer une vision centrale unifiée de l'état de l'ensemble des équipements pour servir de base à des applications de pilotage et d'automatisation de ces équipements. La solution est de construire une plate-forme (HUB) qui centralise l'ensemble des informations en parlant à chaque équipements selon son protocole. Il existe déjà (mars 2018) plus de 1000 types d'équipements qui sont supportés par ce système grâce à la collaboration de nombreux développeurs sur l'Internet. Cela facilite grandement son utilisation même par des non-spécialistes.
Pour réussir cette intégration, le système a été conçu autour de quelques principes simples qu'il est important de comprendre au préalable. Par ailleurs, les choix techniques sont fondées sur les meilleures technologies Web disponibles ce qui assure une grande pérennité et une forte évolutivité de ce système.


Le but de cet article n'est pas de se substituer à la documentation assez complète qui existe sur leur site. C'est plutôt de présenter de manière simple les concepts de base de l'architecture d'Home Assistant en insistant sur l'utilisation d'une technologie de base de l'Internet des objets (IoT : Internet of Things), le protocole MQTT. Ce protocole qui permet aux capteurs de communiquer facilement avec le Hub, est intégré dans Home Assistant. Il va permettre de connecter vos systèmes existants ou futurs avec le minimum d'efforts sans toucher à Home Assistant.

Architecture de Home Assistant

Les principes de base

Ha architecture

C'est le concept Internet des objets (IoT : Internet of Things) qui est utilisé. l'Internet des objets connectés représente les échanges de données provenant de dispositifs du monde réel avec le réseau Internet.
Chaque objet (appareil) est décrit par son état, des événements (changement d'état) et des actions (commandes)

  • état : "allumé", "éteint" pour une lampe ou un lecteur de musique. A chaque état, on peut ajouter des données complémentaires comme la couleur de la lampe ("Rouge") ou le volume du son du lecteur de musique ("60%").
  • événement : "une porte s'ouvre", "un mouvement est détecté", "une lumière s'allume". Les événements peuvent aussi être générés par des éléments extérieurs : "le soleil se lève", "il est 8 heures 30".
  • action (commande) : "éteindre" une lampe, "diminuer" un thermostat.

Cette première étape permet à la plate-forme centrale (Hub) de présenter une interface contenant simultanément l'état de tous les appareils. Des commandes manuelles permettent de déclencher des actions.
Cependant, on peut faire beaucoup mieux : automatiser des commandes. L'automatisation des commandes consiste à fournir un certain nombre de règles au système. Par exemple, "quand j'arrive à la maison", "s'il fait nuit", "allumer la lumière de l'entrée".
Les règles d'automatisation comportent plusieurs étapes :

  • L'événement déclencheur : c'est toujours un événement qui lance une action automatisée, pas un état qui peut durer longtemps. Dans cet exemple, le système détecte l'événement "quand j'arrive à la maison", par exemple à l'aide du GPS de mon téléphone mobile.
  • La ou les conditions à satisfaire : une condition peut prendre deux valeurs : vrai ou faux. Dans l'exemple la condition est "s'il fait nuit" détecté par le système en fonction de la date, l'heure et la position géographique de la maison. On pourrait ajouter plusieurs autres conditions.
  • La ou les commandes à déclencher : si toutes les conditions soient satisfaites, le système exécute les commandes.

On voit donc que le Hub Home Assistant fournit deux fonctions complémentaires : surveiller et piloter les équipements de la maison. Home Assistant permet donc de visualiser et faire travailler ensemble tous les équipements à la maison. Or chaque équipement utilise des protocoles et des standards différents. Comment les connecter à Home Assistant ?

Comment connecter les équipements à Home Assistant ?

Le projet Connected Home over IP qui regroupe les grands acteurs du domaine (Amazon, Apple, Google, ..) vise à définir un standard mondial libre de droits pour fin 2020. En admettant que ce comité n'accouche pas d'une usine à gaz, les résultats ne seront pas visibles avant plusieurs années. En attendant, comme je l'ai signalé, il existe déjà un millier de composants pour connecter des équipements à Home Assistant et la probabilité est grande que les vôtres soient disponibles dans la bibliothèque. Il suffit donc de les décrire dans le fichier de configuration configuration.yaml.

Comment faire s'ils ne sont pas dans la bibliothèque ?

Il est toujours possible d'écrire soi-même un composant. Je ne le conseille pas car il faut le bon niveau de compétence et surtout le temps nécessaire. Depuis plus de 30 ans, j'avais développé mon propre système de domotique à la maison sur un PC. En 2012, j'avais migré ce système sur un Raspberry PI moins gourmand en énergie (environ 4 watts) . Il permettait de surveiller portes et fenêtres, de générer des alarmes et quelques automatisations. L'interface homme/machine était très fruste car je n'avais jamais trouvé le temps de faire mieux. Les équipements multimédia étaient traités à part avec le système Harmony Hub de Logitech.
J'ai souhaité intégrer mon existant dans Home Assistant pour bénéficier d'une interface homme machine moderne et de l'intégration du Multimédia. L'opération a été quasi immédiate grâce aux composants MQTT intégrés dans Home Assistant. MQTT est très simple à utiliser comme la plupart des technologies de l'Internet à condition d'avoir compris la logique sous-jacente : c'est ce que j'explique dans le chapitre suivant avant de donner plus de détails pratiques.

Introduction à MQTT

MQTT logo
Historique

L'expression "Internet of Things" (Internet des objets) a été inventé en 1999 par Kevin Ashton pour désigner des équipements physiques qui échangent des données entre eux sur l'Internet sans intervention humaine. La multiplication des mobiles et l'arrivée de micro ordinateurs connectés à l'internet en WiFi à des coûts dérisoires (à partir de 5 €) permet d'utiliser ces technologies un peu partout y compris à la maison. En 1999, deux ingénieurs Andy Stanford-Clark et Arlen Nipper avaient développé une technologie pour surveiller par satellite un pipe-line dans le désert. La taille des équipements et le volume des données transmises étaient très limitées. Ces contraintes ont conduit au développement de la première version du protocole MQTT (Message Queuing Telemetry Transport) ensuite mis en Open Source puis devenu un standard ISO.

Le principe
Publish Subscribe

MQTT utilise un modèle du type Publier-S'abonner [Publish-Subscribe] différent du cycle Question-Réponse [Request-Response] du protocole HTTP. Le système permet à un émetteur [Publisher] de pousser, en temps réel, des messages au client qui s'est abonné [Subscriber]. Le serveur MQTT [Broker] est le point central chargé de recevoir les messages et de les renvoyer vers les clients légitimes. Chaque message est publié avec un sujet [Topic] qui sert au routage des messages par le serveur MQTT. Chaque client qui veut recevoir des messages s'abonne à un ou plusieurs Topics. Le serveur MQTT délivre aux clients tous les messages qui correspondent aux Topics auxquels il est abonné. De cette manière, clients et émetteurs n'ont pas à se connaître, juste à connaître le nom du Topic (et bien sûr le nom du serveur). Cette architecture est totalement découplée puisqu'elle n'introduit aucune dépendance entre les émetteurs et les abonnés. Elle est extensible largement et facilement puisque le serveur ne gère ni les Topics ni le contenu des messages.
Comme les messages sont poussés vers le client, celui-ci doit écouter en permanence sur une connexion ouverte avec le serveur MQTT. Si le client se déconnecte, les messages peuvent être sauvegardés sur le serveur et réémis à la reconnexion du client.

Topics

Le routage des messages est effectué grâce au Topic. Un Topic est simplement une chaîne de caractères qui indique le sujet du message. Cette chaîne de caractères peut être structurée sous forme de hiérarchie virtuelle par la notation habituelle des "/". Par exemple le Topic home/cuisine/temperature peut servir à publier la température de la cuisine, home/salon/temperature celle du salon. L'introduction de cette hiérarchie permet une grande flexibilité dans l'abonnement à des Topics. home/+/temperature permet de s'abonner à tous les topics température de home/.../, home/# à tous les topics qui commencent par home/, etc...

Messages

Le sujet [Topic] et le contenu du message sont entièrement au choix de l'émetteur. Le contenu des messages peut être très varié, depuis une simple valeur comme pour la température jusqu'à un document JSON ou XML pour un bulletin météo.
Chaque message peut être publié avec 3 qualités de service QoS : 0 aucune garantie, 1 pour demander à ce que le message soit publié au moins une fois, 2 publication exactement une fois. L'option de base QoS 0 est suffisante pour un système domotique à la maison. Il existe aussi l'option Retain pour demander au serveur de conserver la valeur la plus récente d'un Topic. Un client qui se connecte récupérera cette valeur immédiatement sans attendre une nouvelle publication. L'option Retain est à conseiller pour tous les états d'un système domotique. Un client qui se connecte obtient immédiatement la dernière situation connu sans attendre des messages de changement d'état.

Pour en savoir plus...
MQTTbox

Le mieux est de faire quelques tests. Le plus simple est de choisir un client MQTT dans un navigateur comme MQTTbox et de se connecter à un broker. Vous avez le choix soit d'utiliser le broker de test test.mosquitto.org avec un instrument à manipuler , un broker dans le cloud avec une option gratuite CloudMQTT ou HBMQTT le broker intégré dans Home Assistant.

Comment utiliser MQTT avec Home Assistant

HA architecture MQTT

Le principe de la solution est simple. Mon ancien système va "publier" chaque changement d'état de chaque composant sur un broker MQTT. Chaque composant est identifié par son Topic. Le contenu du message de publication est le nouvel état du composant. Dans Home Assistant, chaque ancien composant sera décrit sous la forme d'un nouveau composant MQTT "abonné" au Topic d'état de l'ancien composant. De cette manière, chaque changement d'état de l'ancien système est répercuté dans Home Assistant sans liaison directe entre eux. J'ai été assez surpris par les excellentes performances de ce système qui réagit en moins d'une demi-seconde.
Comment réaliser en pratique ces opérations ?

Choix du broker MQTT

J'ai choisi la solution la plus simple, le broker intégré dans Home Assistant. Il suffit d'ajouter l'instruction suivante dans le fichier de configuration pour le mettre en oeuvre.

# Exemple dans configuration.yaml
mqtt:

Pour modifier les paramètres par défaut ou utiliser un autre broker, voir ici.

Configuration d'un capteur dans Home Assistant
HA frontend

Voici un exemple pour définir deux capteurs utilisant le composant MQTT sensor.

# Exemple dans configuration.yaml
sensor:
  - platform: mqtt
    name: "Fenêtres Salons"
    state_topic: "home/rhio/e5"
  - platform: mqtt
    name: "Fenêtre Cuisine"
    state_topic: "home/rhio/e6"
On peut préciser de nombreux attributs. Seul le state_topic: est obligatoire; C'est l'abonnement au Topic publié par l'ancien système. name: est le nom qui apparaîtra dans l'interface Web.
Publication du Topic par l'ancien système.

Des clients MQTT existent dans la plupart des langages de programmation. Voir une liste ici. Mon système étant écrit en PHP, j'ai utilisé le client PHP phpMQTT. Voici un exemple des quelques lignes de code qui permettent de publier les messages de changement d'état sur le broker de Home Assistant.

require('phpMQTT.php');
$mqtt = new phpMQTT();

/* broker(broker address, broker port, client id); */
$mqtt->broker('192.168.0.100', 1883, 'PHP MQTT Client');

$mqtt->connect();
/* publish( topic, message, qos); */
$mqtt->publish('home/rhio/e5','actif',0);
$mqtt->disconnect();
Comment intégrer un interrupteur Sonoff ?
Sonoff

Mise à jour octobre 2019. La nouvelle version Sonoff Basic r3 permet de mettre à jour le logiciel par Wi-Fi en OTA sans avoir à bricoler le hardware et sans perdre la configuration usine.
L'interrupteur Wi-Fi Sonoff est disponible pour moins de 10 €. Il utilise la technologie CoAP pour communiquer via un broker fourni par le fabricant sur le Cloud (AWS) avec une application mobile eWe-Link, Amazon Alexa ou Google Home. Comme le composant intégré est un ESP8266, il est possible de modifier le logiciel pour le connecter au broker MQTT de son choix et ainsi l'intégrer dans Home Assistant. Attention, c'est une modification sans retour possible (à ma connaissance). Il existe quantité de solutions. C'est le système ESPHome qui est de très loin le mieux réalisé et le plus simple à utiliser. Ce système est décrit ici. Il suffit de définir la configuration souhaitée. Pas besoin de connaître la programmation ! Il faut acheter un adaptateur USB-TTL pour télécharger la première fois le logiciel dans le module. Ensuite toutes les mises à jour se font par Wi-Fi (OTA). La procédure détaillée est ici.
Pour ajouter un interrupteur dans Home Assistant, on utilise le composant MQTT switch. En plus du state_topic: qui fournit l'état du module ("on" ou "off"), le command_topic: permet de manipuler l'interrupteur en publiant un message "on" ou "off".

# Exemple dans configuration.yaml
switch:
- platform: mqtt
  name: "Café"
  state_topic: "home/sonoff/cuisine/stat"
  command_topic: "home/sonoff/cuisine"
  qos: 0
  payload_on: "on"
  payload_off: "off"
  retain: true
Avec cette solution, non seulement vous pouvez manipuler un interrupteur mais aussi connaître son état. On peut aussi l'inclure dans des automatisations, par exemple mettre en route la machine à café le matin pendant 10 minutes...
Comment intégrer des entrées sorties numériques [Digital I/O] ?
Piface 2

On peut utiliser directement les entrées sorties numériques du Raspberry Pi ou via une interface numérique plus facile à connecter comme le module PiFace Digital 2. Dans tous les cas, il est préférable d'utiliser un Raspberry Pi séparé avec les avantages suivants :

  • Découpler les composants pour augmenter la fiabilité et la capacité d'évolution.
  • Simplifier l'architecture avec des composants dédiés à des tâches
  • Bénéficier de la capacité d'intégration du protocole MQTT
En installant le logiciel PI MQTT GPIO sur le Raspberry Pi et en le connectant sur le broker MQTT de Home Assistant, vous pouvez piloter les entrées sorties numériques du GPIO uniquement par des Topics MQTT.
Ajoutez vos commentaires ci-après ou les envoyer à Jean-Paul Figer
Mots clés


Licence Creative Commons
Ce(tte) œuvre est mise à disposition selon les termes de la Licence Creative Commons Attribution - Pas d'Utilisation Commerciale - Pas de Modification 4.0 International.