pepite Posté(e) le 21 mars 2016 Signaler Posté(e) le 21 mars 2016 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 ;-) 1
Steven Posté(e) le 21 mars 2016 Signaler Posté(e) le 21 mars 2016 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)
pepite Posté(e) le 21 mars 2016 Signaler Posté(e) le 21 mars 2016 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
Steven Posté(e) le 21 mars 2016 Signaler Posté(e) le 21 mars 2016 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 :-)
Steven Posté(e) le 21 mars 2016 Signaler Posté(e) le 21 mars 2016 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é.
pepite Posté(e) le 21 mars 2016 Signaler Posté(e) le 21 mars 2016 (modifié) 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é le 21 mars 2016 par pepite
kinou.69 Posté(e) le 21 mars 2016 Signaler Posté(e) le 21 mars 2016 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.
pepite Posté(e) le 21 mars 2016 Signaler Posté(e) le 21 mars 2016 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 1
Steven Posté(e) le 21 mars 2016 Signaler Posté(e) le 21 mars 2016 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 1
kinou.69 Posté(e) le 21 mars 2016 Signaler Posté(e) le 21 mars 2016 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!!!
pepite Posté(e) le 21 mars 2016 Signaler Posté(e) le 21 mars 2016 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 ?
pepite Posté(e) le 22 mars 2016 Signaler Posté(e) le 22 mars 2016 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
Steven Posté(e) le 22 mars 2016 Signaler Posté(e) le 22 mars 2016 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.
pepite Posté(e) le 22 mars 2016 Signaler Posté(e) le 22 mars 2016 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: 1
Steven Posté(e) le 22 mars 2016 Signaler Posté(e) le 22 mars 2016 Bug : Ligne 20 local AlarmeMaison = fibaro:getGlobal("Etat_Alarme") devrait être local mode = fibaro:getGlobal("Etat_Alarme")
pepite Posté(e) le 22 mars 2016 Signaler Posté(e) le 22 mars 2016 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
kinou.69 Posté(e) le 22 mars 2016 Signaler Posté(e) le 22 mars 2016 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.
pepite Posté(e) le 23 mars 2016 Signaler Posté(e) le 23 mars 2016 Salut, Donc pour l'instant tu n as pas besoin de mettre cette variable en trigger je pense.
kinou.69 Posté(e) le 3 avril 2016 Signaler Posté(e) le 3 avril 2016 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)
kinou.69 Posté(e) le 19 avril 2016 Signaler Posté(e) le 19 avril 2016 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.
pepite Posté(e) le 19 avril 2016 Signaler Posté(e) le 19 avril 2016 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.
Invité chris6783 Posté(e) le 19 avril 2016 Signaler Posté(e) le 19 avril 2016 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....
Moicphil Posté(e) le 19 avril 2016 Auteur Signaler Posté(e) le 19 avril 2016 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
i-magin Posté(e) le 19 avril 2016 Signaler Posté(e) le 19 avril 2016 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)
Messages recommandés