Aujourd’hui nous allons voir comment créer un script pour récupérer les prochains événements d’un calendrier Google Agenda dans Jeedom. Le script peut bien sûr être utilisé dans un autre contexte.
Script Google Agenda
Paramétrage du compte Google
Google permet d’utiliser son API avec deux types de comptes. Premièrement nous pouvons créer un client qui va s’authentifier via OAuth2. Cette méthode est utile notamment dans une application qui va récupérer les informations d’un utilisateur. Ce dernier doit donc au préalable donner son consentement sur l’accès à son compte et à ses donnes. Ce type de scénario ne nous convient pas car nous souhaitons exécuter un script « de serveur à serveur », c’est à dire sans interaction humaine.
Le deuxième type d’accès, qui nous intéresse, est via un compte de service. Nous allons donc commencer par en créer un.
Connectons nous à la console développeurs de Google : https://console.developers.google.com/.
A coté du logo vous pouvez créer un nouveau projet. J’ai nommé le mien « Jeedom » car il me sera utile pour tous mes scripts liés à ma domotique.


Nous devons ensuite « activer des API et des services » grâce au bouton en haut à droite de la capture ci-dessus. On recherche alors « Google Calendar API » dans la liste et on l’active.

Nous nous rendons ensuite dans le menu « identifiants » afin de créer notre compte de service. Cet écran liste les comptes existants. Dans notre cas nous cliquons sur « Gérer les comptes de service » (https://console.cloud.google.com/iam-admin/serviceaccounts). Puis nous créons un nouveau compte.

On ne lui donne pas de rôle particulier et on n’autorise pas d’autres utilisateurs à accéder à ce compte (les deux étapes facultatives) mais nous allons créer une clé. L’assistant nous propose de télécharger le fichier json qui contient la clé privée. Nous allons le conserver pour la suite.

Partage du calendrier souhaité
On récupère l’ID du compte de service. Il s’agit d’une adresse mail de la forme bot-jeedom@jeedom-….iam.gserviceaccount.com
Dans Google Agenda nous allons créer un nouveau calendrier en cliquant sur le + à coté de « Autres agendas ». Pour être original nous allons l’appeler … »Jeedom » !

Nous devons ensuite partager ce calendrier avec le compte de service. Pour cela on clic sur les trois petits points à droite du calendrier et on choisit « Paramètres et partage ». Dans la section « Partager avec des personnes en particulier » nous pouvons ajouter l’ID de compte de service pour lui permette d' »Afficher les détails des événements ».
On en profite également pour noter l’ID de l’agenda. Vous le trouverez sur le même écran de paramètres, dans la section « Intégrer l’agenda ».
C’est bon notre compte de service peut donc accéder au calendrier et au détails des événements. Il ne nous reste plus qu’à créer le script pour automatiser tout çà !
Création du script PHP
Un commence par se connecter au serveur en SSH. Dans le cas de jeedom, nous allons créer un dossier dans /var/www/html/plugins/script/core/ressources
cd ~
mkdir scripts
cd scripts
mkdir googlecalendar
cd googlecalendar
Nous avons besoin de la bibliothèque Google qui va nous permettre d’interroger l’API. Pour cela nous l’installons via composer :
composer require google/apiclient:^2.0
On upload ensuite le fichier de clé Google dans le même dossier et on le renomme credentials.json
On créé ensuite notre script :
vi getgoogleevent.php
<?php
if (!isset($argv[1])) {
throw new Exception('You must pass calendar id');
}
$calendarId = $argv[1];
require __DIR__ . '/vendor/autoload.php';
function getClient()
{
$client = new Google_Client();
$client->setApplicationName('Jeedom Google API');
$client->setScopes(Google_Service_Calendar::CALENDAR_READONLY);
$client->setAuthConfig(__DIR__.'/credentials.json');
return $client;
}
$client = new Google_Client();
$client->setApplicationName('Jeedom Google API');
$client->setScopes(Google_Service_Calendar::CALENDAR_READONLY);
$client->setAuthConfig(__DIR__.'/credentials.json');
$service = new Google_Service_Calendar($client);
$results = $service->events->listEvents($calendarId, [
'maxResults' => 10,
'orderBy' => 'startTime',
'singleEvents' => true,
'timeMin' => date('c'),
]);
$events = $results->getItems();
if (empty($events)) {
print "No upcoming events found.\n";
} else {
foreach ($events as $event) {
$start = $event->start->dateTime;
if (!empty($event->start->dateTime)) {
$start = \DateTime::createFromFormat('Y-m-d\TH:i:sP', $event->start->dateTime)->format('d/m H:i');
} else {
$start = \DateTime::createFromFormat('Y-m-d', $event->start->date)->format('d/m');
}
printf("[%s] %s\n", $start, $event->getSummary());
}
}
Le code ci-dessus attend en paramètre l’ID du calendrier à lire.
Il instancie ensuite un Google_Client qui va nous permettre d’interroger l’API avec le fichier credentials.json qui contient la clé privée.
Nous utilisons ensuite un Google_Service_Calendar pour lister les événements.
La fin du script est perfectible mais il permet de formater les 10 prochains événements sous la forme [jour/mois heure:minutes] titre de l’événement.
Au final vous devriez avoir les éléments suivants :
$ ls /home/pi/scripts/googlecalendar
composer.json composer.lock credentials.json getgoogleevent.php vendor
Nous pouvons dors et déjà utiliser notre script en utilisant l’ID de calendrier :
$ php getgoogleevent.php XXXXXXXXXXXXXX@group.calendar.google.com
[30/05 10:00] Evénement 1
[14/06 11:00] Evénement 2
[25/10] Heure d'hiver
...
Intégration dans Jeedom
Nous allons utiliser un script bash qui va nous permettre de lancer le script PHP et de faire autre chose comme changer le format, filtrer sur uniquement la date du jour, etc …
Toujours en SSH, on va donc créer le script comme ceci :
cd /home/pi/scripts
vi getgoogleevent.sh
#!/bin/bash
php /home/pi/scripts/googlecalendar/getgoogleevent.php $1 | sed ':a;N;$!ba;s#\n#<br>#g;s#^<br>##g'
Ce bash permet d’appeler le script PHP avec en paramètre le premier argument. Il remplace ensuite les \n par des <br> pour un affichage en mode html.
Rendons nous dans l’IHM Jeedom désormais. Nous utilisons le plugin script (https://jeedom.github.io/plugin-script/fr_FR/).
On créé donc un nouveau script dont la commande sera la suivante :
– type : info / autre
– requête : /home/pi/scripts/getgoogleevent.sh XXXXXX@group.calendar.google.com (avec XXXXXX@group.calendar.google.com l’ID de votre calendrier)

On enregistre tout et si on clic sur tester …

Dernier point, nous retournons sur l’onglet « Equipement » pour régler la valeur de « Auto-actualisation (cron) ». En cliquant sur l’aide je choisi :

Et voila ! Notre script est fonctionnel et sera mis à jour toutes les heures.