Requêtes HTTP sur Vera Lite

Problématique

http

Il est important de pouvoir faire des requêtes HTTP sur un contrôleur domotique. C’est un moyen de communication qui permet de piloter la box depuis l’extérieur. Cela permet par exemple de développer sa propre interface web pour contrôler sa domotique ou encore mettre en œuvre une technique de push depuis un objet connecté (comme une box IPX800) vers la box domotique afin de notifier de tout changement d’état.

Requête locale et requête distante

Le début d’une requêtes HTTP est différent suivant que la requête est faite depuis le réseau local sur lequel se situe la Vera ou depuis l’extérieur.

  • Depuis le réseau local : http://<ip_Vera>:3480…

    Les sont à remplacer par la suite de la requête.
  • Depuis l’extérieur, le plus simple est de passer par les serveurs de la société Vera Smart Home Controllers : https://fwd1.mios.com/<login>/<password>/<n°vera>…

    Les sont à remplacer par la suite de la requête, fwd1 peut être remplacé par fwd2 ou fwd3.

    Je n’aime pas trop cette technique qui indique en clair dans l’url l’identifiant et le mot de passe et crée une dépendance au serveur de la société Vera.
  • Une autre technique depuis l’extérieur est de mettre en place une redirection de port sur le routeur. On peut alors par exemple écrire : http://<adresse_perso>:<port_redirigé>…

    L’inconvénient de cette technique est que n’importe qui trouvant ce port ouvert peut faire beaucoup de choses avec votre Vera.
  • Pour sécuriser l’accès à la Vera, sans utiliser les serveurs de la société Vera Smart Home Controllers, une solution consiste à passer par un VPN.
Requête sur device ou scène
  • Requête pour modifier l’état d’un device de type On/Off :

    …/data_request?id=lu_action&DeviceNum=<device>&serviceId=urn:upnp-org:serviceId:SwitchPower1&action=SetTarget&newTargetValue=< état>
    </device>

    Les doivent être remplacés par le début de requête adapté, <device> par le numéro de device concerné et <état> par l’état désiré (0 ou 1).

    Exemple de requête complète :
    http://192.168.0.44:3480/data_request?id=lu_action&DeviceNum=19&serviceId=urn:upnp-org:serviceId:SwitchPower1&action=SetTarget&newTargetValue=1

  • Requête pour connaître l’état d’un device de type On/Off :

    …/data_request?id=variableget&DeviceNum=<device>&serviceId=urn:upnp-org:serviceId:SwitchPower1&Variable=Status
    </device>

    Les doivent être remplacés par le début de requête adapté et <device> par le numéro de device concerné.

    Exemple de requête complète :
    http://192.168.0.44:3480/data_request?id=variableget&DeviceNum=19&serviceId=urn:upnp-org:serviceId:SwitchPower1&Variable=Status

  • Lire ce billet pour savoir comment interagir avec un autre type de device
  • Requête pour exécuter une scène :

    …/data_request?id=lu_action&serviceId=urn:micasaverde-com:serviceId:HomeAutomationGateway1&action=RunScene&SceneNum=<num éro de scène>
    </num>

    Les doivent être remplacés par le début de requête adapté et <Numéro de scène> par le numéro de la scène à exécuter.

    Exemple de requête complète :
    http://192.168.0.44:3480/data_request?id=lu_action&serviceId=urn:micasaverde-com:serviceId:HomeAutomationGateway1&action=RunScene&SceneNum=18

Appeler une fonction Lua, méthode directe
L’appel d’une fonction Lua se fait de cette façon :

…/data_request?id=lu_action&serviceId=urn:micasaverde-com:serviceId:HomeAutomationGateway1&action=RunLua&Code=<MA_FONCTION(ARG1,ARG2)>

Les doivent être remplacés par le début de requête adapté et <MA_FONCTION(ARG1,ARG2)> par le code Lua à exécuter.

Par exemple la fonction Lua suivante :

function plus(a,b)
  luup.log(a+b)
end

peut être appelée de la manière suivante :

http://192.168.0.44:3480/data_request?id=lu_action&serviceId=urn:micasaverde-com:serviceId:HomeAutomationGateway1&action=RunLua&Code=plus(1,2)

Il faut bien faire attention à écrire l’url sans espace. Tout espace doit être remplacé par %20.

Appeler une fonction Lua en utilisant un handler
L’inconvénient de la méthode précédente est que l’url à écrire est très longue (trop longue pour un champs de l’IPX800 limité à 128 caractères).
Une bonne alternative est de définir une fonction Lua dédiée à être appelée par une requête HTTP :

luup.register_handler( "josdHandler", "JH" )
function josdHandler(lul_request,lul_parameters,lul_outputformat)
  local parametres=""
  for cle, valeur in pairs(lul_parameters) do
    parametres=parametres.."&nbsp;&nbsp;"..tostring(cle).."="..tostring(valeur).."<br/>\n"
  end
  local lul_html="<head>\n" .."<title>josdHandler</title>\n" .."</head>\n" ..
    "<body>\n".."lul_request="..tostring(lul_request).."<br/>\n"
    .."lul_parameters={<br/>\n"..parametres.."}<br/>\n"
    .."lul_outputformat="..tostring(lul_outputformat).."<br/>\n"
  local lul_content_type = "text/html"
  return lul_html, lul_content_type
end

Voici l’appel :

http://192.168.0.44:3480/data_request?id=lr_JH&P1=val1&P2=val2&P3=val3

et le retour de cette fonction :

lul_request=JH
lul_parameters={
  P2=val2
  P3=val3
  P1=val1
}
lul_outputformat=
Informations et sources
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 *