Aller au contenu
Moicphil

Module Virtuel Alarme Avancée

Recommended Posts

yes, merci Steven de venir à  mon secours de galerien du code ;-)

Developpeur, ca s'invente pas, c'est un metier ;-)

 

C'est exactement ce que je me demandais, comment faire pour arreter la boucle hihihihi

 

je ne savais pas qu'en faisant un get dans la boucle des capteurs, il recuperait tout.

 

Donc ca pourrait s'ecrire comme ceci ?

   local value, lastmodif = fibaro:get(capteurs[i], "value")
    fibaro:debug("Capteurs num : " ..capteurs[i].. "a pour valeur " ..value .. " lastModif : " ..lastmodif)

Apres par contre tu m'as perdu lol

 

je crois avoir compris,

tu fais sonner si diff<30 et si mode different de arret jusqu'a ce qu'on atteigne les 3 mins

 

Donc le besoin de kinou est

 - si diff<30, on ne sonne pas tant que le mode est different d'arret jusqu'au 30, si mode = arret dans les 30, pas de sirene

 - si diff>30 on sonne ;-)

 

Je repropose qqch avec ce que j'ai compris,

 

Merci Seven

 

Repasse apres ma future proposition completee de ton aide ;-)

  • Upvote 1

Partager ce message


Lien à poster
Partager sur d’autres sites

Pas de soucis, je repasse plus tard.

lastmodif correspond au nombre de milliseconde, c'est donc pas très lisible dans un debug.

Utilise ceci :

.. os.date("%HH%m", lastmodif) 
 

Partager ce message


Lien à poster
Partager sur d’autres sites

Voila la nouvelle proposition avec tes conseils Steven

 

Ceci est-il logique ? j'ai un peu demal avec la boucle

if ((AlarmeMaison == "ON") and (Statut["etat"] > 0)) then
   fibaro:debug("Alarme Maison : ON, Capteurs sensibles")
        for i=1, #capteurs do --pour les capteurs sensibles
             local value, lastmodif = fibaro:get(capteurs[i], "value")
             fibaro:debug("Capteurs num : " ..capteurs[i].. "a pour valeur " ..value .. " lastModif : " .. os.date("%HH%m", lastmodif))
            
            if (value > 0) then
                 local diff = tonumber(os.difftime(os.time(), lastmodif))
                 fibaro:debug("Difference : " ..diff.. "pour capteurs num : " ..capteurs[i])
                
                 if (diff <= 30) then
                    local start = 0
                    local dureemax = 30 --30 secs
                    while (mode ~= "Arret" and start <= dureemax) do
                    fibaro:sleep(1000)
                    start = start + 1
                    end
                    fibaro:debug("Sirene turnOff") --Sirene interieure OFF
                 else
                    fibaro:debug("Sirene turnOn") --Sirene interieure ON
                 end
            end
          end  
elseif ((AlarmeMaison == "ON") and (Statut["etat"] < 1)) then
          fibaro:debug("Alarme MAISON : ON, Aucun capteur sensible")
          fibaro:call(309, "pressButton", "2") --envoi SMS
          fibaro:call(339, "turnOn") --Sirene interieure ON
          fibaro:sleep(6*1000)
          fibaro:call(339, "turnOff") --Sirene interieure OFF
end

Partager ce message


Lien à poster
Partager sur d’autres sites

Ce que je comprends pas c'est ceci :

if (diff <= 30) then

else

fibaro:debug("Sirene turnOn") --Sirene interieure ON

end

C'est àdire la sirène va démarrer uniquement si le module a été activé depuis plus de 30 sec ?

Faut dire que j'ai pas lu tout les posts, je suis donc pas au courant de ce que cela devrait faire mais àla lecture du code, j'ai l'impression que quelque chose cloche.

T'arrives expliquer en 2 lignes stp :-)

Partager ce message


Lien à poster
Partager sur d’autres sites

J'ai trouvé le message.

Alarme instantanée pour tous les capteurs sauf certain ou il faut différé l'alarme de 30 secondes.

Dans tous les cas, il faut stopper l'alarme sur le mode = "Arret".

Ca demande réflexion tout cela.

Je cherche aussi un solution de mon côté.

Partager ce message


Lien à poster
Partager sur d’autres sites

Oui c'est ca (1ere ligne ;) )

2eme ligne ;) :

 - Si certains capteurs (table capteurs) sont actives, la sirene ne doit sonner que 30 secs apres; si dans ces 30 secs @kinou est passé en mode ARRET, pas de sirene du tout.

 

je cherche aussi, ca me fait progresser en lua (mode quiche)

Modifié par pepite

Partager ce message


Lien à poster
Partager sur d’autres sites

