Aller au contenu

Messages recommandés

Posté(e)

Salut à  tous,

 

j'ai un petit souci.

J'ai voulu programmer une scène qui active l'armement du détecteur d'ouverture de porte si aucun mouvement est détecté pendant 10 minutes avec un changement des RGB en rouge.

 

Je n'ai pas eu de soucis tout fonctionne parfaitement mais ensuite j'ai voulu programmer une autre scène qui désarme le détecteur de porte si le detecteur est armé et normal et si il y a un mouvement dans l'une des pièces de l'appartement avec les RGB qui s'éteignent

 

Alors là  impossible de faire fonctionner ces deux scènes entre elles. Quand j'essaye de lancer l'armement manuellement, il repart rapidement à  zéro et la HC2 plante radicalement.

Existe t'il un moyen LUA pour faire fonctionner ces deux scènes sans pour autant faire exploser la box et qu'elles s'entrechoquent entre elles

 

Merci pour votre aide

Posté(e)

Oui c'est ça tu as raison.

Le souci c'est je souhaite vraiment activer l'armement automatique. Le souci c'est que je souhaite qu'il se désactive automatiquement. Je pense que ça provoque un loop et qu'il faut que j'enlève le désarmement automatique pour le faire manuellement.

 

Existe t'il un moyen de demander un désarmement automatique sans pouvoir créer un loop car avant on a la scène d'armement qui s'active automatiquement

Posté(e)

Merci beaucoup pour le coup de main :) J'apprécie !

 

 

Armement AUTO

 

--[[
%% autostart
%% properties
105 value
101 value
76 value
60 value
119 value
%% globals
--]]

local delayedCheck0 = false;
if ( tonumber(fibaro:getValue(119, "value")) == 0 ) then
    delayedCheck0 = true;
end
fibaro:sleep(600000);
local delayedCheck1 = false;
local tempDeviceState1, deviceLastModification1 = fibaro:get(105, "value");
if (( tonumber(fibaro:getValue(105, "value")) == 0 ) and (os.time() - deviceLastModification1) >= 600) then
    delayedCheck1 = true;
end
local delayedCheck2 = false;
local tempDeviceState2, deviceLastModification2 = fibaro:get(101, "value");
if (( tonumber(fibaro:getValue(101, "value")) == 0 ) and (os.time() - deviceLastModification2) >= 600) then
    delayedCheck2 = true;
end
local delayedCheck3 = false;
local tempDeviceState3, deviceLastModification3 = fibaro:get(76, "value");
if (( tonumber(fibaro:getValue(76, "value")) == 0 ) and (os.time() - deviceLastModification3) >= 600) then
    delayedCheck3 = true;
end
local delayedCheck4 = false;
local tempDeviceState4, deviceLastModification4 = fibaro:get(60, "value");
if (( tonumber(fibaro:getValue(60, "value")) == 0 ) and (os.time() - deviceLastModification4) >= 600) then
    delayedCheck4 = true;
end

local startSource = fibaro:getSourceTrigger();
if (
 ( delayedCheck0 == true  and  delayedCheck1 == true  and  delayedCheck2 == true  and  delayedCheck3 == true )
and
 ( delayedCheck4 == true )
or
startSource["type"] == "other"
)
then
    fibaro:call(119, "setArmed", "1");
    fibaro:call(80, "setColor", "255", "0", "0", "0");
end
 

 

DESARMEMENT AUTO

 

--[[
%% autostart
%% properties
119 value
105 value
101 value
76 value
60 value
119 armed
%% globals
--]]

local startSource = fibaro:getSourceTrigger();
if (
 ( (tonumber(fibaro:getValue(119, "value")) == 0 and tonumber(fibaro:getValue(119, "armed")) > 0) )
and
 ( tonumber(fibaro:getValue(105, "value")) > 0  and  tonumber(fibaro:getValue(101, "value")) > 0  and  tonumber(fibaro:getValue(76, "value")) > 0  and  tonumber(fibaro:getValue(60, "value")) > 0 )
or
startSource["type"] == "other"
)
then
    fibaro:call(119, "setArmed", "0");
    fibaro:call(80, "turnOff");
 
--Fait une pause de 10 secondes
fibaro:sleep(10000);
 
--apres 10 secondes, relancer le programme precedent
fibaro:call(80, "startProgram", currentProgramID);
else
 
--get last color
local colorSet = fibaro:getValue(80, "lastColorSet");
--set old color
local RGBWTable= {};
local i = 1;
 
for value in string.gmatch(colorSet,"(%d+)") do
RGBWTable = value;
i = i + 1;
end
 

Posté(e)

Voilà  une proposition :

 

1 seul scénario

 

Il tourne automatiquement toutes les minutes pour vérifier s'il doit armer ou non la porte. Si oui (porte fermée et pas de mouvement depuis plus de 10mn) alors il l'arme.

 

Il répond à  un changement d'état d'un détecteur de mouvement. Si la porte est fermée et armée et qu'un mouvement est détecté, il désarme la porte.

 

