Aller au contenu

Messages recommandés

Posté(e)

Bonjour à tous,

 

Depuis quelques jours j'ai une scène qui bug. Elle fonctionnait très bien depuis plusieurs semaines et depuis peu elle ne fonctionne mais que partiellement...

Voici la scène en question:

 

--[[
%% properties
74 value
%% globals
--]]

-- c'est la nuit ou petit dej alors stop

if (fibaro:getGlobalValue("Jour_Nuit") == "Nuit") or
   (fibaro:getGlobalValue("Petit_Dej") == "OUI")  then
   fibaro:debug("Scène annulée");
   fibaro:abort();
end

-- déclaration de variables

local Petit_Dej = fibaro:getGlobalValue("Petit_Dej");
local Luminosite = fibaro:getValue(76, "value");
local delayedCheck0 = false;
local tempDeviceState0, deviceLastModification0 = fibaro:get(74, "value");
local HeureActuelle = os.date("*t");

-- fin de déclaration de variables

if (fibaro:countScenes() > 1) then fibaro:abort() end;
fibaro:debug("Il est "..HeureActuelle['hour']..":"..HeureActuelle['min'])
fibaro:debug("le capteur est safe depuis : "..((os.time() - deviceLastModification0)/60).." min")
fibaro:debug("La luminosité est de "..Luminosite.." Lux")
fibaro:debug("Petit déjeuner : "..Petit_Dej)
if 
 ( tonumber(fibaro:getValue(74, "value")) > 0 )
and
 ( tonumber(fibaro:getValue(76, "value")) <= 5 ) -- valeur en Lux

then
    fibaro:call(65, "turnOn");
    fibaro:debug("Lampe allumée")
    fibaro:sleep(60*1000);
  end
if (( tonumber(fibaro:getValue(74, "value")) == 0 ) and (os.time() - deviceLastModification0) >= 300) -- temps après extinction
  then
    delayedCheck0 = true;
    end
if 
 ( delayedCheck0 == true )
    then
    fibaro:call(65, "turnOff");
    fibaro:debug("Lampe éteinte")
end

 

La scène débute bien, la lampe s'allume mais ne s'éteint plus au bout de 5mn. J'ai l'impression que le décompte ne se fait plus.

 

Quelqu'un a une idée ?

Posté(e)

Je ne comprends plus... Ca me fait n'importe quoi maintenant.

Il y a peut être un moyen plus simple. Dur dur d'apprendre quand on commence de zéro :15:

Posté(e)

Bonjour,

 

A mon avis ta variable deviceLastModification0 est erronée.

