Archives de la catégorie : Domotique

Vera Lite : Plantage sévère

VeraDeadlock
Description du plantage

Ma Vera Lite a subitement planté alors qu’elle fonctionnait normalement (je n’étais pas en train d’intervenir dessus). Voici les derniers messages d’erreur du log :

01	05/15/14 12:06:37.009	Failed to get lock(0xa3e20c) Variable: ../ZWave/ZWaveJobHandler.h:372 last used UserData.cpp:463  first used UserData.cpp:463  thread: 0x2c315680 (>579995)  handler 0x424934 bOkToFail 0 <0x2c915680>
01	05/15/14 12:06:37.019	Deadlock problem. going to reload and quit <0x2c915680>
01	05/15/14 12:06:44.231	Main WatchDogRoutine: blocked - terminating 1 <0x2d92f680>

J’ai immédiatement tenté de la redémarrer en la débranchant puis en la rebranchant, et là, plus rien : plus d’interface web, plus de ssh, aucune réponse au ping.
Les voyants de la Vera sont entrés dans la séquence cyclique suivante :

  1. Le voyant bleu clignote environ 40 secondes
  2. Le voyant vert s’allume quelques secondes
  3. Les quatre voyants s’éteignent puis s’allument puis s’éteignent
  4. Retour au 1
(suite…)
Publié dans Domotique, Contrôleurs | Tagué , | 1 commentaire

Alarme Home Control 2 de MyFOX

myfox

Présentation

Cahier des charges

Mon cahier des charges minimal est assez simple :

  • Véritable alarme plutôt qu’un patchwork à base de modules Z-Wave sur la box domotique
  • Alarme connectée afin de pouvoir l’armer, la désarmer ou faire d’autres manipulations à distance
  • Alarme interfaçable avec la domotique de la maison

Je suis convaincu que ce n’est pas une bonne idée de concevoir son système d’alarme à base de modules Z-Wave. Tout d’abord, le protocole Z-Wave et les box qui le mettent en œuvre ne sont pas conçues pour faire de la sécurité (brouillage radio…). En outre, le Z-Wave n’est ni une technologie fiable, ni une technologie stable. Ensuite, ma box domotique est déjà bien chargée, il lui arrive (rarement) de planter sans qu’elle ne puisse redémarrer d’elle-même (même après avoir été débranchée et rebranchée). Enfin, mieux vaut ne pas mettre tous ses œufs dans le même panier : par exemple, une Vera Lite, une IPX800 et une HC2 de MyFOX se complètent bien et rendent le système bien plus fiable que si toutes ces fonctionnalités étaient supportées par un système unique.

Dans ce contexte, il est important que box domotique et système alarme puissent communiquer. En effet, il est intéressant de pouvoir baisser le chauffage ou éteindre certaine lumière quand l’alarme est armée, et faire l’inverse quand elle est désarmée. Il est également intéressant que la domotique puisse déclencher l’alarme en se basant sur l’activation de ses propres capteurs, ou être informée d’une intrusion pour prendre certaines mesures.

(suite…)
Publié dans Domotique, Contrôleurs, Alarme | Tagué | 20 commentaires

Vera UI5 : Créer son propre Plugin

creer

Problématique

La création d’un plugin pour la box domotique Vera sous UI5 n’est pas une opération très simple et les tutoriels simples et en français pour en décrire les étapes ne sont pas légion sur Internet. Ce billet, rédigé sous la forme d’un tutoriel, à pour vocation de décrire les différentes étapes permettant la création d’un plugin équivalent au plugin Virtual ON/OFF Switches mais comportant 3 états plutôt que deux.

Ce billet n’est pas achevé. Il est cependant en standby pour une question de temps, mais aussi parce que la sortie de UI7 (personnellement, je ne l’attends pas avant 2015) va changer la donne.

Structure d’un Plugin

Un plugin Luup est composé de plusieurs fichiers dont certain sont optionnels.

