Re: calendrier google
Publié : 07 août 2016, 11:46
Bonjour,
non moi ça marche toujours...
Je viens de tester à l'instant.
David.
non moi ça marche toujours...
Je viens de tester à l'instant.
David.
Reprenez le contrôle de votre domotique
https://easydomoticz.com/forum/
peux tu préciser la fonction de gcalcli qui ne fonctionne pas chez toicyberfilou a écrit :S'lut a tous,
avez vous le meme probleme que moi et gcalcli qui ne fonctionne plus ?
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 &
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)Code : Tout sélectionner
user="yourUser"
lignecde="gcalcli --calendar "..domoticz_cal.." agenda ".."'"..agenda_start.."' '"..agenda_end.."' "..options
lignecde="su " ..user.." -c '" ..lignecde .."'"
lignecde=lignecde.." > "..repertoire..file.." &"
Neutrino a écrit :Bonjour,
J'ai fait un script "hybride".
Je me suis basé sur l'étape 1 du site, mais ensuite, j'ai remplacé le python par du LUA.
Je peux appeler un interrupteur par son nom et non par l'IDX, par ex : Lumière Salon = On.
Une plage 'On' pendant 1H, allumera l'interrupteur pendant 1H.
Une plage 'ON', peu importe la durée, allumera l'interrupteur.
Voici mon script_time_calendrier.lua :Ainsi, le calendrier allume la lumière automatiquement. Si je l'éteins, elle ne se rallumera pas.Code : Tout sélectionner
--------------------------------- -- Script de lecture de calendrier Google. -- Actionne un interrupteur ou remplie un capteur virtuel Text -- Auteur : Aurelien Neutrino -- Date : 29 Novembre 2015 -- Nécessite un capteur virtuel de type Text -- Il faut suivre la source suivante et s'arrêter à la fin de l'étape 1 -- source : -- http://easydomoticz.com/agenda-google-et-domoticz-version-2-partie-1/ --------------------------------- commandArray = {} --Récupère l'heure et la date actuelle time = os.time() minutes=tonumber(os.date('%M',time)) hours=tonumber(os.date('%H',time)) jour = os.date('%d',time) --Nombre de minutes depuis 00:00 maintenant=tonumber(hours*60+minutes) --idx et nom du capteur Text idxText = '133' nomText="Pense-bête" --nom de l'agenda google domoticz_cal="maison" --fichier et chemin pour agenda repertoire="/home/pi/" file="googlecal.txt" -- Toutes les heures, on récupère l'agenda de la journée if(maintenant%60==0)then options="--tsv --military" agenda_start="00:00" agenda_end="23:59" lignecde="sudo gcalcli --cal="..domoticz_cal.." agenda ".."'"..agenda_start.."' '"..agenda_end.."' "..options lignecde=lignecde.." > "..repertoire..file.." &" os.execute(lignecde) end local file = io.open(repertoire..file, "r") -- Ouvre le fichier en mode lecture local ligne = {} -- Table pour les lignes du fichier if(file~=nil)then --le fichier n'est pas vide for line in file:lines() do -- Pour chaque lignes table.insert(ligne, line) -- On insère les lignes dans la table end end for i, v in ipairs(ligne) do -- Lecture de la table des RDV dateDebut,heureDebut,minutesDebut,dateFin,heureFin,minutesFin,action = v:match("([^;]+)\t([^;]+):([^;]+)\t([^;]+)\t([^;]+):([^;]+)\t([^;]+)") action = action:gsub(" = ","=") debutAction = heureDebut*60+minutesDebut finAction = heureFin*60+minutesFin anneeAction,moisAction,jourAction = dateDebut:match("([^;]+)-([^;]+)-([^;]+)") if(action:find("=")~=nil and jourAction == jour)then --L'action contient "=", c'est un interrupteur à actionner print("Action : "..action) print(maintenant.." : "..debutAction) interrupteur,etat=action:match("([^;]+)=([^;]+)") if(otherdevices[interrupteur]~=nil and(etat=='On' or etat=='Off' or etat=='ON' or etat=='OFF')and debutAction==maintenant)then --L'interrupteur existe, l'état souhaité est reconnu if(etat=='On'or etat=='Off')then if(dateDebut~=dateFin)then --l'action finit demain finAction=finAction+(24*60) end print(interrupteur.." passe à "..etat.." pendant "..tostring(finAction-maintenant).." minutes") commandArray[interrupteur]=etat.." FOR "..tostring(finAction-maintenant) if(otherdevices_svalues[nomText]=='')then --Aucun pense-bête actuellement renseigné, on affiche l'action en cours. --L'affichage d'un pense-bête est prioritaire sur l'affichage d'un changement d'état print("pense-bête : "..action) commandArray['UpdateDevice']=idxText.."|0|"..action end elseif(etat=='ON')then --ON (tout en majuscule) siginifie que l'action n'a pas de fin print(interrupteur.." passe à On") commandArray[interrupteur]='On' elseif(etat=='OFF')then --OFF (tout en majuscule) siginifie que l'action n'a pas de fin print(interrupteur.." passe à Off") commandArray[interrupteur]='Off' else --Etat non reconnu, on force l'interrupteur print(interrupteur.." passe à "..etat) commandArray[interrupteur]=etat end elseif(otherdevices[interrupteur]==nil and debutAction==maintenant)then --L'interrupteur n'existe pas, on affiche le pense-bête commandArray['UpdateDevice']=idxText.."|0|"..action elseif(finAction==maintenant and action == otherdevices_svalues[nomText])then --L'action est terminée, on l'efface commandArray['UpdateDevice']=idxText.."|0| " end elseif(debutAction==maintenant and jourAction == jour)then --L'action ne correspond pas à un interrupteur à actionner, c'est donc un pense-bête, on l'affiche pendant la durée souhaitée commandArray['UpdateDevice']=idxText.."|0|"..action elseif(finAction==maintenant and action == otherdevices_svalues[nomText])then --L'action est terminée, on l'efface commandArray['UpdateDevice']=idxText.."|0| " end end return commandArray
Code : Tout sélectionner
agenda_start="00:00"
agenda_end="23:59"Code : Tout sélectionner
pi@raspberrypi ~/domoticz/scripts/lua $ ./script_time_calendrier.lua
./script_time_calendrier.lua: line 2: commandArray: command not found
./script_time_calendrier.lua: line 4: syntax error near unexpected token `('
./script_time_calendrier.lua: line 4: `time = os.time()'
Code : Tout sélectionner
commandArray = {}
time = os.time()
minutes=tonumber(os.date('%M',time))
hours=tonumber(os.date('%H',time))
jour = os.date('%d',time)
maintenant=tonumber(hours*60+minutes)