Dans ta scène actuelle elle prend la valeur "ON/OFF" du module (fibaro:get(X,"value'))

Alors qu'elle devrait correspondre, à l'heure du dernier changement d'état du module.

Essaie avec:

local deviceLastModification0 = fibaro:getModificationTime(74, 'value')

Courage...

 

Posté(e)

Merci pour la réponse mais ça ne fonctionne pas.

Voici ce que j'ai dans le debug:

 

[DEBUG] 11:08:19: Il est 11:8
[DEBUG] 11:08:19: line 29: attempt to perform arithmetic on local 'deviceLastModification0' (a nil value)

 

line 29: fibaro:debug("le capteur est safe depuis : "..((os.time() - deviceLastModification0)/60).." min")

 

Posté(e)

Effectivement la variable tempDeviceState0 ne me servait plus, je l'ai enlevée.

Maintenant la lampe s'allume mais ne veut pas s'éteindre au bout de 5mn. Par contre si je relance la scène manuellement la lampe s'éteint... Bizarre !

[DEBUG] 09:29:32: line 29: attempt to perform arithmetic on local 'deviceLastModification0' (a nil value)

 
Posté(e)

le problème de l'extinction vient du fait qu'il n'y pas de temporisation dans la scène.

 

rajoute en dessous de %% globals:

 

%% killOtherInstances 

 

et change:

if (( tonumber(fibaro:getValue(74, "value")) == 0 ) and (os.time() - deviceLastModification0) >= 300) -- temps après extinction
  then
    delayedCheck0 = true;
    end

 

par

if (( tonumber(fibaro:getValue(74, "value")) == 0 )
  then

    fibaro:sleep(300*1000)
    delayedCheck0 = true;
    end

 

 

 

Posté(e)

C'est pas vraiment le même usage:

 

%%killOtherInstances : lorsque la scène est lancée toutes les autres instances déjà en cours sont interrompues

 

if fibaro:countScenes() > 1 then fibaro:abort() end : si d'autres instances sont déjà en cours alors la nouvelle instance est interrompue

 

Posté(e)

Merci pour toutes ces réponses !

J'ai pu avancer un peu sur mon problème en faisant quelques modifications.

Maintenant la lumière s'éteint bien au bout de 5 mn mais j'ai encore un soucis.

A l'heure actuelle, la lumière s'allume bien quand le détecteur est déclenché et que la luminosité est inférieur à 5lux mais s'éteint 5mn après le premier déclenchement. Or j'aimerais que la lumière reste allumée tant qu'il y a du mouvement et s'éteigne au bout de 5mn si plus de mouvement mais je ne sais comment faire...

 

voici ma scène modifiée qui ne fonctionne pas encore à la perfection...

 

--[[
%% properties
74 value
%% globals
--]]

 

-- c'est la nuit ou petit dej alors stop

 

if (fibaro:getGlobalValue("Jour_Nuit") == "Nuit") or
   (fibaro:getGlobalValue("Petit_Dej") == "OUI")  then
   fibaro:debug("Scène annulée car nuit ou petit dej'");
   fibaro:abort();
end

 

-- déclaration des variables

 

local Petit_Dej = fibaro:getGlobalValue("Petit_Dej");
local Luminosite = fibaro:getValue(76, "value");
local deviceLastModification0 = fibaro:getModificationTime(74, "value");
local delayedCheck0 = false;
local HeureActuelle = os.date("*t");

 

-- fin de déclaration des variables

 

if (fibaro:countScenes() > 1) then fibaro:abort() end;

 

fibaro:debug("Il est "..HeureActuelle['hour']..":"..HeureActuelle['min'])
fibaro:debug("La luminosité est de "..Luminosite.." Lux")
fibaro:debug("Petit déjeuner : "..Petit_Dej)

 

-- premier déclenchement on allume puis stop

 

if 
 ( tonumber(fibaro:getValue(74, "value")) > 0 )
and
 ( tonumber(fibaro:getValue(76, "value")) <= 5 )
then
    fibaro:call(65, "turnOn");
      fibaro:debug("Lampe allumée")
    fibaro:abort()
  end

 

-- déclenchements suivants on attends XX sec pour éteindre

 

setTimeout(function()
fibaro:debug("Temps écoulé "..os.time() - deviceLastModification0);

if (( tonumber(fibaro:getValue(74, "value")) == 0 ) and (os.time() - deviceLastModification0) >= 300)
  then
    delayedCheck0 = true;
    end
if 
 ( delayedCheck0 == true )
    then
    fibaro:call(65, "turnOff");
      fibaro:debug("Lampe éteinte")
end
  end, 300*1000)

 

Une autre question, est ce que le setTimout ne fait pas double emploi avec if (( tonumber(fibaro:getValue(74, "value")) == 0 ) and (os.time() - deviceLastModification0) >= 300) ?

Encore merci par avance pour vos réponses !

 

Bonne journée.

Posté(e) (modifié)

Je réponds à moi même :D

Voici ce qui fonctionne parfaitement et qui répond à mes besoins:

Merci PdB ;)

 

--[[
%% properties
74 value
%% globals
%% killOtherInstances
--]]

 

-- c'est la nuit ou petit dej alors stop

 

if (fibaro:getGlobalValue("Jour_Nuit") == "Nuit") or
   (fibaro:getGlobalValue("Petit_Dej") == "OUI")  then
   fibaro:debug("Scène annulée car nuit ou petit dej'");
   fibaro:abort();
end

 

-- déclaration des variables

 

local Petit_Dej = fibaro:getGlobalValue("Petit_Dej");
local Luminosite = fibaro:getValue(76, "value");
local delayedCheck0 = false;
local HeureActuelle = os.date("*t");

 

-- fin de déclaration des variables

 

if fibaro:countScenes() > 1 then fibaro:abort() end

 

fibaro:debug("Il est "..HeureActuelle['hour']..":"..HeureActuelle['min'])
fibaro:debug("La luminosité est de "..Luminosite.." Lux")
fibaro:debug("Petit déjeuner : "..Petit_Dej)
if ( tonumber(fibaro:getValue(74, "value")) == 0 ) then
  fibaro:debug("Fin de présence, décompte de 5mn activé...")
  else
  fibaro:debug("Présence détectée")
  end

 

-- premier déclenchement on allume puis stop

 

if 
 ( tonumber(fibaro:getValue(74, "value")) > 0 )
and
 ( tonumber(fibaro:getValue(76, "value")) <= 5 )
then
    fibaro:call(65, "turnOn");
      fibaro:debug("Lampe allumée")
    fibaro:abort()
  end

 

-- déclenchements suivants on attends 5mn pour éteindre

 

setTimeout(function()
if ( tonumber(fibaro:getValue(74, "value")) == 0 )
  then
    delayedCheck0 = true;
    end
if 
 ( delayedCheck0 == true )
    then
    fibaro:call(65, "turnOff");
      fibaro:debug("Lampe éteinte")
end
    end, 5*60*1000) --temps après extinction 5mn

Modifié par lexus_69
×
×
  • Créer...