Recevoir une notification lorsqu'une alerte météo est en cours

Je partage mon automatisation en YAML pour recevoir une notification quand une alerte météo est levée dans mon département par Météo-France.

Il y a quelques subtilités qui méritent des explications. Et cela permettra à ceux qui sont novices en automatisation de comprendre les concepts de base.

Edit: cette automatisation est maintenant disponible sous forme de Blueprint

Préliminaires

  • Ils faut avoir l’intégration Météo-France installée et configurée pour la ville que vous voulez surveiller.
  • Avoir un système de notification de configuré dans Home Assistant.

Fonctionnement

  • Je veux recevoir une notification (sur Telegram) qui m’informe si une nouvelle alerte météo est levée avec dans le message le niveau de l’alerte et le détail pour chaque type d’alerte.
  • Je veux aussi recevoir une notification quand toutes les alertes sont terminées.

Capture d’écran 2020-09-04 à 19.46.45

Capture d’écran 2020-09-04 à 19.48.37

Implémentation

Update: @Makai a proposé dans la discussion une version plus simple basée sur la fonction choose. Le code de l’automatisation est ici, et les explications ici. L’implémentation initiale fonctionne toujours et je la laisse pour le coté pédagogique.

Voici le code complet de mon automatisation. Vous trouverez les explications après ce bloc.

- alias: "Notification si alerte météo en cours"
  description: "Envoie une notification sur Telegram si une alerte météo est levée par Météo-France"
  id: bb9f2730-ee77-11ea-9220-4198f0db79cf
  trigger:
    - platform: state
      entity_id: sensor.home_weather_alert
  condition:
    # F: Envoie la notification seulement si une alerte est en cours ( State != Vert et != unvailable)
    # E: Send a notification only if a weather alert is active ( State != Vert et != unvailable)
    - condition: template
      value_template: "{% if (is_state('sensor.home_weather_alert', 'Vert') or is_state('sensor.home_weather_alert', 'unavailable') )  %}false{% else %}true{% endif %}"
  action:
    - service: notify.telegram
      data_template:
        message: "Alerte météo {{states('sensor.home_weather_alert')}} en cours:\n
          {%- for attr in ['Vent violent', 'Pluie-inondation', 'Orages', 'Inondation', 'Neige-verglas',
                          'Canicule', 'Grand-froid', 'Avalanches', 'Vagues-submersion'] -%}
          {%- if state_attr('sensor.home_weather_alert', attr) != 'Vert' and state_attr('sensor.home_weather_alert', attr) != None %}\n
          - {{attr}}: {{state_attr('sensor.home_weather_alert', attr)}}
          {%- endif -%}
          {%- endfor -%}"

- alias: "Notification si alerte météo terminée"
  description: "Envoie un notification sur Telegram si toutes les alertes météos sont terminées"
  id: ebb22120-ee77-11ea-9220-4198f0db79cf
  trigger:
    - platform: state
      entity_id: sensor.home_weather_alert
      to: "Vert"
  condition:
    # F: Vérfie que l'état n'est pas revenue à 'Vert' après que l'entity était non disponible.
    # E: Check if state is back to 'Vert' after entity was unvailable.
    - condition: template
      value_template: "{% if trigger.from_state.state != 'unavailable' %}true{% endif %}"
  action:
    - service: notify.telegram
      data_template:
        message: "Fin de l'alerte météo."

Éxplications
Il y a deux automatisations, une lorsque des nouvelles alertes sont levées et une quand toutes les alertes sont terminées.

Chaque automatisation a des paramètres d’identifications:

  • Un nom avec la clé alias
  • Une description avec la clé description mais dont le contenu n’est pas encore visible pour les automatisation en mode YAML. Pour les automatisations configurée dans L’UI cette clé est éditable et visible.
  • un identifiant unique avec la clé id. Vous pouvez générer des identifiants uniques à l’aide ce site.

En ajoutant un identifiant unique, vous débloquez certaines fonctionnalités dans l’interface graphique (personnalisation, vue des liens avec les sensors utilisés, etc.)

- alias: "Notification si alerte météo en cours"
  description: "Envoie une notification sur Telegram si une alerte météo est levée par Météo-France"
  id: bb9f2730-ee77-11ea-9220-4198f0db79cf

