Notifications avancées sur Home Assistant

Petit article sur un script de notification général pour les automations Home Assistant

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:

Gui avec selecteurs

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