Attention,dans tes scripts il y a une variable currentProgramID qui est appelée mais pas renseignée.

 

Il ne devrait plus y avoir de conflit.

--[[
%% autostart
%% properties
105 value
101 value
76 value
60 value
%% globals
--]]

local porte = 119
local rgb = 80
local mouvements = {105, 101, 76, 60}
local delai = 10*60 -- 10 minutes

local startSource = fibaro:getSourceTrigger();

if (startSource["type"] == "autostart") then

	-- Toutes les minutes ont vérifie les détecteurs de mouvements et la porte
	while true do
	
		-- On vérifie que la porte soit bien fermée
		local porte_fermee = tonumber(fibaro:getValue(porte, "value")) == 0

		-- On vérifie que les détecteurs soient inactif et depuis plus de X minutes
		if (porte_fermee) then 
			local mouvements_ok = true
			for i = 1, #mouvements do
				local tempDeviceState, deviceLastModification = fibaro:get(#mouvements[i], "value");
				if ( ( tonumber(tempDeviceState) > 0 ) and (os.time() - deviceLastModification) < delai) ) then
				    mouvements_ok = false;
				end
			end
		end
		
		if (porte_fermee and mouvements_ok) then
			fibaro:call(porte, "setArmed", "1");
			fibaro:call(rgb, "setColor", "255", "0", "0", "0");		
		end

		fibaro:sleep(60*1000) -- on dort 60 secondes
	end

elseif (startSource["type"] == "property") then 
	
	local porte_fermee_et_armee = (tonumber(fibaro:getValue(porte, "value")) == 0 and tonumber(fibaro:getValue(porte, "armed")) > 0)
	
	local dectecteur_en_alerte = tonumber(fibaro:getValue(startSource["deviceID"], "value")) > 0
	
	if (porte_fermee_et_armee and dectecteur_en_alerte) then		
		fibaro:call(porte, "setArmed", "0");
		fibaro:call(rgb, "turnOff");
		
		--Fait une pause de 10 secondes
		fibaro:sleep(10000);
		 
		--apres 10 secondes, relancer le programme precedent
		-- !!!!!!!! currentProgramID !!!!!!!!!!
		fibaro:call(rgb, "startProgram", currentProgramID);
	else
		--get last color
		local colorSet = fibaro:getValue(rgb, "lastColorSet");
		--set old color
		local RGBWTable= {};
		local i = 1;
		 
		for value in string.gmatch(colorSet,"(%d+)") do
			RGBWTable[i] = value;
			i = i + 1;
		end
	end
	
end

Posté(e)

Tu es un roi !! Je n'ai que ça àdire ! Je test et je reviendrai vers toi. Merci beaucoup.

Je vais essayer de voir si je peux checker ce que j'ai foutu avec ce currentprog ID.

Posté(e)

Supprime la ) collée à  delai

 

if ( ( tonumber(tempDeviceState) > 0 ) and (os.time() - deviceLastModification) < delai) ) then

Posté(e)

Oh la la ... je suis chèvre ce soir, le # n'a rien a faire ici.

 

local tempDeviceState, deviceLastModification = fibaro:get(#mouvements, "value");

Posté(e)

haha oui ça marche mieux maintenant, je te tiens au courant si tout fonctionne correctement

Merci en tous les cas.

 

J'ai ajouté pour le CurrentID

 

 local currentProgramID = tonumber(fibaro:getValue(80, "currentProgramID"));
 
if (porte_fermee_et_armee and dectecteur_en_alerte and currentProgramID > 0) then  

 

 

Tu crois qu'il serait facile d'intégrer dans ton code un programme couleur spécifique (RGB)

quand le module Porte sont en train de s'armer ? (Durant les 15s de délai avant l'armement)

ou il faut créer une autre scène ?

  • Upvote 1
Posté(e)

Essai de toujours avoir en haut de tes scripts les ID des modules que tu utilises

 

local rgb = 80

 

et de toujours l'utiliser, car si un jour ton module RGB grille et que tu dois le remplacer, tu risques d'oublier quelques part et d'avoir des comportements très dérangeant (le script plante au beau milieu sans prévenir).

 

local currentProgramID = tonumber(fibaro:getValue(rgb, "currentProgramID"));

 

 

J'espère que cela va fonctionner correctement et répondre à  ta question initiale.

 

Cordialement

Posté(e)

Bon j'ai effectué quelque test en baissant le timing et éviter d'attendre 10 minutes et ça ne fonctionne pas la porte ne s'arme pas

et si je l'arme manuellement pour vérifier si la partie detection et désarmement fonctionne c'est pareil la Porte reste armée ... :)

Posté(e)

Pour la partie armement, un petit détail manque 

local delai = 10*60 -- 10 minutes

a remplacé par 

local delai = 10*60*1000 -- 10 minutes

En effet, nous ne comparons pas des secondes mais des millisecondes.

 


 