4 fichiers permettent d’implémenter le fonctionnement du plugin.

  • D_GenericPlugin1.xml, Device description file (1) – Ce fichier est le principal, il permet de décrire le device implémenté par le plugin. C’est à partir de ce fichier que tous les autres sont atteints. Il s’agit en fait d’un fichier xml de spécification de device UPnP (UPnP device description file). Voici quelques liens utiles pour l’écriture de ce fichier : Luup Plugins ; Luup Plugins By Hand.
  • S_GenericPlugin1.xml, Service File (0 à n) – Ce fichier est optionnel car la Vera fournit déjà de nombreux Service File décrivant de besoins récurrents comme des switches on/off par exemple. Si les services du plugin n’existent pas déjà, il faut créer un ou plusieurs fichiers Service File et décrire l’implémentation dans le fichier Implementation file. Voici quelques liens utiles renseignant les Service File existants : Luup UPNP Files ; Luup Devices ; Luup UPnP Variables and Actions.
  • I_GenericPlugin1.xml, device Implementation file (1) – Ce fichier contient le code Lua nécessaire pour mettre en œuvre les services spécifiés dans le ou les fichiers Service File. Voici quelques liens utiles pour l’écriture de ce fichier : Luup Plugins By Hand ; Luup Declarations ; Luup Lua extensions.
  • L_GenericPlugin1.xml, Lua file (0 à n) – En principe, le code Lua est placé dans le fichier device Implementation file. Cependant, si le code est important, il peut être judicieux de le structurer en plusieurs fichier Lua file et de ne faire que des appels dans le fichier device Implementation file.

2 autres fichiers permettent d’implémenter la partie visuelle du plugin et son interaction dans l’interface UI5. Ces 2 fichiers sont optionnels, ils ne servent que si le plugin doit posséder une interface graphique.

  • D_GenericPlugin1.json, Device interface file(0 ou 1) – Ce fichier n’est utile que pour interagir avec le plugin directement depuis l’interface utilisateur. Dans le cas contraire, le plugin peut toujours être invoqué depuis des scènes, du code Luup, à partir d’appels URL… Ce fichier contient également les liens vers les icônes associés au plugin. Voici quelques liens utiles pour approfondir la questionr : Luup plugins: Static JSON file ; Luup plugin tabs.
  • J_GenericPlugin1.xml, JavaScript files (0 à n) – Appelés par le fichier JSON Device interface file ces fichiers ne sont utiles que pour implémenter des interactions bien particulières (autres que de simples affichages d’étiquettes, de boutons ou de curseurs) au niveau de l’interface.

Informations et sources

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

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 avec des images

attachment

Voici une fonction en Lua permettant d’envoyer un courriel avec une ou plusieurs images en pièce jointe à partir de la Vera Lite. Le message et l’objet peuvent contenir des caractères accentués. L’objet est facultatif. Les images sont aussi facultatives, cette fonction peut donc être utilisée pour envoyer un simple courriel à la place de celle présentée dans ce billet. <@_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ètres le message, l'objet et des images au format jpeg à attacher en pièces jointes
-- On peut ne donner comme paramètres que (message, objet) voir que (message)
-- message    : le message du courriel (ex : "Voici quelques photos")
-- objet      : l'objet du courriel (ex : "Photos")
-- imagesJPEG : les chemins des images (ex : "/img.jpg" ou encore {"/img1.jpg", "/img2.jpg", "/img3.jpg"} )
function josdEnvoyerCourrielAvecImages(message, objet, imagesJPEG)
  local smtp = require("socket.smtp")
  local mime = require("mime")
  local ltn12 = require("ltn12")
  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 body={}
  body[1] = { headers = { ["content-type"] = "text/plain; charset=utf8" }, body = message }
  if(imagesJPEG~=nil) then
    if(type(imagesJPEG)=="string") then imagesJPEG = { imagesJPEG } end
    for i,v in pairs(imagesJPEG) do
      body[i+1] = { 
        headers = {
          ["content-type"] = 'image/jpeg; name="image'..tostring(i)..'.jpg"',
          ["content-disposition"] = 'attachment; filename="image'..tostring(i)..'.jpg"',
          ["content-description"] = 'Image '..i+1,
          ["content-transfer-encoding"] = "BASE64"
        },
        body = ltn12.source.chain(
          ltn12.source.file(io.open(v, "rb")),
          ltn12.filter.chain(
            mime.encode("base64"),
            mime.wrap()
          )
        )
      }
    end
  end
  local courriel = smtp.message{
    headers = {
      from = emetteur,
      to = destinataire,
      subject = objet
    },
    body=body
  }
  smtp.send{ from=emetteur, rcpt=destinataire, source=courriel, server="<smtp>", port="25" }
end

Attention, capturer des images et les envoyer par courriel peut consommer trop de ressources pour la Vera lite (cf. Vera Lite : Plantage sévère).

Sommaire Domotique sur ce blog

Publié dans Domotique, Surveillance | Tagué , | 12 commentaires

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