mmmprod Posté(e) le 29 mai 2014 Signaler Posté(e) le 29 mai 2014 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
Steven Posté(e) le 29 mai 2014 Signaler Posté(e) le 29 mai 2014 Faudrait voir tes scènes car àvu d'oeil, l'une active ce que l'autre désactive provoquant une boucle.
mmmprod Posté(e) le 29 mai 2014 Auteur Signaler Posté(e) le 29 mai 2014 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
Steven Posté(e) le 29 mai 2014 Signaler Posté(e) le 29 mai 2014 Si tu as le courage, envoi moi tes scénarios je regarde ce soir.
mmmprod Posté(e) le 29 mai 2014 Auteur Signaler Posté(e) le 29 mai 2014 Merci beaucoup pour le coup de main J'apprécie ! Armement AUTO --[[%% autostart%% properties105 value101 value76 value60 value119 value%% globals--]]local delayedCheck0 = false;if ( tonumber(fibaro:getValue(119, "value")) == 0 ) then delayedCheck0 = true;endfibaro: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;endlocal delayedCheck2 = false;local tempDeviceState2, deviceLastModification2 = fibaro:get(101, "value");if (( tonumber(fibaro:getValue(101, "value")) == 0 ) and (os.time() - deviceLastModification2) >= 600) then delayedCheck2 = true;endlocal delayedCheck3 = false;local tempDeviceState3, deviceLastModification3 = fibaro:get(76, "value");if (( tonumber(fibaro:getValue(76, "value")) == 0 ) and (os.time() - deviceLastModification3) >= 600) then delayedCheck3 = true;endlocal delayedCheck4 = false;local tempDeviceState4, deviceLastModification4 = fibaro:get(60, "value");if (( tonumber(fibaro:getValue(60, "value")) == 0 ) and (os.time() - deviceLastModification4) >= 600) then delayedCheck4 = true;endlocal startSource = fibaro:getSourceTrigger();if ( ( delayedCheck0 == true and delayedCheck1 == true and delayedCheck2 == true and delayedCheck3 == true )and ( delayedCheck4 == true )orstartSource["type"] == "other")then fibaro:call(119, "setArmed", "1"); fibaro:call(80, "setColor", "255", "0", "0", "0");end DESARMEMENT AUTO --[[%% autostart%% properties119 value105 value101 value76 value60 value119 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 )orstartSource["type"] == "other")then fibaro:call(119, "setArmed", "0"); fibaro:call(80, "turnOff"); --Fait une pause de 10 secondesfibaro:sleep(10000); --apres 10 secondes, relancer le programme precedentfibaro:call(80, "startProgram", currentProgramID);else --get last colorlocal colorSet = fibaro:getValue(80, "lastColorSet");--set old colorlocal RGBWTable= {};local i = 1; for value in string.gmatch(colorSet,"(%d+)") doRGBWTable = value;i = i + 1;end
Steven Posté(e) le 29 mai 2014 Signaler Posté(e) le 29 mai 2014 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
mmmprod Posté(e) le 29 mai 2014 Auteur Signaler Posté(e) le 29 mai 2014 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.
Steven Posté(e) le 29 mai 2014 Signaler Posté(e) le 29 mai 2014 Je suis presque certain que cela ne passera pas du 1er coup ... donc si je peux aider ... hurle.
mmmprod Posté(e) le 29 mai 2014 Auteur Signaler Posté(e) le 29 mai 2014 héhé pas faux J'ai une petite erreur: line 32: 'then' expected near ')'
Steven Posté(e) le 29 mai 2014 Signaler Posté(e) le 29 mai 2014 Supprime la ) collée à delai if ( ( tonumber(tempDeviceState) > 0 ) and (os.time() - deviceLastModification) < delai) ) then
mmmprod Posté(e) le 29 mai 2014 Auteur Signaler Posté(e) le 29 mai 2014 C'est ce que j'ai fait un nouveau message d'erreur line 31: attempt to get lenght of field '?' (a number value)
Steven Posté(e) le 29 mai 2014 Signaler Posté(e) le 29 mai 2014 Oh la la ... je suis chèvre ce soir, le # n'a rien a faire ici. local tempDeviceState, deviceLastModification = fibaro:get(#mouvements, "value");
mmmprod Posté(e) le 29 mai 2014 Auteur Signaler Posté(e) le 29 mai 2014 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 ? 1
Steven Posté(e) le 29 mai 2014 Signaler Posté(e) le 29 mai 2014 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
mmmprod Posté(e) le 29 mai 2014 Auteur Signaler Posté(e) le 29 mai 2014 merci pour le coup de main en tous les cas tu as créé un joli petit script
mmmprod Posté(e) le 30 mai 2014 Auteur Signaler Posté(e) le 30 mai 2014 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 ...
Steven Posté(e) le 30 mai 2014 Signaler Posté(e) le 30 mai 2014 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 ?
mmmprod Posté(e) le 30 mai 2014 Auteur Signaler Posté(e) le 30 mai 2014 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
Steven Posté(e) le 30 mai 2014 Signaler Posté(e) le 30 mai 2014 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.
Steven Posté(e) le 30 mai 2014 Signaler Posté(e) le 30 mai 2014 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
mmmprod Posté(e) le 30 mai 2014 Auteur Signaler Posté(e) le 30 mai 2014 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...
mmmprod Posté(e) le 30 mai 2014 Auteur Signaler Posté(e) le 30 mai 2014 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. 2
Steven Posté(e) le 30 mai 2014 Signaler Posté(e) le 30 mai 2014 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 1
mmmprod Posté(e) le 30 mai 2014 Auteur Signaler Posté(e) le 30 mai 2014 (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é le 30 mai 2014 par mmmprod
Messages recommandés