[Google Calendar] - Solution avec accès en mode OAuth 2.0

Routage de ports, récupération de météo, accès depuis votre smartphone bref tout ce qui permet à Domoticz d'être conecté à Internet se passe ici.
Répondre
bruch05
Messages : 43
Enregistré le : 27 févr. 2016, 21:06

[Google Calendar] - Solution avec accès en mode OAuth 2.0

Message par bruch05 » 13 avr. 2016, 22:40

Bonsoir,

Depuis l'abandon par Google de l'authentification en mode OAuth 1.0, gcalcli ne fonctionne plus.
Je me suis donc penché sur l'accès à l'API Google en mode OAuth 2.0.

Après pas mal de soirée de labeur, voici une solution opérationnelle clef en main.

Les événements dans Google Calendar doivent être sous la forme de cet exemple : DZ:Lampe Salon[Off]

Entête : DZ: (afin de faire la différence avec les autres événements du calendrier familial, Dentiste,Musique,Sport,etc)
Device : Nom du Device : (Pas d'accent ou caractères spéciaux, [ et ] sont interdits)
Commande : [xxx]

A installer

https://developers.google.com/google-ap ... art/python

Evènements


Connexion à Domoticz

domoticz_ip='192.168.0.252'
domoticz_port='8084'
user=''
password='

Connexion à Google
Il faut éditer le code Python afin de définir les variables client_id et client_secret.
Pour les obtenir, se connecter sur le compte Google détenant le calendrier, puis allez sur https://console.developers.google.com
Il faut alors créer un projet dé développement, Domoticz par exemple, puis allez dans le menu à droite nommée "Identifiants".
Choisir le menu en bleu "Créer des identifiants" et sélectionner l'item "ID client OAuth", sélectionner Autre, une fenêtre s'ouvre alors avec l'identifiant (client_id) puis le token (client_secret)

Cela ressemble à cela
client_id='376277659069-he7XXXXX7kq23jgpnouec518cv7v56ma.apps.googleusercontent.com',
client_secret='u9cXkLW5Cwq6V_EEXCx1lGEu',

Pour vérifier que la connexion fonctionne, mettre la variable trace à 1.
Si la connexion fonctionne cette ligne s'affiche, si la connexion est KO, "None" s'affiche.
Debug Google Calendar : credentials : <oauth2client.client.OAuth2Credentials object at 0x7f6ff0392f50>

Intégration NAS Synology
Le lancement du script Python avec l'ordonnanceur Synology crée un environnement shell qui ne permet pas la connexion à Google.
Je n'ai pas trouvé la raison à cette heure, donc j'ai contourné en lançant manuellement un processus détaché qui boucle toutes les 60 secondes.
Je pense qu'il s'agit d'un problème d'environnement Interactif ou non. Si un spécialiste Linux passe par là .... :lol:

Code : Tout sélectionner

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# Copyright Avril 2016 C.BRUGEL All Rights Reserved.
#
# 
# The client_id and client_secret are copied from the API Access tab on
# the Google APIs Console
#     client_id='376277659069-he7me0mh7kq23jgpnouec518XXXXXXX.apps.googleusercontent.com',
#     client_secret='u9cXkLW5Cwq6V_EEXCx1lGEu',
#
# Les évènements dans Google Calendar doivent être sous la forme suivante.
# A noter que
# 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
#*********************************************

DebugPrint("*********************************** MAIN","***********************************")

#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='376277659069-heXXXXXXXXXXXXXkq23jgpnouec518cv7v56ma.apps.googleusercontent.com',
    client_secret='u9cXkLW5Cwq6V_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("################################### MAIN","###################################")
	sys.exit(0)
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 < 35: # 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("################################### MAIN","###################################")
Le shell script qui boucle toutes les 60 secondes

Code : Tout sélectionner

#!/bin/bash

while [ test ]
do
        echo '****************************************** GoogleCalendar-V7.py ******************************************' >> /volume1/@appstore/domoticz/var/scripts/python/GoogleCalendar-V7.log
	
	python GoogleCalendar-V7.py 	>> /volume1/@appstore/domoticz/var/scripts/python/GoogleCalendar-V7.log
     
	echo '########################################## GoogleCalendar-V7.py ##########################################' >> /volume1/@appstore/domoticz/var/scripts/python/GoogleCalendar-V7.log

	sleep 60
done
Le lanceur

Code : Tout sélectionner

#!/bin/bash

nohup /volume1/@appstore/domoticz/var/scripts/python/GoogleCalendar.bash &


Disable adblock

This site is supported by ads and donations.
If you see this text you are blocking our ads.
Please consider a Donation to support the site.


cyberfilou
Messages : 10
Enregistré le : 12 juin 2015, 17:11

Re: [Google Calendar] - Solution avec accès en mode OAuth 2.0

Message par cyberfilou » 07 août 2016, 11:22

s'lut cette solution est-elle bonne pour une raspberry ?

polargeex
Messages : 2
Enregistré le : 23 sept. 2015, 10:01

Re: [Google Calendar] - Solution avec accès en mode OAuth 2.0

Message par polargeex » 13 nov. 2016, 13:49

Bonjour à tous,
cyberfilou a écrit :s'lut cette solution est-elle bonne pour une raspberry ?
Je pense que cette solution peut marcher sur Raspberry à partir du moment ou les api google python s'installe correctement. Par contre pour la programmation du script sur Raspberry je pense qu'un crontab sera plus adapté.

Sinon concernant la solution de bruch05, merci à toi pour cette rapide présentation et le code. Ce post m'a permis de mettre en place l'activation des interrupteurs domoticz depuis un calendrier sur un synology sous DSM6. Par contre cela m'a quand même pris 1/2 journée. Je pense effectivement que le tuto manque de précisions, j'espère que mon expèrience ci-dessous permettra à d'autre de faire cette intégration fort pratique par rapport à la fonction planning de domoticz.

A installer

https://developers.google.com/google-ap ... art/python
il se peut que sur votre synology vous n'ayez pas pip, vous trouverez facilement sur internet des tuto pour l'installer, attention il vous faudra faire la commande d'installation avec un sudo

Connexion à Google

Ne pas oublier une fois que vous avez créer votre identifiant d'activer la google calendar api
Attention dans le code les évènement sont lu uniquement dans votre calendrier principal, si vous voulez utiliser un calendrier spécial dédié à domoticz il faut éditer cette ligne en changeant primary:

Code : Tout sélectionner

calendarId='primary'
dans mon cas:

Code : Tout sélectionner

calendarId='polargeex.com_h1nrr2fc4mc7qgdj65c6vkfuhk@group.calendar.google.com'
pour trouver l'id de votre calendrier, aller sur cette page en bas en faisant un test : https://developers.google.com/google-ap ... rList/list

Intégration NAS Synology

Je n'ai pas choisit la solution de bruch05 m'orientant vers les tâche planifié qui sont très bien intégré dans DSM6
Pour cela j'ai placer par convention (histoire d'être cohérent) mon script dans le répertoire des script de domoticzs, le tout dans un dossier python comme pour mes script lua:
/volume1/@appstore/domoticz/scripts/python/

