calendrier google comme declencheur d'un interrupteur

Posez ici vos questions d'utilisation, de configuration de DomoticZ, de bugs, de conseils sur le logiciel lui même dans son utilisation et son paramétrage.
Des forums spécifiques sont ouverts ci-dessous pour regrouper les différents sujets.
Jacky
Messages : 9
Inscription : 14 juin 2020, 21:57

Re: calendrier google comme declencheur d'un interrupteur

Message par Jacky »

Bonsoir
Je cale a la première étape :je n'arrive pas a installer gcal: après avoir suivi cette procédure:
-sudo apt-get install python-gflags python-dateutil python-httplib2
-sudo apt-get install python-pip
-sudo pip install google-api-python-client==1.4.2
-sudo pip install oauth2client==1.4.12
-sudo apt-get install python-httplib2 python-google-apputils python-googleapi et là j'ai le message d'erreur suivant:

unable to locate package python-google-apputils

J'ai esseyé plusieurs fois et j'ai toujours le même message.
Est ce que quelqu'un à une idée ?
Neutrino
Messages : 2662
Inscription : 10 juil. 2015, 15:42
Localisation : Les Herbiers(85)

Re: calendrier google comme declencheur d'un interrupteur

Message par Neutrino »

Pourquoi ne pas suivre tout simplement ce qui est décrit dans le GitHub ?

Code : Tout sélectionner

sudo apt-get install gcalcli
Ma maison à plein d'IP ! :mrgreen:
SAV Bonjour. Vous avez vidé le cache ?
Jacky
Messages : 9
Inscription : 14 juin 2020, 21:57

Re: calendrier google comme declencheur d'un interrupteur

Message par Jacky »

bonjour
Désolé de poser des questions qui doivent paraitre stupides pour des habitués.
après avoir installer sudo apt-get install gcalcli ,l'identification du compte et l'autorisation doit se faire par la commande : "sudo gcalcli agenda --noauth_local_webserver " selon le site https://easydomoticz.com/agenda-google- ... -partie-1/
et la j'obtiens ce message a la place du lien qui devrait me permettre l'autorisation du calendrier google

freebox@DOMOZ:~$ sudo apt-get install gcalcli
Reading package lists... Done
Building dependency tree
Reading state information... Done
gcalcli is already the newest version (4.0.4-2).
0 upgraded, 0 newly installed, 0 to remove and 1 not upgraded.
freebox@DOMOZ:~$ sudo gcalcli agenda --noauth_local_webserver
Traceback (most recent call last):
File "/usr/local/bin/gcalcli", line 6, in <module>
from gcalcli.cli import main
File "/usr/local/lib/python2.7/dist-packages/gcalcli/cli.py", line 29, in <module>
from gcalcli import utils
File "/usr/local/lib/python2.7/dist-packages/gcalcli/utils.py", line 13, in <module>
fuzzy_date_parse = Calendar().parse
File "/usr/local/lib/python2.7/dist-packages/parsedatetime/__init__.py", line 270, in __init__
self.ptc = Constants()
File "/usr/local/lib/python2.7/dist-packages/parsedatetime/__init__.py", line 2381, in __init__
self.locale = get_icu(self.localeID)
File "/usr/local/lib/python2.7/dist-packages/parsedatetime/pdt_locales/icu.py", line 56, in get_icu
result['icu'] = icu = pyicu.Locale(locale)
AttributeError: 'module' object has no attribute 'Locale'
freebox@DOMOZ:~$

Ai- je oublier une manip ?
Neutrino
Messages : 2662
Inscription : 10 juil. 2015, 15:42
Localisation : Les Herbiers(85)

Re: calendrier google comme declencheur d'un interrupteur

Message par Neutrino »

Installe Python3
Ma maison à plein d'IP ! :mrgreen:
SAV Bonjour. Vous avez vidé le cache ?
Jacky
Messages : 9
Inscription : 14 juin 2020, 21:57

Re: calendrier google comme declencheur d'un interrupteur

Message par Jacky »

deja installé.
lost
Messages : 1511
Inscription : 12 nov. 2016, 11:01

Re: calendrier google comme declencheur d'un interrupteur

Message par lost »

Jacky a écrit : 26 juil. 2020, 22:21deja installé.
Et que dit:

Code : Tout sélectionner

$ python --version
Sur une base Debian pas encore passée à 3.x par défaut, il y a des chances que ce soit 2.7 la réponse. Si python3 n'est pas appelé explicitement dans le code python utilisé, installer le 3 ne suffit pas.

Il faut changer la version par défaut pour l'utilisateur (via un alias dans le .bashrc) ou globalement (via update-alternatives, mais gaffe aux effets de bord si python 2 est utilisé par ailleurs pour des scripts perso ailleurs... ou systèmes!).

