Bon, après quelques jours de debug et de tests, voici mon script, garanti sans python

script_time_calendrier.lua
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 = '133'
nomText="Pense-bête"
--nom de l'agenda google
domoticz_cal="maison"
--fichier et chemin pour agenda
repertoire="/home/pi/"
file="googlecal.txt"
-- Toutes les heures, on récupère l'agenda de la journée
if(maintenant%60==0)then
options="--tsv --military"
agenda_start="00:00"
agenda_end="23:59"
lignecde="sudo gcalcli --cal="..domoticz_cal.." agenda ".."'"..agenda_start.."' '"..agenda_end.."' "..options
lignecde=lignecde.." > "..repertoire..file.." &"
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(etat=='On' or etat=='Off' or etat=='ON' or etat=='OFF')and debutAction==maintenant)then
--L'interrupteur existe, l'état souhaité est reconnu
if(etat=='On'or etat=='Off')then
if(dateDebut~=dateFin)then
--l'action finit demain
finAction=finAction+(24*60)
end
print(interrupteur.." passe à "..etat.." pendant "..tostring(finAction-maintenant).." minutes")
commandArray[interrupteur]=etat.." FOR "..tostring(finAction-maintenant)
if(otherdevices_svalues[nomText]=='')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'
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
Pour le fonctionnement, c'est assez simple :
Pour la configuration, le côté Gmail est le même que l'étape 1 du blog.
Ensuite, il faut un capteur virtuel Text et des interrupteurs à actionner
Le calendrier est interrogé toutes les heures.
L'agenda est rempli par exemple de 18:00 à 23:00 avec
Le chauffage sera donc activé durant cette plage puis s'éteindra.
Remplacez On par ON et le chauffage restera allumé.
Si l'interrupteur ou la commande ne sont pas reconnus, le script l’interprète comme un texte libre et l'envoie dans le dummy text.
Libre à vous d'afficher ce texte sur la custom page ou sur un écran LCD !