Dans ce tutoriel, je vais vous montrer comment afficher les données de l’intégration Météo‑France de Home Assistant sur un reTerminal E1001 à l’aide du framework ESPHome. Vous apprendrez à récupérer les informations météorologiques (température, conditions, prévisions) depuis Home Assistant et à les afficher sur l’écran e‑paper du reTerminal.

Pour mieux comprendre la configuration du reTerminal et l’affichage d’informations issues de Home Assistant, je vous recommande la lecture de mon précédent tutoriel Intégrer un reTerminal E1002 dans Home Assistant avec ESPHome.
Intégration Météo-France de Home Assistant
Commencez par ajouter l’intégration Météo-France dans Home Assistant, puis sélectionnez la ville correspondant à votre lieu de résidence ou celle pour laquelle vous souhaitez obtenir les prévisions météorologiques (Nantes par exemple).

L’intégration Météo‑France prend en charge les deux plateformes suivantes dans Home Assistant : Weather et Sensor, qui permettent d’accéder aux conditions et prévisions météorologiques :
- Weather : fournit des données météorologiques complètes, incluant la météo actuelle, les prévisions horaires détaillées ainsi que les prévisions journalières sur 2 semaines.
- Sensor : expose une série de capteurs spécifiques qui délivrent des mesures précises sur les conditions locales. Parmi ces capteurs, on retrouve la température, la pression atmosphérique, la vitesse et la direction du vent, le taux d’humidité, la probabilité de neige, ainsi que les alertes météorologiques officielles.
Nous allons d’abord vérifier les informations fournies par cette intégration, en utilisant l’onglet « États » des Outils de développement. En saisissant weather.nantes comme filtre, vous pouvez constater que cette entité possède la condition météorologique (rainy) comme état et plusieurs attributs (temperature, humidity, etc.). Il s’agit ici des informations exposée par la plateforme Sensor de l’intégration Météo-France.

Pour accéder aux prévisions météo il faut récupérer les données de la plateforme Weather de l’intégration Météo-France. Pour cela il faut aller dans l’onglet Actions et exécuter l’action weather.get_forecasts sur l’entité weather.nantes et en indiquant le type daily (pour les prévisions journalières) ou hourly (pour les prévisions horaires).
Voici la configuration YAML de cette action pour récupérer les prévisions journalières :
action: weather.get_forecasts
entity_id: weather.nantes
data:
type: daily
target:
entity_id: weather.nantesLes données de la plateforme Weather de l’intégration Météo-France s’afficheront, incluant les prévisions météorologiques de prochains jours : condition, temperature (max), templow (min), precipitation, humidity.

Affichage de la température extérieure
Pour afficher la température extérieure, j’utilise la température actuelle fournie par la plateforme Sensor de l’intégration Météo-France.

L’entité temperature de l’intégration Météo-France n’est pas activée par défaut. Il faut donc l’activer dans la configuration de l’intégration. Notez l’identifiant de cette entité, qui dans cet exemple est : sensor.nantes_temperature.


Il faut déclarer cette entité en tant que capteur (sensor) dans la configuration YAML de ESPHome :
# Declaration du capteur home assistant sensor.nantes_temperature
sensor:
- platform: homeassistant
id: temperature_nantes
entity_id: sensor.nantes_temperatureVous pouvez afficher la valeur de ce capteur sur l’écran du reTerminal E1001 via la configuration ESPHome suivante :
it.printf(20, 50, id(myFont), "Temperature: %.1f °C", id(temperature_nantes).state);Affichage de la température intérieure
Pour afficher la température intérieure, j’utilise le capteur interne STH40 du reTerminal.