Cf:
https://linuxconfig.org/how-to-change-f ... bian-linux
Jacky
Messages : 9
Inscription : 14 juin 2020, 21:57

Re: calendrier google comme declencheur d'un interrupteur

Message par Jacky »

effectivement: Python 2.7.16
Je vais essayé ta solution
Merci pour ton aide
Antho
Messages : 10
Inscription : 09 avr. 2019, 10:04

Re: calendrier google comme declencheur d'un interrupteur

Message par Antho »

Bonjour Neutrino,

Je viens de reprendre ton script en dzevents, par contre cela me met une erreur à la ligne
action = action:gsub(" = ","=")

Voici l'erreur : 2021-05-16 13:18:00.284 Error: dzVents: Error: (3.1.7) Calendrier 1.0: ...scripts/dzVents/generated_scripts/Calendrier dernier.lua:91: attempt to index a nil value (global 'action')

S'aurais tu d'où cela vient?

Neutrino a écrit : 20 juil. 2020, 22:42 Je dois avoir ça en magasin :D
Je me suis créer un calendrier Google nommé 'maison' pour pas mélanger avec les autres.
J'ai un script qui récupère un fichier tiré de gcalcli et un autre qui l'interprète.
Un rdv nommé 'Lumière=On' passe interrupter Lumière à On pendant le temps du RDV.
ON en majuscule le laisse dans cet état.
Quelques explications : viewtopic.php?f=10&t=1195&p=10344#p10343

Le plus chiant, c'est d'installer gcalcli https://github.com/insanum/gcalcli

C'est du DzVents :


GoogleAgenda.lua

Code : Tout sélectionner

--[[
	Prerequisits
	==================================
	Domoticz v3.8837 or later (dzVents version 2.4 or later)

Google calendar actioner
-- Authors  ----------------------------------------------------------------
	V1.0 - Neutrino - Adaptation to Dzvents
	
]]--
-- Variables to customize ------------------------------------------------
local fetchIntervalMins = 1 -- Day time scraping interval.

--idx ou nom du capteur Text 
local nomText="Pense-bête"

--nom de l'agenda google
local domoticz_cal="maison" 

--fichier et chemin pour agenda
local repertoire="/var/tmp/"
local file="googlecal.txt"


-- Please don't make any changes below this line (Except for setting logging level)
local scriptName = 'Calendrier'
local scriptVersion = '1.0'

local function has_value (tab, val)
    for index, value in ipairs(tab) do
        --if val:find(value) then
        if val==(value) then
            return (index-1)*10
        end
    end
    return false
end

