Archives de la catégorie : Tutoriels

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
(suite…)
Publié dans Domotique, Contrôleurs, Tutoriels | Tagué , , , | Laisser un commentaire

IPX800 fonction Push

pushbutton
Problématique

La technique de Push permet d’exécuter une requête HTTP lorsqu’une entrée ou une sortie de l’IPX800 change d’état. C’est le meilleur moyen pour informer en temps réel un autre dispositif internet, comme une box domotique, d’un changement d’état de l’IPX800. L’IPX800 propose deux façons de paramétrer des Push :

  1. Un paramétrage centralisé commun à toutes les entrées et sorties
  2. Un paramétrage individualisé pour chacune des entrées et chacune des sorties

Malheureusement, avec la dernière version en date du micrologiciel (3.05.38), les deux techniques, bien qu’utilisables ne fonctionnent pas parfaitement.

Paramétrage centralisé du Push
IPX800PushCentralisé

Le paramétrage du Push centralisé est accessible de la manière suivante : M2M → PUSH. Voici les différents champs à remplir :

  • Server: <adresse recevant le push>, par exemple 192.168.0.44
  • Port: <le port, par exemple 3480 pour une box Vera
  • Bien cocher Enable puis cliquer sur Save
  • Path: <requête>, par exemple /data_request?id=lr_JH&data=$M&$I
(suite…)
Publié dans Domotique, Contrôleurs, Tutoriels | Tagué | 1 commentaire

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
(suite…)
Publié dans Domotique, Contrôleurs, Tutoriels | Tagué , | Laisser un commentaire

Lua : envoyer un courriel

courriel

Voici une fonction en Lua permettant d’envoyer un courriel à partir de la Vera Lite. Le message et l’objet peuvent contenir des caractères accentués. L’objet est facultatif. <@_courriel_emetteur>, <@_courriel_destinataire> et <smtp> sont à remplacer par l’adresse électronique et le serveur smtp adéquats.

-- Permet d'envoyer un courriel en passant en paramètre le message et l'objet (facultatif)
function josdEnvoyerCourriel(message, objet)
  local smtp = require("socket.smtp")
  local emetteur     = "<@_courriel_emetteur>"
  local destinataire = "<@_courriel_destinataire>"
  if (type(objet)=="string") then objet="[Vera]".." "..objet else objet="[Vera]" end
  message="Bonjour, ceci est un courriel envoyé par la VeraLite ("..os.date("%A %B %Y, %H:%M:%S")..")\n\n"..message.."\n\nCordialement, VeraLite"
  local mesgt = {
    headers = {
      to = destinataire,
      from = emetteur,
      subject = objet,
      ["content-type"] = "text/plain; charset=utf8"
    },
    body = message
  }
  smtp.send{ from=emetteur, rcpt=destinataire, source=smtp.message(mesgt), server="<smtp>", port="25" }
end

Sommaire Domotique sur ce blog

Publié dans Domotique, Tutoriels | Tagué , | Laisser un commentaire

Vera : capturer une image depuis une caméra IP

Voici une petite fonction permettant, à partir d’une Vera Lite, de capturer une photo avec une caméra IP.

-- Capturer une image d'une caméra IP et la placer dans le fichier spécifié
-- requete : requête permettant la capture de l'image
-- cible   : le chemin de l'image (ex : "/root/img.jpg")
function josdCaptureImageCamera(camera, cible)
  local out=assert(io.open(cible, "wb"))
  local _,data=luup.inet.wget(requete)
  out:write(data)
  assert(out:close())
end

En complément, ce billet présente des requêtes permettant de capturer des images depuis des caméras IP D-Link. Ce billet propose une fonction permettant d’envoyer un courriel avec des images en pièce jointe.

Attention, ces captures peuvent consommer trop de ressources pour la Vera lite (cf. Vera Lite : Plantage sévère).

Sommaire Domotique sur ce blog

Publié dans Domotique, Tutoriels, Surveillance | Tagué , , | 5 commentaires

Lua : exécuter une commande système (ping, uptime …)

Exécuter une commande système (os.execute)

Voici une petite fonction permettant d’exécuter une commande système. Cette fonction permet de récupérer la sortie sur stdout de la commande, comme le message d’erreur dans le cas où la commande système échoue.

-- Permet d'exécuter une commande système sur la Vera
-- commande    : la chaîne de caractères contenant la commande
-- Retourne vrai en cas de succès plus le résultat (stdout) de la commande
function josdOsExecute(commande)
  local cmd=commande..' > /tmp/josdOsExecute.log 2>&1'
  local reponse=os.execute(cmd)
  local file=assert(io.open("/tmp/josdOsExecute.log", "r"))
  local stdout=file:read("*all")
  assert(file:close())
  return (reponse==0 or reponse==true), stdout
end

Ping

Voici maintenant une fonction Lua qui permet de tester l’accessibilité d’une autre machine à travers un réseau IP.

-- Permet de faire un ping sur une adresse
function josdPing(adresse)
  local nbPing=3     -- -c CNT : Send only CNT pings
  local nbSecondes=5 -- -w SEC : Seconds until ping exits
  assert(type(adresse)=="string")
  return josdOsExecute("ping -c"..nbPing.." -w"..nbSecondes.." -W"..nbSecondes.." "..adresse)
end

Load Average (uptime)

