calendrier google
Re: calendrier google
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.
-
Chris54220
- Messages : 124
- Inscription : 20 mars 2016, 20:54
- Localisation : Nancy
Re: calendrier google
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 ?
Re: calendrier google
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.
Les évènements dans Google Calendar doivent être sous la forme suivante
DZ:Nom du Device[commande]
Exemple "DZ:Volet Chambre Marie[On]"
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.
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)Re: calendrier google
Impossible de récupérer le calendrier et le mettre dans le fichier txt a partir du script lua. Pourtant la ligne de commande fonctionne parfaitement dans le terminal. Mais a partir du script le fichier txt est vide.
Incompréhensible.
Incompréhensible.
Re: calendrier google
Bonjour,
Petite remarque sur le script, évite de passer par sudo, et utilise plûtot un utilisateur standart :
Il faut placer le fichier ".gcalcli_oauth" dans le home de ton utilisateur.
Merci pour le script.
Petite remarque sur le script, évite de passer par sudo, et utilise plûtot un utilisateur standart :
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.." &"
Merci pour le script.
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
Re: calendrier google
Bonjour,
Si je comprend bien les tutos, discussions, scripts les événement sont affichés à partir de l'heure à laquelle ils débutent?
Je souhaiterais pour ma part récupérer à 0h00 tous les événements (quelque soient leurs heures) contenus dans la journée pour les afficher dans un widget texte (le fameux pense bête).
Est ce possible, est ce que l'un d'entre vous l'a réalisé?
merci bcp
Si je comprend bien les tutos, discussions, scripts les événement sont affichés à partir de l'heure à laquelle ils débutent?
Je souhaiterais pour ma part récupérer à 0h00 tous les événements (quelque soient leurs heures) contenus dans la journée pour les afficher dans un widget texte (le fameux pense bête).
Est ce possible, est ce que l'un d'entre vous l'a réalisé?
merci bcp
Re: calendrier google
Le script récupère déjà tous les événements de la journée.
Le fait de le lancer toutes les heures permet de récupérer des événements ajouter en cours de journée.
Code : Tout sélectionner
agenda_start="00:00"
agenda_end="23:59"Re: calendrier google
Merci pour ta réponse, du coup j essaie ton script et là c'est le drame !
il me renvoie quelques erreurs :
scripts (pour visualiser les lignes)
jamais eut de soucis avec les scripts LUA...une idée?
il me renvoie quelques erreurs :
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)Re: calendrier google
Le script fonctionne dans domoticz, il ne se lance pas dans le terminal.
Re: calendrier google
ah ouai pas dans le terminal !! j avais jamais essayé sur un script LUA...
autant pour moi.
ceci dit cela ne fonctionne pas.
Je n'ai rien qui remonte dans le fichier .txt
Le 1er script du tuto partie 2 fonctionne (les événements sont récupérés), donc pas de soucis à priori d'installation...
dans les logs domoticz j'ai : 2017-03-25 17:52:00.295 LUA: MAJ Calendrier famille
merci pour l aide
ceci dit cela ne fonctionne pas.
Je n'ai rien qui remonte dans le fichier .txt
Le 1er script du tuto partie 2 fonctionne (les événements sont récupérés), donc pas de soucis à priori d'installation...
dans les logs domoticz j'ai : 2017-03-25 17:52:00.295 LUA: MAJ Calendrier famille
merci pour l aide