Re: calendrier google comme declencheur d'un interrupteur
Publié : 16 mai 2021, 19:13
gcalcli est installé et fonctionne ?
Reprenez le contrôle de votre domotique
https://easydomoticz.com/forum/
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 = '14'
nomText="Calendrier Info"
--nom de l'agenda google
domoticz_cal="Domoticz"
--fichier et chemin pour agenda
repertoire="/home/pi/"
file="googlecal.txt"
-- Toutes les deux heures, on récupère l'agenda de la journée
if(maintenant%1==0) then
--if(true)then
options="--tsv --military"
agenda_start="00:00"
agenda_end="+7 days 23:59"
lignecde="export LANG=\"fr_FR.UTF-8\" && sudo gcalcli --cal="..domoticz_cal.." agenda ".."'"..agenda_start.."' '"..agenda_end.."' "..options
lignecde=lignecde.." > "..repertoire..file
print("MAJ Calendrier "..domoticz_cal)
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 debutAction==maintenant)then
--L'interrupteur existe, test des états possibles
if(etat=='On'or etat=='Off')then
if(dateDebut~=dateFin)then
--l'action finit demain
finAction=finAction+(24*60)
end
print(interrupteur.." passe à "..etat)
commandArray[interrupteur]=etat.." FOR "..tostring(finAction-maintenant)
if(otherdevices_svalues[nomText]=='' or otherdevices_svalues[nomText]: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
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'
elseif(tonumber(etat)~=nil)then
--Niveau du dimmer à actionner
print(interrupteur.." passe à "..etat)
commandArray[interrupteur]="Set Level "..etat
elseif(etat=="Confort")then
--Consigne de chauffage
print(interrupteur.." passe à "..etat)
commandArray[interrupteur]='Set Level: 10'
elseif(etat=="Eco")then
--Consigne de chauffage
print(interrupteur.." passe à "..etat)
commandArray[interrupteur]='Set Level: 20'
elseif(etat=="Hors-Gel")then
--Consigne de chauffage
print(interrupteur.." passe à "..etat)
commandArray[interrupteur]='Set Level: 30'
elseif(etat=="Arrêt")then
--Consigne de chauffage
print(interrupteur.." passe à "..etat)
commandArray[interrupteur]='Set Level: 0'
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
Code : Tout sélectionner
start_date start_time end_date end_time title
2021-05-17 12:30 2021-05-17 13:30 Radiateur_cuisine&salon=On
2021-05-17 13:30 2021-05-17 14:30 Radiateur_cuisine&salon = On
2021-05-17 14:30 2021-05-17 15:30 uyyuk
2021-05-17 15:30 2021-05-17 16:30 gkjtk
2021-05-17 17:30 2021-05-17 18:30 kyu
2021-05-17 18:45 2021-05-17 19:45 tyjtyt
2021-05-17 20:15 2021-05-17 21:15 yukuyk
Code : Tout sélectionner
lignecde=lignecde.." > "..repertoire..file.." &"
Code : Tout sélectionner
lignecde=lignecde.." > "..repertoire..file