Le microcontrôleur ESP32-S3 du reTerminal E1001 communique avec le capteur STH40 au travers d’un bus I2C. Son adresse I2C est 0x44, et le bus I2C utilise les broches suivantes :
- Serial Data (SDA) : GPIO19
- Serial Clock (SCL) : GPIO20
Voici la configuration YAML qui permet de récupérer la température et l’humidité depuis ce capteur, à copier juste après la ligne captive_portal: du fichier de configuration ESPHome :
# define I2C interface
i2c:
sda: GPIO19
scl: GPIO20
scan: false
# temperature and humidity sensor
sensor:
- platform: sht4x
temperature:
name: "Temperature"
id: sht4x_temperature
humidity:
name: "Humidity"
id: sht4x_humidity
address: 0x44
update_interval: 60sVous pouvez afficher la valeur de ce capteur sur l’écran du reTerminal E1001 via la configuration ESPHome suivante :
it.printf(10, 10, id(myFont), BLUE, "Temperature: %.1f°C", id(sht4x_temperature).state);
it.printf(10, 40, id(myFont), BLUE, "Humidity: %.1f%%", id(sht4x_humidity).state); Notez que le formatage %.1f indique qu’il faut afficher la température en nombre flottant avec 1 chiffre derrière la virgule (ex: 18.1).
Affichage de la température d’une autre pièce
Pour afficher la température d’une autre pièce, ici ma serre, j’utilise un capteur de température externe connecté en Zigbee à mon routeur Home Assistant.

Il est très simple de récupérer la valeur de ce capteur, il suffit de repérer son ID d’identité (ici sensor.lumi_lumi_weather_temperature_2) dans la configuration Home Assistant.

Puis de déclarer ce capteur dans la configuration ESPHome.
sensor:
- platform: homeassistant
name: "Temperature Serre"
entity_id: sensor.lumi_lumi_weather_temperature_2
id: temperature_serreIl est possible d’afficher les températures minimum et maximum mesurées par ce capteur au cours des dernières 48h. Il suffit d’ajouter une intégration de type Statistics (helper) :

Vous pouvez ensuite créer un capteur de statistiques en indiquant l’entité auquel la statistique va s’appliquer (ici notre capteur de température de la serre) :

Puis configurer la caractéristique de la statistique souhaitée (ici sa valeur minimale) :

Et enfin la configuration de ce capteur statistique. Ici par exemple nous configurons l’age maximum à 48h, c’est à dire que ce capteur statistique va stocker la température minimale de la serre sur les 48 dernières heure :

Affichage des prévisions journalières
Je souhaite afficher les prévisions météorologiques journalières, incluant le jour, la condition, la température minimale/maximale et les précipitations pour aujourd’hui et les quatre prochains jours.

Pour afficher les prévisions quotidiennes, il est nécessaire de modifier le fichier de configuration de Home Assistant (configuration.yaml) afin de créer une automatisation qui exécute l’action weather.get_forecasts, ainsi qu’un modèle de capteur personnalisé (template sensor) pour récupérer les données de prévision météo.
Voici un exemple de configuration du capteur meteo_jour_nantes et de son automatisation, qui récupère les prévisions météo (jour, températures minimales et maximales, et conditions) pour aujourd’hui et les trois prochains jours :
template:
- trigger:
- platform: time_pattern
hours: /1
- platform: homeassistant
event: start
action:
- service: weather.get_forecasts
data:
type: hourly
target:
entity_id: weather.nantes
response_variable: hourly
sensor:
- name: "Prévisions Météo"
unique_id: previsions_meteo_nantes
state: "{{ hourly['weather.nantes'].forecast[0] }}"
attributes:
forecast: "{{ hourly['weather.nantes'].forecast }}"
availability: "{{ states('weather.nantes') not in ['unknown', 'unavailable', 'none'] }}"
- sensor:
- name: "Météo Jour Nantes"
unique_id: meteo_jour_nantes
state: "{{ state_attr('sensor.previsions_meteo_nantes','daily_forecast')[0] }}"
attributes:
# Jour_0
condition0: "{{ state_attr('sensor.previsions_meteo_nantes','daily_forecast')[0].condition | default(0) }}"
jour0: >
{{ ['Dimanche', 'Lundi', 'Mardi', 'Mercredi', 'Jeudi', 'Vendredi', 'Samedi'][as_timestamp(state_attr('sensor.previsions_meteo_nantes','daily_forecast')[0].datetime) | timestamp_custom('%w', true) | int] }}
temperature0: "{{ state_attr('sensor.previsions_meteo_nantes','daily_forecast')[0].temperature | float(0) }}"
templow0: "{{ state_attr('sensor.previsions_meteo_nantes','daily_forecast')[0].templow | float(0) }}"
precipitation0: "{{ state_attr('sensor.previsions_meteo_nantes','daily_forecast')[0].precipitation | float(0) }}"
# Jour_1
condition1: "{{ state_attr('sensor.previsions_meteo_nantes','daily_forecast')[1].condition | default(0) }}"
jour1: >
{{ ['Dimanche', 'Lundi', 'Mardi', 'Mercredi', 'Jeudi', 'Vendredi', 'Samedi'][as_timestamp(state_attr('sensor.previsions_meteo_nantes','daily_forecast')[1].datetime) | timestamp_custom('%w', true) | int] }}
temperature1: "{{ state_attr('sensor.previsions_meteo_nantes','daily_forecast')[1].temperature | float(0) }}"
templow1: "{{ state_attr('sensor.previsions_meteo_nantes','daily_forecast')[1].templow | float(0) }}"
precipitation1: "{{ state_attr('sensor.previsions_meteo_nantes','daily_forecast')[1].precipitation | float(0) }}" Pour vérifier la bonne configuration de ces capteurs, redémarrer Home Assistant et vérifier leur état en utilisant l’outil de développement.

