Ce tutoriel présente la conception d’une jauge de batterie dynamique utilisant un ruban LED, pilotée par Jeedom via WLED et MQTT. L’objectif est de transformer un simple bandeau en un tableau de bord visuel haute précision.
Le concept visuel
- Pouls de l’énergie : Le ruban « respire » (pulsation rapide en charge, lente en décharge).
- Dégradé chromatique : Passage fluide du rouge (vide) au vert (plein).
- Sentinelle : Une LED témoin indépendante en bout de ruban (Vert=Charge, Rouge=Décharge, Bleu=Repos, Rainbow=100%).
- Alerte critique : Flash rouge stroboscopique sous 20%.
- Confort : Luminosité adaptative selon l’éclairage de la pièce (100% ou 5%).
Low:

Charging :

Connaissances requises :
- Flash d’un ESP (navigateur web).
- Bases MQTT.
- Soudure et câblage électrique.
1. Matériel requis
- Contrôleur : Wemos D1 Mini Pro (ou tout autre ESP).
- Ruban LED : Modèle adressable (ex: WS2812B ou WS2815B). Plus la densité de LED/m est élevée, plus le rendu est esthétique.
- Alimentation :
- Si ruban 5V : Alim 5V.
- Si ruban 12V (mon cas) : Alim 12V + Level Shifter (signal DATA) + Convertisseur DC-DC Step-Down (12V vers 5V pour l’ESP).
- Calcul de puissance : Utilisez wled-calculator.github.io pour dimensionner votre alimentation.
2. Cablage :

Le schéma dépend de votre ruban (5V ou 12V). Pour le 12V, le signal DATA doit être élevé à 5V via le Level Shifter pour éviter les scintillements.
3. Configuration WLED
- Flashage : Utiliser l’outil web install.wled.me.
- Wifi : ajouter le à votre réseau wifi et connectez vous à son IP
- Pin : indiquer la pin GPIO qui sera relié au ruban led (D4 = GPIO2 donc 2) à vous de trouver le pinout de votre ESP
- Inversion : cocher inverser pour que le bout du ruban soit en bas sachant que l’ESP est posé sur le haut de la batterie, a vous d’adapter cette info.
- Segments : Dans l’interface WLED, définir deux segments :
- Segment 0 (Jauge) : LED 0 à 46 (jusqu’à votre avant dernière LED).
- Segment 1 (Témoin qui est la dernière LED dans la boite de l’ESP) : LED 46 à 47.
- MQTT : Configurer l’accès au broker de Jeedom (IP, login, password). Définir le topic comme
wled/Battery.

4. Préparation dans Jeedom
Le Virtuel de flux (Puissance)
Créer une info virtuelle pour déterminer le sens de l’énergie (ID de l’exemple : #135043#) :
- Nom : Etat flux
- Formule :
#[votre info puissance]# > 0 ? 1 : (#[votre info puissance]# < 0 ? -1 : 0) - Résultat : 1 (charge), -1 (décharge), 0 (repos).
Détails : #[votre info puissance]# est la puissance mesuré de votre batterie (négative quand elle fourni, positive quand elle charge)
5. L’ajout dans jMQTT
Allez dans votre broker et mettez le en écoute sur le topic que vous avez renseigné dans la configuration WLED (SYNC INTERFACE), faite un on-off dans votre interface WLED pour déclencher l’envoi d’un message et le fera apparaitre dans l’écoute puis ajouter cette équipement avec le petit +
Ensuite dans cette équipement, afin d’envoyer l’ordre de couleur, créé une Action « type message » avec votre topic / api (moi c’est wled/Battery/api)

6. Le Scénario
-
Déclencheurs : Capacité batterie (%), Info du virtuel etat flux, État de la lumière du sous-sol.
-
Action : Un unique bloc code PHP.
7. Détail du bloc Code
Le code suivant calcule l’index de fin du segment 0, définit les couleurs et gère les animations MQTT via l’API JSON de WLED.
Vous devrez changer dans ce code en haut :
Les 3 informations
- capacité batterie en %
- l’info état flux du virtuel créé plus haut
- l’état de la lumière (ou passage en mode nuit, à vous de vous adapter, sinon mettez 1 pour que le ruban soit toujours à 100% de luminosité).
Vous devrez changer dans ce code en bas :
- le numéro de l’action qui publish l’ordre (chez moi 134983 vu plus haut)
LE CODE :
Résumé
/* * JAUGE BATTERIE WLED
* Seg 0 : LEDs 0-45 (Jauge) | Seg 1 : LED 46 (Témoin)
*/
// 1. Récupération des données
$valeurBatterie = (float)jeedom::evaluateExpression("#[Capacité batterie (%)]#");
$etatBatterie = (int)jeedom::evaluateExpression("#Info du virtuel etat flux#");
$etatLumiere = (int)jeedom::evaluateExpression("#[Virtuel_Lumiere_Etat]#");
#[Virtuel_Lumiere_Etat]# est l'information de l'état de ma lumière au sous sol. Cette information aura l'effet de mettre à 100% la luminosité du ruban quand j'allume la lumière, sinon celle-ci sera à 5%
// 2. Luminosité par segment (Jauge discrète si lumière OFF)
$briSeg0 = ($etatLumiere == 1) ? 255 : 5;
$briSeg1 = 255;
// 3. Calcul de la jauge (Mapping 10-100% sur 46 LEDs)
if ($valeurBatterie >= 100) {
$indexLed = 46;
} else {
$indexLed = (int)round(1 + (($valeurBatterie - 10) * (44 / 89)));
$indexLed = max(1, min(45, $indexLed));
}
// 4. Animation Jauge (Segment 0)
$ratio = ($valeurBatterie - 10) / 90;
$red0 = (int)round(255 * (1 - $ratio));
$green0 = (int)round(255 * $ratio);
$fx0 = 0; $sx0 = 0; $col0 = array(array($red0, $green0, 0));
if ($valeurBatterie <= 20) {
$fx0 = 1; $sx0 = 200; $col0 = array(array(255, 0, 0)); // Alerte rouge
} else {
$fx0 = ($etatBatterie != 0) ? 2 : 0; // Breathe si flux actif
$sx0 = ($etatBatterie == 1) ? 200 : 60; // Rapide en charge
}
// 5. Configuration Témoin (Segment 1)
$fx1 = 0; $sx1 = 0;
if ($valeurBatterie >= 100) {
$fx1 = 9; $sx1 = 150; // Rainbow si plein
$col1 = array(array(255, 255, 255));
} else {
if ($etatBatterie == 1) { $col1 = array(array(0, 255, 0)); } // Vert
elseif ($etatBatterie == -1) { $col1 = array(array(255, 0, 0)); } // Rouge
else { $col1 = array(array(0, 0, 255)); } // Bleu
}
// 6. Envoi du JSON (Commande Action/Message MQTT ID : 134983)
$payload = array(
"on" => true, "bri" => 255,
"seg" => array(
array("id" => 0, "bri" => $briSeg0, "stop" => $indexLed, "col" => $col0, "fx" => $fx0, "sx" => $sx0),
array("id" => 1, "bri" => $briSeg1, "fx" => $fx1, "sx" => $sx1, "col" => $col1)
)
);
$cmd = cmd::byId(134983);
if (is_object($cmd)) {
$cmd->execute(array('message' => json_encode($payload)));
}
Astuce pour les tests : Utilisez un curseur virtuel (Slider) pour simuler le pourcentage de batterie et vérifier les paliers sans attendre la charge/décharge réelle de votre équipement.
D’autres photos :