return {
	active = true,
	logging = {
		level = domoticz.LOG_DEBUG, -- Uncomment to override the dzVents global logging setting
		marker = scriptName..' '..scriptVersion
	},
	on = {
		timer = {
			'every '..tostring(fetchIntervalMins)..' minutes',
		},
		--devices={"30 secondes"},
	},

	execute = function(domoticz, item)
		--nom de l'agenda google
		local domoticz_cal="maison" 
		--fichier et chemin pour agenda
		local options="--tsv --military"
		local agenda_start="00:00"
		local agenda_end="23:59"
		local lignecde="export LANG=\"fr_FR.UTF-8\" && sleep 1 && sudo gcalcli --cal="..domoticz_cal.." agenda "
			.."'"..agenda_start.."' '"..agenda_end.."' "..options
		lignecde=lignecde.." > "..repertoire..file.." &"
		domoticz.log("MAJ Calendrier "..domoticz_cal,domoticz.LOG_INFO)
		domoticz.log(lignecde,domoticz.LOG_INFO)
		os.execute(lignecde)
		--Récupère l'heure et la date actuelle
		time = os.time()
		local minutes=tonumber(os.date('%M',time))
		local hours=tonumber(os.date('%H',time))
		local jour = os.date('%d',time)
		--Nombre de minutes depuis 00:00
		local maintenant=tonumber(hours*60+minutes)
		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
			domoticz.log("Début lecture Fichier google Calendrier")
			for line in file:lines() do -- Pour chaque lignes
				table.insert(ligne, line) -- On insère les lignes dans la table
				domoticz.log("Ligne : "..line,domoticz.LOG_DEBUG)
			end
			file:close()
			domoticz.log("Fin Fichier google Calendrier",domoticz.LOG_DEBUG)
		else
			domoticz.log('<font color="#FF0000">Erreur lecture fichier</font>',domoticz.LOG_DEBUG)
		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(" = ","=")
			action = action:gsub("\r","")
			action = action:gsub("\n","")
			debutAction = heureDebut*60+minutesDebut
			finAction = heureFin*60+minutesFin-1
			anneeAction,moisAction,jourAction = dateDebut:match("([^;]+)-([^;]+)-([^;]+)")
			if(action:find("=")~=nil and jourAction == jour)then
			--L'action contient "=", c'est un interrupteur à actionner
				domoticz.log("Action : "..action,domoticz.LOG_DEBUG)
				domoticz.log(maintenant.." : "..debutAction,domoticz.LOG_DEBUG)
				interrupteur,etat=action:match("([^;]+)=([^;]+)")
				domoticz.log(interrupteur.." => "..etat,domoticz.LOG_DEBUG)
				if(domoticz.devices(interrupteur)~=nil and debutAction==maintenant)then
				--if(domoticz.devices(interrupteur)~=nil and maintenant==maintenant)then
				--L'interrupteur existe, test des états possible
					--récupération des infos du dispositif
					levelMax = domoticz.devices(interrupteur).maxDimLevel
					levels = domoticz.devices(interrupteur).levelNames
					domoticz.log("Etat souhaité : "..etat,domoticz.LOG_DEBUG)
					if(etat=="On"or etat=="Off")then
						if(dateDebut~=dateFin)then
						--l'action finit demain
							finAction=finAction+(24*60)
						end
						if(etat=="On")then
							domoticz.devices(interrupteur).switchOn().forMin(finAction-maintenant)
							domoticz.log(interrupteur.." passe à On pour "..finAction-maintenant.." minutes.",domoticz.LOG_DEBUG)
						else
							domoticz.devices(interrupteur).switchOff().forMin(finAction-maintenant)
							domoticz.log(interrupteur.." passe à Off pour "..finAction-maintenant.." minutes.",domoticz.LOG_DEBUG)
						end
						if(domoticz.devices(nomText).text=='' or domoticz.devices(nomText).text:find("=")~=nil)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
							domoticz.log("pense-bête : "..action,domoticz.LOG_DEBUG)
							domoticz.devices(nomText).updateText(action)
						end
					elseif(etat=="ON")then
					--ON (tout en majuscule) siginifie que l'action n'a pas de fin
						domoticz.log(interrupteur.." passe à On",domoticz.LOG_DEBUG)
						domoticz.devices(interrupteur).switchOn()
					elseif(etat=="OFF")then
					--OFF (tout en majuscule) siginifie que l'action n'a pas de fin
						domoticz.log(interrupteur.." passe à Off",domoticz.LOG_DEBUG)
						domoticz.devices(interrupteur).switchOff()
					elseif(tonumber(etat)~=nil)then
					--Niveau du dimmer à actionner
						etat = tonumber(etat)
						if (etat>levelMax)then
							etat = levelMax
							domoticz.log("Attention ! Le niveau demandé "..etat.." est supérieur au niveau maximum possible "..levelMax.." !",domoticz.LOG_DEBUG)
						end
						domoticz.log(interrupteur.." passe à "..etat,domoticz.LOG_DEBUG)
						domoticz.devices(interrupteur).dimTo(etat)
					elseif(levels~=nil)then
						--custom selector
						if(has_value(levels,etat))then
							--Etat demandé reconnu
							domoticz.log(interrupteur.." passe à "..etat.." niveau "..has_value(levels,etat),domoticz.LOG_DEBUG)
							domoticz.devices(interrupteur).switchSelector(has_value(levels,etat))
						else
							domoticz.log(interrupteur.." ne passe pas à "..etat..". Etat custom inexistant.",domoticz.LOG_DEBUG)
						end
					else
					--Etat non reconnu
						domoticz.log(interrupteur.." ne passe pas à "..etat..". Etat inconnu.",domoticz.LOG_DEBUG)
						--commandArray[interrupteur]=etat
					end
				elseif(domoticz.devices(interrupteur)==nil and debutAction==maintenant)then
				--L'interrupteur n'existe pas, on affiche le pense-bête
					domoticz.log("Pense-bête : "..action)
					domoticz.devices(nomText).updateText(action)
				elseif(finAction==maintenant and action == domoticz.devices(nomText).text)then
				--L'action est terminée, on l'efface
					domoticz.devices(nomText).updateText(" ")
				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
				domoticz.log("Pense-bête : "..action)
				domoticz.devices(nomText).updateText(action)
			elseif(finAction==maintenant and action == domoticz.devices(nomText).text)then
			--L'action est terminée, on l'efface
				domoticz.devices(nomText).updateText(" ")
			end
		end		
	end
}
Neutrino
Messages : 2662
Inscription : 10 juil. 2015, 15:42
Localisation : Les Herbiers(85)

Re: calendrier google comme declencheur d'un interrupteur

Message par Neutrino »

Tu as quoi dans ton fichier /var/tmp/googlecal.txt ?
Ma maison à plein d'IP ! :mrgreen:
SAV Bonjour. Vous avez vidé le cache ?
Antho
Messages : 10
Inscription : 09 avr. 2019, 10:04

Re: calendrier google comme declencheur d'un interrupteur

Message par Antho »

le fichier est vide alors que le calendrier à des choses
Répondre