Home Assistant : Envoyer des messages à mes Google Home Mini

Comme annoncé dans mon précédent article, je vais vous expliquer comment j’ai mis en place une mécanique pour envoyer régulièrement des messages sur mes Google Home Mini. Tout cela est possible grâce à Google Agenda.

Avant Home Assistant

J’utilisais des événements sur un agenda dédié dans Google Agenda pour indiquer les messages à diffuser sur le ou les Google Home Mini de l’appartement. En gros, le titre de l’événement correspond au message que le Google Home doit énoncer. Le descriptif contient le nom de chaque Google Home sur lequel doit être énoncé le message. Bien entendu, le message est diffusé à l’heure du début de l’événement. Nous pouvions donc depuis notre agenda Google planifier des messages, des rappels etc. Donc, cette solution est accessible aux personnes non geek.

Configuration

Tous mes Google Home Mini (cf. GHM) ont été ajouté par l’intégration "Google Cast". Ils sont reconnus par HA en tant que "media_player". Tout cela se fait depuis l’interface d’HA.

Mes calendriers Google ont été ajouté par l’intégration "Google Calendar Event". La configuration a été faite dans mon fichier configuration.yaml grâce au code suivant :

google:
 client_id: !secret google_client_id
 client_secret: !secret google_client_secret

Si votre intégration s’est correctement déroulée, vous devriez avoir un fichier google_calendars.yaml au même niveau que votre fichier configuration.yaml. Il ne faudra pas y toucher car il contient l’ensemble des calendriers associés et accessibles de votre compte Google. C’est également dans ce fichier que vous trouverez le nom du calendrier qui vous intéresse.

Remarque

Vous pouvez voir que j’utilise !secret au lieu de mettre directement la valeur réelle. Cela n’a rien de secret, :-D
C’est une fonction native de HA : https://www.home-assistant.io/docs/configuration/secrets/ Je vous laisse découvrir cela par vous même.

Je fonctionne pratiquement qu’avec des fichiers yaml pour la mise en place de mon écosystème. Et entre autres, pour mes routines, j’utilise le répertoire automations/ grâce à cette ligne de code dans configuration.yaml :

automation: !include_dir_list automations/

J’ai ainsi tout ce qu’il me faut pour créer une automatisation qui détectera le début d’un nouvel événement et de ce fait, le moment auquel le message doit être diffusé sur les GHM.

Presque tous les éléments sont en place. Il ne manque plus qu’à indiquer la configuration de la fonction "Text-To-Speech" de HA. Pour cela, il suffit de configurer l’élément suivant dans votre fichier configuration.yaml :

# Example configuration.yaml entry for Google Translate TTS service
tts:
 - platform: google_translate
   cache: true
   cache_dir: /tmp/tts
   time_memory: 300
   base_url: http://192.168.0.10:8123

Source : https://www.home-assistant.io/integrations/tts/
Il faudra indiquer l’adresse IP correspondante à votre Home Assistant. Dans l’exemple donné, Home Assistant est joignable à l’adresse IP 192.168.0.10

La routine, l’automatisation

Je parle de routine car une automatisation est appelée "Routine" chez Google Assistant. Mais cela n’a pas de conséquence ici, je tiens à le préciser. :-) Et surtout, je trouve que ce mot induit l’idée de répétition plus qu’une "automatisation". Nous n’allons pas épiloguer sur le sujet.

Création de l’événement

Sur Google Agenda, nous avons créé notre agenda dédié aux messages à diffuser sur les GHM. On le nommera "Messages GHM" pour simplifier. On y met en place les routines propres à nos besoins.

Je vais prendre l’exemple suivant : tous les jours ouvrés, à 8h15, je dois diffuser le message "Il est l’heure d’aller à l’école". Je crée donc un événement qui se répétera comme désiré. Là, rien de sorcier, c’est accessible à tous.
Pour rappel, le titre de l’événement est le message qui sera diffusé sur les GHM. Ne faites pas un monologue, il faut être concis dans ce que vous voulez dire. J’essaie de ne pas dépasser les 200 caractères. Je reste même en dessous de 100 caractères la plus part du temps. C’est plus simple pour s’y retrouver dans l’agenda par la suite.