Notez que l’attribut « jour » est affiché sous forme de nom du jour de la semaine grâce à l’argument %A de la fonction timestamp_custom(). Consultez la documentation du composant Time pour plus de détails.
Une fois que les capteurs sont configurés dan Home Assistant, il faut les déclarer dans la configuration ESPHome.
Comme le jour et les conditions météorologiques sont fournies sous forme de texte (par exemple, « Lundi », « ensoleillé »), elles doivent être définies comme text_sensor.
text_sensor:
- platform: homeassistant
name: "Jour0"
entity_id: sensor.meteo_jour_nantes
attribute: jour0
id: jour0
- platform: homeassistant
name: "Jour1"
entity_id: sensor.meteo_jour_nantes
attribute: jour1
id: jour1
name: "ConditionJ0"
entity_id: sensor.meteo_jour_nantes
attribute: condition0
id: conditionJ0
- platform: homeassistant
name: "ConditionJ1"
entity_id: sensor.meteo_jour_nantes
attribute: condition1
id: conditionJ1
- platform: homeassistant Les températures minimales et maximales étant des valeurs à virgule flottante, elle doivent être définies comme sensor.
sensor:
- platform: homeassistant
name: "TemperatureJ0"
entity_id: sensor.meteo_jour_nantes
attribute: temperature0
id: temperatureJ0
accuracy_decimals: 1
- platform: homeassistant
name: "TemperatureJ1"
entity_id: sensor.meteo_jour_nantes
attribute: temperature1
id: temperatureJ1
accuracy_decimals: 1
- platform: homeassistant
name: "TemplowJ0"
entity_id: sensor.meteo_jour_nantes
attribute: templow0
id: templowJ0
accuracy_decimals: 1
- platform: homeassistant
name: "TemplowJ1"
entity_id: sensor.meteo_jour_nantes
attribute: templow1
id: templowJ1
accuracy_decimals: 1
- platform: homeassistant
name: "PrecipitationJ0"
entity_id: sensor.meteo_jour_nantes
attribute: precipitation0
id: precipitationJ0
accuracy_decimals: 1
- platform: homeassistant
name: "precipitationJ1"
entity_id: sensor.meteo_jour_nantes
attribute: precipitation1
id: precipitationJ1
accuracy_decimals: 1
Affichage des prévisions horaires
Nous souhaitons afficher les conditions météorologiques horaires, la température et les précipitations pour les douze prochaines heures.

