Entre l’idée brillante sur papier et la solution qui tourne réellement chez un client, il y a souvent un fossé : câblage fragile, code non maintenable, Wi-Fi instable, capteurs capricieux, coupures CEET à répétition, et surtout l’absence d’une méthode claire pour passer à l’échelle. Au Togo comme partout en Afrique de l’Ouest, les projets IoT avortent rarement pour des raisons technologiques ils avortent par manque de méthode et de structure.
Dans cet article, nous suivons une approche concrète et orientée déploiement : partir d’un besoin réel, construire un prototype fonctionnel avec un ESP32, l’intégrer dans Home Assistant via MQTT, puis transformer cet essai en solution domotique exploitable sur le terrain togolais. Que vous soyez technicien, formateur, responsable d’un FabLab ou prestataire IT pour des PME locales, cette méthode vous évite l’errance technique et vous rapproche rapidement d’un résultat livrable.
Niveau : Intermédiaire | Durée estimée : 1 journée de FabLab + 2-3h de configuration logicielle | Budget matériel : 15 000 – 45 000 FCFA selon les capteurs
Table des matières
- Prérequis : matériel, logiciels et compétences
- Définir le besoin métier avant de toucher l’ESP32
- Construire le prototype ESP32 en FabLab
- Connecter l’ESP32 à Home Assistant via MQTT
- Préparer une démonstration terrain convaincante
- Passer au déploiement : industrialiser sans perdre l’agilité
- Adaptations pour le contexte togolais
- Troubleshooting : problèmes courants et solution
1. Prérequis : matériel, logiciels et compétences
Matériel nécessaire (prix indicatifs en FCFA)
- ESP32 DevKit v1 ou v4
- Capteur DHT22 (température + humidité)
- Module relais 5V (1 ou 2 canaux)
- Capteur magnétique d’ouverture de porte
- Breadboard + câbles Dupont
- Alimentation 5V/2A
- Onduleur/UPS mini (optionnel mais recommandé)
- Raspberry Pi 4 ou mini-PC pour Home Assistant
Logiciels requis
- Arduino IDE 2.x ou PlatformIO (dans VS Code) : gratuit
- Bibliothèques Arduino :
PubSubClient(MQTT),DHT sensor library(Adafruit),WiFi.h(intégrée ESP32) - Home Assistant (HAOS ou Docker) : gratuit, auto-hébergé
- Mosquitto MQTT Broker : add-on Home Assistant ou container Docker
- MQTT Explorer : outil de débogage MQTT, gratuit
Compétences requises
- Notions de base en électronique (ne pas inverser VCC/GND)
- Notions de programmation C++ (lecture de fonctions, modification de variables)
- Accès à un réseau Wi-Fi local avec possibilité de créer des règles DHCP statique
- Home Assistant déjà installé (ou suivre le guide d’installation Home Assistant pour le Togo)
2. Définir le besoin métier avant de toucher l’ESP32
Beaucoup de projets IoT démarrent par la technologie (« on va mettre un ESP32 partout »), alors qu’ils devraient démarrer par le terrain. La bonne question n’est pas « quel microcontrôleur choisir ? », mais plutôt : quel problème opérationnel voulons-nous résoudre ?
Prenons un cas réaliste au Togo : un bureau ou une PME à Lomé veut surveiller son local technique, réduire sa consommation électrique et être alerté en cas d’anomalie (surtension, température excessive due à la climatisation en panne, ouverture hors horaires). Le projet doit rester abordable et ne pas nécessiter d’équipe R&D dédiée.
À ce stade, formalisez un mini-cahier des charges en 5 points :
- Mesurer : température, humidité, présence, état d’ouverture, consommation électrique.
- Agir : piloter un relais (éclairage, ventilation, équipement non critique).
- Visualiser : tableau de bord clair sur mobile et poste fixe.
- Alerter : notification Telegram ou WhatsApp en cas d’écart critique.
- Sécuriser : authentification, segmentation réseau, journalisation minimale.
💡 Astuce Locale : Intégrez dès le cahier des charges la gestion des coupures CEET. Votre ESP32 doit savoir se reconnecter automatiquement après une coupure, et Home Assistant doit envoyer une notification si un capteur devient muet pendant plus de 10 minutes.
3. Construire le prototype ESP32 en FabLab
Schéma de câblage de base
Pour notre scénario, voici l’architecture matérielle du prototype :
- DHT22 : VCC → 3.3V, GND → GND, DATA → GPIO 4
- Capteur magnétique : une borne → GPIO 34 (INPUT_PULLUP), autre borne → GND
- Module relais : VCC → 5V, GND → GND, IN → GPIO 26
⚠️ Attention : Le module relais fonctionne en logique inversée sur la plupart des modules chinois bon marché : écrire LOW active le relais, HIGH le désactive. Vérifiez toujours avec un multimètre avant de connecter une charge réelle.
Code firmware ESP32 commenté
Voici un firmware de base complet, prêt à flasher depuis l’Arduino IDE :
#include <WiFi.h>
#include <PubSubClient.h>
#include <DHT.h>
// --- Configuration réseau et MQTT ---
const char* ssid = "NOM_DU_WIFI"; // Remplacez par votre SSID
const char* password = "MOT_DE_PASSE_WIFI"; // Remplacez par votre mot de passe
const char* mqttServer = "192.168.1.XX"; // IP locale de votre broker Mosquitto
const int mqttPort = 1883;
const char* mqttUser = "esp32_user"; // Créez un user dans Mosquitto
const char* mqttPass = "motdepasse_fort";
// --- Broches ---
#define DHTPIN 4
#define DHTTYPE DHT22
#define RELAY_PIN 26
#define DOOR_PIN 34
DHT dht(DHTPIN, DHTTYPE);
WiFiClient espClient;
PubSubClient client(espClient);
unsigned long lastMsg = 0;
const long interval = 30000; // Envoi toutes les 30 secondes
// --- Reconnexion MQTT ---
void reconnect() {
while (!client.connected()) {
Serial.print("Connexion MQTT...");
if (client.connect("ESP32_Bureau", mqttUser, mqttPass)) {
Serial.println("connecté !");
// Souscription au topic de commande du relais
client.subscribe("maison/bureau/relais/set");
} else {
Serial.print("Échec, rc=");
Serial.print(client.state());
Serial.println(" Nouvel essai dans 5s");
delay(5000);
}
}
}
// --- Réception des commandes MQTT ---
void callback(char* topic, byte* message, unsigned int length) {
String msgStr;
for (int i = 0; i < length; i++) msgStr += (char)message[i];
if (String(topic) == "maison/bureau/relais/set") {
if (msgStr == "ON") digitalWrite(RELAY_PIN, LOW); // Activer
if (msgStr == "OFF") digitalWrite(RELAY_PIN, HIGH); // Désactiver
}
}
void setup() {
Serial.begin(115200);
dht.begin();
pinMode(RELAY_PIN, OUTPUT);
digitalWrite(RELAY_PIN, HIGH); // Relais OFF par défaut (état sûr)
pinMode(DOOR_PIN, INPUT_PULLUP);
// Connexion Wi-Fi
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWi-Fi connecté : " + WiFi.localIP().toString());
client.setServer(mqttServer, mqttPort);
client.setCallback(callback);
}
void loop() {
if (!client.connected()) reconnect();
client.loop();
unsigned long now = millis();
if (now - lastMsg > interval) {
lastMsg = now;
// Lecture capteurs
float temp = dht.readTemperature();
float humi = dht.readHumidity();
int door = digitalRead(DOOR_PIN); // 0 = fermée, 1 = ouverte
// Vérification erreur capteur
if (isnan(temp) || isnan(humi)) {
client.publish("maison/bureau/status", "ERREUR_CAPTEUR");
return;
}
// Publication MQTT
char buf[10];
dtostrf(temp, 4, 1, buf);
client.publish("maison/bureau/temperature", buf);
dtostrf(humi, 4, 1, buf);
client.publish("maison/bureau/humidite", buf);
client.publish("maison/bureau/porte", door == 0 ? "ferme" : "ouvert");
client.publish("maison/bureau/status", "OK");
}
}C✅ Bonne pratique : Assignez une IP statique à votre ESP32 dans les paramètres DHCP de votre routeur MikroTik, en vous basant sur son adresse MAC. Cela évite que l’IP change après un redémarrage et que MQTT perde la connexion.
4. Connecter l’ESP32 à Home Assistant via MQTT
Étape 1 : Installer et configurer Mosquitto
Dans Home Assistant, allez dans Paramètres → Modules complémentaires → Mosquitto broker et installez-le. Créez ensuite un utilisateur dédié dans Paramètres → Personnes → Utilisateurs (ex. : esp32_user).
Étape 2 : Déclarer les entités dans configuration.yaml
# configuration.yaml
mqtt:
sensor:
- name: "Température Bureau"
state_topic: "maison/bureau/temperature"
unit_of_measurement: "°C"
device_class: temperature
value_template: "{{ value }}"
availability_topic: "maison/bureau/status"
payload_available: "OK"
payload_not_available: "ERREUR_CAPTEUR"
- name: "Humidité Bureau"
state_topic: "maison/bureau/humidite"
unit_of_measurement: "%"
device_class: humidity
value_template: "{{ value }}"
binary_sensor:
- name: "Porte Bureau"
state_topic: "maison/bureau/porte"
payload_on: "ouvert"
payload_off: "ferme"
device_class: door
switch:
- name: "Relais Bureau"
command_topic: "maison/bureau/relais/set"
state_topic: "maison/bureau/relais/state"
payload_on: "ON"
payload_off: "OFF"YAMLAprès modification du fichier, allez dans Outils de développement → YAML → Vérifier la configuration, puis redémarrez Home Assistant.
Étape 3 : Créer une automatisation d’alerte
Créez une automatisation dans Home Assistant pour envoyer une notification Telegram si la température dépasse 35°C (seuil réaliste à Lomé en saison sèche sans climatisation) :
alias: "Alerte température bureau"
trigger:
- platform: numeric_state
entity_id: sensor.temperature_bureau
above: 35
condition: []
action:
- service: notify.telegram_bot
data:
message: >-
⚠️ ALERTE : Température bureau = {{ states('sensor.temperature_bureau') }}°C.
Vérifiez la climatisation !YAMLPour la configuration complète de Telegram avec Home Assistant, consultez notre guide sur les notifications Home Assistant via Telegram.
5. Préparer une démonstration terrain convaincante
Une démonstration réussie ne se limite pas à « regardez, le capteur affiche la température ». Elle doit répondre à une question business : est-ce que cette solution améliore réellement l’exploitation ?
Construisez une démo scénarisée en conditions proches du réel :
- Simuler une anomalie : approchez une source de chaleur du DHT22 pour déclencher l’alerte de température.
- Ouvrir la porte : montrez la remontée de l’état en temps réel sur le dashboard.
- Activer le relais depuis Home Assistant : démontrez le pilotage à distance d’un équipement.
- Simuler une coupure Wi-Fi : éteignez le routeur 30 secondes et montrez que l’ESP32 se reconnecte automatiquement.
- Montrez les logs : l’historique horodaté des événements rassure les décideurs.
Formalisez des critères de validation chiffrés pour l’étape suivante :
- Taux de disponibilité observé sur 48h de test : cible > 95%
- Temps de détection d’anomalie : cible < 60 secondes
- Nombre de reconnexions Wi-Fi réussies sur 10 tests : cible 10/10
- Lisibilité du dashboard par un non-développeur : validation oui/non
6. Passer au déploiement : industrialiser sans perdre l’agilité
a) Standardiser le matériel et les versions firmware
Définissez une nomenclature claire : modèle d’ESP32 validé, liste capteurs autorisés, boîtiers (impression 3D avec votre Bambu Lab A1 ou boîtier DIN rail), alimentation et protections. Versionnez votre firmware sur Git et documentez un changelog dès le prototype.
b) Sécuriser l’architecture réseau
Un projet domotique déployable n’est pas un réseau plat rempli d’objets connectés. Avec MikroTik, créez un VLAN dédié IoT, isolez-le du réseau principal, et autorisez uniquement le port 1883 vers le broker MQTT. Pour aller plus loin, consultez notre guide sur Installation Pangolin: Alternative au tunnel cloudflare et Déployer Pangolin avec Docker : Gérer Plusieurs Sites MikroTik via WireGuard.
# Exemple RouterOS : règle firewall pour isoler le VLAN IoT
# Autoriser IoT → MQTT Broker uniquement
/ip firewall filter
add chain=forward src-address=192.168.30.0/24 dst-address=192.168.1.XX \
dst-port=1883 protocol=tcp action=accept comment="IoT vers MQTT OK"
add chain=forward src-address=192.168.30.0/24 action=drop \
comment="Bloquer le reste du VLAN IoT"YAMLc) Mettre en place les mises à jour OTA
Pour un parc de plusieurs ESP32, les interventions manuelles deviennent vite coûteuses. Implémentez les mises à jour OTA (Over-The-Air) dès le départ avec la bibliothèque ArduinoOTA intégrée :
#include <ArduinoOTA.h>
void setup() {
// ... votre setup habituel ...
ArduinoOTA.setHostname("esp32-bureau"); // Nom visible sur le réseau
ArduinoOTA.setPassword("motdepasse_ota");
ArduinoOTA.begin();
}
void loop() {
ArduinoOTA.handle(); // À appeler dans chaque itération du loop
// ... reste du loop ...
}Cd) Déployer par paliers
Commencez par une zone pilote (un bureau, une salle serveur), validez les gains mesurables, puis élargissez. Chaque palier doit justifier l’investissement suivant : réduction de la consommation électrique, amélioration du temps d’intervention, diminution des incidents liés aux coupures CEET.
7. Adaptations pour le contexte togolais
🔌 Gestion des coupures CEET
Les coupures électriques sont la contrainte numéro 1 au Togo. Voici les mesures indispensables :
- Onduleur/UPS pour le serveur Home Assistant : minimum 30 minutes d’autonomie. Budget : 25 000 à 45 000 FCFA.
- Alimentation ESP32 sur batterie LiPo : pour les capteurs critiques, utilisez un module de charge TP4056 + batterie 18650 (~3 000 FCFA).
- Reconnexion automatique : le code fourni ci-dessus inclut déjà une boucle de reconnexion MQTT. Activez également la reconnexion Wi-Fi automatique avec
WiFi.setAutoReconnect(true). - Alerte « capteur muet » dans Home Assistant : créez une automatisation qui alerte si un capteur n’a pas envoyé de données depuis plus de 10 minutes (utiliser le topic
status).
📶 Réseau Wi-Fi et bande passante
Le protocole MQTT est extrêmement léger en bande passante (quelques octets par message). Il est parfaitement adapté aux connexions YAS TOGO ou MOOV AFRIKA parfois instables. Toutefois :
- Hébergez votre broker MQTT et Home Assistant en local , pas de dépendance au cloud.
- Pour accès distant, utilisez Cloudflare Tunnel ou WireGuard plutôt qu’une exposition directe.
- Réglez l’intervalle de publication à 30-60 secondes (pas 1 seconde) pour réduire la charge réseau.
🌡️ Température et humidité ambiante
À Lomé, la température ambiante peut dépasser 35°C et l’humidité dépasse souvent 80% en saison des pluies. Utilisez des boîtiers IP54 minimum pour les installations en extérieur ou semi-extérieur. L’ESP32 supporte 0-85°C, mais les capteurs bon marché se dérèglent au-delà de 80% d’humidité prévoyez un remplacement annuel.
8. Troubleshooting : problèmes courants et solutions
Problème 1 : L’ESP32 ne se connecte pas au Wi-Fi
Symptôme : La console série affiche une série infinie de points.
Causes probables : SSID ou mot de passe incorrect, réseau 5GHz (l’ESP32 ne supporte que le 2.4GHz), signal trop faible.
Solution : Vérifiez que votre réseau est bien en 2.4GHz. Approchez l’ESP32 du routeur pour tester. Utilisez WiFi.scanNetworks() pour lister les réseaux visibles.
Prévention : Assignez toujours un canal Wi-Fi fixe sur votre MikroTik (canal 6 ou 11 recommandé à Lomé pour éviter les interférences).
Problème 2 : MQTT se déconnecte fréquemment
Symptôme : Le broker reçoit les données par intermittence.
Causes probables : Le keepalive MQTT est trop court, le broker Mosquitto redémarre, conflit d’ID client (deux ESP32 avec le même nom).
Solution : Utilisez un ID client unique basé sur l’adresse MAC : String clientId = "ESP32-" + String((uint32_t)ESP.getEfuseMac(), HEX);. Vérifiez les logs Mosquitto dans Home Assistant → Journal du module complémentaire.
Problème 3 : Le capteur DHT22 retourne NaN
Symptôme : La valeur publiée est nan ou vide.
Causes probables : Câblage incorrect (DATA non connecté ou sans résistance pull-up), lecture trop rapide (DHT22 nécessite minimum 2 secondes entre lectures), alimentation insuffisante.
Solution : Ajoutez une résistance de 10kΩ entre DATA et VCC. Augmentez l’intervalle de lecture à 5 secondes minimum. Le code fourni inclut déjà la gestion du NaN avec publication d’une erreur sur le topic status.
Problème 4 : Le relais reste actif après un redémarrage ESP32
Symptôme : La charge connectée au relais reste alimentée au démarrage de l’ESP32.
Cause : L’état GPIO est indéfini pendant le boot (quelques millisecondes à LOW).
Solution : Mettez le GPIO en état sûr (HIGH = relais OFF) dans les toutes premières lignes du setup(), avant même la connexion Wi-Fi. Le code fourni ci-dessus applique cette bonne pratique.
Problème 5 : Les entités n’apparaissent pas dans Home Assistant
Symptôme : Aucun capteur visible après configuration du configuration.yaml.
Causes probables : Erreur de syntaxe YAML (indentation), nom du topic MQTT différent entre le firmware et le YAML, Home Assistant pas redémarré.
Solution : Utilisez MQTT Explorer pour vérifier en temps réel les topics publiés par l’ESP32. Comparez exactement les topics dans le firmware et dans le YAML. Validez la configuration YAML avec l’outil intégré avant redémarrage.
Problème 6 : L’ESP32 ne répond pas aux commandes MQTT
Symptôme : Vous publiez sur maison/bureau/relais/set mais le relais ne répond pas.
Cause : La souscription (client.subscribe) n’est appelée qu’une fois lors de la connexion. Si l’ESP32 se reconnecte, il ne se réabonne pas automatiquement.
Solution : Placez le client.subscribe() dans la fonction reconnect() (comme dans le code fourni), pas dans le setup().
Et Enfin !!!
En structurant votre démarche autour d’un besoin réel (pas d’une technologie), en passant par un prototype documenté, une démonstration chiffrée et un plan d’industrialisation progressif, vous passez d’un objet connecté isolé à une solution fiable au service de votre activité ou de vos clients.
Prochaines étapes suggérées :
- Ajouter un capteur de consommation électrique PZEM-004T pour monitorer la consommation réelle
- Intégrer ESPHome pour une gestion encore plus simple des ESP32 dans Home Assistant
- Mettre en place un dashboard personnalisé pour le client final
- Former votre équipe ou vos clients
Partagez votre expérience dans les commentaires : avez-vous déjà prototypé avec un ESP32 ? Quels défis avez-vous rencontrés sur le terrain ? Quelles adaptations avez-vous dû faire face aux coupures CEET ?
