Home Assistant <> Afficheur distant - christr14 - 14-09-2025
Bonjour,
J'ai suivi les instructions pour monter un afficheur distant tel que décrit ici: https://f1atb.fr/fr/affichage-a-distance-consommation-ou-surproduction-electrique/
J'ai donc acheté l'ESP avec l'afficheur intégré: le LILYGO® TTGO T-Display 1.14 pouces ESP 32 (4MB CH9102F).
J'ai pris celui avec la coque, plus pratique pour moi: https://fr.aliexpress.com/item/33050639690.html?spm=a2g0o.order_list.order_list_main.29.1dea5e5b4ijzBc&gatewayAdapt=glo2fra
Pendant plusieurs semaines j'ai donc utilisé le code fourni par André: l'écran communique donc en direct avec le routeur solaire.
Et cela me convenait tout à fait, beau boulot André.
Jusqu'au moment où j'ai voulu afficher aussi ma production solaire instantannée, info captée par un Shelly et envoyée à Home Assistant.
Je dois avouer que je n'ai pas cherché sur le forum si le sujet avait déjà été évoqué.
(hypothèse: une automatisation dans Home Assistant pour envoyer régulièrement au routeur solaire la production solaire en utilisant MQTT ?)
A la place, j'ai cherché sur le net pour trouver comment utiliser cet écran avec Home Assistant, via le module complémentaire ESPHome.
Là non plus je n'ai pas regardé sur le forum !
Comme j'ai passé pas mal de temps à trouver la bonne config qui permette d'utiliser l'écran, puis aussi un peu de temps pour trouver la bonne syntaxe du code dans ESPHOME Builder, je vous partage ici-même:
-> Les photos des 3 pages que j'affiche actuellement sur l'écran
-> Le code pour gérer l'écran dans ESPHOME Builder.
-> Le fichier "calibri.ttf" pour la police utilisée sur l'écran, à placer ici dans Home Assistant: config\esphome\fonts
EDIT 1: fichier "calibri.ttf" impossible à uploader dans ce post. Mais vous le trouverez facilement sur le net, ou sur votre PC windows dans C:\Windows\Fonts
EDIT 2: l'encadrement des pages + le jour tempo sont maintenant de la couleur du jour Tempo
En l'état actuel des choses:
- Je n'ai pas réussi à afficher une barre de progression pour l'ouverture du triac
- Le code permet de basculer d'une page à l'autre avec les boutons de l'écrans.
J'ai commenté le code qui permet de faire défiler les pages toutes les x secondes, c'est donc à votre choix
- Je n'ai pas branché de capteur de présence sur cet ESP.
Je suis preneur de toute évolutions/améliorations.
Voilou, amusez-vous bien 
Code : esphome:
name: test
friendly_name: Afficheur
esp32:
board: esp32dev
framework:
type: esp-idf
version: recommended
# Enable logging
logger:
# Enable Home Assistant API
api:
encryption:
key: "VOTRE CLEF ICI"
ota:
- platform: esphome
password: "VOTRE MDP ICI"
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
# Enable fallback hotspot (captive portal) in case wifi connection fails
ap:
ssid: "Point d'acces afficheur"
password: ""
captive_portal:
# Définition des couleurs
color:
- id: Rouge
red: 100%
green: 0%
blue: 0%
- id: Jaune
red: 100%
green: 100%
blue: 0%
- id: Vert
red: 0%
green: 100%
blue: 0%
- id: Bleu
red: 0%
green: 0%
blue: 100%
- id: Gris
red: 50%
green: 50%
blue: 50%
- id: Blanc
red: 100%
green: 100%
blue: 100%
- id: Orange
red: 100%
green: 60%
blue: 0%
- id: Turquoise
red: 0%
green: 50%
blue: 45%
# Copier le fichier calibri.ttf dans le dossier esphome/fonts/
font:
- file: "fonts/calibri.ttf"
id: calibri_60
size: 60
- file: "fonts/calibri.ttf"
id: calibri_48
size: 40
- file: "fonts/calibri.ttf"
id: calibri_24
size: 20
- file: "fonts/calibri.ttf"
id: calibri_S
size: 16
# Les capteurs en provenance de Home Assistant
sensor:
- platform: homeassistant
id: sonde_edf_routeur
entity_id: sensor.sonde_edf_routeur
internal: true
state_class: measurement
unit_of_measurement: W
device_class: power
- platform: homeassistant
id: prod_solaire
entity_id: sensor.conso_edf_et_production_solaire_em1_power
internal: true
- platform: homeassistant
id: triac_ouverture
entity_id: sensor.routeur_rms_chauffe_eau_ouverture
internal: true
- platform: homeassistant
id: temp_triac
entity_id: sensor.routeur_rms_triac
internal: true
- platform: homeassistant
id: temp_max_triac
entity_id: sensor.temperature_triac_max
internal: true
- platform: homeassistant
id: duree_equiv_triac
entity_id: sensor.routeur_rms_chauffe_eau_duree_equiv
internal: true
- platform: homeassistant
id: energie_J_soutiree
entity_id: sensor.routeur_rms_energie_jour_t_soutiree
internal: true
- platform: homeassistant
id: energie_J_injectee
entity_id: sensor.routeur_rms_energie_jour_t_injectee
internal: true
text_sensor:
- platform: homeassistant
id: tempo_J
name: tempo_J
entity_id: sensor.rte_tempo_couleur_actuelle
# Matériel et affichage des informations
spi:
clk_pin: GPIO18
mosi_pin: GPIO19
display:
- platform: st7789v
id: my_display
model: TTGO TDisplay 135x240
backlight_pin: GPIO4
cs_pin: GPIO05
dc_pin: GPIO16
reset_pin: GPIO23
update_interval: 5s
rotation: 90°
pages:
- id: page1
lambda: |-
it.rectangle(0, 0, it.get_width(), it.get_height(), id(Gris));
if (id(tempo_J).state == "Bleu") {
it.rectangle(0, 0, it.get_width(), it.get_height(), id(Bleu));
}
if (id(tempo_J).state == "Blanc") {
it.rectangle(0, 0, it.get_width(), it.get_height(), id(Blanc));
}
if (id(tempo_J).state == "Rouge") {
it.rectangle(0, 0, it.get_width(), it.get_height(), id(Rouge));
}
it.print(1, 22, id(calibri_24), id(Rouge), TextAlign::LEFT, "EDF");
it.printf(232, 2, id(calibri_60), id(Rouge), TextAlign::RIGHT, "%.0f W", id(sonde_edf_routeur).state);
it.print(1, 65, id(calibri_24), id(Jaune), TextAlign::LEFT, "SUN");
it.printf(232, 45, id(calibri_60), id(Jaune), TextAlign::RIGHT, "%.0f W", id(prod_solaire).state);
it.print(1, 110, id(calibri_24), id(Blanc), TextAlign::LEFT, "TRIAC");
it.printf(232, 98, id(calibri_48), id(Blanc), TextAlign::RIGHT, "%.0f %%", id(triac_ouverture).state);
- id: page2
lambda: |-
it.rectangle(0, 0, it.get_width(), it.get_height(), id(Gris));
if (id(tempo_J).state == "Bleu") {
it.rectangle(0, 0, it.get_width(), it.get_height(), id(Bleu));
}
if (id(tempo_J).state == "Blanc") {
it.rectangle(0, 0, it.get_width(), it.get_height(), id(Blanc));
}
if (id(tempo_J).state == "Rouge") {
it.rectangle(0, 0, it.get_width(), it.get_height(), id(Rouge));
}
it.print(1, 22, id(calibri_24), id(Rouge), TextAlign::LEFT, "temp. Triac");
it.printf(232, 2, id(calibri_60), id(Rouge), TextAlign::RIGHT, "%.1f°", id(temp_triac).state);
it.print(1, 65, id(calibri_24), id(Jaune), TextAlign::LEFT, "temp. max");
it.printf(232, 45, id(calibri_60), id(Jaune), TextAlign::RIGHT, "%.1f°", id(temp_max_triac).state);
it.print(1, 110, id(calibri_24), id(Blanc), TextAlign::LEFT, "Duree equ.");
it.printf(232, 98, id(calibri_48), id(Blanc), TextAlign::RIGHT, "%.2f h", id(duree_equiv_triac).state);
- id: page3
lambda: |-
it.rectangle(0, 0, it.get_width(), it.get_height(), id(Gris));
if (id(tempo_J).state == "Bleu") {
it.rectangle(0, 0, it.get_width(), it.get_height(), id(Bleu));
it.print(1, 22, id(calibri_24), id(Bleu), TextAlign::LEFT, "Tempo J");
it.printf(232, 2, id(calibri_60), id(Bleu), TextAlign::RIGHT, "%s", id(tempo_J).state.c_str());
}
if (id(tempo_J).state == "Blanc") {
it.rectangle(0, 0, it.get_width(), it.get_height(), id(Blanc));
it.print(1, 22, id(calibri_24), id(Blanc), TextAlign::LEFT, "Tempo J");
it.printf(232, 2, id(calibri_60), id(Blanc), TextAlign::RIGHT, "%s", id(tempo_J).state.c_str());
}
if (id(tempo_J).state == "Rouge") {
it.rectangle(0, 0, it.get_width(), it.get_height(), id(Rouge));
it.print(1, 22, id(calibri_24), id(Rouge), TextAlign::LEFT, "Tempo J");
it.printf(232, 2, id(calibri_60), id(Rouge), TextAlign::RIGHT, "%s", id(tempo_J).state.c_str());
}
it.print(1, 65, id(calibri_24), id(Jaune), TextAlign::LEFT, "J soutiree");
it.printf(232, 60, id(calibri_48), id(Jaune), TextAlign::RIGHT, "%.0f wh", id(energie_J_soutiree).state);
it.print(1, 110, id(calibri_24), id(Blanc), TextAlign::LEFT, "J injectee");
it.printf(232, 98, id(calibri_48), id(Blanc), TextAlign::RIGHT, "%.0f wh", id(energie_J_injectee).state);
# Rectangle plein: it.filled_rectangle(0, 120, 239, 20, id(turquoise));
# Ligne: it.line(0, 22, 240, 22, id(Bleu));
# Afficher heure: it.strftime(5, 2, id(calibri_S), id(jaune), TextAlign::TOP_LEFT, "%d.%m.%Y %H:%M", id(esptime).now());
time:
- platform: homeassistant
id: esptime
# Etat de l'ESP et utilisation de ses 2 boutons
binary_sensor:
- platform: status
name: "Node Status"
id: system_status
- platform: gpio
internal: false
name: ttgo button_0 push
id: tdisplay_button_input_0
entity_category: config
pin:
number: GPIO0
inverted: true
mode:
input: true
pullup: true
on_click:
then:
- display.page.show_next: my_display
- component.update: my_display
- platform: gpio
internal: false
id: tdisplay_button_input_1
name: ttgo button_1 push
entity_category: config
pin:
number: GPIO35
inverted: true
mode:
input: true
filters:
- delayed_on: 10ms
- delayed_off: 10ms
on_click:
then:
- display.page.show_previous: my_display
- component.update: my_display
# Pour faire un carousel pour passer d'une page à l'autre, à la place des boutons
#interval:
# - interval: 5s
# then:
# - display.page.show_next: my_display
# - component.update: my_display
|