Aller au contenu

Script FGMS et IPX800 avec interrupteurs VA et VIENT


jjacques68

Recommended Posts

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 ?

 

Lien vers le commentaire
Partager sur d’autres sites

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. 

 

 

Lien vers le commentaire
Partager sur d’autres sites

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.

 

Lien vers le commentaire
Partager sur d’autres sites

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 ?

 

 

Lien vers le commentaire
Partager sur d’autres sites

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é par pepite
Lien vers le commentaire
Partager sur d’autres sites

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 !

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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é par jjacques68
Lien vers le commentaire
Partager sur d’autres sites

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...

Lien vers le commentaire
Partager sur d’autres sites

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. 

Lien vers le commentaire
Partager sur d’autres sites

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.

 

 

  • Upvote 1
Lien vers le commentaire
Partager sur d’autres sites

×
×
  • Créer...