Station Météo-France reTerminal E1001

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

5
(1)

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.

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.

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

Affichage de la température intérieure

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

Température intérieure 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).

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.

Température mesurée par un capteur de température relié à Home Assistant en Zigbee

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.

YAML
sensor:
  - platform: homeassistant
    name: "Temperature Serre"
    entity_id: sensor.lumi_lumi_weather_temperature_2
    id: temperature_serre

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

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

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 :

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

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


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

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

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.

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

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.

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

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.

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. Une batterie bien chargée lorsque sa tension est supérieure à 4.0 V.

Affichage de la tension de la batterie interne

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 :

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

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

YAML
  - file: "fonts/materialdesignicons-webfont.ttf"
    id: icon_font_20
    size: 20
    glyphs:
      - "\U000F12A3" # battery
      - "\U000F058C" # water
      - "\U000F050F" # thermometer
      - "\U000F1442" # clock

Ensuite vous pouvez afficher l’icône à partir de son code de cette façon :

YAML
      it.printf(0, 0+85, id(icon_font_20), "\U000F050F");  // icone thermometre

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

YAML
# 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 logic

Rafraî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é :

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

Désactiver la mise à jour automatic (update_interval: never) pour le capteur interne ST4X :

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

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

Et enfin rafraîchir l’écran une fois qu’une donnée Home Assistant est reçue :

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

How useful was this post?

Click on a star to rate it!

Average rating 5 / 5. Vote count: 1

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?