Pour la partie désarmement, une question surgit dans ma tête ... a-t-on le droit de désarmer un périphérique ?

Posté(e)

Je me dit que si une simple scène avec des blocks de couleurs est capable de te proposer l'option "désarmer" c'est que ça doit être faisable.

En revanche souvent chez fibaro cet faisable mais ça ne marche pas ... LoL

Donc je ne sais pas

Posté(e)

Je test dès que ma femme aura quitté la maison avec les enfants ... ce au cas ou je déclenche l'alarme sans le vouloir.

Posté(e)

Testé avec succès, c'est donc possible sans soucis.

 

Ce qui pourrait poser un soucis

 

local currentProgramID = tonumber(fibaro:getValue(80, "currentProgramID"));
if (porte_fermee_et_armee and dectecteur_en_alerte and currentProgramID > 0) then

 

S'il n'y a pas de programme en cours sur le module RGB, la porte ne sera pas désarmée. 

 

Il faudrait mieux faire 

if (porte_fermee_et_armee and dectecteur_en_alerte) then		
	fibaro:call(porte, "setArmed", "0");
	local currentProgramID = tonumber(fibaro:getValue(90, "currentProgramID"));
	fibaro:call(rgb, "turnOff");

	if (currentProgramID > 0) then
		--Fait une pause de 10 secondes
		fibaro:sleep(10000);

		--apres 10 secondes, relancer le programme precedent
		-- !!!!!!!! currentProgramID !!!!!!!!!!
		fibaro:call(rgb, "startProgram", currentProgramID);
	else
		--get last color
		local colorSet = fibaro:getValue(rgb, "lastColorSet");
		--set old color
		local RGBWTable= {};
		local i = 1;

		for value in string.gmatch(colorSet,"(%d+)") do
			RGBWTable[i] = value;
			i = i + 1;
		end
	end
end
Posté(e)

Le désarmement fonctionne. C'est bon !

En revanche j'ai toujours un souci moi avec l'armement il ne se passe rien... c'est étrange. Il faut que je regarde ce qu'il se passe...

Posté(e)

J'ai modifié quelques trucs tu me dis si je n'ai pas fait de connerie

local currentProgramID = tonumber(fibaro:getValue(90, "currentProgramID"));

que j'ai remplacé par

local currentProgramID = tonumber(fibaro:getValue(rgb, "currentProgramID"));

car tu l'avais annoncé plus haut dans le code

et

fibaro:sleep(10000);

par

fibaro:sleep(10*1000);

Je vais essayer de travailler l'inclusion d'un programme RVB qui s’exécute pendant le délai d'armement. J'ai demandé de l'aide àdes mecs sur le forum FIBARO mais il semble que tu sois plus passionné qu'eux LOL...

ensuite je posterai ce script sur le fofo avec ton crédit bien entendu si ça peut aider d'autre qui ont envie d'automatiser leur armement pour l'alarme.

  • Upvote 2
Posté(e)

Je suis entrain de relire le code  et j'ai fait une chose qui va faire rire @JossAlf (voir l'acticle Portée des variables)

		-- On vérifie que les détecteurs soient inactif et depuis plus de X minutes
		if (porte_fermee) then 
			local mouvements_ok = true
			for i = 1, #mouvements do
				local tempDeviceState, deviceLastModification = fibaro:get(mouvements[i], "value");
				if ( ( tonumber(tempDeviceState) > 0 ) and (os.time() - deviceLastModification) < delai ) then
				    mouvements_ok = false;
				end
			end
		end

                if (porte_fermee and mouvements_ok) then

La variable "local mouvements_ok = true" est déclarée dans le if (porte_fermee) then ... cette variable va dont disparaitre dès la fin du if et elle n'existera pas quand on la testera plus tard. ... Aà¯e, aà¯e, aà¯e

 

 

En remontant cette ligne ainsi, c'est tout bon, désolé.

		-- On vérifie que les détecteurs soient inactif et depuis plus de X minutes
                local mouvements_ok = true
		if (porte_fermee) then 	
			for i = 1, #mouvements do
				local tempDeviceState, deviceLastModification = fibaro:get(mouvements[i], "value");
				if ( ( tonumber(tempDeviceState) > 0 ) and (os.time() - deviceLastModification) < delai ) then
				    mouvements_ok = false;
				end
			end
		end

                if (porte_fermee and mouvements_ok) then
  • Upvote 1
Posté(e) (modifié)

Haha :) Merci 

Tout fonctionne parfaitement, armement et désarmement. Tu es un chef !! sauf une chose qui pose problème.

 

En effet quand il y a une intrusion, c'est à  dire que le détecteur d'ouverture de Porte passe en mode "Alerte et Armé", la désactivation automatique fonctionne toujours; dès que le capteur de mouvement perçoit un mouvement tout se désarme ... alors que tout devrait se bloquer du moment qu'il y a intrusion et alerte.

 

Cela fait bugger d'ailleurs la box... :) je suis obligé de redémarrer

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