Bonjour Steven et pépite,

Tous les capteurs sont des détecteurs d'ouverture.

Quand l'alarme est en marche et que j'ouvre la porte sur laquelle il y a un capteur sensible,l'alarme se déclenche et la sirene au bout 30sec.

Pour les autres détecteurs d'ouverture, m'alarme déclenché instantanément.

Partager ce message


Lien à poster
Partager sur d’autres sites

oui oui kinou, on a bien compris ton besoin ;-)

 

@steven, je te remets le code complet

 

tu noteras que j'ai volé ton style pour récuperer l'etat des capteurs ;-)


 --[[
%% properties
%% globals
PA_Mode
PA_Sensors
--]]
------------------------
local portables = {xx, xx}
local id_module_virtuel = xxx
-------------------------
-- Limitation à  1 seule instance en cours -----
if (fibaro:countScenes() > 1) then
    fibaro:abort()
end
--------------------------------
local AlarmeMaison = fibaro:getGlobal("Etat_Alarme")
local AlarmeCabane = fibaro:getGlobal("Cabane_Alarme")
local VGJourNuit = fibaro:getGlobal("Jour_Nuit")
 
-- liste des capteurs "sensibles"
local capteurs = {388, 390, 392, 60}
 
-- recuperation de l'etat des capteurs sensibles au lancement de la scene
local Statut = {
    portegaragekevin = tonumber(fibaro:getValue(388, "value")) > 0,
    portegarageflo = tonumber(fibaro:getValue(390, "value")) > 0,
    entreegaragekevin = tonumber(fibaro:getValue(392, "value")) > 0,
    porteentree = tonumber(fibaro:getValue(60, "value")) > 0,
    etat = 0
}
-----------------------------------
 
 
function doIt(mode, armed, id)
 
fibaro:debug(mode)
if (armed) then fibaro:debug("armé") else fibaro:debug("désarmé") end
-----------------------------------------------------------------
if (mode == "Jour" and armed) then
-----------------------------------------------------------------
 
-- SI 1 des capteurs sensibles est =1 alors variable etat = 1
if (Statut["portegaragekevin"] or Statut["portegarageflo"] or Statut["entreegaragekevin"] or Statut["porteentree"]) then Statut["etat"] = 1 end
fibaro:debug("Valeur Statut[Etat] : " ..Statut["etat"])
 
 
-- Si alarmemaison =ON et variable etat = 1

if ((AlarmeMaison == "ON") and (Statut["etat"] > 0)) then
   fibaro:debug("Alarme Maison : ON, Capteurs sensibles")
        for i=1, #capteurs do --pour les capteurs sensibles
             local value, lastmodif = fibaro:get(capteurs[i], "value")
             fibaro:debug("Capteurs num : " ..capteurs[i].. "a pour valeur " ..value .. " lastModif : " .. os.date("%HH%m", lastmodif))
            
            if (value > 0) then
                 local diff = tonumber(os.difftime(os.time(), lastmodif))
                 fibaro:debug("Difference : " ..diff.. "pour capteurs num : " ..capteurs[i])
                
                 if (diff <= 30) then
                    fibaro:debug("Sirene turnOff") --Sirene interieure OFF
                    local start = 0
                    local dureemax = 30 --30 secs
                    while (mode ~= "Arret" and start <= dureemax) do
                    fibaro:sleep(1000)
                    start = start + 1
                    end
                 else
                    fibaro:debug("Sirene turnOn") --Sirene interieure ON
                 end
            end
        end
            
elseif ((AlarmeMaison == "ON") and (Statut["etat"] < 1)) then
          fibaro:debug("Alarme MAISON : ON, Aucun capteur sensible")
          fibaro:call(309, "pressButton", "2") --envoi SMS
          fibaro:call(339, "turnOn") --Sirene interieure ON
          fibaro:sleep(6*1000)
          fibaro:call(339, "turnOff") --Sirene interieure OFF
end
  • Upvote 1

Partager ce message


Lien à poster
Partager sur d’autres sites

J'arrive pas faire plus simple par contre, je ne peux pas tester et je l'ai pondu à  l'aveugle, donc sà»rement des fautes.
 

C'est un proposition qui n'est pas comme la tienne mais un mixte des 2 devrait être correcte.

 

Perso, j'utilise dans l'entête du script les ids des capteurs pour déclencher le scripts ainsi que la variable qui gère l'état de l'alarme.

 

Je te laisse jeté un oeil.

--[[
%% properties
1 value
2 value
3 value
4 value
11 value
12 value
13 value
%% globals
Etat_Alarme
]]--

-- Id du capteur = true pour différé
local capteurs = {[388]=true, [390]=true, [392]=true, [60]=true}

