Aller au contenu
mprinfo

Scene Lua - Trigger Horaire Sans Boucle While ... Do

Recommended Posts

Objectif :

  • Crée des déclencheurs (trigger) toutes les 30mn sans avoir besoin de faire une boucle "while true do" afin de mettre a jours 2 variables globale qui nous servirons a déclencher des scènes.

 

Méthode :

  • Utiliser la variable Globale que l'on mets a jour pour lancer la scène

Variable Globale a créée :

  • Heure
  • DemiHeure

 

Ce script va mettre a jour :

  • La variable DemiHeure sera mis a jour à  chaque fois que les minutes seront égales a 0 ou 30
  • La variable Heure sera mis a jour si les minutes sont égale à  0
  • Nous aurons donc 1 déclenchement par heure pour la VG: Heure et 2 déclenchements par heure pour la VG DemiHeure

Voici le script (a copier dans une scène) :

--[[
%% autostart
%% globals
DemiHeure
--]]
local Minutes = tonumber(os.date("%M", os.time()))
local trigger = fibaro:getSourceTrigger()

if (trigger['type'] == 'autostart') then
   fibaro:setGlobal("DemiHeure", "0"..Minutes)
   fibaro:debug("Demarrage via autostart")
   fibaro:abort()
end

fibaro:debug("Demarrage en cours...")
local NbreScene = fibaro:countScenes()
fibaro:debug("Nombres de Scéne en cours : "..NbreScene)
fibaro:sleep(60*1000)

local Pause = 0
if Minutes > 30 then
  Pause = 60 - Minutes
  else
  Pause = 30 - Minutes
end
fibaro:debug("Mise a jour Variable : "..Pause.."mn")
fibaro:sleep(Pause*60*1000)
Minutes = tonumber(os.date("%M", os.time()))
fibaro:debug("mise a jour VG DemiHeure"..Minutes)
fibaro:setGlobal("DemiHeure", Minutes)
if Minutes == 0 then
   local Heure = tonumber(os.date("%H", os.time()))
   fibaro:setGlobal("Heure", Heure)
   fibaro:debug("mise a jour VG Heure"..Minutes)
end




Exemple d'utilisation :

 

  • Je veux que ma scène se lance à  17h
--[[
%% globals
Heure
--]]

local heure = fibaro:getGlobalValue("Heure")

if heure ~= 17 then; fibaro:abort(); end

fibaro:debug("le script peut être exécuté ")

Un peut plus compliquer

--[[
%% globals
DemiHeure
--]]

local trigger = fibaro:getSourceTrigger()
if (trigger['type'] == 'global') then
  nomTrigger = trigger['name']
  valeurTrigger = tonumber(fibaro:getGlobalValue(nomTrigger))
  print("Nom du déclencheur = ", nomTrigger, " - Minutes : ", valeurTrigger)
  if valeurTrigger ~= 17 then; fibaro:abort(); end
else
  fibaro:debug("La scéne ne peut être lancer que par une Variable Globale")
  fibaro:abort();
end

if nomTrigger="Heure" and valeurTrigger ~= 17 then
  fibaro:abort() 
end
Modifié par mprinfo
  • Upvote 5

Partager ce message


Lien à poster
Partager sur d’autres sites

Merci pour ce tuto ;) super intéressant :60:  

Partager ce message


Lien à poster
Partager sur d’autres sites

Excellent mrpinfo, merciiiiiiiii le king of tuto ;-)

Partager ce message


Lien à poster
Partager sur d’autres sites

bonjour,

j'ai créé une scène avec le script et les variables globales Heure et Demiheure.

Seulement, les VG ne change d'état qu'une seule fois. une fois le premier changement des VG, la scéne n'est plus exécutée.

Partager ce message


Lien à poster
Partager sur d’autres sites

tu as bien mis les triggers ? car c'est eux qui relance la scène

Partager ce message


Lien à poster
Partager sur d’autres sites

J'ai mis dans une scène le premier script du post. celui qui permet de faire varier les variables Heure et DemiHeure.

d’après ce que j'ai compris, le trigger de cette scène est la la variable Heure qu'il y a ligne 5. Celle-ci permet automatiquement de relancer la scène et ainsi de mettre a jour les VG.