Pour définir les paramètres de déclenchement d’une automatisation, il faut utiliser la clé trigger. Dans le cas de cette automatisation, je la déclenche sur le changement d’état du sensor weather_alert créé par l’intégration Météo-France.
Bon à savoir: même si l’état ne change pas mais qu’un attribut du sensor change, le trigger lance l’automatisation.

  trigger:
    - platform: state
      entity_id: sensor.home_weather_alert

Dans la seconde automatisation je rajoute un clé to pour déclencher l’automatisation uniquement sur le passage de l’état à la valeur Vert (qui correspond à un retour à la normal).

  trigger:
    - platform: state
      entity_id: sensor.home_weather_alert
      to: "Vert"

Si vous voulez découvrir tous les triggers disponibles, vous pouvez consulter la page trigger de la doc.

Maintenant que notre automatisation est déclenchée nous pouvons vérifier certaines conditions avant de lancer des actions. C’est ce que je fais avec la clé conditions. J’utilise le type de condition le plus complexe qui va interpréter un template en langage Jinja pour savoir si la condition passe (renvoie true) ou pas.

Le template utilisé dans la condition de la première automatisation, veut bloquer l’automatisation si l’état du sensor est à Vert (pas besoin de m’informer dans ce cas) et si l’état du sensor a la valeur unavailable.
J’ai rajouté dernièrement le test de la valeur unavailable pour éviter de recevoir une notification parasite quand l’intégration n’arrive pas à récupérer l’information sur l’API de Météo-France. En effet, les intégrations quand elles sont bien codées, passent l’état des sensors à unavailable si il y a un problème avec le service ou l’appareil qu’il représentent.

    - condition: template
      value_template: "{% if (is_state('sensor.home_weather_alert', 'Vert') or is_state('sensor.home_weather_alert', 'unavailable') )  %}false{% else %}true{% endif %}"

De même avec la seconde automatisation, j’utilise une condition pour éviter de recevoir une notification parasite quand le sensor passe de unavailable à Vert. Cela peut arriver quand l’intégration récupère la communication avec l’API après l’avoir perdu.

Pour implémenter cette condition je fais appel à une fonctionnalité du langage de template trigger.from_state.state qui me permet de récupérer quel était l’état du sensor juste avant le declanchement du trigger. Pour en savoir plus sur ce mecanisme je vous conseille cette section de la doc

    - condition: template
      value_template: "{% if trigger.from_state.state != 'unavailable' %}true{% endif %}"

Pour creuser toutes les conditions qui sont disponible, encore une fois direction la doc.

Donc maintenant que nous avons vu ce qui permet de déclencher une automatisation et de vérfier les conditions avant de lancer les actions passons à l’envoie de la notification. Pour cela il faut utiliser la clé action. Dans cette exemple, j’utilise un service pour envoyer un message avec Telegram. Il faudra ajuster cette automatisation avec le service de notifications que vous préférez.

  action:
    - service: notify.telegram
      data_template:
        message:

Et encore une fois j’utilise un template en langage Jinja pour avoir exactement le message que je souhaite: l’état général d’alerte du département et la liste des types d’alertes qui ne sont pas Vert.
Pour y arriver je fais une boucle sur tous les types d’alerte que je connais à l’avance. et je vérifie que l’attribut correspondant n’a pas la valeur Vert ou None. Ce dernier cas est possible si l’attribut n’existe pas car certains types d’alertes sont saisonniers ou disponible que sur les départements côtiers.

        message: "Alerte météo {{states('sensor.home_weather_alert')}} en cours:\n
          {%- for attr in ['Vent violent', 'Pluie-inondation', 'Orages', 'Inondation', 'Neige-verglas',
                          'Canicule', 'Grand-froid', 'Avalanches', 'Vagues-submersion'] -%}
          {%- if state_attr('sensor.home_weather_alert', attr) != 'Vert' and state_attr('sensor.home_weather_alert', attr) != None %}\n
          - {{attr}}: {{state_attr('sensor.home_weather_alert', attr)}}
          {%- endif -%}
          {%- endfor -%}"

Voilà pour ce premier partage. J’espère que cela vous a plus.
Si vous voulez creuser le langage des templates, il y a pas mal d’info sur cette page de la doc.
Si vous voulez voir d’autres automatisations, direction ma configuration sur GitHub.

