La Zibase en complément de la Vera ?

La Zibase en complément de la Vera   ?

Cet article fait directement reference “La vera en complément de la Zibase ?” du forum touteladomotique.com

Avant toute chose, pourquoi utiliser la Zibase en complément de la Vera ?

L’utilisation de la Zibase permet de palier un des manques (que j’abordais dans le premier article de ce blog) : avoir des sondes (températures, humidité) abordables et de taille restreinte”. Attention, pas que ce soit incompatible avec le protocole Zwave, la preuve des modules existent (ici par exemple), mais aux alentours de 60€ pièces il est difficile de concurrencer les modules Oregon ou Lacrosse dont les sondes standards coutent entre 15€ et 30€ et pour lesquelles il existe une multitude de variantes (capteur UV, sonde pour piscine etc.).

L’idée est donc d’utiliser un connecteur entre les sondes Oregons et la Vera :

  • Si vous n’avez pas déjà une Zibase, je vous conseil d’utiliser le nouveau module USB de RFXCOM (95€) qui se branchera directement sur votre Vera en USB et qui, via un plugin dédié, vous permettra de contrôler vos sondes et vos modules X10, Chacon, … (quelques références : iciici, et ici). Je  ne l’ai pas personnellement testé (avis aux bonnes âmes ;)) mais cette solution est bien plus économique et est compatible avec plus de protocole et notamment les sondes Lacrosse.
  • Si vous avez déjà une Zibase, vous pouvez (et c’est l’object de cette article) utiliser votre Zibase comme connecteur entre vos sondes et la vera.

Comment utiliser la Zibase en complément de la vera ?

1) Les pré-requis :

Connaitre l’adresse ip de sa Zibase (Nota : la vera et la Zibase doivent etre dans le meme réseau. Pour faire simple elles doivent accéder à internet par la meme boite ADSL, si la Zibase est dans votre maison de vacances et la Vera dans votre domicile principal cela ne fonctionnera pas ;))

Pour cela, se rendre sur votre espace Zibase.net, passer en mode expert, dans l’onglet Zibase, sous onglet système :

Cette adresse ne doit pas changer, vous pouvez soit configurer l’adresse statique via les paramètres de votre box. La procédure étant differente pour chaque Box, je ne rentrerai pas dans les détails ici. A noter que vous aurez besoin de l’adresse “MAC” de votre Zibase et qu’il sera plus ou moins facile de l’obtenir en fonction de votre box. Il est domage que cette information ne soit pas présente dans les paramètre de l’espace zibase.net 🙁

Vous pouvez également choisir de rendre cette adresse fixe via les paramètres de la Zibase présente sur cette meme page : Adressage IP Lan en mode manuel (réservé aux experts du routage static :p ).

2) Créer des sondes (virtuelles) dans la Vera :

En préparation de l’étape suivant, il faut créer autant de sondes virtuelles que vous avez de capteurs a récupérer de la Zibase (nota : pour une sonde température + humidité, il faut donc créer 2 sondes virtuelles).

Pour cela, allez dans l’onglet APPS / Develop Apps / Create device :

Dans le champs “Description” : donner un nom à votre sonde

Dans le champs “Upnp Device Filename” utiliser (attention a ne pas avoir d’espace en trop à la fin) :

  • D_HumiditySensor1.xml : pour créer des sondes virtuelles d’humidité
  • D_TemperatureSensor1.xml : idem pour la température
  • D_PowerMeter1.xml : idem pour la consommation électrique

Enfin choisissez la pièce associée à la sonde et valider.

La création de chaque module sera confirmée par ce message. noter le numéro de la sonde (ici 130) nous en aurons besoin plus tard.

Tous vos modules sont maintenant créés et doivent apparaitre dans votre interface (exemple ici d’un module d’humidité) :

3) Connaitre les paramètres Radio de chacune de ses sondes

Le principe de base de ce connecteur est d’allez lire dans le fichier sensors.xml de la Zibase pour récupérer les valeurs des sondes. Ce fichier se trouve à l’adresse : http://IPZIBASE/sensors.xml (ou IPZIBASE est l’adresse ip de votre Zibase, voir le paragraphe pré-requis).

Dans votre espace Zibase.net, récupérer l’Identifiant radio de chacune de vos sondes :

Ouvrez dans votre navigateur pour trouvez la ligne qui correspond dans le fichier sensors.xml, utilisez la fonction de recherche de votre navigateur en partant de l’identifiant de la sonde sans les lettres (dans mon cas 439193872)

<ev type="7" pro="OS" id="439193872" gmt="1334659738" v1="165" v2="0" lowbatt="0"/>

Pour chaque sondes vous devrez connaitre :

  • Son type (dans mon cas 7 pour les oregon et 10 pour OWL CM119)
  • Son paramètre “pro” (OS pour mes oregon et WS pour mon OWL)
  • Son id qui correspond à l’identifiant radio (sans les lettres)

4) Configurer la scène qui va se charger de lire le fichier sensor.xml

Dans votre Vera, créer une nouvelle scène et allez dans l’onglet luup.

Voici le canevas du code que vous pouvez copier coller dans la partie code :

-- fonction utilisée pour parcourir le xml et récupérer les valeurs
local function extractElement(type, pro, id, xml, default)
local gmt,v1,v2,v3
local pattern = "<ev type=""..type.."" pro=""..pro.."" id=""..id.."" gmt="(%d+)" v1="([+-]?%d+)" v2="([+-]?%d+)" lowbatt="(%d+)"/>"
gmt, v1, v2, v3 = xml:match(pattern)
if (gmt == nil) then
gmt, v1, v2, v3 = 0, default, default, default
end
return gmt, v1, v2, v3
end
-- fonction utiliser pour aleter en cas de batterie faible
local function setBatteryLevel(lowbat)
 if (lowbat == 1 or lowbat == "1") then
  return 0
 else
  return 100
 end
end

-- création des paramètres
local url = "http://IP_ZIBASE/sensors.xml"
local gmt, v1,v2
local status, rss = luup.inet.wget(url, 10)
local tempID,humiID
if (status == 0) then
-- A Completer ici dans la prochaine étape du tutoriel
end

Il faudra bien sur remplacer  IP_ZIBASE par l’adresse ip de votre Zibase.

En l’etat nous avons donc un scripte capable de lire les informations dans le fichier xml, il ne reste plus qu’a envoyer dans notre module virtuel la valeur lue. il faut donc maintenant compléter la partie au niveau du commentaire “A Completer ici dans la prochaine étape du tutoriel”

En fonction du type de sonde, le code est différent :

  • Pour une sonde de température (seulement) :
 tempID = 24
 gmt, v1,v2,lowbatt = extractElement(7,"OS","439193872", rss, "N/A")
 if (tonumber(v1)==nil) then
 luup.variable_set("urn:upnp-org:serviceId:TemperatureSensor1", "CurrentTemperature", v1 , tempID)
 else
 luup.variable_set("urn:upnp-org:serviceId:TemperatureSensor1", "CurrentTemperature", v1/10 , tempID)
 end

 luup.variable_set("urn:micasaverde-com:serviceId:HaDevice1", "BatteryLevel", setBatteryLevel(lowbatt) ,tempID)
 luup.variable_set("urn:micasaverde-com:serviceId:SecuritySensor1", "LastTrip", gmt ,tempID)

Vous devez modifier dans les 2 premières lignes :

tempID = l’id de la sonde virtuelle de température que nous avons créé dans l’étape 2
les paramètres de la fonction extractElement : 7 correspond au type, “OS” au paramètre pro et “439193872” au paramètre id que nous avons récupéré dans l’étape 3

  • Pour une sonde de température + humidité :
 tempID = 11
 humiID = 14
 gmt, v1,v2,lowbatt = extractElement(7,"OS","439193872", rss, "N/A")
 if (tonumber(v1)==nil) then
 luup.variable_set("urn:upnp-org:serviceId:TemperatureSensor1", "CurrentTemperature", v1 ,tempID)
 else
 luup.variable_set("urn:upnp-org:serviceId:TemperatureSensor1", "CurrentTemperature", v1/10 ,tempID)
 end
 luup.variable_set("urn:micasaverde-com:serviceId:HumiditySensor1", "CurrentLevel", v2 ,humiID)
 luup.variable_set("urn:micasaverde-com:serviceId:HaDevice1", "BatteryLevel", setBatteryLevel(lowbatt) ,humiID)
 luup.variable_set("urn:micasaverde-com:serviceId:SecuritySensor1", "LastTrip", gmt ,humiID)
 luup.variable_set("urn:micasaverde-com:serviceId:HaDevice1", "BatteryLevel", setBatteryLevel(lowbatt) ,tempID)
 luup.variable_set("urn:micasaverde-com:serviceId:SecuritySensor1", "LastTrip", gmt ,tempID)

