Ce billet propose différentes fonctions qui permette d’utiliser pleinement le contrôleur IPX800 depuis la box Vera Lite. Dans un premier temps, il expose comment consulter ou modifier l’état de l’IPX800. Dans un second temps, il propose un moyen de synchroniser l’état de l’IPX800 avec une structure de donnée dans la Vera Lite afin de bénéficier d’un cache restant synchrone avec les changements d’état de l’IPX800.
Lire un état sur l’IPX800
Connexion à l’IPX800 en Lua :
local socket=require("socket")
function josdConnexionIPX800()
local addresseIP="192.168.0.34" -- adresseIP de l'IPX
local port=9870 -- par defaut le port de lIPX est 9870
local client = assert(socket.connect(addresseIP, port))
client:send("key=<motdepasse>") -- Si l'interface est protégée par un mot de passe
client:receive() -- Si l'interface est protégée par un mot de passe
return (client)
end
</motdepasse> |
local socket=require("socket")
function josdConnexionIPX800()
local addresseIP="192.168.0.34" -- adresseIP de l'IPX
local port=9870 -- par defaut le port de lIPX est 9870
local client = assert(socket.connect(addresseIP, port))
client:send("key=<motdepasse>") -- Si l'interface est protégée par un mot de passe
client:receive() -- Si l'interface est protégée par un mot de passe
return (client)
end
</motdepasse>
Attention, à partir du micrologiciel version 3.05.46, si l’interface de l’IPX800 est protégée par un mot de passe, ce dernier doit être envoyé juste après la connexion comme indiqué ci-dessus (remplacer <motDePasse>
par le mot de passe).
Fonction interne Lua de lecture d’un état de l’IPX800 :
function josdGetIPX800(indice,commande)
if (type(indice)=="string") then indice=tonumber(indice) end
assert(type(indice)=="number" and indice>=1 and indice< =8)
local client=josdConnexionIPX800()
commande=commande..tostring(indice)
client:send(commande)
local reponse=client:receive()
assert(client:close())
local etat=assert(string.match(reponse,'=([0-9]*)$'))
return tonumber(etat)
end |
function josdGetIPX800(indice,commande)
if (type(indice)=="string") then indice=tonumber(indice) end
assert(type(indice)=="number" and indice>=1 and indice< =8)
local client=josdConnexionIPX800()
commande=commande..tostring(indice)
client:send(commande)
local reponse=client:receive()
assert(client:close())
local etat=assert(string.match(reponse,'=([0-9]*)$'))
return tonumber(etat)
end
Fonction Lua de lecture de l’état d’une entrée de l’IPX800 :
function josdGetEntreeIPX800(indice)
return josdGetIPX800(indice,"GetIn")
end |
function josdGetEntreeIPX800(indice)
return josdGetIPX800(indice,"GetIn")
end
Fonction Lua de lecture de l’état d’une sortie de l’IPX800 :
function josdGetSortieIPX800(indice)
return josdGetIPX800(indice,"GetOut")
end |
function josdGetSortieIPX800(indice)
return josdGetIPX800(indice,"GetOut")
end
Fonction Lua de lecture de l’état d’un compteur d’impulsion de l’IPX800 :
function josdGetCompteurIPX800(indice)
return josdGetIPX800(indice,"GetCount")
end |
function josdGetCompteurIPX800(indice)
return josdGetIPX800(indice,"GetCount")
end
Fonction Lua de lecture de l’état d’une entrée analogique de l’IPX800 :
function josdGetEntreeAnalogiqueIPX800(indice)
return josdGetIPX800(indice,"GetAn")
end |
function josdGetEntreeAnalogiqueIPX800(indice)
return josdGetIPX800(indice,"GetAn")
end
Modifier une sortie de l’IPX800
Fonction Lua permettant de changer l’état d’une sortie de l’IPX800 :
function josdSetSortieIPX800(indice, etat)
if (type(indice)=="string") then indice=tonumber(indice) end
if (type(etat)=="string") then etat=tonumber(etat) end
assert(type(indice)=="number" and indice>=1 and indice<=8 and type(etat)=="number" and (etat==0 or etat==1))
local client=josdConnexionIPX800()
local commande="Set0"..tostring(indice)..tostring(etat)
client:send(commande)
local reponse=client:receive()
assert(client:close())
assert(reponse=="Success")
end |
function josdSetSortieIPX800(indice, etat)
if (type(indice)=="string") then indice=tonumber(indice) end
if (type(etat)=="string") then etat=tonumber(etat) end
assert(type(indice)=="number" and indice>=1 and indice<=8 and type(etat)=="number" and (etat==0 or etat==1))
local client=josdConnexionIPX800()
local commande="Set0"..tostring(indice)..tostring(etat)
client:send(commande)
local reponse=client:receive()
assert(client:close())
assert(reponse=="Success")
end
Notification de changement d’état de l’IPX800
Cette section s’appuie sur les billets IPX800 fonction Push et Requêtes HTTP sur Vera Lite. La modification d’une sortie se fait toujours avec la fonction josdSetSortieIPX800
. Par contre, les fonctions de lecture de l’état de l’IPX800 de la section Lire un état sur l’IPX800 sont caduques dans cette section.
La structure de donnée
ipx800
mémorise l’état de l’IPX800 et reste constamment synchrone avec l’état de l’IPX800 grâce au
Push de cette dernière :
local ipx800={
entrees={}, -- État des entrées de l'IPX800
sorties={} -- État des sorties de l'IPX800
} |
local ipx800={
entrees={}, -- État des entrées de l'IPX800
sorties={} -- État des sorties de l'IPX800
}
Voici la fonction permettant de synchroniser l’état de l’IPX800 avec la structure
ipx800
. Les
--...
désignent les endroits où vous devez placer le code qui réagira lorsqu’une entrée ou une sortie change :
function josdSynchroniseEtatIPX800()
local client=josdConnexionIPX800()
local commande="GetInputs"
client:send(commande)
local entreesIPX800=client:receive()
commande="GetOutputs"
client:send(commande)
local sortiesIPX800=client:receive()
assert(client:close())
entreesIPX800=assert(string.match(entreesIPX800,'=([0-9]*)$'))
sortiesIPX800=assert(string.match(sortiesIPX800,'=([0-9]*)$'))
local indice=1
while indice<=8 do
local etatEntree=tonumber(string.sub(entreesIPX800,indice,indice))
local etatSortie=tonumber(string.sub(sortiesIPX800,indice,indice))
if (ipx800.entrees[indice]~=etatEntree) then
ipx800.entrees[indice]=etatEntree
--...
end
if (ipx800.sorties[indice]~=etatSortie) then
ipx800.sorties[indice]=etatSortie
--...
end
indice=indice+1
end
end |
function josdSynchroniseEtatIPX800()
local client=josdConnexionIPX800()
local commande="GetInputs"
client:send(commande)
local entreesIPX800=client:receive()
commande="GetOutputs"
client:send(commande)
local sortiesIPX800=client:receive()
assert(client:close())
entreesIPX800=assert(string.match(entreesIPX800,'=([0-9]*)$'))
sortiesIPX800=assert(string.match(sortiesIPX800,'=([0-9]*)$'))
local indice=1
while indice<=8 do
local etatEntree=tonumber(string.sub(entreesIPX800,indice,indice))
local etatSortie=tonumber(string.sub(sortiesIPX800,indice,indice))
if (ipx800.entrees[indice]~=etatEntree) then
ipx800.entrees[indice]=etatEntree
--...
end
if (ipx800.sorties[indice]~=etatSortie) then
ipx800.sorties[indice]=etatSortie
--...
end
indice=indice+1
end
end
Voici la fonction qui doit être appelée par l’IPX800 pour notifier la Vera de tout changement. Il faut donc paramétrer la fonctionnalité
Push de l’IPX800 en conséquence (cf.
IPX800 fonction Push). La requête HTTP à paramétrer dans l’IPX800 est
/data_request?id=lr_PushVera&message=
. Cette fonction se contente en fait d’appeler la fonction
josdSynchroniseEtatIPX800()
:
luup.register_handler( "josdIPX800PushVera", "PushVera" )
function josdIPX800PushVera(lul_request,lul_parameters,lul_outputformat)
josdSynchroniseEtatIPX800()
return "<head>\n<title>josdIPX800PushVera</title>\n</head>\n<body>\nAcknowledge\n</body>","text/html"
end |
luup.register_handler( "josdIPX800PushVera", "PushVera" )
function josdIPX800PushVera(lul_request,lul_parameters,lul_outputformat)
josdSynchroniseEtatIPX800()
return "<head>\n<title>josdIPX800PushVera</title>\n</head>\n<body>\nAcknowledge\n</body>","text/html"
end
Voici maintenant les fonction
josdGetEntreeIPX800(indice)
et
josdGetSortieIPX800(indice)
qui permettent d’accéder à l’état de l’IPX800 et qui deviennent triviales :
function josdGetEntreeIPX800(indice)
return(ipx800.entrees[indice])
end |
function josdGetEntreeIPX800(indice)
return(ipx800.entrees[indice])
end
function josdGetSortieIPX800(indice)
return(ipx800.sorties[indice])
end |
function josdGetSortieIPX800(indice)
return(ipx800.sorties[indice])
end
Cette entrée a été publiée dans
Domotique,
Contrôleurs,
Tutoriels and taguée
Fonction Luup,
IPX800,
Lua,
Vera. Placez un signet sur le
permalien.