Ma scène ne s'exécute qu'une seule fois.

Ce matin, a 9h00, j'avais  Heure = 21 et DemiHeure = 30 avant que j'exécute la scène. les VG se sont mise a jour, mais la scène n'est plus exécutée maintenant.

Partager ce message


Lien à poster
Partager sur d’autres sites

regarde dans le dashboard si la scène est bien lancer

Envoyé de mon SM-G900F en utilisant Tapatalk

Partager ce message


Lien à poster
Partager sur d’autres sites

Justement c'est en regardant le dashboard que je sais si la scène est exécutée. Et ne l'est pas.

Partager ce message


Lien à poster
Partager sur d’autres sites

Je crois qu'il y a un petit bug dans la scène dsl

essai de lancer la scène dans la 1er demi heure si cela fonctionne je corrigerai le code

Envoyé de mon SM-G900F en utilisant Tapatalk

Partager ce message


Lien à poster
Partager sur d’autres sites

dans le dashboard, quand j'exécute une scène, j'ai le bouton gris play qui devient un bouton un bouton bleu stop. Jusque la, je trouve ça normal.

Ensuite, je ferme dashboard puis je le réouvre. La scène precedement executée se retrouve avec le bouton gris play.

Partager ce message


Lien à poster
Partager sur d’autres sites

Je viens de faire de nouveau test aucun soucis avec le code

Partager ce message


Lien à poster
Partager sur d’autres sites

dans le Dashboard, la scène doit toujours être executee (bouton bleu)?

Comment faut il déclarer Heure et DemiHeure : s'agit il de variables prédéfinies?

Partager ce message


Lien à poster
Partager sur d’autres sites

Non des variables globale normale

Envoyé de mon SM-G900F en utilisant Tapatalk

Partager ce message


Lien à poster
Partager sur d’autres sites

C'est en variables globales qu'elles sont déclarées.

Je laisse tombé, je faire que des scènes basiques en bloc.

Merci pour ton aide mprinfo.

Partager ce message


Lien à poster
Partager sur d’autres sites

je passe des heures sur la box àla programmer et rien ne marche. cela me désespère et je me demande pourquoi je l'ai acheté. une HCL m'aurait plus convenu.

Je suis frustré car je me rend bien compte du potentiel de la HC2, c'est dommage.

Heureusement que le forum existe car on peut compter sur votre aide.

Partager ce message


Lien à poster
Partager sur d’autres sites

C'est normal c'est le début il faut que tu t'habitues a l'interface et au termes qui sont utilisé sur le forum c'est pas évident qu'en on commence

Partager ce message


Lien à poster
Partager sur d’autres sites

cette nuit j'ai mis en trigger en plus la variable DemiHeure et cela semble fonctionner.

Ma box a planté ce matin vers 6H30. Je pense que j'ai eu autre scène (alarme automatique) a débugger, plutot a faire débugger.

Par contre, je ne comprends pas pourquoi cela ne fonctionne pas avec uniquement la variable Heure en trigger.

si tout fonctionne bien, je poursuivrais avec ton tuto Scene LUA - ouverture et fermeture des volets

Merci

Partager ce message


Lien à poster
Partager sur d’autres sites

Ah ok il faut les 2 trigger càla scène doit ce lancer toutes les 30 mn

Envoyé de mon SM-G900F en utilisant Tapatalk

Partager ce message


Lien à poster
Partager sur d’autres sites

Ajout d'une correctif suite a un bug rencontré, lorsque l'on mets une VG àjour avec la même valeur il n'y a pas de déclenchement et la scène s’arrête voici donc un correctif

local Minutes = tonumber(os.date("%M", os.time()))
local trigger = fibaro:getSourceTrigger()

if (trigger['type'] == 'autostart') then
   fibaro:setGlobal("DemiHeure", "0"..Minutes)
   fibaro:debug("Demarrage via autostart")
   fibaro:abort()
end

J'ai mis a jour le poste 1

Partager ce message


Lien à poster
Partager sur d’autres sites

Bonjour,

depuis la mise a jour V4.70, j'ai un problème avec cette scène.