Vous devez modifier dans les 2 premières lignes :

tempID = l’id de la sonde virtuelle de température que nous avons créé dans l’étape 2
humiID =  l’id de la sonde virtuelle d’humidité que nous avons créé dans l’étape 2
les paramètres de la fonction extractElement : 7 correspond au type, “OS” au paramètre pro et “439193872” au paramètre id que nous avons récupéré dans l’étape 3

  • Pour un capteur de consommationélectrique OWL
 tempID = 11
 gmt, v1,v2,lowbatt = extractElement(10,"WS","133923", rss, "N/A")
if (tonumber(v1)==nil) then
luup.variable_set("urn:micasaverde-com:serviceId:EnergyMetering1", "KWH", v1 ,tempID)
else
luup.variable_set("urn:micasaverde-com:serviceId:EnergyMetering1", "KWH", v1/10 ,tempID)
end
if (tonumber(v2)==nil) then
luup.variable_set("urn:micasaverde-com:serviceId:EnergyMetering1", "Watts", v2 ,tempID)
  else
luup.variable_set("urn:micasaverde-com:serviceId:EnergyMetering1", "Watts", v2*100 ,tempID)
end
 luup.variable_set("urn:micasaverde-com:serviceId:HaDevice1", "BatteryLevel", setBatteryLevel(lowbatt) ,tempID)
 luup.variable_set("urn:micasaverde-com:serviceId:SecuritySensor1", "LastTrip", gmt ,tempID)

Vous devez modifier dans les 2 premières lignes :

tempID = l’id de la sonde virtuelle de consommation électrique que nous avons créé dans l’étape 2
les paramètres de la fonction extractElement : 10 correspond au type, “WS” au paramètre pro et “133923” au paramètre id que nous avons récupéré dans l’étape 3

Il faut donc copier pour chacune de vos sondes le bout de code correspondant en ayant pris soins de changer chacun des paramètres.

Un fois tout assemble vous devrez donc avoir un code luup comme celui ci :

-- fonction utilisée pour parcourir le xml et récupérer les valeurs
local function extractElement(type, pro, id, xml, default)
local gmt,v1,v2,v3
local pattern = "<ev type=""..type.."" pro=""..pro.."" id=""..id.."" gmt="(%d+)" v1="([+-]?%d+)" v2="([+-]?%d+)" lowbatt="(%d+)"/>"
gmt, v1, v2, v3 = xml:match(pattern)
if (gmt == nil) then
gmt, v1, v2, v3 = 0, default, default, default
end
return gmt, v1, v2, v3
end
-- fonction utiliser pour aleter en cas de batterie faible
local function setBatteryLevel(lowbat)
if (lowbat == 1 or lowbat == "1") then
return 0
else
return 100
end
end

-- création des paramètres
local url = "http://IP_ZIBASE/sensors.xml"
local gmt, v1,v2
local status, rss = luup.inet.wget(url, 10)
local tempID,humiID
if (status == 0) then

-- Autant de fois que de sonde de température seul
tempID = 24
gmt, v1,v2,lowbatt = extractElement(7,"OS","439193872", rss, "N/A")
if (tonumber(v1)==nil) then
luup.variable_set("urn:upnp-org:serviceId:TemperatureSensor1", "CurrentTemperature", v1 , tempID)
else
luup.variable_set("urn:upnp-org:serviceId:TemperatureSensor1", "CurrentTemperature", v1/10 , tempID)
end

