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
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) :
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

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