Une fois le script en place avec le code modifié comme ci-desous je l'ai lancé manuellement le script afin de créer la clef google api dans un fichier calendar.dat. Notez que j'ai mis le chemin du fichier calendar.dat en entier dans le code, ce sera indispensable pour la tâche planifié

Code : Tout sélectionner

storage = Storage('/volume1/@appstore/domoticz/scripts/python/calendar.dat')
la ligne pour lancer le script manuellement (le script est modifier pour prendre en compte le dernier paramètre)
sudo python /volume1/@appstore/domoticz/scripts/python/GoogleCalendar-V7.py --noauth_local_webserver

une fois le script lancé à la main, s'il n'y a pas d'erreur la console vous affiche une url qu'il faut copier coller dans un navigateur ce qui vous permettra d'autoriser l'application et d'obtenir une clef secrète. copier coller la clef secrète dans la console et si nécessaire relancer le script manuellement pour la saisir. une fois saisi ça doit marcher.

Il faudra ensuite créer une tâche planifié toute les minute dans l'interface synology en root avec la ligne: python /volume1/@appstore/domoticz/scripts/python/GoogleCalendar-V7.py --noauth_local_webserver
force de cette solution vous pouvez vous envoyer le résultat par mail et voir si tout se passe bien au début

Code à jour

Par contre le code de bruch05 était mal indenté (certainement à cause de la copie dans la balise code du forum) en plus des corrections d'indentation celui ci-dessous contient les modifications qui m'on permis de le faire fonctionner

Code : Tout sélectionner

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# Copyright Avril 2016 C.BRUGEL All Rights Reserved.
# Modified by polargeex November 2016
# 
# The client_id and client_secret are copied from the API Access tab on
# the Google APIs Console
#     client_id='376277659069-he7me0mh7kq23jgpnouec518XXXXXXX.apps.googleusercontent.com',
#     client_secret='u9cXkLW5Cwq6V_EEXCx1lGEu',
#
# Les évènements dans Google Calendar doivent être sous la forme suivante.
# A noter que
# 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
from oauth2client import tools

try:
    import argparse
    flags = argparse.ArgumentParser(parents=[tools.argparser]).parse_args()
except ImportError:
    flags = None

#------Paramètres généraux ----------
domoticz_ip='192.168.0.7'
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
#*********************************************

DebugPrint("*********************************** MAIN","***********************************")

#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='314295128224-4meba18tjsvorir77efevcd84sd9g3e2.apps.googleusercontent.com',
    client_secret='GJcLYxausiHw4ZKCx3j4X8LF',
    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('/volume1/@appstore/domoticz/scripts/python/calendar.dat')
credentials = storage.get()

DebugPrint("credentials",credentials)

if credentials is None or credentials.invalid == True:
  if flags:
    credentials = tools.run_flow(FLOW, storage, flags)
  else: # Needed only for compatibility with Python 2.6
    credentials = tools.run(FLOW, storage)
#credentials = tools.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='polargeex.com_h1nrr2ac4mc7qg7jt5c6vkfuhk@group.calendar.google.com', 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("################################### MAIN","###################################")
   sys.exit(0)
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 < 35: # 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("################################### MAIN","###################################")
Futur

Aujourd'hui pour allumer un thermostat chauffage on doit par exemple mettre un évènement pour ON puis un évènement pour OFF avec les 1H par défaut des calendrier google si je veux faire marcher mon thermostat de 18:00 à 20:00 je créer les 2 évènements suivants:
18:00 DZ:thermostat[ON]
20:00 DZ:thermostat[Off] (dure jusqu'à 21h même si je thermostat s'arrête à 20)

Je me sens motivé pour modifier le script et faire en sorte que ce soit la présence d'un évènement de 18:00 à 20:00 qui gère l'allumage et l'extinction à la fin de l'évènement, on aurait ainsi une meilleur vision de l'activité et moins d'évènement à créer. Je vous tiendrai au courant.

Disable adblock

This site is supported by ads and donations.
If you see this text you are blocking our ads.
Please consider a Donation to support the site.


Répondre