Notifications avancées sur Home Assistant
Je trouve les notifications de Home Assistant superbes et très pratiques. J'utilise chez moi un mélange entre Telegram et l'application native pour les recevoir. Seul petit problème depuis les années que j'ai home assistant, c'est que quand je change de technique de notification (de Telegram a l'application par exemple) je dois vérifier que toutes mes automations utilisent la nouvelle méthode. Idem quand on change de téléphone ou d'autres appareils.
Du coup, aujourd'hui j'ai décidé de changer ma manière de faire. Je vais utiliser un script qui lui va gérer les notifications sur tout les appareils. Lors d'un changement il me suffira de changer le script et non plus toutes les automations.
Pour cela je vais me baser sur le script de CCOSTAN sur github (ici). Son script est basé majoritairement sur iOS, mais chez moi il y a un bon mélange iOS et Android, il faudra donc adapter en fonction du besoin.
Grouper les notifications
Première étape, générer un groupe pour notifier plusieurs personnes a la fois. Pour cela, je rajoute dans ma configuration les lignes suivantes:
notify:
- name: family_app
platform: group
services:
- service: mobile_app_iphone
- service: mobile_app_android
Libre a vous de faire autant de groupes que nécessaires, pour mes besoin celui-là suffit.
Notifier Android et iOS
Là ça va se corser: les deux applications mobiles n'ont pas les mêmes fonctionnalités. Pour le moment, je n'ai pas prévu de faire des notifications avancées, donc on va en rester là. Mais j'y reviendrai a l'avenir
Scripts dans un sous-dossier
Personnellement je fais ce script dans un fichier a part, dans un dossier nommé script
. Pour faire pareil, dans votre fichier de configuration ajoutez la ligne suivante:
script old: !include_dir_merge_named script
Le mot clé old
est juste là pour définir un second lieu pour les scripts. Utilisez ce que vous voulez.
Script de notification
Venons en au script. Depuis la 2021.5 les différences entre Android et iOS sont minimes. On va donc simplement ignorer les différences spécifiques pour nos notifications. Le but est seulement de fournir l'information a tout le monde.
Bon, quel est le besoin du coup? Afficher une notification sur le téléphone, avec si besoin un bouton pour ouvrir une vue. Pas besoin de plus poussé pour le moment.
notification_engine:
sequence:
- service: >
{% if who == 'personne1' %}
notify.mobile_app_1
{% elif who == 'personne2' %}
notify.mobile_app_2
{% elif who == 'family_app' %}
notify.family_app
{% elif who == 'family_telegram' %}
notify.family_telegram
{% else %}
notify.family_app
{% endif %}
data:
title: "{{ title }}"
message: "{{ message }}"
data:
actions:
- action: "URI"
title: "View More"
uri: "{{ url }}"
entity_id: "{{ camera_entity }}"
Voyons le code ensemble:
La première partie est le service. Ici des conditions en jinja2 permettent de sélectionner sur quel appareil ou groupe d'appareil on envoie la notification. Pour ma part, j'ai 2 groupes, un pour l'app mobile et un pour Telegram. Ceci permet de gérer mes types de notifications a part.
Ensuite vient la partie data:
. Ici on utilise que des données qui existent pour tout nos types de notification. Je ne vais pas rentrer dans le détail pour tout, mais quelques notes: le second champ data
est ignoré par Telegram, mais n'empèche pas l'envoi de la notification. Ensuite, les actions. J'en ai qu'une dans ce code, mais plusieurs peuvent être ajoutées dans le même principe. Pour finir: entity_id
ne marche que pour iOS mais est simplement ignoré par Android. Ce champ permet de donner un flux vidéo live a iOS.
Bon, c'est bien beau tout ça, mais comment on l'utilise?
Utilisation du script
Pour l'utiliser, il va suffire de l'appeler dans une automation de la manière suivante:
service: script.notification_engine
data:
who: utilisateur1
title: Le meilleur titre du monde
message: Hello world!
url: /lovelace/main
camera_entity: camera.je_te_vois_la_bas
Dans une automation, il faudra passer en mode yaml pour entrer les mêmes valeurs:
Et voilà! Vous trouverez le script entier et d'autres infos sur mon GitLab
Bonus
Pour les utilisateurs un peu plus avancés qui aiment la GUI:
On peut ajouter les sélecteurs pour les GUI d'automation et autres:
Pour cela, on ajoute simplement le nom des champs au début du fichier dan un fields:
: (plus d'infos ici: selectors)
fields:
who:
name: "Qui?"
required: true
selector:
select:
options:
- "personne1"
- "personne2"
- "family_app"
title:
name: Title
description: Title of the message
selector:
text:
message:
name: Message
description: Message to send
selector:
text:
url:
name: URL
description: actionable URL
selector:
text:
camera_entity:
name: camera
selector:
entity:
domain: camera
Ce qui donne au final pour le fichier complet:
notification_engine:
fields:
who:
name: "Qui?"
required: true
selector:
select:
options:
- "personne1"
- "personne2"
- "family_app"
title:
name: Title
description: Title of the message
selector:
text:
message:
name: Message
description: Message to send
selector:
text:
url:
name: URL
description: actionable URL
selector:
text:
camera_entity:
name: camera
selector:
entity:
domain: camera
sequence:
- service: >
{% if who == 'personne1' %}
notify.mobile_app_1
{% elif who == 'personne2' %}
notify.mobile_app_2
{% elif who == 'family_app' %}
notify.family_app
{% elif who == 'family_telegram' %}
notify.family_telegram
{% else %}
notify.family_app
{% endif %}
data:
title: "{{ title }}"
message: "{{ message }}"
data:
actions:
- action: "URI"
title: "View More"
uri: "{{ url }}"
entity_id: "{{ camera_entity }}"
A bientôt!
Image: Photo by Hardik Sharma on Unsplash