Aller au contenu

Module Virtuel Alarme Avancée


Moicphil

Messages recommandés

Bonjour,

 

Tu n'as pas l'air d'utiliser les modes de depart.

Tu as declare tes propres variables au milieu de JOUR and armed et autre

 

Ta scene fonctionne en l'etat ?

 

De même tu fait le test des ouvrants directement.

 

Tu as l'air de refaire une scene alors que @Moicphil a tout prevu en couplant le VD et la scene.

Lien vers le commentaire
Partager sur d’autres sites

Bonjour pépite,

j'utilise bien l'ensemble VD/scene de Moicphil.

j'ai un autre VD, une télécommande, avec les boutons Marche / Arrêt de l'alarme qui change l'état de ma variable prédéfinie Etat_Alarme.

Si cette variable Etat_Alarme reste sur ON, la scène fonctionne tel que programmé..

Si Etat_alarme ON alors j’appuie sur l'un des modes Jour, nuit ou silence.

Si Etat_alarme OFF alors j’appuie sur Arrêt.

 

J'ai l'impression, que ça se mort la queue. Quand la scène est lancée, si je met sur OFF la variable Etat_alarme, je bascule dans le mode arrêt alors que la séquence du mode jour n'est pas terminée. J'ai donc deux instances en cours de la scène.

Je me trompe peut-être...

 

En gros je souhaiterais avoir le même fonctionnement que mon alarme Diagral.

Avec les capteurs 60/388/390 et 392, je temporise de 30 sec le déclenchement de la sirène (alternance de marche/arret)

Si pendant ces 30secondes je désactive l'alarme (VD Etat_Alarme == "OFF") , la sirène ne doit pas sonner.

Avec les autres capteurs, je déclenche directement la sirène (alternance de marche/arret)

Quand je désactive l'alarme, si la sirène sonne, elle se coupe.

 

Dans mon fonctionnement de ce VD, en tant qu'alarme, je ne pense pas avoir besoin de la condition "not armed"

Lien vers le commentaire
Partager sur d’autres sites

Ce que je comprends :

 

 - Ton VD met la variable Etat_Alarme à  ON ou OFF, il ne fait que ca ?

- tu utilises le VD/scene de moicphil complet donc :

 --> tu as bien crée les 3 variables

- tu utilises les 3 modes dans lesquels tu as declarés les IDs de tes capteurs.

- as tu armé tes sensors dans les boutons de mode ?

 

- ETAT Alarme = ON : mode jour, nuit ou silence

- ETAT Alarme OFF : ARRET

 

2 fonctionnements :

- Avec 60/388/390 et 392, tempo de 30 secs, si dans ces 30 sec : arret, pas de sirene

- les autres capteurs : sirene, si ETAT ALRME : OFF, sirene OFF

 

c'est ca ?

Lien vers le commentaire
Partager sur d’autres sites

Mon VD arme et désarmé les modules

J'ai suivi le tuto de moicphil donc je pense avoir créé les 3 variables. De mémoire pa-sensor, pa-mode et....

Dans les trois modes j'ai déclaré les sensors.

j'ai dès actions différentes àchaque mode. Par exemple, positionnement d'une caméra, désactivation du wifi,etc... Mais pour l'instant je travail que sur le mode jour

Pour le fonctionnement, c'est bien ca.

Je te remercie pour ton aide

Lien vers le commentaire
Partager sur d’autres sites

Essaie juste ceci peut-etre, avant d'en rajouter

pour la tempo,de 30 secs pour les capteurs "particuliers", il faut que tu mettes le mode arret dans les 30 secs, enfin je crois

--[[
%% properties
%% globals
PA_Mode
PA_Sensors
--]]
------------------------
local portables = {xx, xx}
local id_module_virtuel = xxx
-------------------------
local AlarmeMaison = fibaro:getGlobal("Etat_Alarme")
local AlarmeCabane = fibaro:getGlobal("Cabane_Alarme")
local VGJourNuit = fibaro:getGlobal("Jour_Nuit")
local capteurs = {388, 390, 392, 60}
-----------------------------------


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
-----------------------------------------------------------------
    if AlarmeMaison == "ON" then
        for i=1, #capteurs do
            if (fibaro:getValue(capteurs[i], "value") > 0) then
                local lastmodif = fibaro:getModificationTime(capteurs[i], "value")
                if (((os.time() - lastmodif) <= 30) and (mode == "Arret")) then
                        fibaro:call(339, "turnOff") --Sirene interieure OFF
                end
            end
        end
      
      end

