Agenda Google et Domoticz Version 2- Partie 2

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 »

Domoticz ID

Domoticz idx

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)

Cal_domoticz

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
  1. domoticz_ip=’192.168.1.82′
  2. domoticz_port=’8080′
  3. user : le user Domoticz si vous avez activé ce mode, laissez à vide si pas géré.
  4. 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&param=switchlight&idx='
json_url2='&switchcmd='
json_url3='&level=0'

# fin du parametrage #
###############  fin des parametres #############################

def maj_switch(idx,etat):

#/json.htm?type=command&param=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 minute2015-01-02 14_56_00

Ici comme il est l’heure (difference = 0) on lance les URL vers Domoticz

2015-01-02 14_57_40et ici une action passée et une action en attente dans 268 minutes

2015-01-02 15_01_23Vé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).

yes

Yesss !!

 

 

 

Pour toute question technique concernant cet article, veuillez utiliser les forum situés à https://easydomoticz.com/forum/
Posted in domoticz, python, scripts.

10 Comments

  1. Bonjour,

    Très intéressant, mais je pense que le fichier getgooglecal.py en lien n’est pas complet !

    Cordialement,

    Archi.

  2. 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

    #!/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’)

  3. 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.

  4. 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

  5. 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)

  6. 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 ? 😉

  7. 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

  8. 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!!

  9. 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

Comments are closed.