Le load average est une moyenne de la charge système calculée sur la dernière minute, les cinq dernières minutes et les quinze dernières minutes (3 moyennes en fait). Voici une fonction Lua permettant de retourner la valeur de ces trois moyennes.

-- Permet de connaitre le taux d'occupation du processeur de la VeraLite
-- Retourne la charge système moyenne pour les 1, 5 et 15 dernières minutes.
function josdLoadEverage()
  local succes,message=josdOsExecute("uptime")
  if (succes) then
    local l1,l2,l3=string.match(message, "load average[^0-9.]*([0-9.]*)[^0-9.]*([0-9.]*)[^0-9.]*([0-9.]*)")
    return tonumber(l1),tonumber(l2),tonumber(l3)
  end
end

Voici une fonction Lua permettant de tester si ces trois moyennes sont en dessous d’un seuil passé en paramètre.

-- Vrai si les trois valeurs du taux d'occupation du processeur sont inférieures à la limite
function josdLimiteLoadEverage(limite)
  limite=limite or 0.33 -- Valeur par défaut
  local l1,l2,l3=josdLoadEverage()
  return(l1<limite and l2<limite and l3<limite)
end

Sommaire Domotique sur ce blog

Publié dans Domotique, Tutoriels | Tagué , | 1 commentaire

Authentification par clé SSH : Linux, Synology, Vera

ssh_rsa

Problématique

SSH (Secure SHell) permet de se connecter de façon sécurisée à un système Unix ou Linux et doit être privilégié par rapport à d’autres programmes tels que rlogin, telnet, rcp, ftp et rsh. SSH garantit entre autres la confidentialité, l’intégrité et l’authentification.

Avec SSH, l’authentification peut se faire sans l’utilisation de mot de passe ou de phrase secrète en utilisant la cryptographie asymétrique. Cette technique est à la fois plus sûre mais aussi plus pratique (plus de mot de passe à taper) et enfin et surtout indispensable pour pouvoir scripter ou programmer des échanges en utilisant ce protocole.

Principe

Le principe de mise en place d’une authentification par clé est simple et comporte deux étapes :

  1. Création de la paire de clé sur le client (celui depuis lequel on souhaite lancer une commande SSH) ; cette est à faire une fois pour toutes
  2. Envoyer sa clé publique sur le serveur dans le fichier authorized_keys

La mise en pratique est parfois moins triviale de part la diversité des systèmes utilisés (PC, Nas, Box) et de part la diversité des implémentations logicielles du protocole SSH.

(suite…)
Publié dans Domotique, Synology, Tutoriels, Questions Réseau | Tagué | Laisser un commentaire

Communication bidirectionnelle entre Box Domotique et Caméra IP

DCS-6511_Connector

En principe, une caméra IP doit posséder une entrée et une sortie numérique. Dans le cadre d’une installation domotique, il est tout à fait pertinent de faire communiquer le box domotique avec la caméra IP afin que la box soit informée en cas de détection de mouvement, et inversement que la box puisse envoyer un signal d’alarme à la caméra en cas de détection d’un capteur associé à la box (ouverture de porte, détection de mouvement…)

MIMOlite

Fortrezz commercialise un module Z-Wave MIMOlite possédant une entrée numérique ou analogique et une sortie tout ou rien. Ce module me semble tout à fait adéquat pour servir de passerelle entre une box domotique Z-Wave et une Caméra IP.

Personnellement, je possède une caméra IP D-Link DCS-6511 et un contrôleur domotique IPX800. C’est donc ces deux dispositifs que j’ai décidé de faire communiquer et le câblage entre les deux est on ne peut plus simple.

DCS-6511-Connexion-Dia

Sommaire Domotique sur ce blog

Publié dans Domotique, DLink, Tutoriels, Surveillance | Tagué , | Laisser un commentaire

Lua : vacances, jours chômés et jours fériés

reposFirefox

Indispensable dans une box domotique

Il est souvent utile de savoir si le jour courant est un jour passé à la maison, ou pas, pour planifier la programmation des luminaires ou du thermostat. Ce billet présente un ensemble de fonctions permettant de déterminer si le jour courant est un jours chômé (c’est à dire un jour où au moins un membre de la famille reste à la maison).

Jours chômés

La fonction principale pourrait se résumer à celle-ci :

function josdJourChome()
  local jour=josdGetJourSemaine()
  return jour=="samedi" or jour=="dimanche" or josdJourFerie() or josdJourVacances()
end

Un jour chômé est donc un samedi, un dimanche (à adapter selon votre situation) un jour férié ou un jour de vacances scolaires. Cette fonction fait appel à d’autres fonctions (josdGetJourSemaine(), josdJourFerie() ou josdJourVacances()) que nous détaillerons plus bas.

(suite…)
Publié dans Domotique, Tutoriels | Tagué | Laisser un commentaire

Luup et les Variables des Modules

Principes de fonctionnement

Propriétés d'un Module

Les variables d’un module (device) permettent de connaître, voir de modifier, l’état courant d’un module (allumé, éteint, température, niveau des batteries….). Dans l’interface de la Vera, pour accéder aux variables d’un module, il faut cliquer sur la petite clef à molette du module en question afin d’accéder à la boîte de dialogue des propriétés du module. Les variables du module se trouvent dans la partie inférieure de l’onglet Advanced de cette boite de dialogue comme illustré sur l’image ci-dessous.

(suite…)
Publié dans Domotique, Tutoriels | Tagué , | 2 commentaires