Connecter un ESP à Home Assistant via MQTT
Home assistant et MQTT
Aujourd'hui on va voir comment créer un objet connecté à votre serveur Home Assistant via MQTT à l'aide d'un simple ESP8266.
MQTT est un protocole pour les objets connectés très simple et relativement ancien, la première version de ce protocole datant de 99. Ce protocole fonctionne sur le modèle de client et de broker. Le client s'abonne et publie à des sujets de messages auprès du broker.
Je ne vais pas traiter de l'installation de Home Assistant.
Instalation de MQTT sur HA
Rendez-vous sur votre serveur HomeAssistant et allez dans Paramètres > Apps > Installer l'application.
Entrez MQTT dans la barre de recherche et sélectionnez Mosquitto Broker puis cliquez sur Installer.
Une fois l'installation faite, il a fallu que je redémarrer mon serveur pour que le broker soit réellement actif.
Configuration
Retournez dans Paramètres > Apps > Mosquitto MQTT > Configuration, cliquez sur le bouton Ajouter en dessous de Logins.
Rentre les identifiants de votre choix, pour cet exemple je mets mqtt-user / changeit.
Une lampe sur ESP8266
Dans l'exemple suivant, je vais utiliser un ESP8266. Je vais contrôler la LED embarquée via le serveur. Pour une raison que j'ignore sur ma version de mon contrôleur, la LED s'allume sur l'état LOW et s'éteint sur l'état HIGH.
Configuration du projet
J'utilise Visual Studio Code pour le développement Arduino. J'explique comment l'installer dans cet article.
Pour ce projet on va avoir besoin de la lib home-assistant-integration.
Pour rappel on peut ajouter une lib à un projet en éditant le fichier platformio.ini.
lib_deps = dawidchyrzynski/home-assistant-integration@^2.1.0
Connexion WiFi
J'explique plus en détail la connexion au Wi-Fi dans cet article.
#include <Arduino.h>
#include <ESP8266WiFi.h>
#define SSID_NAME "<VOTRE_SSID>"
#define SSID_PASS "<VOTRE_PASS_WIFI>"
#define HOST_NAME "<NOM_D_HOTE_DE_VOTRE_CHOIX>"
WiFiClient client;
void initWifi() {
WiFi.disconnect(true);
WiFi.setHostname(HOST_NAME);
WiFi.mode(WIFI_STA);
WiFi.setAutoConnect(true);
WiFi.setAutoReconnect(true);
WiFi.begin(SSID_NAME, SSID_PASS);
while (!WiFi.isConnected()) {
Serial.print(".");
delay(100);
}
Serial.println();
Serial.print("Connected. Ip: ");
Serial.println(WiFi.localIP().toString());
// Je réutilise cette adresse MAC plus tard
Serial.print("Connected. Mac: ");
Serial.println(WiFi.macAddress());
}
void setup() {
Serial.begin(9600);
initWifi();
}
void loop() {
}
Connexion au Broker MQTT
Pour vous connecter au broker MQTT.
// Ajout de l'import
#include <ArduinoHA.h>
// j'utilise l'adresse MAC de l'ESP32, mais je sais pas du tout si cela a une importance.
byte mac[] = { 0x1A, 0x2B, 0x3C, 0x4D, 0x5E, 0x6F };
HADevice device(mac, sizeof(mac));
HAMqtt mqtt(client, device);
void onStateChanged(HAMqtt::ConnectionState state) {
Serial.print("onStateChanged: ");
// Devrait afficher 0 lorsque la connexion est réussie.
Serial.println(state);
}
void setup() {
Serial.begin(9600);
initWifi();
// Donner le nom de votre choix à votre objet connecté
device.setName("TestDeviceName");
// Associer la fonction onStateChanged au changement d'état du périphérique.
mqtt.onStateChanged(onStateChanged);
// Identifiant précédent
mqtt.begin("<IP de Votre Serveur HA>", 1883, "mqtt-user", "changeit");
}
void loop() {
mqtt.loop();
}
Et normalement si tout se passe bien vous devriez voir la console :
onStateChanged: -5
onStateChanged: 0
Ajout d'une lampe.
Un device peut avoir plusieurs composants, ici on va juste faire une lampe.
// Ajout d'une lampe.
// Donner l'identifiant de votre choix, il doit être unique.
HALight light("LightId");
// Ajout d'un callback pour recevoir les messages de changement d'état sur la lampe
void onLightStateCommand(bool state, HALight* sender) {
Serial.print("State: ");
Serial.println(state);
// Appliquer le changement
digitalWrite(LED_BUILTIN, state ? LOW : HIGH);
// Il faut renvoyer l'état au broker pour acquitement.
sender->setState(state);
}
void setup() {
Serial.begin(9600);
initWifi();
// Initialisation, de la lampe on va faire très simple ici.
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, HIGH);
device.setName("TestDeviceName");
// Donner le nom de choix
light.setName("TestLightName");
// Associer le callback
light.onStateCommand(onLightStateCommand);
mqtt.onStateChanged(onStateChanged);
mqtt.begin("<IP de Votre Serveur HA>", 1883, "mqtt-user", "changeit");
}
void loop() {
mqtt.loop();
}
Et normalement dans votre Home Assistant vous devriez voir apparaître un bouton pour contrôler votre petite lumière :
Lumiere RGB et plus
On peu aussi ajouté plus de fonctionnalité à notre lampe. Comme la temperature de couleur ou le RGB.
// Ajouter les flags voulu
HALight light("LightId", HALight::BrightnessFeature | HALight::ColorTemperatureFeature | HALight::RGBFeature);
void onBrightnessCommand(uint8_t brightness, HALight* sender) {
// Traiter la luminositée
Serial.prinln(brightness);
sender->setBrightness(brightness);
}
void onColorTemperatureCommand(uint16_t temperature, HALight* sender) {
// Traiter la température
Serial.println(temperature);
sender->setColorTemperature(temperature);
}
void onRGBColorCommand(HALight::RGBColor color, HALight* sender) {
// Traiter la couleur
Serial.print(color.red);
Serial.print(",");
Serial.print(color.green);
Serial.print(",");
Serial.println(color.blue);
sender->setRGBColor(color); // report color back to the Home Assistant
}
void setup() {
// à Ajouter
// Associer les callbacks
light.onBrightnessCommand(onBrightnessCommand); // optional
light.onColorTemperatureCommand(onColorTemperatureCommand); // optional
light.onRGBColorCommand(onRGBColorCommand); // optional
}