-----------------------------------------------------------------
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
 
 
-- -----------------------------------------------------
-- Envoi le message PUSH
-- -----------------------------------------------------
function sendMessage(message)
for i = 1, #portables do
fibaro:call(portables[i], "sendPush", message)
 
end
fibaro:debug(message .. " [envoyé]")
end
 
-- -----------------------------------------------------
-- Vérifie si les portes sont bien fermées
-- -----------------------------------------------------
function check(doors)
local stillopen = {}
 
-- On vérifie l'état des portes --
for i = 1, #doors do
if (doors[i]~=nil) then
local id = tonumber(doors[i])
local name = fibaro:getName(id) or "unknown"
if (tonumber(fibaro:getValue(id, "value")) == 1) then
table.insert(stillopen, id)
fibaro:debug(name .. " est ouverte")
else
fibaro:debug(name .. " est fermée")
end
else
fibaro:debug("ID #"..i.." n'existe plus")
end
end
 
if (stillopen and #stillopen > 0) then
-- au moins une porte n'est pas fermée
local msg = ""
if (#stillopen == 1) then msg = msg .. "Attention : " else msg = msg .. "Attention : " end
for i = 1, #stillopen do
msg = msg .. " " .. fibaro:getName(tonumber(stillopen[i]))
end
if (#stillopen == 1) then msg = msg .. " est toujours ouverte." else msg = msg .. " sont toujours ouvertes." end
 
-- --------------------------------------------
-- Actions si sensor(s) ouvert(s)
-----------------------------------------------
-- on averti par push
sendMessage(msg)
 
-- Passage en mode Arret
local mode = "Arret"
fibaro:setGlobal("PA_Mode", mode)
fibaro:call(id_module_virtuel, "setProperty", "ui.lblMode.value", mode)
 
 
 
return false
end
return true
end
 
-- -----------------------------------------------------
-- Transforme une châine en tableau en utilisant
-- un délimiteur
-- -----------------------------------------------------
function split(text, sep)
local sep, fields = sep or ":", {}
local pattern = string.format("([^%s]+)", sep)
text:gsub(pattern, function(c) fields[#fields+1] = c end)
return fields
end
 
local source = fibaro:getSourceTrigger()
local id_declencheur = nil
local isOpen = "1"
 
fibaro:debug(source["type"])
 
if (source["type"] == "property") then
id_declencheur = tonumber(source["deviceID"])
elseif (source["type"] == "global") then
fibaro:debug( source["name"])
local gName = fibaro:getGlobal(source["name"])
if ( gName == "Panic") then
doIt( "Panic", false, 0 )
elseif (source["name"] == "PA_Sensors") then
fibaro:debug(gName)
local doors = fibaro:getGlobal("PA_Sensors")
local exclus = fibaro:getGlobal("PA_Exclus")
doors = split(string.gsub(doors, "[%[%]]", ""), ",")
if (exclus and exclus ~= "") then
exclus = split(string.gsub(exclus, "[%[%]]", ""), ",")
else
exclus = {}
end
todo = {}
for i = 1, #doors do
local found = false
for j = 1, #exclus do
if (doors[i] == exclus[j]) then found = true end;
end
if (not found) then
table.insert(todo, doors[i])
fibaro:debug(doors[i] .. " doit être vérifiée")
end
 
end
fibaro:debug("Checking doors")
 
if (not check(todo)) then
else
-------------------------------------------
-- Actions lorsque l'alarme est activée
-------------------------------------------
 
--Vos actions ici
 
 
----------------------------------------------
end
end
elseif (source["type"] == "other") then
id_declencheur = nil
isOpen = "0"
end
 
if (not id_declencheur) then
return
end
 
fibaro:debug("Déclencheur " .. id_declencheur)
 
local actif = fibaro:getGlobal("PA_Sensors")
local exclus = fibaro:getGlobal("PA_Exclus")
 
 
if (actif and actif ~= "") then
fibaro:debug(actif)
actif = string.gsub(actif, "[%[%]]", ",")
local exist = string.find(actif, ","..id_declencheur)
if (exist) then fibaro:debug("exist") end
 
local todo = exist
if (exclus and exclus ~= "") then
fibaro:debug(exclus)
exclus = string.gsub(exclus, "[%[%]]", ",")
if (string.find(exclus, ","..id_declencheur)) then
fibaro:debug("ID Excluded")
todo = false
end
else
fibaro:debug("Exclus empty")
end
 
if (todo and fibaro:getValue(id_declencheur, "value")==isOpen ) then
doIt( fibaro:getGlobal("PA_Mode"), fibaro:get(id_declencheur, 'armed')=="1", id_declencheur )
end
 
 
end

--

Lien vers le commentaire
Partager sur d’autres sites

Quelquechose comme ceci peut-etre mais lorsque tu bascules en mode arret par exemple, PA_Mode etant un trigger ca relance une scene

c'est pour ca que tu te mords la queue je pense...

 

je t'ai mis un limitation à  1 seule scene en cours

 

Qu'as tu mis derriere le bouton arret ?

 --[[
%% 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 capterus "sensibles"
local capteurs = {388, 390, 392, 60}

-- recuperation de l'etat des capteurs sensibles au lancement de la scene
local Statut = {
    portegaragekevin = fibaro:getValue(388, "value") > 0,
    portegarageflo = fibaro:getValue(390, "value") > 0,
    entreegaragekevin = fibaro:getValue(392, "value") > 0,
    porteentree = 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

-- 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
            if (fibaro:getValue(capteurs[i], "value") > 0) then
                local lastmodif = fibaro:getModificationTime(capteurs[i], "value") -- recuperation modification
                if (((os.time() - lastmodif) <= 30) and (mode == "Arret")) then --si dans les 30 secs et mode arret
                        fibaro:call(339, "turnOff") --Sirene interieure OFF
                end
            end
        end
    elseif ((AlarmeMaison == "ON") and (Statut["etat"] == 0)) 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
Lien vers le commentaire
Partager sur d’autres sites

pour l'instant je n'ai rien dans le bouton arrêt. Par contre dans le bouton qui désactive l'alarme, celui-ci désarme tous les capteurs et appuie sur le bouton arrêt du VD de Moicphil.

Je n'ai pas encore eu le temps de tester ton script, ce weekend je l’espère...

Lien vers le commentaire
Partager sur d’autres sites

bonjour kinou,

 

J'ai tout de même l'impresson que ton VD fait la même chose que les boutons du VD d'origine, je m'explique :

 - tu mets à  jour ta variable globale ALARME en on ou off

- tu armes tes modules

- tu les desarmes

 

tu pourrais tout faire depuis le VD d'origine :

 - sur le bouton jour par exemple :

     --> mettre à  jour ta variable ALARME

    --> armer les modules comme prévus par le VD

 

- sur le bouton arret :

     --> desarmer tes modules

Lien vers le commentaire
Partager sur d’autres sites

Salut

 

Désolè, j'arrive un peu tard sur ce post... ^_^

 

Pepite est dans la place, ca m'arrange, j'ai pas tout compris de ce que tu souhaitais faire Kinou.69 ...

 

Temporiser le déclenchement de l'alarme sur certains capteurs, c'est ca ?

 

Je ne vois pas pourquoi tu utilise 2 VD, un seul devrais suffir méme si tu n'utilise que certaines fonctions de la scène ( armé ou non, etc... )

Lien vers le commentaire
Partager sur d’autres sites

je suis tous a fait d'accord avec vous, tout est faisable dans le VD Alarme Avancée.

J'utilisais mon VD plus comme une télécommande d'alarme car j'envisage de domotiser mon alarme Diagral.

 

Moicphil, c'est tout a fait cela, je souhaite temporiser le déclenchement de l'alarme et de la sirène si certains capteurs sont en alerte.

Ensuite je souhaiterais que la sirène fonctionne cycliquement (marche arrêt avec tempo de 30secondes).

 

J'en profite pour vous raconter ce qui nous est arrivé cette semaine.

Ma femme est rentrée a la maison et a oublié de désactiver l'alarme Diagral. La sirène extérieure a fonctionné une 20aine de minutes par intermittence.

Les voisins sont sortis dans la rue pour voir ce qui se passait. Ils n'ont pas osés rentrer dans le terrain inspecter la maison car c'était en pleine journée.

Gênée par la sirène, ma femme s'est décidée, au bout de 20minutes, d'aller voir dehors; elle pensait que c'était l'alarme d'une voiture : c'est alors qu'elle a compris...

Merci Chérie...

Vivement que cette alarme (HC2) soit enfin opérationnelle.

Lien vers le commentaire
Partager sur d’autres sites

Salut

 

Concernant les tempos selon différents "id" , as-tu essayé la modif de @pepite ?

 

Ca devrait le faire je pense.

 

Par contre tu dis "désarmer" via un bouton autre que celui du VD, pense bien donc à  "vider" l'encodage des sensors et changer le "mode"

fibaro:setGlobal("PA_Mode","arret")
fibaro:setGlobal("PA_Exclus", "")
Lien vers le commentaire
Partager sur d’autres sites

J'ai finalement abandonné mon VD.

Par contre j'ai essayé le dernier script de pépite, mais j'ai un message d'erreur :

 

[DEBUG] 21:39:26: line 26: attempt to compare number with string

ligne dans la déclaration des capteurs sensibles de la variable local statut

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

Désolé, en formation en ce moment, pas trop devant la bete et sur le forum

 

Essaie ceci alors, mais bizarre

J'ai rajoute des "tonumber" dans la declaration delocal statut ;-)

 

Ce n'est peut-etre que le début des BUGS ;-)

 --[[
%% 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 capterus "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
 
-- 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
            if (fibaro:getValue(capteurs[i], "value") > 0) then
                local lastmodif = fibaro:getModificationTime(capteurs[i], "value") -- recuperation modification
                if (((os.time() - lastmodif) <= 30) and (mode == "Arret")) then --si dans les 30 secs et mode arret
                        fibaro:call(339, "turnOff") --Sirene interieure OFF
                end
            end
        end
    elseif ((AlarmeMaison == "ON") and (Statut["etat"] == 0)) 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
Lien vers le commentaire
Partager sur d’autres sites

Merci pepite,

ligne 57 , j'ai remplacé ==0 par <1

ligne 58 j'ai mis un f minuscule.

ligne 50 j'ai rajouté un tonumber

la 2eme partie "aucun capteur sensible" du code semble fonctionner.

je ne comprend pas ton code sur les capteurs sensible mais cela ne fonctionne pas. Je ne voit pas comment est géré l'activation de la sirène après la tempo de 30secondes.

Dans les propriétés de la scène, j'ai comme déclencheur tous les capteurs : xxx value

Lien vers le commentaire
Partager sur d’autres sites

Saut kinou,

 

Ben j'ai peut-etre mal compris, mais l'idee etait  que si tes 4 capteurs sensibles sont ON, alors tu voulais pouvoir dans les 30 secs,passer ta sirene en OFF et non en ON ?

-- 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("Statut Etat" : ..Statut["etat"])

-- Si alarmemaison =ON et variable etat = 1    
if ((AlarmeMaison == "ON") and (Statut["etat"] > 0)) then 
-- Si 1 des capteurs sensibles est concernes par l'alerte et ALARME MAISON Active      
 fibaro:debug("Alarme Maison : ON, Capteurs sensibles")    
    for i=1, #capteurs do --pour les capteurs sensibles           
 if (fibaro:getValue(capteurs[i], "value") > 0) then -- on recupere les capteurs qui sont en alerte               
local lastmodif = fibaro:getModificationTime(capteurs[i], "value") -- recuperation du moment de la derniere modification, de 0 à  1 donc          
     if (((os.time() - lastmodif) <= 30) and (mode == "Arret")) then -- si on est dans les 30 secs et que tu passe en mode arret, si le temps actuel - dernier modif inf à  30 secs    
                   fibaro:call(339, "turnOff") -- alors on met la Sirene interieure en OFF                
end            
end       
 end

J'ai rajoute des commentaires.

 

Dans ma tete ca parait logique, mais de la à  etre sur du code Heuuuu..

On va y arriver, pas de soucis ;-)

cherchons ;-)

Lien vers le commentaire
Partager sur d’autres sites

Bonjour Pépite,

je te remercie vraiment pour ton aide.

dans le principe, quand mon alarme est active, je souhaite que sur détection d'un capteur la sirène sonne.

Sauf pour 4 capteurs sensible pour lesquels la sirène 30secondes apres la détection de ces capteurs.

Si dans ces 30secondes, j’arrête l'alarme, la sirene ne doit pas sonner sur détection d'un de ces 4 capteurs sensible.

 

Plus tard, la box sera couplée a mon alarme diagral.

Je veux pouvoir rentrer chez moi (porte d'entrée ou portes de garages), et avoir le temps de desactiver l'alarme diagral (moins de 30 secondes). en désactivant l'alarme diagral, sui sera domotisée, l'alarme HC2 sera automatiquement désactvée.

Lien vers le commentaire
Partager sur d’autres sites

j'ai rajoute tes modifs dans le code

 

ajout d'un else pour les capteurs sensibles, si pas de passage en mode arret, alors sirene interieure sonne ;-)

 --[[
%% 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 capterus "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
 
-- 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
            if tonumber((fibaro:getValue(capteurs[i], "value")) > 0) then
                local lastmodif = fibaro:getModificationTime(capteurs[i], "value") -- recuperation modification
                if (((os.time() - lastmodif) <= 30) and (mode == "Arret")) then --si dans les 30 secs et mode arret
                    fibaro:call(339, "turnOff") --Sirene interieure OFF
                else
                    fibaro:call(339, "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
Lien vers le commentaire
Partager sur d’autres sites

Bonsoir pepite,

ligne 50 j'ai déplacé la première parenthèse avant tonumber.

quand un des capteurs sensibles est en alerte, la sirene sonne de suite. la scène passe directement dans le else ligne 55.

j'ai compris le principe des lignes 51 et 52, mais je ne vois ce qu'il faut faire...

Lien vers le commentaire
Partager sur d’autres sites

Salut kinou,

 

Bon ben alors pourquoi dans le else direct  ;-)

 

J'ai mis des debug un peu partout pour voir où on est ;-)

 

J'ai enleve la sirene et mis aussi des debugs pour eviter de la faire sonner, plus sympa pour les tests.

 

Je me demande si on ne devrait pas faire avec un while

 --[[
%% 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 capterus "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 = tonumber(fibaro:getValue(capteurs[i], "value"))
            fibaro:debug("Capteurs num : " ..capteurs[i].. "a pour valeur " ..value)
            
            local lastmodif = fibaro:getModificationTime(capteurs[i], "value") -- recuperation modification
            fibaro:debug("Capteurs num : " ..capteurs[i].. " lastModif : " ..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 --si difference < 30 secs
                    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
Lien vers le commentaire
Partager sur d’autres sites

ou comme ceci peut-etre

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 = tonumber(fibaro:getValue(capteurs[i], "value"))
            fibaro:debug("Capteurs num : " ..capteurs[i].. "a pour valeur " ..value)
            
            local lastmodif = fibaro:getModificationTime(capteurs[i], "value") -- recuperation modification
            fibaro:debug("Capteurs num : " ..capteurs[i].. " lastModif : " ..lastmodif)
            
            if (value > 0) then
                local diff = tonumber(os.difftime(os.time(), lastmodif))
                fibaro:debug("Difference : " ..diff.. "pour capteurs num : " ..capteurs[i])
                
                while (diff <= 30) do
                    if (mode == "Arret") then
                        fibaro:debug("Sirene turnOff") --Sirene interieure OFF
                    end
                end
            
            else
                fibaro:debug("Sirene turnOn") --Sirene interieure ON
            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
Lien vers le commentaire
Partager sur d’autres sites

Juste pour info

local value = tonumber(fibaro:getValue(capteurs[i], "value"))
fibaro:debug("Capteurs num : " ..capteurs[i].. "a pour valeur " ..value)
            
local lastmodif = fibaro:getModificationTime(capteurs[i], "value") -- recuperation modification
fibaro:debug("Capteurs num : " ..capteurs[i].. " lastModif : " ..lastmodif)
Peut être optimisé pas 

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

 

Après, à  vue d'oeil, je vois pas comment tu vas sortir de ta boucle :

while (diff <= 30) do
	if (mode == "Arret") then
		fibaro:debug("Sirene turnOff") --Sirene interieure OFF
	end
end
Voici une proposition avec une durée maximum pour éviter la crise cardiaque

if (diff <= 30) then
	fibaro:debug("Sirene turnOn") --Sirene interieure ON
	local start = 0
	local dureemax = 180 -- 3 minutes maximum
	while (mode ~= "Arret" and start <= dureemax) do
		fibaro:sleep(1000)
		start = start + 1
	end
	fibaro:debug("Sirene turnOff") --Sirene interieure OFF
end
  • Upvote 1
Lien vers le commentaire
Partager sur d’autres sites

×
×
  • Créer...