Archives du tag : Vera

Détecteur Z-Wave Fibaro Smoke Sensor FGSS-001

Description

smoke_sensor

Le Fibaro Smoke Sensor FGSS-001 est un capteur de fumée permettant d’être alerté d’une menace d’incendie par une sirène, une lumière Led multi-couleur et un signal Z-Wave. Comme certains matériaux brûlent sans fumer les ingénieurs de Fibaro ont décidé d’inclure une protection supplémentaire sous la forme d’un capteur de température. La batterie du module est censée tenir 3 ans et une alimentation extérieure est possible. La sensibilité de détection du capteur est réglable (3 niveaux), il peut être connecté à un système d’alarme filaire et dispose d’une protection contre le sabotage.

Attention, à partir de 2015, un détecteur de fumée sera obligatoire dans chaque logement. Cependant, le Fibaro Smoke Detector FGSS-001 est uniquement compatible avec la norme EMC 2004/108/EC. Il ne respecte pas la norme Européenne EN 14 604 à laquelle tout détecteur de fumée (DAAF) commercialisé en France depuis 2008 doit se conformer. Notamment le son émis par sa sirène n’est pas très fort, il ne respecte pas les 85dB de la norme CE. C’est pour cela que Fibaro utilise le terme de capteur de fumée plutôt que celui de détecteur de fumée.

Note du 14/02/2015 : Une version respectant la norme Européenne existe et est présentée ici.

(suite…)
Publié dans Domotique, Modules | Tagué , , | 11 commentaires

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

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

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

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