Communication entre Vera Lite et IPX800

Vera-IPX800
Problématique

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>

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
Fonction Lua de lecture de l’état d’une entrée de l’IPX800 :
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
Fonction Lua de lecture de l’état d’un compteur d’impulsion de l’IPX800 :
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
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
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
}
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
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
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 josdGetSortieIPX800(indice)
  return(ipx800.sorties[indice])
end
Informations et sources

Sommaire Domotique sur ce blog

Cette entrée a été publiée dans Domotique, Contrôleurs, Tutoriels and taguée , , , . Placez un signet sur le permalien.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *