Aller au contenu

Messages recommandés

Posté(e)

Salut à  tous, je viens d'écrire à  peu près le même scénario et je voulais juste vous le soumettre. ce que je ne pense pas pouvoir faire c'est le timeout (je suis en V3.6).

 

Ce que je veux faire, c'est entre 18 h et 7h du matin, si la luminosité de ma pièce passe en dessous de 10 lux, j'allume la lampe qui reste allumer tant qu'il y a du mouvement dans la pièce et si après 1 minute de calme rien ne se passe, elle s'éteint.

 

Je vais l'essayer ce soir mais je voulais quand même votre avis. s'il vous plaît

 

Merci les gars !!!

--[[
%% properties
31 value
33 value
%% globals
--]]

local delayedCheck0 = false;
local tempDeviceState0, deviceLastModification0 = fibaro:get(31, "value");
local HeureActuelle = os.date("*t");

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")
if ((HeureActuelle['hour']>= 18 or HeureActuelle['hour'] <= 7) 
and
 ( tonumber(fibaro:getValue(31, "value")) > 0 )
and
 ( tonumber(fibaro:getValue(33, "value")) <= 10 )
)
then
	fibaro:call(29, "turnOn");
    fibaro:sleep(60*1000);
  end

if (( tonumber(fibaro:getValue(31, "value")) == 0 ) and (os.time() - deviceLastModification0) >= 60)
  then
	delayedCheck0 = true;
    end
if 
 ( delayedCheck0 == true )
    then
    fibaro:call(29, "turnOff")
end

  • 1 mois après...
Posté(e)

A rien :-)

 

Pour info, si on utilise pas un retour de fonction en LUA, la norme voudrait que l'on fasse ceci :

local _, deviceLastModification0 = fibaro:get(31, "value");

C'est plus simple pour la compréhension.

 

Bon dans ce cas précis, il aurait fallu utiliser :

local deviceLastModitication0 = fibaro:getModificationTime(31, "value")

Ok, ok , .... je sors  :98:

 

Ps. voici le code de getModificationTime(...)  :P

fibaro.getModificationTime = function(self, deviceID, propertyName)
  local _, modified = fibaro:get(deviceID, propertyName)
  return modified
end
  • Upvote 1
Posté(e)

Je suis vraiment nul et j'ai du mal à  piger !!!

 

@steven comment tu mets en oeuvre ta fonction getModificationTime ? quoi mettre à  quel endroit ? en particulier dans mon script...

 

Comment tu l'introduit ? faut-il un "If" ou autre ? la déclarer comme une variable locale ?

 

J'ai fait ça :

--[[
%% properties
92 value
94 value
%% globals
--]]
local id_lampe1= 29
local id_lampe2 = 171
local id_mouv_couloir = 92
local id_lux_couloir = 94
local delayedCheck0 = false;
local deviceLastModitication0 = fibaro:getModificationTime(92, "value")
local deviceLastModitication1 = fibaro:getModificationTime(29, "value")
local deviceLastModitication2 = fibaro:getModificationTime(171, "value")
local HeureActuelle = os.date("*t");

fibaro:getModificationTime = function(self, 92, "value")
  local _, modified = fibaro:get(92, "value")
  return modified
end

mais j'ai une erreur qui me lance ça :

8.lua.17; function arguments expected near "="

tu peux m'aider stp ???

 

merci

 

j'ai fait

Posté(e)

Comme ceci plutot, essaie ;-)

la fonction doit etre definie avant d'etre appelee.

 

En fait il est toujours preferable de prendre l'habitude de definir les variables et fonctions avant de les utiliser

fibaro.getModificationTime = function(self, deviceID, propertyName)
  local _, modified = fibaro:get(deviceID, propertyName)
  return modified
end
 
 local id_lampe1= 29
local id_lampe2 = 171
local id_mouv_couloir = 92
local id_lux_couloir = 94
local delayedCheck0 = false;
local deviceLastModitication0 = fibaro:getModificationTime(92, "value")
local deviceLastModitication1 = fibaro:getModificationTime(29, "value")
local deviceLastModitication2 = fibaro:getModificationTime(171, "value")
local HeureActuelle = os.date("*t");
Posté(e)

c'est bien fibaro.getModificationTime et non fibaro:getModificationTime ?

 

Je ne remplace rien dans la fonction ? ni deviceID ni propertyName ?

Posté(e)

J'ai des erreurs :

--[[
%% properties
92 value
94 value
%% globals
--]]

fibaro.getModificationTime = function(self, deviceID, propertyName)
  local _, modified = fibaro:get(deviceID, propertyName)
  return modified
end
 
 local id_lampe1= 29
local id_lampe2 = 171
local id_mouv_couloir = 92
local id_lux_couloir = 94
local delayedCheck0 = false;
local deviceLastModitication0 = fibaro:getModificationTime(92, "value")
local deviceLastModitication1 = fibaro:getModificationTime(29, "value")
local deviceLastModitication2 = fibaro:getModificationTime(171, "value")
local HeureActuelle = os.date("*t");

-- si il y a plus d'une instance en route alors on arrête

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

-- ça c'est pour la forme 
fibaro:debug("Il est "..HeureActuelle['hour']..":"..HeureActuelle['min'])
fibaro:debug("le capteur est safe depuis : "..((os.time() - deviceLastModification0)/60).." min")
fibaro:debug("la lumière est éteinte depuis : "..((os.time() - deviceLastModification1)/60).." min")

àla ligne 29 et certainement 30 aussi :

Attempt to perform arithmetics on global 'lastModificationTime0' a nil value
  • 2 mois après...
Posté(e)

Non, ce n'est pas une boucle. C'est un bloc d'instructions mis en attente d'exécution. Le temps d'attente étant défini àla dernière ligne de la fonction.

Voir exemple en page 1 de ce sujet.

Posté(e)

je comprends pas bien...

 

j'ai créé une scène toute simple pour que a 9h30 il m'affiche qqch dans debug.

Elle marche pas.

 

Si je prends une scène en bloc graphique, que je converti en LUA et que j'adapte pour faire pareil, ça marche.

 

La différence est qu'il y a ce setTimeout et le %%event dans l'entête...

 

c'est flou tout ça... pfffffff

Posté(e)

ce bout de code ne marche pas, il n'y a pas de settimeout...

--[[
%% autostart
%% properties
%% events
%% globals
--]]

local heure2 = string.format("%02d", os.date("%H")) .. ":" .. string.format("%02d", os.date("%M"))

if heure2 == "10:00" then
  fibaro:debug("condition ok")
end

celui-ci fonctionne :

--[[
%% autostart
%% properties
%% events
%% globals
--]]

function tempFunc()
  
local currentDate = os.date("*t");
if (
 ( (string.format("%02d", currentDate.hour) .. ":" .. string.format("%02d", currentDate.min) == "10:03") )
)
then
    fibaro:debug("ok")
end

setTimeout(tempFunc, 60*1000)
end
tempFunc()

j'aimerai bien savoir pourquoi ??

 

si qqun a une explication ??

Posté(e)

désolé de vous embêter, mais d'après ces essais :

--[[
%% autostart
%% properties
%% events
%% globals
--]]

function essai()
	fibaro:debug("entrée dans la fonction")  
	local heure2 = string.format("%02d", os.date("%H")) .. ":" .. string.format("%02d", os.date("%M"))
	if heure2 == "10:22" then
  		fibaro:debug("condition ok")
    	--fibaro:abort()
	end
 	setTimeout(essai, 20*1000)
	fibaro:debug("sortie de la fonction")  
end

fibaro:debug("start")
essai()
fibaro:debug("end")

le setTimeout fait belle et bien une boucle en arrière plan tant que rien ne l'arrête (ex : fibaro:abort())

ci-joint la fenêtre d'aperçu du debug...

 

 

 

 

 

 

post-5094-0-18729500-1451208645_thumb.png

Posté(e)

@jjacques68, ce n'est pas forcement évident mais oui le setTimeout n'est pas une boucle mais  (pour faire simple) il exécute du code après un délai déterminé (après le timeout). Effectivement le second script produit une boucle mais c'est la logique du code qui produit une boucle et pas le setTimeout qui est la boucle ;).

 

Le premier code ne marche pas en boucle car il n'est pas dans un bloc

while (true) do end

Bon courage :)

  • Upvote 1
  • 5 mois après...
Posté(e)

bonjour,

je bloque sur une temporisation. Je désire utiliser la fonction setTimeout dans un bouton d'un module virtuel, mais cela ne marche pas.

pouvez vous m'aider merci.

  • 4 mois après...
Posté(e)

 

Voilà  en fait ce que je voulais faire.

 

Les Mamies c'est bien, mais ça se lève la nuit pour satisfaire un besoin bien naturel.

Seulement les Mamies ça ne veut pas déranger, alors ça n'allume pas la lumière.

Résultat, ça se casse la gueule dans les meubles et ça réveille toute la maison.

 

J'ai donc mis un détecteur FGMS001 dans le couloir. Dès que Mamie sort de sa chambre, une lampe du salon s'allume et donne assez de lumière pour rejoindre les toilettes. Tant que Mamies baguenaude entre sa chambre, les toilettes ou la salle de bain, la lumière reste allumée.

Après 2 mn ça s’éteint.

--[[
%% properties
52 value
52 armed
%% globals
--]]

-- c'est le jour alors stop

if (fibaro:getGlobalValue("Day_Night") == "DAY") then
  fibaro:abort();
end

fibaro:debug("Start");

local val = fibaro:getValue(52, "value");
local arm = fibaro:getValue(52, "armed");
local scenenum = fibaro:countScenes();

fibaro:debug("Etat "..val.."  "..arm);
fibaro:debug("scene n "..scenenum);

-- premier déclanchement du détecteur
-- on allume et stop

if (val == "1" and scenenum == 1) then
  fibaro:call(163, "turnOn");
  fibaro:abort();
end

-- déclanchements suivants on attend 120s
-- pour éteindre

setTimeout(function()
local delayedCheck0 = false;
local tempDeviceState0, deviceLastModification0 = fibaro:get(52, "value");


fibaro:debug("Temps écoulé "..os.time() - deviceLastModification0);
    
if (( (tonumber(val) == 0 and tonumber(arm) == 0) ) and (os.time() - deviceLastModification0) >= 120) then
	delayedCheck0 = true;
end

if ( delayedCheck0 == true ) then
	fibaro:call(163, "turnOff");
end
end, 120000)

fibaro:debug("End");

Bonsoir à  vous,

je désirerais créer un timer qui me donnerait le temps écoulé entre deux changement d'état d'un module.

par exemple: "heure actuelle - heure du changement d'état du module"= durée depuis le changement

 

Dans l'exemple cité ci-dessus, comment est renseignée le temps de modification d'état dans la variable "deviceLastModification0"

 

Merci pour vos réponses

 

JP

×
×
  • Créer...