Aller au contenu

Scenes et Var Globale pour gérer l'extinction d'une lumière


Messages recommandés

Posté(e) (modifié)

Hello tous,

 

Tout d'abord merci à la communauté car sans vous, je crois que la gestion domotique en générale ne serait vraiment pas simple :p

 

J'aurais besoin d'un petit coup de pouce ... pour me corriger ou me proposer quelque chose de plus simple ^^

 

J'explique ce que je souhaite faire :

- J'ai une lumiere géré par un FGD212 

- J'ai un détecteur avec l'Oeil

- lorsque quelqu'un entre dans la pièce, la lumière s'allume ... bon jusque là rien de sorcier :) meme moi j'y arrive

 

Ca se complique pour éteindre ... je voudrais que la lumière reste tant que l'oeil perçoit de l'activité et que ca s'éteigne par exemple 5 min après la dernière activité perçue.

D'une manière "simple" j'ai pas réussi.

 

J'ai donc créé 2 scènes :

- La première vérifie si l'oeil s'active et si c'est le cas, il donne la valeur "1" a une variable globale :

--[[
%% properties
102 value
%% events
%% globals
--]]

local VALUE_SENSOR_C = fibaro:getValue(102, 'value')

-- Si le détecteur des combles est activé, 
-- alors on applique la valeur 1 à la variable globale Detect_Combles_Val
if (VALUE_SENSOR_C == '1') then
fibaro:setGlobal('Detect_Combles_Val', 1)
end

 

- la deuxième scène attend 1 min après la dernière détection de l'oeil et affecte la valeur 0 à la variable global. Si la variable global est inchangée par l'autre scene (donc les deux variables sont à 0) on éteint, sinon on laisse allumé. J'ai pris soin de mettre la variable global dans %% globals pour que la scène s'active en cas de changement de la variable globale

--[[
%% properties
121 value
102 value
%% events
%% globals
Detect_Combles_Val
--]]

local VALUE_SENSOR_C = fibaro:getValue(102, 'value')
local LUM_COMBLES = fibaro:getValue(121, 'value')
local D_Combles_Val = fibaro:getGlobalValue('Detect_Combles_Val')

-- Si détecteur combles s'active, j'attends 1 min et je met la Var Globale à 0
if (VALUE_SENSOR_C == '1') then
  fibaro:sleep(60000) -- attend 1 min
  fibaro:setGlobal('Detect_Combles_Val', 0)
end

-- Dans le cas ou il n'y plus d'activité, on éteint. 
-- Si activité, la Scène "Check Detect Combles" remettra la Var Globale à 1 dans 
-- l'autre scene
if (VALUE_SENSOR_C == '0') then
  D_Combles_Val = fibaro:getGlobalValue('Detect_Combles_Val')
  if (D_Combles_Val == '0') then
	fibaro:call(121, 'turnOff')
  end  
end

 

 

Modifié par Doudoubidou
Posté(e)

J'entrevois une cause :

Dans les ordres fibaro:setGlobal, la valeur est numérique, et lors du test sur la valeur (if (D_Combles_Va l == '0') then) il s'agit d'une chaîne de caractères.

 

Posté(e)

Hello,

mmmh, j'ai testé mais c'est bien avec '0' qu'il faut mettre ...

D'ailleurs ma scene fonctionne bien, lorsque je sors de la piece, et que j'attends assez, la Var global repasse bien a 0. Et si j'execute ma scene manuellement, la lampe s'éteint correctement.

Le problème est que la scène ne se rééxecute pas toute seule !? Pourtant en mettant ca je pensais que la scene se lançait toute seul lors du changement de la var globale ? :

%% globals
Detect_Combles_Val
Posté(e)

Je maintiens mon diagnostic 0 et '0' !

fibaro:setGlobal('Detect_Combles_Val', 0)
...
D_Combles_Val = fibaro:getGlobalValue('Detect_Combles_Val')
  if (D_Combles_Val == '0') then

Ta scène s'exécute bien deux fois, ajoute un fibaro:debug en tête pour t'en assurer.

 

Lors du passage de la variable globale à 0, une nouvelle scène est lancée, et la scène continue à s'exécuter mais suite à la confusion entre '0' et 0,  le test échoue. Pour la même raison la nouvelle scène ne fait rien.

 

 

Posté(e)

Merci pour ton retour Barelle, je viens de tester et le résultat est :

La valeur de la variable globale est bien changée dans les 2 cas et le renvoie Fibaro:debug donne le meme résultat. Mais la scene ne se relance pas.

Par contre si je fais "démarrer" sur la scene manuellement, alors elle s'execute correctement et éteint les lumières avec le '0' mais ne le fait pas avec 0 sans cote.

Donc il interprète apparement correctement avec les cotes.

 

Mais toujours pas de relance de la scène :'( 

 

Posté(e)

Oups, j'ai été soumis à une certaine confusion qui m'a fait écrire de fausses assertions.

La scène ayant été déclenchée par un changement de valeur de la variable globale ne sera pas redéclenchée par un changement de la valeur de la même variable globale, il me semble bien, mais sans être catégorique, que dans des versions précédentes nous n'avions pas ce comportement.

 

Pour ton cas précis, je ne vois pas très bien en quoi cela altère le comportement attendu.

Posté(e)

Tu avais évoqué la possibilité de faire plus simplement, je te propose une seule scène que je n'ai pas testé :

--[[
%% properties
102 value
--]]