Comme pour les prévisions quotidiennes, l’affichage des prévisions horaires nécessite de modifier le fichier de configuration de Home Assistant (configuration.yaml) afin de créer un capteur personnalisé meteo_heure_nantes et son automatisation :
Voici un exemple de configuration d’un capteur personnalisé et de son automatisation, qui récupère les prévision pour les heures H et H+1.
template:
- trigger:
- platform: time_pattern
hours: /1
- platform: homeassistant
event: start
action:
- service: weather.get_forecasts
data:
type: hourly
target:
entity_id: weather.nantes
response_variable: hourly
sensor:
- name: "Prévisions Météo"
unique_id: previsions_meteo_nantes
state: "{{ hourly['weather.nantes'].forecast[0] }}"
attributes:
forecast: "{{ hourly['weather.nantes'].forecast }}"
availability: "{{ states('weather.nantes') not in ['unknown', 'unavailable', 'none'] }}"
- sensor:
- name: "Météo Heure Nantes"
unique_id: meteo_heure_nantes
state: "{{ state_attr('sensor.previsions_meteo_nantes','forecast')[0] }}"
attributes:
# Heure_0
condition0: "{{ state_attr('sensor.previsions_meteo_nantes','forecast')[0].condition | default(0) }}"
heure0: "{{ as_timestamp(state_attr('sensor.previsions_meteo_nantes','forecast')[0].datetime) | int(0) | timestamp_custom('%H:%M', true) }}"
temperature0: "{{ state_attr('sensor.previsions_meteo_nantes','forecast')[0].temperature | float(0) }}"
precipitation0: "{{ state_attr('sensor.previsions_meteo_nantes','forecast')[0].precipitation | float(0) }}"
# Heure_1
condition1: "{{ state_attr('sensor.previsions_meteo_nantes','forecast')[1].condition | default(0) }}"
heure1: "{{ as_timestamp(state_attr('sensor.previsions_meteo_nantes','forecast')[1].datetime) | int(0) | timestamp_custom('%H:%M', true) }}"
temperature1: "{{ state_attr('sensor.previsions_meteo_nantes','forecast')[1].temperature | float(0) }}"
precipitation1: "{{ state_attr('sensor.previsions_meteo_nantes','forecast')[1].precipitation | float(0) }}"Pour vérifier la bonne configuration de ces capteurs, redémarrer Home Assistant et vérifier leur état en utilisant l’outil de développement.

