Home Assistant : Afficher les données Météo-France sur un reTerminal E1001 avec ESPHome

0
(0)

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 :

YAML
action: weather.get_forecasts
entity_id: weather.nantes
data:
  type: daily
target:
  entity_id: weather.nantes

Les 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.

Récupération 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.

Affichage de la température extérieure

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 :

YAML
# Declaration du capteur home assistant sensor.nantes_temperature
sensor:
  - platform: homeassistant
    id: temperature_nantes
    entity_id: sensor.nantes_temperature

Vous pouvez afficher la valeur de ce capteur sur l’écran du reTerminal E1001 via la configuration ESPHome suivante :

YAML
it.printf(20, 50, id(myFont), "Temperature: %.1f °C", id(temperature_nantes).state);

Récupération de la température et humidité intérieure

Pour afficher la température et l’humidité intérieure, j’utilise le capteur interne STH40 du reTerminal.

Température et humidité mesurée par le capteur interne du reTerminal E1001

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 :

YAML
# 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: 60s

Vous pouvez afficher la valeur de ce capteur sur l’écran du reTerminal E1001 via la configuration ESPHome suivante :

YAML
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).

Récupération 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 et la température maximale pour aujourd’hui et les 4 prochains jours. Pour cela j’utilise la plateforme Weather de l’intégration Météo-France.

Prévisions météorologiques (condition, température maximale et minimale) quotidiennes

L’utilisation de la plateforme Weather est un peu plus complexe que celle du capteur Sensor présentée au paragraphe précédent. Elle nécessite de modifier le fichier de configuration de Home Assistant (configuration.yaml) afin d’y créer une automatisation qui exécute l’action weather.get_forecasts ainsi qu’un capteur personnalisé (template sensor) pour récupérer les prévisions météo.

Voici un exemple de configuration d’un capteur personnalisé et de son automatisation, qui récupère les prévision pour le jour J et J+1.

YAML
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) }}"
          # 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) }}"

Deux déclencheurs sont définis :

  • Un déclencheur basé sur time_pattern toutes les heures (hours: /1)
  • Un déclencheur sur l’événement homeassistant start, pour exécuter l’action au redémarrage de Home Assistant.

L’action fait appel au service weather.get_forecasts pour demander les prévisions horaires pour l’entité météo weather.nantes. Les résultats sont stockés dans la variable hourly pour être utilisés par la suite dans les capteurs.

Le premier capteur template “Prévisions Météo” (sensor.previsions_meteo_nantes) possède l’attribut forecast qui expose toute la liste des prévisions quotidiennes du service météo.

Le deuxième capteur template, “Météo Jour Nantes” (sensor.meteo_jour_nantes), exploite les attributs de sensor.previsions_meteo_nantes et sa clé “daily_forecast“. Les attributs suivants sont créés pour ce second capteur, pour chaque jour (ici les deux premiers jours) :

  • jour0 (et jour1) : calcule le nom du jour en français en s’appuyant sur la date et la fonction timestamp_custom().
  • condition0, temperature0, templow0 : contiennent la condition météo, températures max/min attendues pour le jour J (idem pour J+1).

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.

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.

YAML
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.

YAML
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

Récupération des prévisions horaires

Les prévisions météorologiques horaires (heure, condition, température, précipitation) sont également fournies par la plateforme Weather de l’intégration Météo-France.

Prévisions météorologiques (condition, température et précipitation) horaires

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.

YAML
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) }}"

L’automatisation est similaire que pour la récupération des prévisions quotidiennes. L’automatisation et le premier capteur template sont identiques. Seul le deuxième capteur template est différent. Le capteur tempate “Météo Heure Nantes” (sensor.meteo_heure_nantes) exploite les attributs de sensor.previsions_meteo_nantes mais avec la clé “hourly_forecast” et non plus “daily_forecast“.

Plusieurs attributs personnalisés sont créés, pour chaque heure (ici les deux premières heures): condition0, temperature0, precipitation0 : contiennent la condition météo, la température et la précipitation attendues pour l’heure H (idem pour H+1). Notez que l’heure est au format heure locale grâce au second argument de timestamp_custom positionné à true.

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.

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.

YAML
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.

YAML
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 :

YAML
// 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);

Récupération 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.

YAML
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 compensation

En 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.

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.

How useful was this post?

Click on a star to rate it!

Average rating 0 / 5. Vote count: 0

No votes so far! Be the first to rate this post.

We are sorry that this post was not useful for you!

Let us improve this post!

Tell us how we can improve this post?