local lumComblesId		= 121;
local sensorComblesId	= 102;
local delai				= 60; 							-- en secondes

if fibaro:getValue(lumComblesId, 'value') == "0" then	-- C'est éteint
	fibaro:abort();										-- Il n'y a rien à faire, on sort
end

if fibaro:countScenes() > 1 then						-- Une seule scène active
	fibaro:abort();										
end

fibaro:sleep(delai * 1000);								-- On attend le delai exprimé en secondes
local temps = os.time() - fibaro:getModificationTime(sensorComblesId, 'value'); -- temps écoulé depuis la dermière modification
if temps > delai then
	fibaro:call(lumComblesId, 'turnOff');				-- alors on éteint
end

 

Posté(e) (modifié)

moi j‘utilise ça

 

Le principe est que tant qu‘il voit l’œil est à 1, elle boucle sur elle-même.

Il faut bien rapamétrer l’œil car c’est lui qui

va déterminer la durée où la lumière est allumée : paramètre 6 - Alarme cancellation delay (le temps que tu veux en secondes)

- autorise une nouvelle détection après la précédente : paramètre 2 - blind time (2 secondes dans mon cas)

 

J’ai toute la maison qui fonctionne comme ça. Marche nickel.

 

Cette scène peut être utilisée pour plusieurs pièces (j’en ai une pour toute la maison)

Il suffit d‘ajouter

l‘ID du capteur dans les trigger (XXX value).

- une ligne dans la liste “Device“ pour connaître le l‘ID du FGD ou autre.

 

Et mettre le nombre d‘instance de la scène au maximum (10). Je pense pas que 10 capteurs vont passer à 1 simultanément, donc on est tranquille :) 

--[[
%% properties
XXX value
YYY value
--]]

local Device = {
	--[ID_PIR] = {ID = ID_Actuator, NAME = "Room Name"}
	[XXX] = {ID = zzz, NAME = "Pièce 1"},
	[YYY] = {ID = www, NAME = "Pièce 2"},	
}

local Trigger = fibaro:getSourceTrigger()

--si PIR = ON
if tonumber(fibaro:getValue(Trigger.deviceID, "value")) == 1 then

	print("PIR", Trigger.deviceID, " = ON")
	
 	--allumage
	fibaro:call(Device[Trigger.deviceID].ID, "turnOn")

	--boucle tant qu'il y a de l'activité (ça rajoute max 3 secondes au temps du paramètre 6)
	while tonumber(fibaro:getValue(Trigger.deviceID, "value")) == 1 do fibaro:sleep(3*1000) end 
    
	--extinction
 	fibaro:call(Device[Trigger.deviceID].ID, "turnOff")
    
	print("PIR", Trigger.deviceID, " = OFF")
end

 

Possibilité de rajouter une marche forcée gérée par un VD et une VG par pièce.

Modifié par jjacques68
Posté(e) (modifié)

Merci à vous deux :)

 

J'ai repris la scène de Jacques68 qui me semble intéressante et permet de réduire le nombre de mes scènes ...

 

J'ai modifié comme suit :

--[[
%% properties
102 value
--YYY value
%% events
%% globals
--]]

local Device = {
	---[ID_PIR] = {ID = ID_Actuator, NAME = "Room Name"}
	[102] = {ID = 121, NAME = "Combles"},
	---[YYY] = {ID = www, NAME = "Pièce 2"},	
}

local Trigger = fibaro:getSourceTrigger()

--si PIR = ON
if tonumber(fibaro:getValue(Trigger.deviceID, "value")) == 1 then

	print("PIR", Trigger.deviceID, " = ON")
	
 	--allumage
	fibaro:call(Device[Trigger.deviceID].ID, "turnOn")

	--boucle tant qu'il y a de l'activité (ça rajoute max 3 secondes au temps du paramètre 6)
	while tonumber(fibaro:getValue(Trigger.deviceID, "value")) == 1 do fibaro:sleep(3*1000) end 
    
	--extinction
 	fibaro:call(Device[Trigger.deviceID].ID, "turnOff")
    
	print("PIR", Trigger.deviceID, " = OFF")
end

Et j'ai configuré mon Oeil avec les param suivant :

paramètre 6 : 1 min

paramètre 2 : valeur 3 (doit correspondre à 2 sec)

 

Mais lorsque j'exécute la scène, il me renvoie ce message :

[DEBUG] 10:29:35: 2020-01-04 10:29:35.811984 [ fatal] Unknown exception: /opt/fibaro/FibaroSceneAPI.lua:116: attempt to concatenate local 'deviceId' (a nil value)
 

 

Modifié par Doudoubidou
Posté(e)

J'ai réessayé en mettant le param 6 à 30 sec pour que ca soit moins long.

Ca marche niquel !!

C'est top :) Merci.

 

Je vais y ajouter une condition pour que ça ne s'active pas dans la journée.

 

Merci  pour votre aide c'est top et comme ca j'ai appris un peu plus du code et des paramètres de ma Fibaro ;)

Bonne journée à vous :)

Posté(e)

Re, 

Mon retour d'expériences après quelques jours ...

Bon, en fait mon détecteur de luminosité marche bizarrement et me renvoie des valeurs pas très cohérentes :(

En cherchant sur les forum, j'ai l'impression que beaucoup de monde se plaignent du même genre de pb :(

Je vais revenir sur les conditions a base d'horaires (dommage :/)

Mais bien dommage que la luminosité ne marche pas bien :(

×
×
  • Créer...