Edit: une autre automatisation expliquée est disponible: Être alerté si la pluie est attendue dans moins d'une heure

6 J'aime

Belle explication de ton automatisation avec de bon détails pour les automatisations en yaml

Quel plaisir de voir du YAML :wink:

Super tuto et très sympa à lire.

Faut monter le FLDY (Front libérateur du YAML) contre l’envahisseur Node-Red :laughing: !

2 J'aime

Hello,

On peut simplifier encore et faire une seule automatisation :

- alias: "Notification pour alerte météo"
  description: "Envoie une notification sur Telegram si une alerte météo est levée par Météo-France"
  id: bb9f2730-ee77-11ea-9220-4198f0db79cf
  trigger:
    - platform: state
      entity_id: sensor.home_weather_alert
  condition: []
  action:
    - choose:
      - conditions:
        - condition: state
          entity_id: sensor.home_weather_alert
          state: ['Jaune', 'Orange', 'Rouge'] # Filtre le 'unavailable'
        sequence:
          - service: notify.telegram
            data_template:
              message: "Alerte météo {{states('sensor.home_weather_alert')}} en cours:\n
                {%- for attr in ['Vent violent', 'Pluie-inondation', 'Orages', 'Inondation', 'Neige-verglas',
                                'Canicule', 'Grand-froid', 'Avalanches', 'Vagues-submersion'] -%}
                {%- if state_attr('sensor.home_weather_alert', attr) != 'Vert' and state_attr('sensor.home_weather_alert', attr) != None %}\n
                - {{attr}} : {{state_attr('sensor.home_weather_alert', attr)}}
                {%- endif -%}
                {% endfor -%}"
      - conditions:
        - condition: state
          entity_id: sensor.home_weather_alert
          state: 'Vert'
        - condition: template
          value_template: "{{ trigger.from_state.state != 'unavailable' }}"
        sequence:
          - service: notify.telegram
            data_template:
              message: "Fin de l'alerte météo."
1 J'aime

Pour celles et ceux qui veulent en savoir plus sur la méthode de @Makai, voici le lien vers la documentation :

Effectivement la version de @Makai est plus optimisée. La fonctions choose a été implémentée avec la version 0.113.0 de Home Assistant core, et je n’avais pas encore pris le temps de revoir ma config avec cette nouvelle possibilité. Merci :pray:t2:

Pour reprendre l’esprit du poste initial. Voici les explications.

Nous n’utilisons pas la première clé condition car nous allons définir un arbre de décision avec la clé choose un peu plus loin. Chaque possibilité aura son propre jeu de conditions.

condition: []

Dans la section ou nous définissons les actions à réaliser (clé action), nous utilisons la clé choose pour implémenter un arbre de décision avec plusieurs conditions. Uniquement la première des conditions vraie déclenche les actions dans la séquence attachée.

Le premier choix vérifie une condition sur l’état de l’entité. La condition est vraie si l’état est Jaune, Orange ou Rouge. Cela permet d’éviter le cas unavailable (cf. premier post de cette discussion). Dans ce cas il lance l’action qui génère la première notification correspondant au début d’une alerte météo comme je l’avais fait initialement.

      - conditions:
        - condition: state
          entity_id: sensor.home_weather_alert
          state: ['Jaune', 'Orange', 'Rouge'] # Filtre le 'unavailable'
        sequence:
          - service: notify.telegram
            ...

Le second choix teste si l’état est revenu à Vert. Nous ajoutons comme dans la version précédente un test pour vérifier que l’état précédent n’était pas unavailable pour éviter une notification parasite. Et lance la notification de fin d’alerte météo.

      - conditions:
        - condition: state
          entity_id: sensor.home_weather_alert
          state: 'Vert'
        - condition: template
          value_template: "{{ trigger.from_state.state != 'unavailable' }}"
        sequence:
          - service: notify.telegram
            ...
1 J'aime

Et avec la 0.115 on pourra encore simplifier tout ça ! :wink:

Çà m’intéresse, tu as un lien ?

Je vais commencer la refonte de mon code qui commence à dater et surtout des premiers bouts de code qui parfois même s’il font le boulot sont :face_with_raised_eyebrow:

Suivant l’info, je vais peut être attendre…