-- Limitation à  1 seule instance en cours -----
if (fibaro:countScenes() > 1) then
    fibaro:abort()
end

-- Si la variable global passe à  "Arret", on éteint l'alarme et on sort.
local trigger = fibaro:getSourceTrigger()
if (trigger["type"] == "global") then
	if (fibaro:getGlobal("Etat_Alarme") == "Arret") then
		fibaro:debug("On éteint l'alarme")
		fibaro:abort()
	end
end

-- Si l'alame n'est pas activé, on a rien à  faire.
if (fibaro:getGlobal("Etat_Alarme") == "Arret") then
	fibaro:abort()
end

--- en mode différé ou non, faux si l'ID n'a pas été déclaré dans les la 1ère ligne de code
local differe = capteurs[trigger["deviceID"]] or false

if (not differe) then
	-- Activation de l'alarme
	fibaro:debug("Activé l'alarme")
else
	-- On attent 30 secondes puis on execute le code
	setTimeout(
		function() 
			-- On reteste l'état de l'alare qui a pu changer
			if (fibaro:getGlobal("Etat_Alarme") ~= "Arret") then
				fibaro:debug("Activé l'alarme")
			end
		end
	, 30000)
end
  • Upvote 1

Partager ce message


Lien à poster
Partager sur d’autres sites

Merci pour votre aide,

malheureusement, je ne pourrais tester qu'a mon retour de déplacement.

Si j'ai bien compris, il faut faire un mixte des 2 scripts. Aie!!!

Partager ce message


Lien à poster
Partager sur d’autres sites

yes, merci Steven, je jette un oeil pour etre en raccord avec le Vd et la scene de moicphil

 

@kinou, on va y arriver ;-)

 

Sinon, tu utilises ta variable etat_alarme en trigger de la scene ou non ? Est-ce que lorsque cette variable passe à  ON tu souhaites que la scene demarre ?

Partager ce message


Lien à poster
Partager sur d’autres sites

Salut @kinou et Maitre @steven,

 

Bon, ben j'ai pas fait grand chose de plus hihihi, juste mis (enfin je crois) en adequation avec la logique du Vd/scene de Moicphil

 

@kinou, il y a Etat_Alarme en trigger

--[[
%% properties
1 value
2 value
3 value
4 value
11 value
12 value
13 value
%% globals
Etat_Alarme
PA_Mode
PA_Sensors
]]--
 
local portables = {xx, xx}
local id_module_virtuel = xxx
---------
local AlarmeMaison = fibaro:getGlobal("Etat_Alarme")

-- Id du capteur = true pour différé
local capteurs = {[388]=true, [390]=true, [392]=true, [60]=true}
 
-- Limitation à  1 seule instance en cours -----
if (fibaro:countScenes() > 1) then
    fibaro:abort()
end
 
-- Si la variable global passe à  "Arret", on éteint l'alarme et on sort.
local trigger = fibaro:getSourceTrigger()
if (trigger["type"] == "global") then
    if (mode == "Arret") then
        fibaro:debug("Extinction de l'alarme")
        fibaro:abort()
    end
end
 
-- Si l'alame n'est pas activée, on a rien à  faire.
if (mode == "Arret") then
    fibaro:abort()
end
 
--- en mode différé ou non, faux si l'ID n'a pas été déclaré dans les la 1ère ligne de code
local differe = capteurs[trigger["deviceID"]] or false
 
if (not differe) then
    -- Activation de l'alarme
    fibaro:debug("Aucun Capteur sensible : Activation de l'alarme")
else
    -- Capteurs sensibles : On attend 30 secondes puis on execute le code
    setTimeout(
        function()
            -- On reteste l'état de l'alarme qui a pu changer
            if (mode ~= "Arret") then
                fibaro:debug("Capteurs sensibles : activation de l'alarme après 30 secs")
            end
        end
    , 30000)
end

Partager ce message


Lien à poster
Partager sur d’autres sites

Les capteurs 388, 390, 392 et 60 doivent être dans l'entête

sauf s'il sont dans la variable PA_Sensors mais je m'en souvient plus du fonctionnement  :(

et j'ai malheureusement pas le temps de m'y remettre.

Partager ce message


Lien à poster
Partager sur d’autres sites

Oui oui mais kinou a déjà  sa scène et le VD de prêt si j'ai bien compris.

De même, dans un des posts, il m'a dit qu'il avait renseigné son entete mais je ne sais plus où ;-)

 

Ca devrait le faire, kinou veille. :60: :60:

  • Upvote 1

Partager ce message


Lien à poster
Partager sur d’autres sites

Bug :

 

Ligne 20