Notez que l’heure est au format heure locale grâce au second argument de timestamp_custom() positionné à true.
Une fois que les capteurs sont configurés dans Home Assistant, il faut les déclarer dans la configuration ESPHome.
Comme l’heure et les conditions météorologiques sont fournies sous forme de texte (par exemple, « 11:00 », « ensoleillé »), elles doivent être définies comme text_sensor.
text_sensor:
- platform: homeassistant
name: "Condition0"
entity_id: sensor.meteo_heure_nantes
attribute: condition0
id: condition0
- platform: homeassistant
name: "Condition1"
entity_id: sensor.meteo_heure_nantes
attribute: condition1
id: condition1
- platform: homeassistant
name: "Heure0"
entity_id: sensor.meteo_heure_nantes
attribute: heure0
id: heure0
- platform: homeassistant
name: "Heure1"
entity_id: sensor.meteo_heure_nantes
attribute: heure1
id: heure1 Les précipitations et la température, étant des valeurs à virgule flottante, doivent être définies comme sensor.
Cet exemple illustre une configuration ESPHome pour des capteurs affichant la température et les précipitations pour les deux prochaines heures.
sensor:
- platform: homeassistant
name: "Temperature0"
entity_id: sensor.meteo_heure_nantes
attribute: temperature0
id: temperature0
accuracy_decimals: 1
- platform: homeassistant
name: "Temperature1"
entity_id: sensor.meteo_heure_nantes
attribute: temperature1
id: temperature1
accuracy_decimals: 1
- platform: homeassistant
name: "Precipitation0"
entity_id: sensor.meteo_heure_nantes
attribute: precipitation0
id: precipitation0
accuracy_decimals: 1
- platform: homeassistant
name: "Precipitation1"
entity_id: sensor.meteo_heure_nantes
attribute: precipitation1
id: precipitation1
accuracy_decimals: 1
Vous pouvez ensuite afficher les valeurs de ces capteurs sur l’écran du reTerminal E1001 via la configuration ESPHome suivant :
// Condition meteo H0 (texte)
it.printf(100, 50, id(myFont), "%s", id(condition0).state.c_str());
// Precipitations H0 (float, avec une décimale)
it.printf(100, 100, id(myFont), "%.1f", id(precipitation0).state);
// Temperature H0 (float, pas de décimale)
it.printf(100, 150, id(myFont), "%.0f", id(temperature0).state);Affichage de la charge de la batterie
Pour récupérer le niveau de batterie du reTerminal, il faut activer la mesure de la tension de la batterie en configurant le GPIO21 (VBAT ENABLE) lors du boot du reTerminal. La lecture s’effectue ensuite sur le GPIO1 (VBAT ADC), qui est relié en interne à la batterie via un circuit de mesure.
esphome:
name: reterminal
friendly_name: reTerminal
on_boot:
priority: 600
then:
- output.turn_on: bsp_battery_enable
- delay: 500ms
captive_portal:
output:
- platform: gpio
pin: GPIO21
id: bsp_battery_enable
sensor:
# ADC for battery voltage measurement
- platform: adc
pin: GPIO1
name: "Battery Voltage"
id: battery_voltage
update_interval: 600s
attenuation: 12db
filters:
- multiply: 2.0 # Voltage divider compensationEn lisant la valeur analogique sur ce GPIO1, nous récupérons la tension de la batterie interne. La documentation technique montre que la tension est mesurée à l’aide d’un pont diviseur de tension, il faut donc appliquer un filtre pour compenser la division de la tension par deux liée à ce pont diviseur constitué de 2 résistances de 10kΩ.


La tension aux bornes de la batterie interne permet d’en déduire son niveau de charge. La batterie lithium est considérée comme déchargée si sa tension est inférieure à 3.3 V. Une batterie bien chargée lorsque sa tension est supérieure à 4.0 V.

Afficher la puissance du signal Wi-Fi
L’affichage de la puissance de réception du signal Wi-Fi par le reTerminal peut être utile.

Cette information est fournie par ESPHome, et a pour unité le dBm, voir mon article “C’est quoi… un dBm ?” pour en savoir plus. Pour l’obtenir, il suffit de déclarer le capteur wifi_signal dans la configuration d’ESPHome :
sensor:
- platform: wifi_signal
name: "Signal WiFi ReTerminal"
id: wifi_signal_strength
update_interval: never Comme le Wi-Fi n’est pas disponible au démarrage, j’ai décidé de mettre à jour sa mesure lorsque le reTerminal reçoit les prévisions météorologiques quotidiennes. À ce moment-là, la connexion Wi-Fi est déjà établie. C’est également à ce moment-là que je commence à actualiser l’affichage, voir plus loin dans le chapitre “Rafraîchissement de l’affichage“.
- platform: homeassistant
id: temperature_d0
entity_id: sensor.daily_weather_forecast_sensor
attribute: temperature0
on_value:
then:
# Update the Wifi signal measurement and refresh the e-paper display whenever this sensor updates
- component.update: wifi_signal_strength
- component.update: epaper_display
Affichage des icônes
J’ai choisi d’afficher les icônes en n’utilisant pas d’image mais plutôt la police materialdesignicons-webfont.ttf. Il faut télécharger cette police et la placer dans le répertoire fonts de ESPHome avec le module complémentaire File Editor par exemple. Pour choisir vos propres icônes, vous pouvez utiliser le site pictogrammers.com et noter la référence de l’icône souhaitée.

