Aller au contenu

A Propos Des Oiele Trou Doux ! ( While True Do )


Messages recommandés

Posté(e)

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".  :D  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
  • Upvote 2
Posté(e)

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

Posté(e)

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

×
×
  • Créer...