J’ai pris pour habitude également de mettre une durée de 10 minutes pour chacun de ces événements. Cela pour plusieurs raisons :

  • On a besoin uniquement, dans ce contexte d’utilisation, que du titre et de son heure de début ;
  • Il faut que cela reste facilement cliquable dans l’interface Google Agenda ;
  • Si on a plusieurs événements les uns derrières les autres, cela sera plus lisible.

On peut en créer autant d’événements que l’on désire. Libre à vous d’adapter les messages selon votre mode de vie.

Création de l’automatisation

Les événements maintenant créés, il nous faut créer dans HA l’automatisation qui gérera la diffusion au moment opportun.

Dans le répertoire automations/, créer le fichier messages_ghm.yaml. Puis dans ledit fichier, nous pourrons mettre le code suivant :

alias: Diffusion des messages
trigger:
 platform: state
 entity_id: calendar.messages_ghm
 from: 'off'
 to: 'on'
action:
 - service: media_player.volume_set
   data_template:
     entity_id: media_player.nom_du_ghm
     volume_level: 0.6
 - service: tts.google_translate_say
   data_template:
     entity_id: media_player.nom_du_ghm
     message: '{{ state_attr('calendar.alarmes_maison', 'message') }}'
     language: 'fr'

Explications :
L’automatisation va se déclencher (cf. trigger) lorsque calendar.messages_ghm, notre calendrier dédié passera à "on". C’est-à-dire qu’un événement commence. Donc dans notre problématique qu’un message doit être diffusé.
Dans les actions, nous utilisons le service media_player.volume_set pour modifier le volume du GHM. volume_level étant la valeur que nous désirons. C’est histoire que le message soit entendu correctement.
Nous utilisons le service tts.google_translate_say (que nous avons défini plus haut dans configuration) pour transmettre au GHM désiré. Le message est le titre de l’événement, soit {{ state_attr('calendar.alarmes_maison', 'message') }}. Ce n’est qu’un pur hasard mais HA indique le titre de l’événement par l’attribut "message". Nous le prendrons sans broncher.

Bon, c’est pas mal. Ça fait le job désiré. Malheureusement, tel quel, on envoie le message à un et un seul GHM. Comment faire pour l’envoyer à plusieurs GHM ?

Spoiler alert

Contrairement à la solution que j’utilisais avec "Assistant-Plugins" avant HA, je n’ai pas trouvé la méthode pour indiquer les GHM à qui je dois transmettre le message. En gros, j’ai "GHM Salon", "GHM Chambre enfants", "GHM Bureau". Je ne sais pas pour le moment (mars 2021) comment indiquer à HA que je veux que tel message soit envoyé à GHM Salon et GHM Chambre enfant. Puis tel autre message à GHM Bureau uniquement.

Avec la liste de GHM ci-dessous, nous allons créé un script permettant d’envoyer les messages à ceci.

  • GHM Salon (cf. media_player.ghm_salon)
  • GHM Première Chambre (cf. media_player.ghm_premiere_chambre)
  • GHM Deuxième Chambre (cf. media_player.ghm_deuxieme_chambre)
  • GHM Suite Parentale (cf. media_player.ghm_suite_parentale)
  • GHM Salle de bain (cf. media_player.ghm_salle_de_bain)

Création d’un script

Comme dans la section précédente, nous avons vu comment envoyer des messages depuis une automatisation. Nous allons nous créer un script pour nous simplifier la vie. Le but étant de pouvoir appeler ce script autant de fois que nous désirions notifier l’ensemble des GHM.
En fait, on va en créer 2 :

  • un script pour faire parler un media_player ;
  • un script qui va notifier TOUS les media_player que nous voulons.

Dans notre fichier configuration.yaml, je dois indiquer où trouver mes scripts. Je choisis, comme pour les automatisations d’avoir tous mes scripts dans un répertoire :

script: !include_dir_merge_named scripts/

Cela fait, je crée un fichier media_player_say.yaml dans le répertoire scripts/

media_player_say:
 alias: "[Helper] Media Player says"
 sequence:
 - service: media_player.volume_set
   data_template:
     entity_id: '{{speaker_location}}'
     volume_level: '{% if (volume_level | float) > 0 %} {{volume_level}} {% else %} 0.7 {% endif %}'
 - service: tts.google_translate_say
   data_template:
     entity_id: '{{speaker_location}}'
     message: '{{message}}'
     language: 'fr'

