Alors oui, pour ta défense, le script n'est pas évident à comprendre. Il a été réalisé sur un serveur domoticz dédié à l'arrosage et donc tous les timers sont affectés.
Personnellement, je le modifierai ainsi :
Code : Tout sélectionner
return {
on = { variables = { 'GlobalOnOff' }, httpResponses = { 'CodeRetour' } },
data = {
Step = { initial = 'Appel initial' },
MasterInter = { initial = 'MasterInter non initialisé' },
Horo = { initial = 'Horo non initialisé' },
URLPlanningOn = { initial = 'URLPlanningOn non initialisée' },
URLPlanningOff = { initial = 'URLPlanningOff non initialisée' },
TabPlannings = { initial = nil },
NbPostesPlanning = { initial = 'NbPostesPlanning non initialisé' },
PostePlanningEc = { initial = 'PostePlanningEc non initialisé'
}
},
execute = function(domoticz, item)
local bavard = false
local emailNotification = 'xxx@xxx.com'
-- Filtre pour les timers à lister
local filterDevices = {
['Device Name 1'] = true,
['Other Device Name 2'] = true,
}
local getURLPlanning = function(domoticz, indexTab)
-- Mise en forme de la requête
local URLPlanningOnOff = ''
if domoticz.data.MasterInter == 'On' then
URLPlanningOnOff = domoticz.data.URLPlanningOn
else
URLPlanningOnOff = domoticz.data.URLPlanningOff
end
local currentTimerID = domoticz.data.TabPlannings[indexTab].TimerID
URLPlanningOnOff = URLPlanningOnOff .. currentTimerID
return URLPlanningOnOff
end
if bavard then
domoticz.log('Etape du script = ' .. domoticz.data.Step)
domoticz.log('Variable MasterInter = ' .. domoticz.data.MasterInter)
domoticz.log('Variable Horo = ' .. domoticz.data.Horo)
domoticz.log('Requête PlanningOn = ' .. domoticz.data.URLPlanningOn)
domoticz.log('Requête PlanningOff = ' .. domoticz.data.URLPlanningOff)
domoticz.log('Dispositifs concernés :')
for name,_ in pairs(filterDevices) do
domoticz.log(name .. ' (' .. domoticz.devices(name).state .. ')')
end
-- à 'décommenter' pour lister la table persistante des planifications dans la log
-- if domoticz.data.NbPostesPlanning ~= 'NbPostesPlanning non initialisé' then
-- for i = 1, domoticz.data.NbPostesPlanning do
-- local tab = domoticz.data.TabPlannings[i]
-- domoticz.log('Poste planning "' .. i .. '" : TimerID = ' .. tab.TimerID .. ', Active = ' .. tab.Active .. ', DevName = ' .. tab.DevName .. ', Time = ' .. tab.Time .. ', TimerCmd = ' .. tab.TimerCmd)
-- end
-- end
domoticz.log('Nombre de plannings = ' .. domoticz.data.NbPostesPlanning)
domoticz.log('Poste planning en cours = ' .. domoticz.data.PostePlanningEc)
end
if item.isVariable then
---- Trigger = changement d'état de la Variable GlobalOnOff ... donc premier appel du script
local MasterInter = ''
local IPGreenIQ = 'http://192.168.10.51:8080'
local GetPlannings = IPGreenIQ .. '/json.htm?type=schedules&filter=device'
---- Attention, idx sera l'index du schedule et non du device
local PlanningOn = IPGreenIQ .. '/json.htm?type=command¶m=enabletimer&idx='
local PlanningOff = IPGreenIQ .. '/json.htm?type=command¶m=disabletimer&idx='
local Jour = os.date("%d-%m-%Y")
local Heure = os.date("%X")
local Horo = " le " .. Jour .. " à " .. Heure
if item.value == 1 then MasterInter = 'On' else MasterInter = 'Off' end
---- Chargement des données persistantes
domoticz.data.MasterInter = MasterInter
domoticz.data.Horo = Horo
domoticz.data.URLPlanningOn = PlanningOn
domoticz.data.URLPlanningOff = PlanningOff
---- Récupération de la plannification des devices
domoticz.data.Step = 'Initialisation des variables, récupération de la planification'
if bavard then domoticz.log('Envoi de la requête ' .. GetPlannings) end
domoticz.openURL({
url = GetPlannings,
method = 'GET',
callback = 'CodeRetour',
})
elseif item.isHTTPResponse then
---- Trigger = Code retour openURL
if item.ok then
---- Retour de l'interrogation de la planification des devices (/json.htm?type=schedules&filter=device)
if domoticz.data.Step == 'Initialisation des variables, récupération de la planification' then
---- Mise en table de la planification
-- Conversion du résultat JSON de la requête vers la table TabPlanningsJson
local TabPlanningsJson = item.json.result
-- Comptage du nombre de postes pour initialiser la variable persistante NbPostesPlanning
local NbPostes = 0
---- Chargement de la table "persistante" TabPlannings
---- Structure de la table :
---- TimerID (Index de planification)
---- Active (Planification active ou non)
---- DevName (Nom du périphérique)
---- Time (Heure de la Planification)
---- TimerCmd (Action entreprise)
-- Déclaration de la table persistante TabPlannings en fonction du nombre de postes retourné par la commande json
domoticz.data.TabPlannings = {}
for i, planning in pairs (TabPlanningsJson) do
local deviceName = planning.DevName
if filterDevices[deviceName] then
if bavard then
domoticz.log('TabPlanningsJson --> Zone = ' .. planning["DevName"] .. ' - Heure = ' .. planning["Time"] .. ' - Timer = ' .. planning["TimerID"] .. ' - Actif = ' .. planning["Active"])
end
NbPostes = NbPostes + 1
domoticz.data.TabPlannings[NbPostes] = {
TimerID = planning.TimerID,
Active = planning.Acive,
DevName = deviceName,
Time = planning.Time,
TimerCmd = planning.TimerCmd,
}
end
end
domoticz.data.NbPostesPlanning = NbPostes
---- Envoi de la première requête d'activation ou de désactivation des plannings
-- Préparation des codes retours
domoticz.data.Step = 'Boucle de modification de la planification'
domoticz.data.PostePlanningEc = 1
local URLPlanningOnOff = getURLPlanning(domoticz, 1)
if bavard then domoticz.log('Envoi de la requête ' .. URLPlanningOnOff) end
domoticz.openURL({
url = URLPlanningOnOff,
method = 'GET',
callback = 'CodeRetour',
})
elseif domoticz.data.Step == 'Boucle de modification de la planification' then
-- On incrémente le compteur de poste dans la table des planifications
domoticz.data.PostePlanningEc = domoticz.data.PostePlanningEc + 1
-- On vérifie si tous les postes ont été traités
if domoticz.data.PostePlanningEc > domoticz.data.NbPostesPlanning then
---- C'est fini
-- Mise en forme tu texte de compte-rendu
local Jour = os.date("%d-%m-%Y")
local Heure = os.date("%X")
local Horo = " le " .. Jour .. " à " .. Heure
local MasterInter
if domoticz.data.MasterInter == 'On' then MasterInter = 'RÉACTIVATION' else MasterInter = 'DÉSACTIVATION' end
-- local Texte = "Demande de " .. MasterInter .. " de l'arrosage planifié " .. domoticz.data.Horo .. " - Procédure terminée " .. Horo
local Texte = MasterInter .. " de l'arrosage planifié " .. domoticz.data.Horo
if bavard then domoticz.log("--> Message = " .. Texte) end
-- Envoi du courriel
domoticz.email("GreenIq - Gestion de l'arrosage planifié", Texte, emailNotification)
-- Réinitialisation des données persistantes pour la prochaine utilisation
domoticz.data.Step = 'Appel initial'
domoticz.data.MasterInter = 'MasterInter non initialisé'
domoticz.data.Horo = 'Horo non initialisé'
domoticz.data.URLPlanningOn = 'URLPlanningOn non initialisée'
domoticz.data.URLPlanningOff = 'URLPlanningOff non initialisée'
domoticz.data.TabPlannings = {}
domoticz.data.NbPostesPlanning = 'NbPostesPlanning non initialisé'
domoticz.data.PostePlanningEc = 'PostePlanningEc non initialisé'
---- Bye bye
else
---- On continue
local URLPlanningOnOff = getURLPlanning(domoticz, domoticz.data.PostePlanningEc)
if bavard then domoticz.log('Envoi de la requête ' .. URLPlanningOnOff) end
domoticz.openURL({
url = URLPlanningOnOff,
method = 'GET',
callback = 'CodeRetour',
})
end
end
else
-- CodeRetour non OK
domoticz.log('--> Procédure GlobalOnOff - Code retour incorrect : ' .. item.statusCode .. ', ' .. item.statusText)
domoticz.log('Poste planning en cours = ' .. domoticz.data.PostePlanningEc)
local tab = domoticz.data.TabPlannings[domoticz.data.PostePlanningEc]
domoticz.log('Poste planning : TimerID = ' .. tab.TimerID .. ', Active = ' .. tab.Active .. ', DevName = ' .. tab.DevName .. ', Time = ' .. tab.Time .. ', TimerCmd = ' .. tab.TimerCmd)
end
end
end
}
C'est un premier jet, et je vois d'autres simplifications.
Mais cette version contient un tableau à remplir contenant les dispositifs à prendre en compte.