Pour l’instant je suis les PR et vois donc les « nouveautés » qui vont arriver.
Avec le mois du « What the Heck? », pas mal de petites choses ont été améliorées et tout ça va sortir avec la 0.115.

Quelques exemples :

Merci pour l’info. :+1:

J’aimerai bien aussi ajouter des évènements a l’intégration meteo_france. Pour encore simplifier les automatisations.

1 J'aime

Et maintenant disponible sous forme de Blueprint:

Bonjour,

Je souhaiterai utiliser le code de @Makai plutôt que le blueprint mais après un copier/coller de celui-ci dans le code Yaml de l’automatisation, je me retrouve avec un code modifié et qui bien sûr ne marche pas. Je suppose que la syntaxe du message PushOver n’est pas correct.

De l’aide serait la bienvenue. Merci d’avance.

alias: Notification pour alerte météo
description: Envoi une notification si une alerte météo est levée par Météo-France
trigger:
  - platform: state
    entity_id: sensor.33_weather_alert
condition: []
action:
  - choose:
      - conditions:
          - condition: state
            entity_id: sensor.33_weather_alert
            state:
              - Jaune
              - Orange
              - Rouge
        sequence:
          - service: notify.pushover_ha
            data:
              message: |-
                Alerte météo {{states('sensor.33_weather_alert')}} en cours:
                 {%- for attr in ['Vent violent', 'Pluie-inondation', 'Orages', 'Inondation', 'Neige-verglas', 'Canicule', 'Grand-froid', 'Avalanches', 'Vagues-submersion'] -%} {%- if state_attr('sensor.33_weather_alert', attr) != 'Vert' and state_attr('sensor.33_weather_alert', attr) != None %}
                 - {{attr}} : {{state_attr('sensor.33_weather_alert', attr)}} {%- endif -%} {% endfor -%}
      - conditions:
          - condition: state
            entity_id: sensor.33_weather_alert
            state: Vert
          - condition: template
            value_template: '{{ trigger.from_state.state != ''unavailable'' }}'
        sequence:
          - service: notify.pushover_ha
            data:
              message: Fin de l alerte météo.
mode: single

Pourquoi ? C’est le même code… :upside_down_face:

Oui, c’est pas faux … mais j’apprend plus vite en bidouillant du code (comprendre la structure) plutôt que de renseigner deux ou trois champs pour un blueprint.

De plus, j’ai configuré le blueprint mais :

essai en notify.notify pour le test :slight_smile:

Voici les modifications que j’ai apporter pour l’exemple:
il suffira simplement de remplacer le n°00 par celui de la Gironde :slight_smile:

- alias: Notification pour alerte météo
  description: Envoie une notification si une alerte météo est levée par Météo-France
  trigger:
  - platform: state
    entity_id: sensor.00_weather_alert
  condition: []
  action:
  - choose:
    - conditions:
      - condition: state
        entity_id: sensor.00_weather_alert
        state:
        - Jaune
        - Orange
        - Rouge
      sequence:
      - service: notify.notify
        data_template:
          message: "Alerte météo {{states('sensor.00_weather_alert')}} en cours:\n\
            \ {%- for attr in ['Vent violent', 'Pluie-inondation', 'Orages', 'Inondation',\
            \ 'Neige-verglas', 'Canicule', 'Grand-froid', 'Avalanches', 'Vagues-submersion']\
            \ -%} {%- if state_attr('sensor.00_weather_alert', attr) != 'Vert' and\
            \ state_attr('sensor.00_weather_alert', attr) != None %}\n - {{attr}}\
            \ : {{state_attr('sensor.00_weather_alert', attr)}} {%- endif -%} {% endfor\
            \ -%}"
    - conditions:
      - condition: state
        entity_id: sensor.00_weather_alert
        state: Vert
      - condition: template
        value_template: '{{ trigger.from_state.state != ''unavailable'' }}'
      sequence:
      - service: notify.notify
        data_template:
          message: Fin de l'alerte météo.

Merci de ton aide @Felix62 mais je ne reçois aucune notification (ni erreur).

Le code, je le colle bien dans le fichier automations.yaml ?

oui dans automation.yaml
le code se déclenchera lors des prochaines alertes soit en certain :slight_smile:

Normal de trouver ça en fin du code ?