calendrier google

Forum dédié aux problématiques concernant les scripts pour DomoticZ.
Entourez votre code et les logs avec les balises nommées code grâce au bouton <\>.
David07
Messages : 6
Inscription : 30 déc. 2015, 17:19

Re: calendrier google

Message par David07 »

Bonjour,
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

Message par Chris54220 »

cyberfilou a écrit :S'lut a tous,

avez vous le meme probleme que moi et gcalcli qui ne fonctionne plus ?
peux tu préciser la fonction de gcalcli qui ne fonctionne pas chez toi
bruch05
Messages : 47
Inscription : 27 févr. 2016, 21:06

Re: calendrier google

Message par bruch05 »

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)
ayziaa
Messages : 25
Inscription : 29 janv. 2017, 17:16

Re: calendrier google

Message par ayziaa »

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.
matleses
Messages : 1
Inscription : 26 févr. 2017, 08:58

Re: calendrier google

Message par matleses »

Bonjour,

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.." &" 
Il faut placer le fichier ".gcalcli_oauth" dans le home de ton utilisateur.

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 :

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
Ainsi, le calendrier allume la lumière automatiquement. Si je l'éteins, elle ne se rallumera pas.
fab0030
Messages : 102
Inscription : 24 nov. 2016, 17:04

Re: calendrier google

Message par fab0030 »

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
Neutrino
Messages : 2662
Inscription : 10 juil. 2015, 15:42
Localisation : Les Herbiers(85)

Re: calendrier google

Message par Neutrino »

Le script récupère déjà tous les événements de la journée.

Code : Tout sélectionner

   agenda_start="00:00"
   agenda_end="23:59"
Le fait de le lancer toutes les heures permet de récupérer des événements ajouter en cours de journée.
Ma maison à plein d'IP ! :mrgreen:
SAV Bonjour. Vous avez vidé le cache ?
fab0030
Messages : 102
Inscription : 24 nov. 2016, 17:04

Re: calendrier google

Message par fab0030 »

Merci pour ta réponse, du coup j essaie ton script et là c'est le drame !
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()'
scripts (pour visualiser les lignes)

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)
jamais eut de soucis avec les scripts LUA...une idée?
Neutrino
Messages : 2662
Inscription : 10 juil. 2015, 15:42
Localisation : Les Herbiers(85)

Re: calendrier google

Message par Neutrino »

Le script fonctionne dans domoticz, il ne se lance pas dans le terminal.
Ma maison à plein d'IP ! :mrgreen:
SAV Bonjour. Vous avez vidé le cache ?
fab0030
Messages : 102
Inscription : 24 nov. 2016, 17:04

Re: calendrier google

Message par fab0030 »

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
Répondre