Suite du premier article sur les calendriers google https://easydomoticz.com/agenda-google-et-domoticz-version-2-partie-1/ ou nous avions installé et configuré un agenda google spécifique au pilotage de Domoticz, nous continuons ici avec la mise en place des liens entre l’agenda et Domoticz via des scripts python.
Très long article, bon courage
Comment çà marche ?
Il suffira d’introduire des actions destinées à nos interrupteurs Domoticz dans un agenda google sous la forme IDX=etat , un premier script python à lancer une fois par jour récupérè toutes les actions de la journée, un autre script lancé toutes les minutes exécute les commande à l’heure prévue
Deux façon de donner des ordres via le calendrier sont actuellement acceptées :
- Une simple commande faisant appel à un seul IDX Domoticz et l’état souhaité (On/Off) Ex: 14=On
- Une commande multiple pilotant plusieurs IDX Domoticz, Exemple : 14;17;18=On
Rappel : les IDX sont indiqués dans « Configuration », « Périphériques »
N.B :
- les commandes on/off ne sont pas sensibles à la casse.On ,ON, off,OfF,Off sont fonctionnels.
- les heures de fin de l’agenda google ne sont pas utilisées , il faudra faire un IDX=off pour éteindre à l’heure désirée.
- Les IDX ne sont pas vérifiés, appliquez vous.
I – Le calendrier Google.
Connectez vous à votre compte gmail et dans le calendrier Domoticz ajoutez des événements sous la forme IDX=etat POUR AUJOURD’HUI ou plus tard (pas pour hier SVP)
Vérifions si le raspi sait lire les infos en question
gcalcli --cal=Domoticz agenda --tsv --military
nous affiche nos commandes
2015-01-02 16:30 2015-01-02 17:30 14=On 2015-01-02 19:30 2015-01-02 20:30 45;16=Off
Si ceci fonctionne passons à la suite
II – Les programmes python
J’ai découpé la gestion de l’agenda en deux programmes python :
- un premier programme chargé de lire les actions à faire dans la journée, nommé ici getgooglecal.py
- un second qui, lancé toutes les minutes, exécute les actions à l’heure prévue (cal_action.py)
III – Récupération du calendrier journalier.
Le programme suivant se connecte à un agenda google, récupère les taches de la journée (00:00-23:59) et place tout cela dans un fichier texte qui sera relu toutes les minutes par un deuxième programme.
Il se nomme getgooglecal.py pour moi
Les paramètres à définir sont en tête du programme à adapter suivant vos besoins
- On trouve le nom du calendrier google qui contient les actions Domoticz
domoticz_cal= »Domoticz » - Le fichier texte généré et son chemin
rep= »/var/tmp/ »
file= »googlecal.txt » - Une variable d’affichage permettant de savoir ce qui cloche à passer à 1
#debug = 1 on affiche les chaines de caracteres recues
debug=0
#!/usr/bin/python # -*- coding: utf-8 -*- # ce programme interroge l agenda google et renvoie les taches du jour # dans un fichier texte import time import os ############# Parametres ################################# # on utilise gcalcli qui doit etre installe # Nom du calendrier google qui contient les actions Domoticz domoticz_cal="Domoticz" #options de la ligne de commande cf doc google options="--tsv --military" agenda_start="00:00" agenda_end="23:59" # fichier et chemin pour agenda rep="/var/tmp/" file="googlecal.txt" #debug = 1 on affiche les chaines de caracteres recues debug=0 # fin du parametrage # ############### fin des parametres ############################# datej=time.strftime('%Y%m%d',time.localtime()) #gcalcli --cal=Domoticz agenda '20141230T00:00' '20141230T23:59" --tsv --military lignecde="gcalcli --cal="+domoticz_cal+" agenda "+"'"+datej+"T"+agenda_start+"' '"+datej+"T"+agenda_end+"' "+options lignecde=lignecde+" > "+rep+file os.system(lignecde) if debug!=0: print datej print lignecde os.system ('cat /var/tmp/googlecal.txt')
Le programme se trouve ici https://easydomoticz.com/scripts/getgooglecal.py
Téléchargez et recopiez le dans /home/pi/domoticz/scripts
Un chmod +x sur ce fichier, un ./votrefichier.py
puis un cat /var/tmp/googlecal.txt doit afficher
2015-01-02 15:00 2015-01-02 16:00 14;18=On 2015-01-02 19:30 2015-01-02 20:30 45;16=Off
ou mettez dans le script debug=1 (repassez à 0 après)
Plaçons cela dans un crontab -e tous les jours a 00:02
00 02 * * * sudo /home/pi/domoticz/scripts/getgooglecal.py
Attention : si des modifs sont faites dans le calendrier google pour la journée en cours et si le script n’est pas relancé on ne les récupèrera pas.
Dans ce cas , lancez le manuellement ou changez dans le crontab pour le lancer plus fréquemment.
IV – Le programme des actions
Le fichier texte indique quoi faire et quand, le programme suivant va lire ce fichier et lancer les commandes Domoticz grâce à l’API JSON.
Ce programme nécessite le module python requests
sudo pip install requests
Les paramètres à définir sont en tête du programme à adapter suivant vos besoins
- Le fichier texte généré et son chemin : LE MEME que dans le soft précédent 🙂
rep= »/var/tmp/ »
file= »googlecal.txt » - Ce debug est volontairement TRES bavard il montre toutes les données reçues
- Une variable d’affichage permettant de savoir ce qui cloche à passer à 1
#debug = 1 on affiche les chaines de caractères reçues
debug=0 - les paramètres de Domoticz
- domoticz_ip=’192.168.1.82′
- domoticz_port=’8080′
- user : le user Domoticz si vous avez activé ce mode, laissez à vide si pas géré.
- password le mot de passe associé, laissez à vide si pas géré.
#!/usr/bin/python # -*- coding: utf-8 -*- # il faut le module requests # sudo pip install requests # on lit le fichier genere par getgoovlecal.py # dans le calendrier google on fait soit # idx=etat (14=On ou 44=Off) # # ou idx1;idx2;idx3=etat # 25/01/15 correction pour mode debug qui lance la cde alors que le mode ss debug non # 25/01/15 mode auth pour identification Domoticz import time import os import requests from requests.auth import HTTPBasicAuth import csv from collections import namedtuple from datetime import datetime ############# Parametres ################################# # fichier et chemin pour agenda rep="/var/tmp/" file="googlecal.txt" # seuil pour declemecnhemnt des actions # c'est la tolerance autour de l'heure prevue par rapport a l'heure exacte # cest a dire que X secondes AVANT l heure prevue on declenche seuil=10 #a cause du declenchelent de crontab qui a lieu entre 0 et 5sec apres l'heure prevue # un crontab programme toutes les minutes peut se declencher a 1min0sec, 1min1sec ,1min2sec ... 1min5sec # donc on gere un seuil de X secondes APRES l'heure prevue # si declenchement tt les minutes dans crontab # si le seuil est a 10 sec # l'action pourra se declencher 1O secondes avant # et si c'est croontab qui declcenche on laisse 10 secondes APRES #debug = 1 on affiche les chaines de caracteres recues debug=1 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # les parametres de Domoticz # adaptez a vos ip et mots de passe # mettez user='' # et password='' # si vous n avez pas de user/password pour vous indentifier dans domoticz #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ domoticz_ip='192.168.1.82' domoticz_port='8080' user='pm' password='123456' # l URL Domoticz est construite dans maj_switch pour allumer/eteidndre # avec les bouts ci dessous json_url1='/json.htm?type=command¶m=switchlight&idx=' json_url2='&switchcmd=' json_url3='&level=0' # fin du parametrage # ############### fin des parametres ############################# def maj_switch(idx,etat): #/json.htm?type=command¶m=switchlight&idx=&switchcmd=&level=0 requete='http://'+domoticz_ip+':'+domoticz_port+json_url1+idx+json_url2+etat+json_url3 r=requests.get (requete,auth=HTTPBasicAuth(user,password)) if debug!=0: print "______________________________________________________________" print "" print ("URL= :",requete) print (" le serveur Domoticz dit : ",r) print "" print "###############################################################" def debugmode(): print "" print "###############################################################" print "" print ("le fichier dit que l'action ",r.action,"debute a ",r.heuredeb,"le :",r.datedeb) print ("heure declenchement ",heure_action) print ("il est ",present) print ("difference en secondes",diffsecondes) print "" print "" # main # reader = csv.reader(open(rep+file),delimiter='\t') rec=namedtuple('rec','datedeb heuredeb datefin heurefin action') for r in map(rec._make,reader): date_action=r.datedeb+" "+r.heuredeb heure_action= datetime.strptime(date_action,"%Y-%m-%d %H:%M") present=datetime.now() diffsecondes=(heure_action-present).seconds # diffsecondes=4 if (diffsecondes < seuil or (diffsecondes> 86400-seuil and diffsecondes <86400)): if debug!=0: debugmode() todo=r.action.split("=") idx=todo[0] etat=todo[1].capitalize() if ";" in idx: #print "multiples idx" midx=idx.split(";") for each_idx in midx: print (" IDX : ",each_idx) if (etat=="On" or etat=="Off"): if debug!=0: print "" print "ok actions a faire" print ("idx=",each_idx) print ("etat=",etat) print "" maj_switch(each_idx,etat) else: if (etat=="On" or etat=="Off"): if debug!=0: print "" print "ok actions a faire" print ("idx=",idx) print ("etat=",etat) print "" maj_switch(idx,etat) else: if debug!=0: print "Rien a faire /nothing to do/wir haben nichts damit zu tun" debugmode()
- Éventuellement l’URL JSON utilisée pour activer/désactiver
Téléchargez le programme ici https://easydomoticz.com/scripts/cal_action.py
Recopiez le dans /home/pi/domoticz/scripts
Pour tester passez le debug à 1
on peut faire un chmod +x, puis un ./votreprg.py
Pour moi il se nomme cal_action.py
Lancez ./cal_action.py pour voir ce qui ce passe
V – le debug
Le mode debug affiche les données récupérées du fichier texte et les actions à faire
Ici par exemple on à des switchs à basculer dans 1 minute
Ici comme il est l’heure (difference = 0) on lance les URL vers Domoticz
et ici une action passée et une action en attente dans 268 minutes
Vérifiez que Domoticz se comporte comme voulu puis repassez le debug à 0.
VI – Crontab
Etape finale , lancer ce script toutes les minutes par crontab -e
*/1 * * * * sudo /home/pi/domoticz/scripts/cal_action.py
VII – Conclusion
J’ai élaboré ces scripts pour pallier au changement de comportement de l’API google , je ne suis pas un professionnel de la programmation, il répondent à mon besoin et fonctionnent comme je l’entends.
J’espère qu’il en sera de même pour vous, toutes les améliorations, corrections, optimisations m’intéressent et j’essaierai de prendre en compte vos remarques pour faire évoluer les outils (merci d’utiliser le forum pour cela, il y a un sujet sur les calendrier google).
Bonjour,
Très intéressant, mais je pense que le fichier getgooglecal.py en lien n’est pas complet !
Cordialement,
Archi.
Bonjour,
le script est tout petit il se contente de recuperer la date du jour et de lancer l’url google cal, le voici ici dessous
Très bons tutos (1 et 2) qui fonctionnent parfaitement sans avoir à modifier grand chose dans les scripts (ip user et mdp de domoticz seulement).
Une petite amélio, utiliser les noms des dispositifs plutôt que les ID. L’agenda y gagnerait en lisibilité.
Beau travail et merci.
L’intérêt d’utiliser les idx est de passer outre le nommage des éléments -majuscules/minuscules, accents,espaces)
Donc en effet moins lisibles dans l’agenda mais au combien plus sécure
Mais en effet pourquoi ne pa imaginer d’utiliser le nom Domoticz dans l’agenda et le script irait chercher si il y a un idx qui y correspond sinon exit
Je le note dans la todo list
Et merci pour le compliment concernant les 2 tutos
Très bon tuto. J’ai eu un peu de mal avec les droits, mais c’est résolu.
Juste un petit problème chez moi quand la connexion internet ne fonctionne plus.
Le fichier se vide et là, c’est un peu le bazar.
J’ai ajouté une ligne qui ping afin de vérifier la connexion.
Il faudrait que j’ajoute une ligne en cas de connexion correcte mais de bande passante occupée. (et donc de fichier vide)
Super Tuto, un grand merci !
Pour info en lançant en manuelle la récupération de l’agenda, j’obtiens cette alerte :
pi@domoticzpi ~/domoticz/scripts $ sudo /home/pi/domoticz/scripts/getgooglecal.py
WARNING:root:This function, oauth2client.tools.run(), and the use of the gflags library are deprecated and will be removed in a future version of the library.
une petite maj à venir ? 😉
Idem que le précédent commentaire sur le message de google
S’lut, j’ai eu le meme probleme, et quand tu verifie dans le Fichier googlecal.Txt, il informe simplement qu’il faut se réautentifier, avec l’instruction
gcalcli agenda –noauth_local_webserver (Cfr Partie 1), on remet le code et c’est repartit.
J’ai utilisé ce systeme pour commander un Veralite, car le Gcal de la vera déconnait.
Pour l’instant sa fonctionne. On vera la suite
Bonjour,
Le problème que vous avez eu Sylvain et Olivier, c’est parce que vous utilisez l’utilisateur pi quand vous vous authentifiez et lorsque vous faîtes appel au script « getgooglecal.py », vous utilisez root! Ce sont deux utilisateurs différents et google n’a pas les autorisations!
Faîtes
sudo gcalcli agenda –noauth_local_webserver
Et là plus de problème!
Bonne soirée!!
Très bon tuto!
Je ne suis pas super calé en programmation.
Aurais tu un bout de programme pour seulement mettre à jour un widget texte avec les événements du jour.
Merci bcp