jjacques68 Posté(e) le 17 avril 2017 Signaler Posté(e) le 17 avril 2017 Bonjour à tous, J'ai essayé cette après midi de faire un éclairage sur détection pour une cage d'escalier. ça marche comme je veux mais !!! Je trouve qu'il y a un certain temps de réaction de l'installation... (2-3 secondes) Matériel : - 1 FGMS dans la cage d'escalier - 2 interrupteurs montage classique va et vient relié sur l'input 3 d'un IPX - Eclairage branché sur output 7 de l'ipx (via un contacteur jour/nuit) Configuration du FGMS : Param 1 = 10 (défaut) Param 2 = 2 (défaut) Param 3 = 1-2 impulsions (défaut) Param 4 = 2-12 secondes (défaut) Param 6 = 10 secondes J'ai VD avec 2 boutons ON/OFF qui me permet d'allumer ou éteindre depuis le Tél ou autre. (ce VD commande la sortie de l'IPX) C'est ces boutons que j'actionne depuis la scène. J'ai créé une scène pour gérer tout cela : -Cette scène est déclenchée lors du changement de valeur du FGMS. -lors du déclenchement de la scène, je teste d'abord si un interrupteur n'a pas été actionné (en testant l'input de l'IPX) -si pas le cas j'allume pendant le temps définit par le param 6 du FGMS -avant d'éteindre, je teste de nouveau si pas d'interrupteur actionné -si pas le cas je coupe la lumière La voici : (désolé pour la syntaxe du code, mais l'éditeur de texte du forum fait un peu ce qu'il veut avec les indentations...) --[[ %% properties 298 value %% events %% globals --]] if fibaro:countScenes() > 1 then fibaro:abort() end local http = net.HTTPClient() if tonumber(fibaro:getValue(298, "value")) == 1 then --si passage sur ON du FGMS -- avant test pour voir si un interrupteur n'a pas été actionné http:request("http://192.168.2.41/api/xdevices.json?cmd=10", { options = {method = 'GET', headers = {['Authorization'] = "BASIC YWRtaW46xxxxxxxxx="},}, success = function(response) jsonResponse = json.decode(response.data) if jsonResponse.IN3 == 0 then --allume si pas allumer par interrupteur print("<font color='green'>Escalier = ON</font>") fibaro:call(296, "pressButton", 1) while tonumber(fibaro:getValue(298, "value")) == 1 do --tant que FGMS sur ON, on boucle fibaro:sleep(2*1000) --tempo 2 secondes end --reteste si pas action d'interrupteur http:request("http://192.168.2.41/api/xdevices.json?cmd=10", { options = {method = 'GET', headers = {['Authorization'] = "BASIC YWRtaW46xxxxxxxxxxx="},}, success = function(response) jsonResponse = json.decode(response.data) if jsonResponse.IN3 == 0 then --éteint si pas allumer par interrupteur fibaro:call(296, "pressButton", 2) --on éteint print("<font color='red'>Escalier = OFF</font>") else print("<font color='yellow'>Escalier = manuel</font>") --sinon c'est que qqun a actionné interrupteur end end, error = function(response) fibaro:debug("Error: " ..response) end }) end end, error = function(response) fibaro:debug("Error: " ..response) end }) end ça marche très bien tout ça ! Si qqun actionne un interrupteur manuellement, c'est bien gérer ! Mais, je trouve qu'il y a un temps de réaction entre mon apparition devant le détecteur et l'allumage de la lumière (2 secondes). Après quand je vois la complexité de mon code pour une chose si simple ! c'est peut être normal ?! Vous avez d'autres idées plus simples pour l'amélioration ?
pepite Posté(e) le 18 avril 2017 Signaler Posté(e) le 18 avril 2017 Bonjour @jjacques68, sympa ce code ;-) Mon avis :-) Inutile de boucler je pense avec un sleep :ton détecteur est ON, tu testes l'IPX et tu allumes. Mieux vaut utiliser setTimeout à la place du sleep pour ton test d'extinction.
jjacques68 Posté(e) le 18 avril 2017 Auteur Signaler Posté(e) le 18 avril 2017 On avait déjà parlé du setTimeout J'y avais pensé, mais je vois pas comment l'intégrer dedans. Car dans ce cas, la durée est gérer par le FGMS lui-même ! Tant qu'il est en alerte ! Elle n'est pas fixe.
pepite Posté(e) le 18 avril 2017 Signaler Posté(e) le 18 avril 2017 oui mais pourquoi tu sleep(s) tant qu'il est en alerte ? Tu fais ça avant de passer à l'extinction ?
jjacques68 Posté(e) le 18 avril 2017 Auteur Signaler Posté(e) le 18 avril 2017 Tient étrange, j'avais répondu à ta question mais visiblement, ça n'a pas pris !!! Donc je recommence, en effet le sleep n'a pas vraiment d'intérêt là. Je pourrais l'enlever et ne garder que le while .... do ça mettra le code en pause tant que le FGMS n'est pas repasser à 0. J'avais mis le sleep car je me suis dis que cela pourrait clamer le proc de la HC2 ! Et puis mettre une boucle while do avec rien dedans ça faisait bizarre ! nan ?
pepite Posté(e) le 19 avril 2017 Signaler Posté(e) le 19 avril 2017 (modifié) Bonjour @jjacques68, Oui je comprends. Comme ceci peut-être. Attention, je suis toujours un boulet du code ;-) local source = fibaro:getSourceTrigger() local http = net.HTTPClient() local Url_IPX = "http://192.168.2.41" local InPut = false local Rafraichissement = 2 -- en secondes function TestInputIPX() http:request(Url_IPX.."/api/xdevices.json?cmd=10", { options = {method = 'GET', headers = {['Authorization'] = "BASIC YWRtaW46xxxxxxxxx="},}, success = function(response) jsonResponse = json.decode(response.data) if jsonResponse.IN3 == 0 then --éteint si pas allumer par interrupteur Input = true end return Input end, error = function(response) fibaro:debug("Error: " ..response) end }) end function OnOff() TestInputIPX() if InPut then print("<font color='green'>Escalier = ON</font>") fibaro:call(296, "pressButton", 1) setTimeout(function() TestInputIPX() if Input and tonumber(fibaro:getValue(298, "value")) ~= 1 then fibaro:call(296, "pressButton", 2) --on éteint print("<font color='red'>Escalier = OFF</font>") else OnOff() end end, Rafraichissement*1000) else print("<font color='yellow'>Escalier = manuel</font>") --sinon c'est que qqun a actionné interrupteur end end --==== MAIN ===== if source["type"] == "property" then if fibaro:countScenes() > 1 then fibaro:abort() end if tonumber(fibaro:getValue(298, "value")) > 0 then --si passage sur ON du FGMS OnOff() end end Modifié le 19 avril 2017 par pepite
jjacques68 Posté(e) le 19 avril 2017 Auteur Signaler Posté(e) le 19 avril 2017 Je viens de survoler ton code, jolie !!! J'essaye ce soir ! le fonction de test est bien vu ! Ça va alléger... par contre il va y avoir un effet de clignotement, je veux dire par la que on rallume que si elle s'est éteinte ?! Nan ? JE te confirme cela ce soir ! merci !
pepite Posté(e) le 19 avril 2017 Signaler Posté(e) le 19 avril 2017 Ca ne fonctionnera peut-etre pas, c'est juste une idée sans le "sleep" ;-) Oui seulement quand c'est eteint, ca devrait etre bon : - si input = true donc si IN3 = 0 (eteint) dans la fonction TestInputIPX() - Si Input = true dans la fonction OnOff() On allume puis -- settimeout : si c'est allumé, toutes les "Rafraichissement", on teste si Input = true et si le FGMS est OFF, si OUI : on eteint quand je l'ecris ca semble bon, mais après ;-) hihihi
jjacques68 Posté(e) le 19 avril 2017 Auteur Signaler Posté(e) le 19 avril 2017 (modifié) Alors, dans un premier temps j'ai essayé en ajoutant une fonction de test: Mais du coup je pense qu'il y a un soucis à cause de la méthode asynchrone de la requête http. C'est à dire que le retour de la fonction n'apparait qu'après le premier test de la variable Input, donc elle n'est pas prise en compte ! --[[ %% properties 298 value %% events %% globals --]] if fibaro:countScenes() > 1 then fibaro:abort() end local http = net.HTTPClient() --Fonction qui test l'input 3 de l'IPX --return True si l'input 3 = 0 (pas d'interrupteur enclenché) --return False si l'input 3 = 1 (interupteur enclenché) function TestIpx() http:request("http://192.168.2.41/api/xdevices.json?cmd=10", { options = {method = 'GET', headers = {['Authorization'] = "BASIC YWRtaxxxxxxx="},}, success = function(response) jsonResponse = json.decode(response.data) if jsonResponse.IN3 == 0 then print("Input à 0") return true else print("Input à 1") return false end end, error = function(response) fibaro:debug("Error: " ..response) end }) end if tonumber(fibaro:getValue(298, "value")) == 1 then --si passage sur ON -- test l'input de l'IPX ne fait rien si lumière enclenchée par interrupteur) if TestIpx() then --on allume print("<font color='green'>Escalier = ON</font>") fibaro:call(296, "pressButton", 1) while tonumber(fibaro:getValue(298, "value")) == 1 do --tant que sur ON, on boucle fibaro:sleep(2*1000) --tempo 2 secondes end --retest de l'input avant d'éteindre (cas d'un allumage forcé par interrupeteur) if TestIpx() then fibaro:call(296, "pressButton", 2) --on éteint print("<font color='red'>Escalier = OFF</font>") else --sinon on laisse allumé print("<font color='yellow'>2 eme test : Escalier = manuel</font>") end else --sinon on laisse allumé print("<font color='yellow'>1er test : Escalier = manuel</font>") end end Voici le debug qui me le fait penser : [DEBUG] 18:03:56: 1er test : Escalier = manuel [DEBUG] 18:03:56: Input à 0 Modifié le 19 avril 2017 par jjacques68
jjacques68 Posté(e) le 19 avril 2017 Auteur Signaler Posté(e) le 19 avril 2017 j'ai essayé avec ton code, en le copiant simplement dans une scène, aucune erreur !!! Mais exactement la même réaction, le test de la variable Input renvoi false parce que le fonction n'a pas renvoyé la valeur. Le code continue à s'exécuter et donc il crois que l'input est à 1 au lieu de 0... D'où l'ordre d'affichage dans le debug qui est inversé par rapport à ce que cela devrait être. Je pense vraiment que cela vient du fonctionne asynchrone de la requette http... C'est pas très clair cette histoire d'asynchrone, si qqun pouvait l'expliquer !!! Dans mon premier script, ce problème n'apparait pas car j'ai imbriqué les commandes dans les requêtes HTTP même ! L'une à la suite de l'autre. J'avais déjà eut ce soucis d'enchainement pour mes script de patrouille des caméras...
jjacques68 Posté(e) le 19 avril 2017 Auteur Signaler Posté(e) le 19 avril 2017 il faudrait trouver un moyen de mettre en pause le script tant que la fonction n'a pas retourné sa valeur ! Je tourne autour du settimeout denouveau...
jjacques68 Posté(e) le 19 avril 2017 Auteur Signaler Posté(e) le 19 avril 2017 Mais je pense pas qu'il soit la solution au problème car il faut spécifier un temps, et moi je n'ai pas de temps à spécifier.
pepite Posté(e) le 19 avril 2017 Signaler Posté(e) le 19 avril 2017 Waouw, du premier coup ;-), un de mes premiers "OneShot" de code lol Dans ce cas, faut éviter l'asynchrone de http:request et faire scène --> VD ;-) , dans un bouton tu mets le code en utilisant Net.FHttp. Scene : déclenchée par le FGMS qui appuie sur le bouton du VD. et le SetTimeout devrait être OK aussi, tu définis un temps court pour continuer à tester la valeur.
jjacques68 Posté(e) le 20 avril 2017 Auteur Signaler Posté(e) le 20 avril 2017 Bon alors ça je savais pas... Bon ça compliquer encore plus les choses... 1 scène... 1 VD... ... Je crois que je vais garder ma scène Mais dès que j'ai le temps d'essayer pour pas mourir bête, je le fais, c'est intéressant, je te tiens au courant... En attendant, pour mon problème de temps de réaction, j'ai réussi à l'améliorer considérablement en jouant avec le paramètre 3 qui était à 1-2 impulsions par défaut. Je l'ai mis à 0-1 impulsion. 1
jjacques68 Posté(e) le 22 avril 2017 Auteur Signaler Posté(e) le 22 avril 2017 @pepite : tu peux m'expliquer de nouveau la différence entre : fibaro:sleep(60*1000) ... code ... et setTimeout(function() ... code ..., 60*1000) ???? merciiiiii
Messages recommandés