luup.variable_set("urn:micasaverde-com:serviceId:HaDevice1", "BatteryLevel", setBatteryLevel(lowbatt) ,tempID)
luup.variable_set("urn:micasaverde-com:serviceId:SecuritySensor1", "LastTrip", gmt ,tempID)

-- Autant de fois que de sonde de température avec humidité
tempID = 11
humiID = 14
gmt, v1,v2,lowbatt = extractElement(7,"OS","439193872", rss, "N/A")
if (tonumber(v1)==nil) then
luup.variable_set("urn:upnp-org:serviceId:TemperatureSensor1", "CurrentTemperature", v1 ,tempID)
else
luup.variable_set("urn:upnp-org:serviceId:TemperatureSensor1", "CurrentTemperature", v1/10 ,tempID)
end
luup.variable_set("urn:micasaverde-com:serviceId:HumiditySensor1", "CurrentLevel", v2 ,humiID)
luup.variable_set("urn:micasaverde-com:serviceId:HaDevice1", "BatteryLevel", setBatteryLevel(lowbatt) ,humiID)
luup.variable_set("urn:micasaverde-com:serviceId:SecuritySensor1", "LastTrip", gmt ,humiID)
luup.variable_set("urn:micasaverde-com:serviceId:HaDevice1", "BatteryLevel", setBatteryLevel(lowbatt) ,tempID)
luup.variable_set("urn:micasaverde-com:serviceId:SecuritySensor1", "LastTrip", gmt ,tempID)

-- Autant de fois que de sonde de consommation électrique
tempID = 11
gmt, v1,v2,lowbatt = extractElement(10,"WS","133923", rss, "N/A")
if (tonumber(v1)==nil) then
luup.variable_set("urn:micasaverde-com:serviceId:EnergyMetering1", "KWH", v1 ,tempID)
else
luup.variable_set("urn:micasaverde-com:serviceId:EnergyMetering1", "KWH", v1/10 ,tempID)
end
if (tonumber(v2)==nil) then
luup.variable_set("urn:micasaverde-com:serviceId:EnergyMetering1", "Watts", v2 ,tempID)
else
luup.variable_set("urn:micasaverde-com:serviceId:EnergyMetering1", "Watts", v2*100 ,tempID)
end
luup.variable_set("urn:micasaverde-com:serviceId:HaDevice1", "BatteryLevel", setBatteryLevel(lowbatt) ,tempID)
luup.variable_set("urn:micasaverde-com:serviceId:SecuritySensor1", "LastTrip", gmt ,tempID)
end

Afin de s’assurer que le code fonctionne correctement vous pouvez le tester dans l’onglet APPS / Develop apps / Test luup code :

Si tout est bon, vous devriez voir maintenant la valeur de vos capteurs dans vos sondes virtuelles :

Enregistrez votre code luup dans votre scène et sauvegarder la scène.

[Remarque importante sur un bug dans l’interface de la Vera]

Quand vous éditer votre code luup situé dans votre scène, vérifier toujours la ligne qui se trouve dans la première fonction :


local pattern = "<ev type=""..type.."" pro=""..pro.."" id=""..id.."" gmt="(%d+)" v1="([+-]?%d+)" v2="([+-]?%d+)" lowbatt="(%d+)"/>"

En effet, un bug transforme la dernière partie  

"/>"

 en

"></ev>"

ce qui a pour effet de ne plus faire marcher le scripte. il faut donc remettre cette ligne avant d’enregistrer la scène.

5) Configurer la fréquence de rafraichissement :

Maintenant que vous avez une scène qui permet de mettre à jour la température de vos sondes virtuelles sur la base du fichier sensor.xml de la Zibase, il n’y a plus qu’a choisir la périodicité de ce traitement.

Les températures étants des données à variation lente j’ai opté pour une mise à jour toutes les 10 minutes. Pour cela, éditer votre scène en allant dans l’onglet Schedules et positionner un timer :

Vous pouvez maintenant profiter de vos sondes de températures depuis votre Vera, et les utiliser par exemple pour gérer la commande de vos radiateurs.

This post is also available in: French