local AlarmeMaison = fibaro:getGlobal("Etat_Alarme")

devrait être

local mode = fibaro:getGlobal("Etat_Alarme")

Partager ce message


Lien à poster
Partager sur d’autres sites

en fait je ne suis pas sur, mais si kinou utilise bien le Vd et la scene du tuto il y a bien deja un mode "arret" de declarer

 

regarde :


function doIt(mode, armed, id)
 
fibaro:debug(mode)
if (armed) then fibaro:debug("armé") else fibaro:debug("désarmé") end
-----------------------------------------------------------------
if (mode == "Jour" and armed) then
-----------------------------------------------------------------
-----------------------------------------------------------------
elseif (mode == "Jour" and not armed) then
 
-----------------------------------------------------------------
-----------------------------------------------------------------
elseif (mode == "Nuit" and armed) then
-----------------------------------------------------------------
-----------------------------------------------------------------
elseif (mode == "Nuit" and not armed) then
 
-----------------------------------------------------------------
-----------------------------------------------------------------
elseif (mode == "Silence" and armed) then
-----------------------------------------------------------------
-----------------------------------------------------------------
elseif (mode == "Silence" and not armed) then
 
-----------------------------------------------------------------
-----------------------------------------------------------------
elseif (mode == "Manuel" and armed) then
-----------------------------------------------------------------
elseif (mode == "Manuel" and not armed) then
-----------------------------------------------------------------
elseif (mode == "Arret" and armed) then
-----------------------------------------------------------------
elseif (mode == "Arret" and not armed) then
-----------------------------------------------------------------
-----------------------------------------------------------------
elseif (mode == "Panic") then
 
-----------------------------------------------------------------
-----------------------------------------------------------------
end
 
end

Partager ce message


Lien à poster
Partager sur d’autres sites

En effet j'utilise le vd et la scène alarme avancée.

La variable Etat_Alarme sera l'image de l'état de mon alarme diagral. Pour l'instant cette variable est conditionnée par appui sur les boutons jour et arrêt du VD.

Partager ce message


Lien à poster
Partager sur d’autres sites

Salut,

 

Donc pour l'instant tu n as pas besoin de mettre cette variable en trigger je pense.

Partager ce message


Lien à poster
Partager sur d’autres sites

bonjour,

je relance le sujet, je viens de rentrer de déplacement.

si j'ai bien compris, je dois insérer le script avant la ligne avec le code ; function doIt(mode, armed, id)

Partager ce message


Lien à poster
Partager sur d’autres sites

bonjour,

mon voisin d'en face a été cambriolé cette nuit. Du coup, ma femme veut qu'on remplace la porte d'entrée, et que je mette des verrous sur les volets roulants.

Il faut absolument que je termine l'alarme.

Je pense que ce qu'on touche le bout avec les scripts de pepite et steven.

Merci de votre aide.

Partager ce message


Lien à poster
Partager sur d’autres sites

Salut kinou,

 

 

Ah carrement des verrous sur les volets ?

As-tu essaye ce qu'on t'a proposé déjà  ?

 

il faut mettre le code dans la partie "if" qui te correspond, je crois que la où tu l'avais mis dès le départ c'est bon.

Partager ce message


Lien à poster
Partager sur d’autres sites

Les verrous sur les volets ça ne servirais pas àgrand chose car avec un petit pied de biche on arrache les attaches du tablier. Et ensuite sortir les tabliers des rails ça se fait d'une main. Beaucoup de boulot pour une efficacité limitée et en plus il faut verouiller àla main et avant d'ouvrir....

Partager ce message


Lien à poster
Partager sur d’autres sites

Oui, il y a '2 écoles' concernant les volets et les cambriolages.

Faut-il ou pas les fermer ?

Mon expérience, mon voisin ferme tous les jours ses volets : régulièrement cambriolé malgré son alarme.

Et moi (je touche du bois), une seule visite il y a 5 ans ( volets fermés)

Depuis ce cambriolage, les volets sont constamment ouverts même lorsque l'on part 3 semaines en vacances.

Autre solution, si tu souhaites les fermer, peut être (si possible) poser des fgk sur les volets, afin que l'alarme déclenche tout de suite.

Et pour revenir au module virtuel, essayer ce que t'a dis pépite

Partager ce message


Lien à poster
Partager sur d’autres sites

Depuis ce cambriolage, les volets sont constamment ouverts même lorsque l'on part 3 semaines en vacances.

Tu ne risques pas d'avoir des problèmes avec ton assurance,  qui peut imposer de fermer tes volets au-delà  d'une certaine durée d'absence ? (sauf à  avoir un vitrage anti effraction)

Partager ce message


Lien à poster
Partager sur d’autres sites

×