Dans le même état d’esprit que le partage de mon automatisation pour les alertes météo, je vous partage une autre automatisation pour être alerté de l’arrivée de la pluie.
Préliminaires:
- Il faut avoir l’intégration Météo-France installée et configurée pour la ville à surveiller. La ville doit être couverte par les prévisions de pluie à une heure.
- Avoir un système de notification configuré dans Home Assistant (par exemple Telegram).
- Avoir un système de Text-To-Speech (TTS) configuré dans Home Assistant (Google Home par exemple)
Fonctionnement:
- Je veux recevoir une notification (sur Telegram) qui m’informe si de la pluie est attendue dans la prochaine heure avec l’heure estimée de la pluie.
- Je veux qu’a chaque mise à jour de l’heure estimée, une nouvelle notification soit envoyée.
- Une fois que la pluie est prévue dans moins de 5 minutes, je considère qu’il pleut et je ne veux plus recevoir de nouvelle notification jusqu’à ce que plus de pluie soit attendue dans la prochaine heure.
- Je veux aussi envoyer un message audio sur le Google Home du salon, 5 minutes avant la pluie pour alerter ceux qui sont présents.
Implémentation:
Voici le code complet de mon automatisation. Vous trouverez les explications après ce bloc.
- alias: Alerte quand pluie attendue
description: Envoie des notifications quand la pluie est attendue dans l'heure
id: 30f4e5a8-df44-11ea-87d0-0242ac130003
trigger:
platform: state
entity_id: sensor.home_next_rain
action:
- choose:
- conditions:
# If rain is expected and notification are not stop by the input_boolean...
- "{{ trigger.to_state.state != 'unknown' }}"
- condition: state
entity_id: input_boolean.stop_rain_notification
state: 'off'
sequence:
- choose:
- conditions:
# If estimated time change...
# ... Send a notification on Telegram
- "{{ trigger.to_state.state != trigger.from_state.state }}"
sequence:
- service: notify.telegram
data:
message: >
La pluie est attendue à {{ as_timestamp(states('sensor.home_next_rain'))
| timestamp_custom('%H:%M', True) }}.
- choose:
- conditions:
# If rain is expected in less than 5 mintues...
# ... Stop future notification and send a notification on Google Home
- "{{ state_attr('sensor.home_next_rain', '1_hour_forecast')['0 min'] != 'Temps sec' }}"
sequence:
- service: input_boolean.turn_on
data:
entity_id: input_boolean.stop_rain_notification
# If current time is between 10h00 and 21h30...
# ... Send a notification on Google Home
- condition: time
before: '21:30:00'
after: '10:00:00'
- service: tts.google_translate_say
data:
entity_id: media_player.google_home
message: "Chers résidents, la pluie est attendue dans quelques minutes."
- conditions:
# If rain is no more expected...
# ... Send a notification on Telegram and allow future notifications
- "{{ trigger.to_state.state == 'unknown' }}"
- "{{ trigger.from_state.state != 'unknown' }}"
sequence:
- service: notify.telegram
data:
message: "Plus de pluie attendue dans la prochaine heure."
- service: input_boolean.turn_off
data:
entity_id: input_boolean.stop_rain_notification
Explications:
Une seule automatisation suffit pour implémenter celà. J’utilise les dernières fonctionnalités implémentées récemment dans HA core pour les scripts: choose
et template shorthand
.
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: Alerte quand pluie attendue
description: Envoie des notifications quand la pluie est attendue dans l'heure
id: 30f4e5a8-df44-11ea-87d0-0242ac130003
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 home_next_rain
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.
Si vous voulez découvrir tous les triggers disponibles, vous pouvez consulter la page trigger de la doc.
Notre automatisation est maintenant déclenchée. Contrairement à l’exemple sur les alertes météo, je ne rajoute pas de clé condition
juste après le trigger
. En fait je vais utiliser l’instruction choose
qui permet d’avoir plusieurs embranchement dans la logique du script (équivalent de if
/elif
/ else
en Python)
action:
- choose:
Dans la suite du script j’utilise à plusieurs endroit un booléen (input_boolean.stop_rain_notification
) qui me permet de suivre si les notifications doivent être bloquées ou non (cf. description de la logique).
Deux embranchements sont possibles:
- De la pluie est attendue dans moins d’une heure et le booléen ne bloque pas les notifications.
- L’état du sensor
home_next_rain
revient à la valeurunknown
ce qui veut dire que plus de pluie n’est attendue dans la prochaine heure.
Pour le premier cas j’implémente deux conditions sous forme de liste. Toutes les conditions listées doivent être vraies pour déclencher les actions décrites dans la clé séquence
associée.
La première condition utilisant la notation {{ ... }}
permet d’offrir plus rapidement une condition basée sur un template Jinja.
La deuxième est une condition pour vérifier la valeur de l’état du booléen.
- conditions:
- "{{ trigger.to_state.state != 'unknown' }}"
- condition: state
entity_id: input_boolean.stop_rain_notification
state: 'off'
Pour le second cas, il ya deux conditions au format raccourci (shorthand) qui permettent de vérifier que le sensor qui a déclenché l’automatisation est passé (au moment du déclenchement) d’un état différent de unknown
(c-a-d que de la pluie était attendue) à un l’état unknown
(c-a-d qu’il ny’a plus de pluie prévue dans la prochaine heure).
- conditions:
- "{{ trigger.to_state.state == 'unknown' }}"
- "{{ trigger.from_state.state != 'unknown' }}"
Si toutes les conditions du premier cas sont remplies (rappel: De la pluie est attendue dans moins d’une heure et le booléen ne bloque pas les notifications) nous voulons que:
- Si l’heure estimé de la pluie change, une notification est envoyée sur Telegram.
- S’il pleut dans moins de 5 minutes, un message audio est envoyé sur la Google Home et nous passons le booléen qui bloque les prochaines notifications à vraie.
Les actions qui permettent de réaliser cette logique sont dans la première clé sequence:
. Là aussi nous allons utiliser l’instruction choose
(2 fois).
Comme nous avons déjà détaillé son fonctionnement au dessus, je vais aller un peu plus vite.
Donc dans ce premier bloc, nous testons si l’état du sensor qui a déclenché l’automatisation (home_next_rain
) a bien changé: il y a donc une nouvelle heure estimée de pluie. Dans ce cas j’utilise un service lié à l’intégration Télégram pour envoyer une notification personnalisée avec l’heure estimée au format HH:MM)
- choose:
- conditions:
- "{{ trigger.to_state.state != trigger.from_state.state }}"
sequence:
- service: notify.telegram
data:
message: >
La pluie est attendue à {{ as_timestamp(states('sensor.home_next_rain'))
| timestamp_custom('%H:%M', True) }}.
C’est la seule possibilité que nous avons mis dans ce bloc choose
donc si la valeur de l’état n’a pas changé, rien ne se passe et nous passons au second bloc choose
.
Dans ce bloc, la condition permet de contrôler une valeur spécifique du dictionnaire stocké dans l’attribut 1_hour_forecast
associé au sensor home_next_rain
. Si la valeur correspondant à la prévision dans moins de 5 minutes est différente de Temps sec
, je considère qu’il va pleuvoir très prochainement.
- choose:
- conditions:
- "{{ state_attr('sensor.home_next_rain', '1_hour_forecast')['0 min'] != 'Temps sec' }}"
Dans ce cas j’appelle deux services.
Un premier pour mettre le booléen (qui permet de bloquer les notifications) à vrai. Je n’attend donc plus de nouvelle notification car maintenant la pluie est là.
Le second service envoie le message audio sur la Google Home si auparavant une condition vérifiant que les horaires sont acceptables est bien remplie.
sequence:
- service: input_boolean.turn_on
data:
entity_id: input_boolean.stop_rain_notification
- condition: time
before: '21:30:00'
after: '10:00:00'
- service: tts.google_translate_say
data:
entity_id: media_player.google_home
message: "Chers résidents, la pluie est attendue dans quelques minutes."
Pour terminer ces explications nous n’avons plus qu’à voir les actions associées au second cas dans le premier embranchement correspondant à « L’état du sensor home_next_rain
revient à la valeur unknown
ce qui veut dire que plus de pluie n’est attendue dans la prochaine heure ».
Dans ce cas j’utilise un service pour envoyer une notification m’indiquant que l’épisode de pluie est terminé. Un second service change la valeur du booléen qui bloquait les notifications pour en permettre de nouvelles si la pluie revient.
sequence:
- service: notify.telegram
data:
message: "Plus de pluie attendue dans la prochaine heure."
- service: input_boolean.turn_off
data:
entity_id: input_boolean.stop_rain_notification
J’espère que cela aura été utile à certains d’entre vous. Je suis ouvert à vos questions et commentaires.
Si vous voulez voir d’autres automatisations, direction ma configuration sur GitHub