Récupérer alarme et minuteur des Google Home depuis le dernier changement d'API

Bonjour,

Aujourd’hui, je vous propose un tutoriel pour vous aider à ajouter un sensor des alarmes du google home. Depuis le début de l’année, j’ai vu que Google avait changé leur api et ainsi rendu extrêmement compliqué son utilisation, car ils utilisent maintenant un système de clés qui changent toutes les heures.

Sur le forum anglais, une personne a proposé une solution pour tout automatiser l’obtention de la clé par Home assistant pour que lui-même puisse l’utiliser pour obtenir les alarmes.

Voici le github de la personne en question.

Prérequis :

  • Vous munir de votre compte google, mail et password. Je vous conseille fortement de créer un app password rien que pour cette installation => https://myaccount.google.com/apppasswords
  • Télécharger get_tokens.py.
  • Télécharger le get_tokens.sh du github.
  • Télécharger le Google Foyer proto files (Bien télécharger tout le dossier appelé « google »).
  • Télécharger la dernière version de grpcurl (Attention ! Pour les utilisateurs de Raspberry Pi, ou tout autres systèmes sur ARM, il faut compiler le code source vous-même. Je vais vous expliquer ça).

Compiler grpcurl pour les plateforme ARM :

grpcurl est écrit en Go et le compiler est cross-plateforme. Vous pouvez très bien compiler directement sur votre Linux ARM ou sur une ubuntu voire un windows.

Je vais expliquer les étapes pour une compilation sur les debians de manière général. Cependant, il y a une légère différence, si vous compiler votre programme pas directement sur le Raspberry mais sur une autre distribution linux. Personnellement j’ai compilé sur un Ubuntu Windows Subsystem for Linux.

Pour tous les linux :

sudo apt update
sudo add-apt-repository ppa:longsleep/golang-backports
sudo apt install golang-go
git clone https://github.com/fullstorydev/grpcurl.git
cd grpcurl

Compiler sur un linux générique:

env GOOS=linux GOARCH=arm GOARM=7 make install

Compiler directement sur votre système ARM :

make install

Le fichier compilé du grpcurl se trouve dans un dossier parent du clone du git : ex …/go/bin/linux_arm/grpcurl

Installation :

Dans votre machine qui fait tourner home assistant, créer un dossier qui va servir a accueillir tous fichier téléchargé (et grpcurl compilé pour les arm). Personnellement, j’ai créé un dossier google-home-tracker dans le www du dossier config de HA.
Dans ce dossier, vous devez y retrouver

  • un dossier appelé google
  • get_tokens.py
  • get_tokens.sh
  • grpcurl

Maintenant vous devez éditer les deux fichiers get_tokens.
Dans get_tokens.sh :

  • Remplir la variable hassApiToken avec un jeton longue durée de vie que vous pouvez créer en allant tout en bas de votre profil home assistant : http://HASS-IP/profile
  • Remplir les variable grpCurlPath, protoPath, getTokenScriptPath avec le chemin absolu.
    Attention pour getTokenScriptPath, le chemin s’arrête avant le google (personnellement: /usr/share/hassio/homeassistant/www/google_home_tracker/)
  • Remplir le targetDevices, personnellement j’ai juste mis le nom du google home dans l’app google Home, ex: Salon
  • Vous pouvez utiliser le healthCheck et remplir son healthCheckUrl. Je vous laisse vous renseigner à ce sujet.
    Vous pouvez mettre le healthCheck a false, si vous ne l’utiliser pas.

Dans get_tokens.py :

  • Remplir la variable USERNAME et PASSWORD avec mail et votre app password.

Pour tester, vous pouvez démarrer le script bash get_tokens.sh.
Vous devrez peut installé un module python supplémentaire :

apt install python3-pip
pip3 install gpsoauth

En lançant le script vous devrez obtenir ça comme trace dans votre terminal

Grabbing access token...
Grabbing list of local authentication tokens...
Got authentication token for Salon.
Home assistant keys updated.

Créer une tâche cron pour récupérer chaque heure le token du google home :
Dans votre terminal en root

crontab -e

Ajouter à la fin de la crontab

@hourly /bin/bash /path/to/get_tokens.sh

Maintenant, aller dans votre Developper Tools dans home assistant et chercher l’entity input_text.google_tokens. Vous devrez y voir un token_nom_du_home avec une clé.

Pour finir, ajouter la dernière alarme comme sensor.

platform: command_line
command: "curl --insecure --header \"cast-local-authorization-token: {{ state_attr('input_text.google_tokens', 'token_my-google-home') }}\" https://my-google-home:8443/setup/assistant/alarms"
name: Next Alarm
value_template: >
  {% set alarms = value_json.alarm|sort(attribute='fire_time') %}
  {% if alarms[0] is defined %}
    {{ alarms[0].fire_time }}
  {% else %}
    None
  {% endif %}

On crée un sensor utilisant une commande curl. Ne pas oublier de remplacer ‹ token_my-google-home › par le nom se trouvant dans input_text.google_tokens, et aussi le ‹ my-google-home › de URL par l’adresse IP de votre google home. Redémarrer votre home assistant et mettez une alarme sur votre google home. Maintenant, vous obtenez l’alarme avec le sensor.next_alarm.

Je ne suis pas encore sur de la signification de la valeur obtenu, mais je pense que c’est l’UNIX timestamp a laquelle sonnera l’alarme en . J’éditerai le post si j’en sais plus.

PS : Mon utilité, c’est de récupérer le timer. Je dois encore bien éditer le sensor pour que j’obtienne le minuteur, ce que j’ai pas encore eu le temps de faire. Je voulais automatiser la récupération des tokens des google homes avec home assistant directement et pas avec cron, mais je n’ai pas réussi. Le script se lance mais ne renvoie a de résultat à home assistant.

J’attends vos retour !

EDIT: Pour rendre exploitable la valeur obtenu par le sensor, il faut faire :

states('sensor.next_alarm')|int/1000

ça donnera l’heure réelle a laquelle sonnera l’alarme