Code : Tout sélectionner
sudo gcalcli listCode : Tout sélectionner
sudo gcalcli listbruch05 a écrit :Bonsoir,
Voici une version améliorée de la précédente. Se lance au boot du NAS via le script Google-Calendar.sh dans /usr/local/etc/rc.d.
Le script Python Google-Calendar-V1r8.py s'exécute indéfiniment avec une boucle interne.Code : Tout sélectionner
#!/bin/sh cd /volume1/@appstore/domoticz/var/scripts/python python Google-Calendar-V1r8.py >>Google-Calendar-V1r8.txt 2>&1 </dev/null &
Les évènements dans Google Calendar doivent être sous la forme suivante
DZ:Nom du Device[commande]
Exemple "DZ:Volet Chambre Marie[On]"
Code : Tout sélectionner
#!/usr/bin/env python # -*- coding: utf-8 -*- #*************************************************************** # Gestion des évènements Google #*************************************************************** __namescript__='Google-Calendar-V1r8' __author__= 'CBR' __version__= '1.8' __status__= 'Exploitation' __created__='13/02/16' __modified__='15/11/16' # The client_id and client_secret are copied from the API Access tab on # the Google APIs Console # client_id='3762XXXX9069-he7me0mh7kq23jgpnouec518XXXXXXX.apps.googleusercontent.com', # client_secret='XXXXkLW5Cwq6V_EEXCx1lGEu', # # Les évènements dans Google Calendar doivent être sous la forme suivante. # DZ:Nom du Device[commande] # Exemple DZ:Volet Chambre Marie[On] # #import pdb # Chargement du module Debug Python si nécessaire import sys import datetime import time import pytz import re import ConfigParser import json import requests from requests.auth import HTTPBasicAuth import httplib2 from oauth2client import client from apiclient.discovery import build from oauth2client.file import Storage from oauth2client.client import OAuth2WebServerFlow #------Paramètres généraux ---------- domoticz_ip='192.168.0.252' domoticz_port='8084' user='' password='' #------Variables Globales ---------- trace=1 # Affichage message Debug deviceidx=[] devicename=[] #********************************************* # Debug Output #********************************************* def DebugPrint(chaine,valeur): if trace == 1: print ("Debug Google Calendar : " + str(chaine) + " : " + str(valeur)) #***************************************************************** # Renvoie le nombre de secondes d'une date ISO 2016-04-09T14:52:00 #***************************************************************** def Secondes(s): heure=s[8:10]+"/"+s[5:7]+"/"+s[0:4]+" "+s[11:19] DebugPrint("Heure",heure) d = datetime.datetime.strptime(heure, "%d/%m/%Y %H:%M:%S") r = time.mktime(d.timetuple()) return (r) #********************************************* # Ecriture Device Domoticz #********************************************* write_url_text1='/json.htm?type=command¶m=' write_url_text2='&idx=' write_url_text3='&' def WriteDevice(domoticz_idx,param,val): requete='http://'+domoticz_ip+':'+domoticz_port+write_url_text1+param+write_url_text2+str(domoticz_idx)+write_url_text3+val DebugPrint("WriteDevice Requete", requete) r=requests.get(requete,auth=HTTPBasicAuth(user,password)) DebugPrint("WriteDevice Return", r) if r.status_code != 200: ErrorPrint ("-1-Erreur Lecture API Domoticz") return("KO") else: return("OK") #********************************************* # Lecture Device Domoticz #********************************************* read_url_text1='/json.htm?type=devices&rid=' def ReadDevice(domoticz_idx,param): requete='http://'+domoticz_ip+':'+domoticz_port+read_url_text1+str(domoticz_idx) DebugPrint("ReadDevice Requete", requete) r=requests.get(requete,auth=HTTPBasicAuth(user,password)) DebugPrint("ReadDevice Return", r) domoticzjson=r.json() for i, v in enumerate(domoticzjson["result"]): val= domoticzjson["result"][i][param] if r.status_code != 200: ErrorPrint ("-2-Erreur Lecture API Domoticz") return("KO") else: return(val) #******************************************************************* # Construction liste Device Switch Domoticz # Cette liste permet de retrouver l'IDX en fonction du nom de device #******************************************************************* read_url_text1='/json.htm?type=command¶m=getlightswitches' # URL pour énumérer liste device type Switch def ReadDeviceList(): requete='http://'+domoticz_ip+':'+domoticz_port+read_url_text1 DebugPrint("ReadDevice Requete", requete) r=requests.get(requete,auth=HTTPBasicAuth(user,password)) DebugPrint("ReadDevice Return", r) # On récupère la liste dans "r" domoticzjson=r.json() for i, v in enumerate(domoticzjson["result"]): # On balaie la liste pour stocker les noms devicename.append(domoticzjson["result"][i]['Name']) # On ajoute le nom du device à la liste for i, v in enumerate(domoticzjson["result"]): # On balaie la liste pour stocker les IDX deviceidx.append(domoticzjson["result"][i]['idx']) # On ajoute l'IDX du device à la liste DebugPrint(i, devicename[i] + " : " + deviceidx[i]) if r.status_code != 200: ErrorPrint ("-3-Erreur Lecture API Domoticz") return("KO") else: DebugPrint("==============================","================================") return(i) #********************************************* # Main fonction #********************************************* while True: DebugPrint("*********************************** DEBUT","***********************************") #pdb.set_trace() # Activation du mode Debug Python #Alimentation liste des devices de type Switchs #Si la constuction de la liste plante, on sort if ReadDeviceList() == "KO" : sys.exit(0) # Définition NOW au format ISO now = datetime.datetime.now(pytz.timezone('Europe/Paris')).isoformat() DebugPrint("now",now) # NOW en nombre de secondes nowsec=Secondes(now) DebugPrint("nowsec",nowsec) # Authenticate and construct service. # Set up a Flow object to be used if we need to authenticate. This # sample uses OAuth 2.0, and we set up the OAuth2WebServerFlow with # the information it needs to authenticate. Note that it is called # the Web Server Flow, but it can also handle the flow for native # applications FLOW = OAuth2WebServerFlow( client_id='3762XXXXX069-he7me0mh7kq23jgpnouec518cv7v56ma.apps.googleusercontent.com', client_secret='XXXXXW5Cwq6V_EEXCx1lGEu', scope='https://www.googleapis.com/auth/calendar', user_agent='Domoticz/1.0') # If the Credentials don't exist or are invalid, run through the native client # flow. The Storage object will ensure that if successful the good # Credentials will get written back to a file. storage = Storage('calendar.dat') credentials = storage.get() DebugPrint("credentials",credentials) if credentials is None or credentials.invalid == True: credentials = run(FLOW, storage) # Create an httplib2.Http object to handle our HTTP requests and authorize it # with our good Credentials. http = httplib2.Http() http = credentials.authorize(http) # Build a service object for interacting with the API. Visit # the Google APIs Console # to get a developerKey for your own application. service = build(serviceName='calendar', version='v3', http=http, developerKey='YOUR_DEVELOPER_KEY') # Construction liste des 30 évènements à venir eventsResult = service.events().list( calendarId='primary', timeMin=now, maxResults=10, singleEvents=True, orderBy='startTime').execute() events = eventsResult.get('items', []) if not events: DebugPrint("No upcoming events found.","") # Pas d'évènement ! DebugPrint("################################### FIN","###################################") time.sleep(60) else: # On énumère chaque évènement for event in events: start = event['start'].get('dateTime', event['start'].get('date')) chaine = start + event['summary'] if (chaine[25:28]) == "DZ:": DebugPrint("==============================","================================") DebugPrint("chaine",chaine) #2016-04-06T22:35:00+02:00DZ:Volet Marie[Off] eventsec=Secondes(chaine[0:19]) # Date Event en nombre de secondes DebugPrint("eventsec",eventsec) deltasec=abs(eventsec-nowsec) # Calcul de l'écart en secondes entre NOW et Event DebugPrint("deltasec",deltasec) DZdevice=chaine[28:chaine.index("[")] # On extrait le nom du device de l'Event DebugPrint("DZdevice",DZdevice) DZcommand=chaine[chaine.index("[")+1:chaine.index("]")] # On extrait le nom de la commande de l'Event DebugPrint("DZcommand",DZcommand) DeviceAvailable=1 # On positionne le device par défaut comme existant dans Domoticz try: index=devicename.index(DZdevice) # On cherche le device de l'Event dans la liste des devices Domoticz idx=deviceidx[index] # si le device est connu, on récupère l'IDX domoticz DebugPrint("idx", idx) except Exception, e: # Dans le cas ou le device de l'Event n'est pas dans Domoticz DebugPrint("erreur", e) DeviceAvailable=0 # On positionne le device comme n'existant pas Domoticz DebugPrint("Erreur : ","Device inconnu") pass if DeviceAvailable==1 and deltasec < 65: # On traite l'action si le device de l'Event existe et si l'écart en sec est < à 35s DebugPrint("Action : ", DZdevice + " : " + DZcommand) Status=WriteDevice(idx,"switchlight","switchcmd="+DZcommand) DebugPrint("################################### FIN","###################################") time.sleep(60)