Page 1 sur 3

calendrier google comme declencheur d'un interrupteur

Publié : 20 juil. 2020, 21:49
par Jacky
bonjour,
Néophyte en domotique et sur ce forum. Je me suis lancé depuis 3 semaines avec mes maigres connaissances informatiques.
J'ai installé l'application Domoticz sur une machine virtuelle de la Freebox Devialet.
J'ai pu installé des prises sonoff basique en les flashant avec le logiciel Tasmota.
Ce que je n'arrive pas à faire c'est de déclencher un interrupteur par le biais du calendrier Google: En faît ce que je souhaite c'est que le calendrier Google par le biais d'une notifications ou d'un événement envoie directement ou via IFTTT une commande à un interrupteur.
J'ai lu plusieurs sujet sue ce forum et pour l'instant je m'arrache les cheveux.
Est-ce que c'est réalisable ? Si oui comment ?.
C'est mon premier message j'espère que je le post est au bon endroit
Bravo pour ce site

Re: calendrier google comme declencheur d'un interrupteur

Publié : 20 juil. 2020, 22:42
par Neutrino
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
}

Re: calendrier google comme declencheur d'un interrupteur

Publié : 21 juil. 2020, 08:44
par lost
Jacky a écrit : 20 juil. 2020, 21:49 Néophyte en domotique et sur ce forum. Je me suis lancé depuis 3 semaines avec mes maigres connaissances informatiques.
(...)
Ce que je n'arrive pas à faire c'est de déclencher un interrupteur par le biais du calendrier Google
Débutant, tu n'as peut-être pas vu les plannings intégrés à Domoticz et attachés à chaque interrupteur? Certes, c'est pour du répétitif à la semaine (pas un calendrier/actions datées) mais peut-être suffisant et évitant de dire à gogole à chaque fois que tu actives un inter chez toi... et de dépendre d'une connexion externe faillible à éviter autant que possible.

Sinon, il me semble qu'une extension améliorant les plannings intégrés existe. A voir ici ou sur le forum anglophone.

Re: calendrier google comme declencheur d'un interrupteur

Publié : 21 juil. 2020, 08:57
par Wolfen38
Tu sais ce qu'elle améliore cette version améliorée ?

Envoyé de mon Mi 9T Pro en utilisant Tapatalk


Re: calendrier google comme declencheur d'un interrupteur

Publié : 21 juil. 2020, 10:21
par lost
Wolfen38 a écrit : 21 juil. 2020, 08:57 Tu sais ce qu'elle améliore cette version améliorée ?
C'est à cela que je pensais:
https://easydomoticz.com/forum/viewtopi ... 1&start=70

Mais je ne suis pas utilisateur, je ne peut donc en dire plus.

Pour ma part, les plannings intégrés me suffisent. Surtout depuis qu'on peut en créer autant qu'on en veut (et switcher de l'un à l'autre, au besoin de manière scriptée ; Pour ma part j'ai 3 plannings: Normal/Présence continue/Vacances, influant sur les heures/consignes chauffage, chauffe-eau qui prends ses heures creuses ou non... je peux aussi remettre tout cela en route à distance la veille d'un retour de congé...).

En complément, j'ai un peu d'adaptatif scripté pour les cas ne tombant pas bien niveau plannings (remettre le chauffage en route si les enfants sont rentrés car un cour a pu sauter...).

Re: calendrier google comme declencheur d'un interrupteur

Publié : 21 juil. 2020, 10:25
par Wolfen38
Merci je vais regarder

Envoyé de mon Mi 9T Pro en utilisant Tapatalk


Re: calendrier google comme declencheur d'un interrupteur

Publié : 21 juil. 2020, 12:55
par Keros
Wolfen38 a écrit : 21 juil. 2020, 08:57 Tu sais ce qu'elle améliore cette version améliorée ?
Je suis utilisateur de l'extension et c'est super partique. Cela ressemble à ça (une image est toujours mieux qu'on long discours) :

Image


L'extension devait être intégrée dans DomoticZ mais DomoticZ voulait supprimer la fonction des semaines paires et impaires, ce que le développeur voulait garder...
Petite info, il faut refaire la procédure d'installation à chaque mise à jour de DomoticZ.


Au passage, si quelqu'un à la même fonction mais avec un calendrier hors Google et hébergé en local, je serai preneur :mrgreen:

Re: calendrier google comme declencheur d'un interrupteur

Publié : 22 juil. 2020, 22:31
par Jacky
Bonsoir
Merci pour vos réponses et à votre réactivité notament celle de Neutrino qui réponds parfaitement à ce que je veux faire.
Je vais essayé ta solution mais j'ai peur de n'avoir pas tout compris

Re: calendrier google comme declencheur d'un interrupteur

Publié : 22 juil. 2020, 23:29
par Jacky
lost a écrit : 21 juil. 2020, 08:44
Jacky a écrit : 20 juil. 2020, 21:49 Néophyte en domotique et sur ce forum. Je me suis lancé depuis 3 semaines avec mes maigres connaissances informatiques.
(...)
Ce que je n'arrive pas à faire c'est de déclencher un interrupteur par le biais du calendrier Google
Débutant, tu n'as peut-être pas vu les plannings intégrés à Domoticz et attachés à chaque interrupteur? Certes, c'est pour du répétitif à la semaine (pas un calendrier/actions datées) mais peut-être suffisant et évitant de dire à gogole à chaque fois que tu actives un inter chez toi... et de dépendre d'une connexion externe faillible à éviter autant que possible.

Sinon, il me semble qu'une extension améliorant les plannings intégrés existe. A voir ici ou sur le forum anglophone.

Bonsoir
merci pour ta réponse mais je veux utiliser un agenda sur une année

Re: calendrier google comme declencheur d'un interrupteur

Publié : 22 juil. 2020, 23:31
par Jacky
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 : https://easydomoticz.com/forum/viewtopi ... 344#p10343

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

C'est du DzVents :

creationFichierGcal.lua

Code : Tout sélectionner

return {
	active = false, 
	on = {
		--['timer'] = 'every hour',
		timer = {'every 1 minutes'},
		
		
	},

	execute = function(domoticz)
		--nom de l'agenda google
		domoticz_cal="maison" 
		--fichier et chemin pour agenda
		repertoire="/var/tmp/"
		file="googlecal.txt"
		file2="googlecal2.txt"
		options="--tsv --military"
		agenda_start="00:00"
		agenda_end="23:59"
		lignecde="export LANG=\"fr_FR.UTF-8\" && 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("sudo mv "..repertoire..file.." "..repertoire..file2)
		os.execute(lignecde)
	end
}
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
}
Bonsoir
Merci pour vos réponses et à votre réactivité notament celle de Neutrino qui réponds parfaitement à ce que je veux faire.
Je vais essayé ta solution mais j'ai peur de n'avoir pas tout compris.