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.
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: https://forum.hacf.fr/t/etre-alerte-si-la-pluie-est-attendue-dans-moins-dune-heure/1262