Il faut ensuite déclarer les glyph correspondant aux icônes dans la font. Ici par exemple sur une font de taille 20 nous souhaitons utiliser les icônes représentant une batterie, une goutte d’eau, un thermomètre et une horloge.
- file: "fonts/materialdesignicons-webfont.ttf"
id: icon_font_20
size: 20
glyphs:
- "\U000F12A3" # battery
- "\U000F058C" # water
- "\U000F050F" # thermometer
- "\U000F1442" # clockEnsuite vous pouvez afficher l’icône à partir de son code de cette façon :
it.printf(0, 0+85, id(icon_font_20), "\U000F050F"); // icone thermometreVeille profonde
Le reTerminal E1001 est configuré pour être en veille profonde pendant 30 minutes. Au bout de ces 3à minutes, il se réveille pendant 30 secondes afin de récupérer les informations météo et mettre à jour son écran. Il retourne ensuite en veille profonde pour 30 minutes.
Cette veille profonde est configurée de la sorte dans le fichier de configuration YAML de ESPHome :
# Deep sleep configuration to save power
deep_sleep:
id: deep_sleep_1 # ID for deep sleep component
run_duration: 30s # Time to stay awake after wake-up
sleep_duration: 30min # Time to sleep between wake-ups
wakeup_pin: GPIO3 # GPIO pin to wake up device
wakeup_pin_mode: INVERT_WAKEUP # Inverted wake-up logicRafraîchissement de l’affichage
Lors de la sortie de veille profonde du reTerminal, il adopte le même comportement qu’au démarrage. Il faut donc assurer une chronologie précise des événement. L’écran du reTerminal doit être rafraichi uniquement une fois que les données du capteur interne et de Home Assistant sont récupérées (le WiFi met du temps à s’activer et donc les données de Home Assistant ne sont pas disponible immédiatement au boot).
Mettre à jour au moment du boot la mesure de la tension de la batterie et la mesure du capteur interne de température et d’humidité :
on_boot:
priority: 600
then:
# Turn on the GPIO output that powers the battery measurement circuit
- output.turn_on: bsp_battery_enable
# Wait a short delay to allow power stabilization
- delay: 500ms
# Manually update battery sensors (voltage and percentage)
- component.update: battery_voltage
# Manually read the internal temperature/humidity sensor
- component.update: sht4x_componentDésactiver la mise à jour automatic (update_interval: never) pour le capteur interne ST4X :
# Internal SHT4x temperature/humidity sensor
- platform: sht4x # Sensor platform
id: sht4x_component # ID for the component
temperature: # Temperature sensor
name: "Temperature" # Sensor name
id: sht4x_temperature # ID for temperature sensor
humidity: # Humidity sensor
name: "Humidity" # Sensor name
id: sht4x_humidity # ID for humidity sensor
address: 0x44 # I2C address
update_interval: never # Disable automatic updates (manual read only)Désactiver le rafraichissement automatique (update_interval: never) de l’écran :
display:
- platform: waveshare_epaper
id: epaper_display
model: 7.50inv2
cs_pin: GPIO10
dc_pin: GPIO11
reset_pin:
number: GPIO12
inverted: false
busy_pin:
number: GPIO13
inverted: true
update_interval: neverEt enfin rafraîchir l’écran une fois qu’une donnée Home Assistant est reçue :
- platform: homeassistant
name: "TemperatureJ0"
entity_id: sensor.meteo_jour_nantes
attribute: temperature0
id: temperatureJ0
accuracy_decimals: 1
on_value:
then:
# Refresh the e-paper display whenever this sensor updates
- component.update: epaper_display Conclusion
Grâce au reTerminal E1001 et à son intégration dans Home Assistant, j’ai enfin la station météo parfaitement adaptée à mes attentes. Le framework ESPHome demande une courte phase d’apprentissage pour en maîtriser les principes, mais une fois ces notions acquises, il se révèle remarquablement puissant et flexible.
L’ensemble de la configuration Home Assistant et ESPHome utilisée dans ce tutoriel est disponible sur mon GitHub.
Je vous recommande la lecture du test des reTerminal E1001 et E1002 et je remercie son auteur WarC0zes pour son aide sur le forum HACF.
J’espère que ce tutoriel vous aura intéressé. N’hésitez pas à donner votre avis en cliquant sur les étoiles ci-dessous ou en laissant un commentaire.