Ce script attend qu’on lui indique 3 paramètres :

  • speaker_location : l’entity_id de mon GHM (exemple : media_player.ghm_salon)
  • volume_level : le niveau sonore attendu
  • message : le message à diffuser.

Nous allons maintenant créé le 2ème script qui fera appel à script.media_player_say. On répète les même opérations : crée un fichier media_player_notify_all.yaml dans le répertoire scripts/. Et y mettre le code suivant :

media_player_notify_all:
 alias: "[Helper] Notify all media players"
 sequence:
   - delay: 0
   - data_template:
       speaker_location: media_player.ghm_salon
       message: "{{ message }}"
       volume_level: "{{ volume }}"
     service: script.media_player_say
   - delay: 0
   - data_template:
       speaker_location: media_player.ghm_salle_de_bain
       message: "{{ message }}"
       volume_level: "{{ volume }}"
     service: script.media_player_say
   - delay: 0
   - data_template:
       speaker_location: media_player.ghm_deuxieme_chambre
       message: "{{ message }}"
       volume_level: "{{ volume }}"
     service: script.media_player_say
   - delay: 0
   - data_template:
       speaker_location: media_player.ghm_premiere_chambre
       message: "{{ message }}"
       volume_level: "{{ volume }}"
     service: script.media_player_say

Vous répétez autant de fois que nécessaire l’appel au service script.media_player_say, autant de fois que vous désirez de GHM. Vous pouvez voir que nous indiquons à chaque fois les 3 paramètres obligatoires : speaker_location, message et volume_level.

De ce fait, on pourra simplifier l’automatisation avec ce script. Et on pourra l’utiliser partout où on le désire. Pour résumer, l’automatisation appellera un script qui appellera un script. :-)
Cela donne ceci :

alias: Diffusion des messages
trigger:
 platform: state
 entity_id: calendar.messages_ghm
 from: 'off'
 to: 'on'
action:
 - service: script.media_player_notify_all
   data_template:
     message: "{{ state_attr('calendar.alarmes_maison', 'message') }}"
     volume: 0.6

Améliorer le script

Ces scripts et cette automatisation sont plutôt pratiques et m’apportent satisfaction en soit. Tout est géré par le biais des agendas. Donc libre à chacun de mettre les messages quand cela est nécessaire. Je n’ai pas de problèmes d’isolation sonore dans mon appartement. Toutefois, j’ai ajouté une sécurité : une heure de début et de fin de diffusion des messages, une tranche horaire donc.
Pour leurs utilisations, il est nécessaire de mettre en place les conditions (ici aussi) dans le script media_player_say.yaml

media_player_say:
 alias: "[Helper] Media Player says"
 sequence:
 - condition: and
   conditions:
     - condition: state
       entity_id: input_boolean.speech_notifications
       state: 'on'
     - condition: template
       value_template: >
         {{ now().strftime("%H:%M") > states.input_datetime.speech_notifications_start.state }}
     - condition: template
       value_template: >
         {{ now().strftime("%H:%M") < states.input_datetime.speech_notifications_end.state }}
 - service: media_player.volume_set
   data_template:
     entity_id: '{{speaker_location}}'
     volume_level: '{% if (volume_level | float) > 0 %} {{volume_level}} {% else %} 0.7 {% endif %}'
 - service: tts.google_translate_say
   data_template:
     entity_id: '{{speaker_location}}'
     message: '{{message}}'
     language: 'fr'

Pour aller plus loin

Tout ça c’est bien beau, mais j’aimerai trouver une solution pour baisser le volume en soirée ou voir même très tôt le matin pour ne pas être agressif dans le foyer.
En plus de cela, je voudrais utiliser des tableaux que je passerai en paramètre à un script. Je ne suis pas sûr qu’Home Assistant le permet par yaml. Il faudrait peut-être passer par AppDaemon qui permet d’utiliser des scripts python. Merci à HACS pour son intégration.
Il y a encore de belles possibilités offertes par HA et consort. Il faut que j’apprenne à mieux connaître Home Assistant. Cela est en cours. Si vous avez des suggestions, des améliorations, des remarques, je suis preneur. ;-)

Dans la même série

Présentation