La variable globale "Heure" ne change plus, uniquement la variable "DemiHeure".

J'en ai profité du coup pour ajouter le correctif du dernier message, mais cela ne change rien.

de plus dans le debug, il est marqué que la scène tourne deux fois.

une idée!? Merci

Partager ce message


Lien à poster
Partager sur d’autres sites

J'ai l'impression que c'est les variables Heure et DemiHeure qui n'exécute pas la scène.

Sinon c'est le nombre de scène exécutée qui la fait planter.

Partager ce message


Lien à poster
Partager sur d’autres sites

J'ai eu aussi quelques soucis avec cette scène car a priori les triggers ne fonctionne pas toujours bien j'ai donc utilisé la fameuse boucle et plus aucun soucis

--[[
%% autostart
--]]
fibaro:debug("Demarrage en cours...")
local NbreScene = fibaro:countScenes()
if NbreScene > 1 then
   fibaro:abort()
end

local Minutes = tonumber(os.date("%M", os.time()))
local Pause = 0
--------------------------------------------------------------
function CalPause(Minutes)
         if Minutes > 30 then
            Pause = 60 - Minutes
            fibaro:debug("Mise a jour dans "..Pause.." Minutes")   
            fibaro:sleep(Pause*60*1000)
            Minutes = tonumber(os.date("%M", os.time()))
            local Heure = tonumber(os.date("%H", os.time()))
            fibaro:debug(string.format("mise a jour VG Heure = %s h DemiHeure = %s mn",Heure , Minutes))
            fibaro:setGlobal("DemiHeure", Minutes)  
            fibaro:setGlobal("Heure", Heure)
         else
            Pause = 30 - Minutes
            fibaro:debug("Mise a jour dans "..Pause.." Minutes")
            fibaro:sleep(Pause*60*1000)
            Minutes = tonumber(os.date("%M", os.time()))
            Heure = tonumber(os.date("%H", os.time()))
            fibaro:debug(string.format("mise a jour VG DemiHeure = %s mn", Minutes))
            fibaro:setGlobal("DemiHeure", Minutes) 
         end
end

CalPause(Minutes)
fibaro:debug("Demmarrage boucle while true do ....")

while true do
  
   fibaro:sleep(60*1000)
   Minutes = tonumber(os.date("%M", os.time()))
   CalPause(Minutes)
   
end

Partager ce message


Lien à poster
Partager sur d’autres sites

Bonjour à  tous

 

je souhaite ouvrir mes volets à  un horaire different en fonction de la variable JourChome 

 

 

voici ce que j ai fait cela vous semble t il correct?

 

 

--[[
%% autostart
%% properties
%% events
%% globals
--]]
 
local sourceTrigger = fibaro:getSourceTrigger();
function tempFunc()
local currentDate = os.date("*t");
local startSource = fibaro:getSourceTrigger();
if (
 ( (JourChome == NON) and os.date("%H:%M", os.time()-30*60) == fibaro:getValue(1, "sunriseHour"))  or  ((JourChome == OUI) and string.format("%02d", currentDate.hour) .. ":" .. string.format("%02d", currentDate.min) == "08:45"))
 
then
fibaro:call(112, "open");
    fibaro:call(255, "pressButton", "2");
setTimeout(function()
fibaro:startScene(33);
end, 10000)
setTimeout(function()
fibaro:startScene(32);
end, 15000)
setTimeout(function()
fibaro:startScene(34);
end, 20000)
setTimeout(function()
fibaro:startScene(37);
end, 25000)
end
 
setTimeout(tempFunc, 60*1000)
end
if (sourceTrigger["type"] == "autostart") then
tempFunc()
else
 
local currentDate = os.date("*t");
local startSource = fibaro:getSourceTrigger();
if (
startSource["type"] == "other"
)
then
fibaro:call(112, "open");
setTimeout(function()
fibaro:startScene(33);
end, 10000)
setTimeout(function()
fibaro:startScene(32);
end, 15000)
setTimeout(function()
fibaro:startScene(34);
end, 20000)
setTimeout(function()
fibaro:startScene(37);
end, 25000)
end
 
end
 
 
MERCI por votre aide

Partager ce message


Lien à poster
Partager sur d’autres sites

×