Berale64 Posté(e) le 17 mai 2015 Signaler Posté(e) le 17 mai 2015 Trop de scènes tournent indéfiniment avec des "while true do". j'avais envie de me livrer à un petit exercice et aussi de jouer avec les tables. J'ai donc écrit ce petit scheduler qui permet d'actionner des devices et d'exécuter certaines actions sous certaines conditions. J'en vois déjà qui hurlent "GEA". Oui, je sais mais si on veut apprendre lua, il faut d'abord faire soi même, après on verra. Tout est décrit dans une table qui contient : Pour chaque ligne, une clée, une table d’horaires de déclenchement, une chaine de caractères de 1 à 7 qui sont les jours de la semaine tels que définis par wday dans os.date, une action, une table avec le nom d'une variable globale et une valeur, une table 'dID de devices. Les actions sont : - "turnOn et turnOff". allumer ou éteindre les devices de la table de devices aux heures et jours définis si la variable globale vaut la valeur donnée. Bien respecter les mots clés qui sont utilisés dans la function call. - "setGlobal" met à jour la variable globale. La table d'ID représente le VD et le bouton à actionner. Si pas de VD remplacer la table par nil. - "pressButton" pousse le bouton du VD défini dans la table d'ID si la variable globale vaut la valeur définie. Ce script correspond à mes besoins, mais peut très facilement être adapté pour d'autres mots clés. --[[ %% autostart %% properties %% globals --]] local SalonID = {46,47,48}; local BureauID = {67}; local PaCbuttonON = {113,"2"}; local PaCbuttonOFF = {113,"1"}; local DayON = {70,"1"}; local DayOFF = {70,"2"}; local DoveON = {69,"1"}; local DoveOFF = {69,"2"}; table = -- Simulation présence {["SalonON"] = {{"17:30","01:30","05:20"},"1234567","turnOn",{"AtHome","NO"},SalonID}, ["SalonOFF"] = {{"22:30","01:45","07:20"},"1234567","turnOff",{"AtHome","NO"},SalonID}, ["BureauON"] = {{"18:51","01:35","06:12"},"1234567","turnOn",{"AtHome","NO"},BureauID}, ["BureauOFF"] = {{"20:12","01:52","07:55"},"1234567","turnOff",{"AtHome","NO"},BureauID}, -- Lumière salon présence ["Salon2ON"] = {{"19:30"},"23456","turnOn",{"AtHome","YES"},SalonID}, ["Salon2OFF"] = {{"21:00"},"23456","turnOff",{"AtHome","YES"},SalonID}, ["Salon3ON"] = {{"18:00"},"17","turnOn",{"AtHome","YES"},SalonID}, ["Salon3OFF"] = {{"22:00"},"17","turnOff",{"AtHome","YES"},SalonID}, -- PaC Piscine ["PaCON"] = {{"14:15"},"1234567","setGlobal",{"Start_PaC","STANDBY"},PaCbuttonON}, ["PacOFF"] = {{"19:00"},"1234567","setGlobal",{"Start_PaC","OFF"},PaCbuttonOFF}, -- Day and Night ["DayON"] = {{"06:30"},"1234567","setGlobal",{"Day_Night","DAY"},DayON}, ["DayOFF"] = {{"22:20"},"1234567","setGlobal",{"Day_Night","NIGHT"},DayOFF}, -- Lumière garage pour colombes l'hiver ["DoveON"] = {{"08:00"},"1234567","pressButton",{"Season","WINTER"},DoveON}, ["DoveOFF"] = {{"18:00"},"1234567","pressButton",{"Season","WINTER"},DoveOFF} }; while true do local currentDate = os.date("*t"); local TriggerTime = string.format("%02d",currentDate.hour)..":"..string.format("%02d",currentDate.min); local TriggerDay = currentDate.wday; for key,value in pairs(table) do local time = value[1]; local days = value[2] local action = value[3]; local VGvalue = value[4]; local devID = value[5]; if (string.find(days,TriggerDay) ~= nil) then for i =1,#time do if (TriggerTime == time[i]) then fibaro:debug(key.." "..TriggerTime.." "..action); -- Changement de variable globale et action bouton VD if (action == "setGlobal") then fibaro:setGlobal(VGvalue[1], VGvalue[2]); if (devID ~= nil) then fibaro:call(devID[1], "pressButton", devID[2]); end -- pressButton d'un VD elseif (action == "pressButton") and (fibaro:getGlobalValue(VGvalue[1]) == VGvalue[2]) then fibaro:call(devID[1], "pressButton", devID[2]); -- Action sur Device elseif (fibaro:getGlobalValue(VGvalue[1]) == VGvalue[2]) then for j = 1,#devID do fibaro:call(devID[j],action); end end end end end end fibaro:sleep(60*1000); end 2
mprinfo Posté(e) le 17 mai 2015 Signaler Posté(e) le 17 mai 2015 Moi pour diminuer les while true do j'utilise les trigger et while do conditions comme cela la boucle ne tourne que pendant un certain temps du coup je n'ai plus qu un seul while true do sur ma box
Berale64 Posté(e) le 17 mai 2015 Auteur Signaler Posté(e) le 17 mai 2015 On est bien d'accord, c'est le but de cette scène, tout le reste est fait par des triggers, enfin presque !
BenjyNet Posté(e) le 17 mai 2015 Signaler Posté(e) le 17 mai 2015 Alors moi j'ai du taf pour vous.... transformez mon script sur le séche-linge pour qu'il ne démarre que lorsqu'il a détecté que celui-ci est en route... => http://www.domotique-fibaro.fr/index.php/topic/569-s%C3%A8che-linge-cycle-de-chauffe-notification/ Allez hophophop application !
Berale64 Posté(e) le 17 mai 2015 Auteur Signaler Posté(e) le 17 mai 2015 Tu commences par changer l'entête comme ça: Plus de autostart et ajoute un 42 power --[[%% properties 42 power%% globals--]] A chaque changement de la conso ta scène doit démarrer. A toi, alors, en testant la valeur de voir ce que tu veux faire. ça te permettra d'enlever les boucles et tous les sleep. Je n'ai pas de wallplug, sinon j'aurai fait un petit test. Enjoy !!!
Messages recommandés