Page 8 sur 8

Re: calendrier google

Publié : 25 mars 2017, 18:52
par Neutrino

Code : Tout sélectionner

sudo gcalcli list
Cette commande te renvoie qquelque chose ?

Re: calendrier google

Publié : 25 mars 2017, 23:03
par fab0030
Il a fallu que je redonne l autorisation!??
J ai bien ma liste de calendriers dont celui que je souhaite utiliser.
Mais toujours rien dans fichier txt

Re: calendrier google

Publié : 25 mars 2017, 23:44
par fab0030
Relu le forum, J ai viré le début de la lignecmd : utf8...., et le fichier txt se met à jour...on avance ! Mais pas le device texte dans domoticz :?

Re: calendrier google

Publié : 26 mars 2017, 00:00
par Neutrino
Le device text n'affiche l'événement en cours qu'au moment voulu.
Le but de ce script est de modifier l'état des interrupteurs ou d'afficher un pense-bête à l'heure souhaitée.

Re: calendrier google

Publié : 26 mars 2017, 00:36
par fab0030
ok merci Neutrino cela fonctionne !!
Si le script est très bien, mon besoin est un pense bête pour la journée, donc pouvoir reprendre l'ensemble du fichier googlecal.txt dans un device txt.
A priori c'est plus simple que ton script...mais encore compliqué pour moi...vais essayer

Re: calendrier google

Publié : 26 mars 2017, 09:34
par vil1driver
Mets le widget Google calendrier sur ton tel :mrgreen:

Re: calendrier google

Publié : 26 mars 2017, 10:04
par fab0030
Figures toi que c est pour afficher sur monitor ;)
J ai insérer le calendrier en question, en ne mettant que les événements mais ca ne me plait pas ! Pas assez waf :D
Alors j essaie autre chose !!

Re: calendrier google

Publié : 30 nov. 2017, 19:35
par anthropo
Bonjour,

lorsque je lance le script j'ai une erreur :

Debug Google Calendar : credentials : None
Traceback (most recent call last):
File "Google-Calendar.py", line 189, in <module>
credentials = run(FLOW, storage)
NameError: name 'run' is not defined

Je n'ai aucune idée de la raison. Quelqu'un pourrait-il m'aider ?

Merci

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

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 &
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]"

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&param='
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&param=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

Publié : 10 juin 2020, 15:39
par Le-Steph
Salut,

J'ai un calendrier spécifique pour la garde mes enfants dans Google.
J'aimerais pouvoir le lire dans Dz. Mon calendrier est simple, il y a un événement enfants sur la journée complète quand ils sont là, et rien s'ils ne sont pas là.

Déjà, j'ai tenté ce tuto : https://easydomoticz.com/agenda-google- ... -partie-1/
mais je bloque là : sudo python setup.py install

pi@raspberrypi:~/gcalcli $ sudo python setup.py install
File "setup.py", line 12
print('Warning: No long description generated.', file=sys.stderr)
^
SyntaxError: invalid syntax


Donc je suis bloqué. Pourquoi ? :oops:

Ensuite, vue ce que j'ai pu lire, ça paraît simple comme données celles de mon calendrier ! Mais comme les sujets précédents sont trop complexes pour moi (je débute), je voudrais déjà trouver le moyen dans Dz d'avoir un bouton fictif qui lise les données, en gros présence enfant oui/non (on/off), ce qui me permettra sûrement par la suite la gestion des volets roulants de leurs chambres, la programmation du chauffage ...

Je le répète, ma demande est certainement simple mais je manque encore du béaba !

Merci !