Contents
Intro
Dans cet article, je vous présente un projet qui me tient à cœur : un affichage visuel des couleurs de l’offre Tempo d’EDF (pour le jour actuel et le lendemain) à l’aide d’un ESP8266 (Wemos D1 Mini), d’une bande LED RGB WS2812, et d’ESPHome. Ce système me permet de savoir d’un coup d’œil si la journée est en tarif Bleu, Blanc ou Rouge, et d’anticiper celle du lendemain. Les données sont récupérées depuis Home Assistant et affichées via des LED colorées. Voici comment j’ai réalisé ce projet, avec le code complet et des explications pour vous inspirer !
Pourquoi ce projet ?
L’offre Tempo d’EDF propose des tarifs variables selon les jours : Bleu (tarif avantageux), Blanc (intermédiaire), ou Rouge (plus cher). Connaître la couleur du jour et celle du lendemain est essentiel pour optimiser ma consommation électrique, par exemple en décalant l’utilisation d’appareils énergivores. Plutôt que de vérifier manuellement sur Home Assistant, j’ai voulu un affichage visuel simple et intuitif grâce à une bande LED RGB. Ce projet allie domotique, programmation, et un côté pratique au quotidien !
Le matériel utilisé
- ESP8266 Wemos D1 Mini : Une carte compacte et économique, idéale pour les projets IoT.
- Bande LED RGB WS2812 : J’utilise 8 LED (mais seules 4 sont actives dans ce projet : 2 pour le jour actuel, 2 pour le lendemain).
- Quelques câbles pour connecter la bande LED à la carte.


Le code ESPHome
Voici le programme complet que j’ai utilisé pour configurer mon ESP8266 avec ESPHome. Ce code récupère les données Tempo depuis Home Assistant et contrôle les LED en fonction des couleurs.
substitutions:
device_name: esp141-affichage-pv
adress_ip: "192.168.0.141"
friendly_name: esp141
time_timezone: "Europe/Paris"
esphome:
name: ${device_name}
project:
name: "rem81.Affichage_Pv"
version: "1.0.0"
platformio_options:
lib_deps: NeoPixelBus@2.6.0
on_boot:
then:
- light.control:
id: rgb_led
brightness: 0.25
state: on
esp8266:
board: d1_mini
framework:
version: recommended
wifi:
networks:
- ssid: !secret wifi_esp
password: !secret mdpwifi_esp
priority: 1
- ssid: !secret wifi
password: !secret mdpwifi
priority: 0
reboot_timeout: 5min
#use_address: ${device_name}
manual_ip:
static_ip: ${adress_ip}
gateway: 192.168.0.254
subnet: 255.255.255.0
logger:
api:
ota:
platform: esphome
web_server:
port: 80
time:
- platform: homeassistant
timezone: ${time_timezone}
# Led WS2812 RGB
light:
- platform: neopixelbus
method:
type: esp8266_dma
num_leds: 8 #1
pin: GPIO3
name: "RGB strip"
variant: ws2812
id: rgb_led
globals:
# Niveau intensité lumineuse
- id: intlum
type: float
restore_value: no
initial_value: '10'
# Niveau intensité lumineuse
- id: intlum1
type: float
restore_value: no
initial_value: '0.25'
#Etat de la connection
binary_sensor:
- platform: gpio
pin:
number: GPIO16
inverted: True
name: bp_raz
- platform: status
name: "${friendly_name} Status"
text_sensor:
- platform: homeassistant
name: "Tempo Jour"
entity_id: sensor.rte_tempo_couleur_actuelle
id: tempo_jour
- platform: homeassistant
name: "Tempo j+1"
entity_id: sensor.rte_tempo_prochaine_couleur
id: tempo_jour1
switch:
- platform: restart
name: "${friendly_name} Restart"
interval:
- interval: 1s
then:
- script.execute: calcul_led_jour
- script.execute: calcul_led_jour1
# ------------------------ Scripts
script:
#
# Couleur du Jour en cours
# Si indisponible alors Led Eteinte
- id: calcul_led_jour
mode: single
then:
- if:
condition:
and:
- lambda: |-
return strcmp(id(tempo_jour).state.c_str(),"Bleu") != 0;
- lambda: |-
return strcmp(id(tempo_jour).state.c_str(),"Blanc") != 0;
- lambda: |-
return strcmp(id(tempo_jour).state.c_str(),"Rouge") != 0;
then:
- light.addressable_set:
id: rgb_led
range_from: 0
range_to: 1
red: 0%
green: 0%
blue: 0%
- light.addressable_set:
id: rgb_led
range_from: 2
range_to: 4
red: 0%
green: 0%
blue: 0%
- if:
condition:
- lambda: |-
return strcmp(id(tempo_jour).state.c_str(),"Bleu") == 0;
then:
- light.addressable_set:
id: rgb_led
range_from: 0
range_to: 1
red: 0%
green: 0%
blue: !lambda |-
return id(intlum1);
- light.addressable_set:
id: rgb_led
range_from: 2
range_to: 4
red: 0%
green: 0%
blue: 0%
- if:
condition:
- lambda: |-
return strcmp(id(tempo_jour).state.c_str(),"Blanc") == 0;
then:
- light.addressable_set:
id: rgb_led
range_from: 0
range_to: 1
red: !lambda |-
return id(intlum1);
green: !lambda |-
return id(intlum1);
blue: !lambda |-
return id(intlum1);
- light.addressable_set:
id: rgb_led
range_from: 2
range_to: 4
red: 0%
green: 0%
blue: 0%
- if:
condition:
- lambda: |-
return strcmp(id(tempo_jour).state.c_str(),"Rouge") == 0;
then:
- light.addressable_set:
id: rgb_led
range_from: 0
range_to: 1
red: !lambda |-
return id(intlum1);
green: 0%
blue: 0%
- light.addressable_set:
id: rgb_led
range_from: 2
range_to: 4
red: 0%
green: 0%
blue: 0%
# Couleur du lendemain
- id: calcul_led_jour1
mode: single
then:
# Si
- if:
condition:
and:
- lambda: |-
return strcmp(id(tempo_jour1).state.c_str(),"Bleu") != 0;
- lambda: |-
return strcmp(id(tempo_jour1).state.c_str(),"Blanc") != 0;
- lambda: |-
return strcmp(id(tempo_jour1).state.c_str(),"Rouge") != 0;
then:
- light.addressable_set:
id: rgb_led
range_from: 5
range_to: 7
red: 0%
green: 0%
blue: 0%
- light.addressable_set:
id: rgb_led
range_from: 2
range_to: 4
red: 0%
green: 0%
blue: 0%
- if:
condition:
- lambda: |-
return strcmp(id(tempo_jour1).state.c_str(),"Bleu") == 0;
then:
- light.addressable_set:
id: rgb_led
range_from: 5
range_to: 7
red: 0%
green: 0%
blue: !lambda |-
return id(intlum1);
- light.addressable_set:
id: rgb_led
range_from: 2
range_to: 4
red: 0%
green: 0%
blue: 0%
- if:
condition:
- lambda: |-
return strcmp(id(tempo_jour1).state.c_str(),"Blanc") == 0;
then:
- light.addressable_set:
id: rgb_led
range_from: 5
range_to: 7
red: !lambda |-
return id(intlum1);
green: !lambda |-
return id(intlum1);
blue: !lambda |-
return id(intlum1);
- light.addressable_set:
id: rgb_led
range_from: 2
range_to: 4
red: 0%
green: 0%
blue: 0%
- if:
condition:
- lambda: |-
return strcmp(id(tempo_jour1).state.c_str(),"Rouge") == 0;
then:
- light.addressable_set:
id: rgb_led
range_from: 5
range_to: 7
red: !lambda |-
return id(intlum1);
green: 00%
blue: 0%
- light.addressable_set:
id: rgb_led
range_from: 2
range_to: 4
red: 0%
green: 0%
blue: 0%
Explications du code
- Substitutions : J’ai défini des variables comme le nom de l’appareil (esp141-affichage-pv), son adresse IP statique (192.168.0.141), et un nom convivial (esp141). Le fuseau horaire est réglé sur Europe/Paris.
- Configuration de l’ESP8266 : J’utilise une Wemos D1 Mini (board: d1_mini) avec la version recommandée du framework ESPHome. La bibliothèque NeoPixelBus est incluse pour gérer la bande LED WS2812.
- Connexion Wi-Fi : Le module se connecte à deux réseaux Wi-Fi possibles (avec des priorités), et utilise une IP statique pour une intégration stable dans mon réseau.
- Bande LED RGB :
- J’utilise une bande WS2812 avec 8 LED, connectée à la broche GPIO3 (D1 sur la Wemos D1 Mini).
- Les LED 0 à 1 affichent la couleur du jour actuel, et les LED 5 à 7 celle du lendemain. Les LED 2 à 4 sont éteintes pour séparer visuellement les deux groupes.
- L’intensité lumineuse est contrôlée par une variable globale intlum1 (initialement à 0.25 pour éviter un éclairage trop intense).
- Récupération des données Tempo :
- Deux text_sensor récupèrent les données depuis Home Assistant : sensor.rte_tempo_couleur_actuelle (couleur du jour) et sensor.rte_tempo_prochaine_couleur (couleur du lendemain).
- Ces capteurs doivent être configurés dans Home Assistant au préalable (par exemple, via l’intégration officielle RTE Tempo).
- Scripts pour les LED :
- Le script calcul_led_jour gère la couleur du jour actuel :
- Si la couleur est « Bleu », les LED 0-1 s’allument en bleu.
- Si « Blanc », elles s’allument en blanc (R+G+B).
- Si « Rouge », elles s’allument en rouge.
- Si la couleur est indisponible, les LED s’éteignent.
- Le script calcul_led_jour1 fait de même pour le lendemain, en contrôlant les LED 5-7.
- Les scripts sont exécutés toutes les secondes (interval: 1s) pour une mise à jour rapide.
- Le script calcul_led_jour gère la couleur du jour actuel :
- Autres fonctionnalités :
- Un binary_sensor (status) vérifie l’état de la connexion.
- Un switch (restart) permet de redémarrer l’ESP à distance.
- Un bouton physique (bp_raz) est connecté à GPIO16, mais il n’est pas utilisé dans ce code.
Intégration dans Home Assistant
Pour que ce projet fonctionne, il faut d’abord configurer l’intégration Tempo dans Home Assistant (via l’intégration officielle RTE). Une fois les capteurs sensor.rte_tempo_couleur_actuelle et sensor.rte_tempo_prochaine_couleur disponibles, l’ESP les récupère automatiquement grâce au composant text_sensor. L’appareil est détecté via l’API ESPHome, et je peux aussi ajuster l’intensité des LED ou redémarrer l’ESP depuis Home Assistant.
Conclusion
Ce système est un vrai gain de temps au quotidien : un simple coup d’œil sur la bande LED me permet de savoir si je dois limiter ma consommation (jour Rouge) ou en profiter (jour Bleu). La couleur du lendemain me permet aussi de planifier mes tâches, comme lancer une machine à laver ou charger un appareil. C’est un projet à la fois pratique et esthétique, qui ajoute une touche de domotique maligne à mon intérieur !