Review
Nous vous avions parlé brièvement de Pachube il y a quelques temps, lors du rachat par LogMeIn. Pachube est un service qui permet de stocker des données statistiques et d’en faire une représentation graphique facilement. Un service intéressant, mais qui à ce moment là était payant (une version gratuite existait, mais limitée à 4 flux de données et un historique sur 30 jours seulement, ce qui était bien trop limité pour un suivi de sa consommation électrique par exemple).
Bonne nouvelle: depuis quelques jours, Pachube est totalement gratuit ! Plus de limitation des flux, plus de limitation de l’historique.
Et qu’est ce qu’il manque justement à la Vera ? Une représentation graphique des données ! Pachube disposant d’une API très complète, et la Vera étant capable d’interpréter des scripts, il n’était pas très difficile d’exploiter cette possibilité.
Je vous explique donc aujourd’hui comment réaliser cela.
I. Pré requis
Il faudra tout d’abord créer un compte sur le site Pachube. Une fois créé, vous aurez accès à une clé pour utiliser l’API:
Notez bien cette clé, elle sera réutilisée plus tard sur la Vera.
Ensuite, créez un feed, qui contiendra les données que vous souhaitez:
Ici, j’ai donc créé un feed dédié à la Vera. Tout en bas de l’écran, on peut ensuite définir les datastream qui correspondront à chaque donnée stockée:
Le fee peut être public si vous souhaitez le partager avec n’importe qui, ou bien privé.
Voilà. Du côté de Pachube, nous avons tout ce dont nous avons besoin.
II. Du côté de la Vera
Il ne reste plus qu’à configurer la Vera pour qu’elle envoie automatiquement les données à Pachube. L’API est un peu complexe, et pour faciliter son utilisation il vaut mieux créer une fonction sur la Vera qu’on appellera quand on le souhaite.
Pour cela, nous allons donc dans la partie MiOS Developpers, onglet « Edit startup Lua » pour y copier le code de notre fonction. Ce code sera lancé automatiquement à chaque démarrage de la Vera, rendant cette fonction disponible n’importe quand:
Le code en question:
function my_send_pachube (feed, datastream, value)
local apikey = "VOTRE_CLE_API_PACHUBE"
local base_url = "http://api.pachube.com/v2/feeds/"
local method = "PUT"
require('ltn12')
local socket = require("socket")
local http = require("socket.http")
local json_data = '{ "version":"1.0.0","datastreams":[ {"id":"' .. datastream .. '", "current_value":"' .. value .. '"}]}'
local response_body = {}
local response, status, header = http.request{
method = method,
url = base_url .. feed,
headers = {
["Content-Type"] = "application/json",
["Content-Length"] = string.len(json_data),
["X-PachubeApiKey"] = apikey
},
source = ltn12.source.string(json_data),
sink = ltn12.sink.table(response_body)
}
end
Remplacez bien la clé API par la votre, comme vu plus haut.
Il n’y a plus qu’à créer un scénario pour envoyer les données qu’on souhaite. Par exemple, pour avoir un suivi de la température de mon salon, je crée une scène avec un timer toutes les 10min, et j’appelle la fonction Pachube dans le code Luup, de cette façon:
Le code complet:
local deviceID = 190
local tempsalon = luup.variable_get("urn:upnp-org:serviceId:TemperatureSensor1", "CurrentTemperature", deviceID)
my_send_pachube ("29458", "Temperature_Salon", tempsalon)
return true
Avec la première ligne, on indique le device à exploiter. Il faudra remplacer le « 190″ par l’ID de votre device sur la Vera (visible dans les paramètres avancés du device en question).
La deuxième ligne récupère la valeur du device, ici la température.
Enfin, la troisième ligne exécute la fonction créée précédemment qui se charge d’envoyer l’information à Pachube. On indique simplement le numéro du feed (ici « 29458″, à remplacer par le votre) , le nom du datastream (« Temperature_Salon », à remplacer également par le votre), puis la valeur à envoyer, qui est ici la température récupérée du device.
Les deux autres arguments »urn:upnp-org:serviceId:TemperatureSensor1″ et »CurrentTemperature » seront à adapter si vous voulez récupérer une information autre que la température (je donnerai quelques exemples plus loin).
Après quelques temps de fonctionnement, vous pourrez voir sur votre interface Pachube les données recueillies, représentées sous forme graphique:
Sur la droite on peut sélectionner l’échelle. Sur une semaine, je commence à avoir quelques données représentatives:
En cliquant sur la petite roue, il est possible de personnaliser le graphique et d’obtenir le code pour insérer le graphique où on souhaite:
Pachube propose de nombreuses possibilités au niveau du partage des informations, dont c’est justement le but. Vous pourrez donc facilement afficher un graphique où vous le souhaitez, exploiter les données, etc… Certains vont même jusqu’à récupérer ces statistiques pour les afficher dans une représentation 3D de leur maison, ce qui en fait donc une représentation avec des données « live » :D Il faudra juste étudier un peu les API de Pachube, et donc s’y connaitre un peu en code (juste un peu, hein…)
Nous avons vu l’exemple ici pour le suivi d’une température, mais on peut très bien récupérer toutes les autres informations de la Vera.
Pour l’humidité, voici mon code:
local deviceID = 191
local humsalon = luup.variable_get("urn:micasaverde-com:serviceId:HumiditySensor1", "CurrentLevel", deviceID)
my_send_pachube ("29458", "Humidite_Salon", humsalon)
return true
Il faudra bien veiller à modifier les services associés au device qu’on souhaite exploiter (les « urn:micasaverde-com:serviceId »).
Pour le niveau de luminosité:
local deviceID = 192
local lumsalon = luup.variable_get("urn:micasaverde-com:serviceId:LightSensor1", "CurrentLevel", deviceID)
my_send_pachube ("29458", "Luminosite_Salon", lumsalon)
return true
Et enfin pour la consommation d’électricité:
local deviceID = 110
local consoarmoire = luup.variable_get("urn:micasaverde-com:serviceId:EnergyMetering1", "Watts", deviceID)
my_send_pachube ("29458", "Conso_Armoire", consoarmoire)
return true
On peut représenter de cette façon n’importe quelle donnée: le nombre d’ouvertures de la porte, le nombre de détection de présence, etc… en adaptant simplement le nom du service du device.
J’ai commencé ainsi à me construire mon petit tableau de bord:
Voilà, vous pouvez maintenant créer de beaux graphiques à partir des données de la Vera, ceci assez simplement, sans avoir à installer votre propre serveur générant les graphiques (style rrdtool…) ! Et du coup également garder un historique des informations qui vous semblent importantes (consommation électrique, températures, etc…).
Bien sûr, l’API de Pachube ne s’arrête pas à la Vera, et peut être utilisée avec tout soft supportant des scripts un peu « poussés », comme par exemple Homeseer. Avec la Zibase, pour le moment il faudra oublier à cause de fonctions script pour le moment inexistantes, mais celle ci dispose déjà de représentations graphiques des différentes données, suffisante dans la majorité des cas.
Je remercie au passage Thomas qui nous avait fait part de son code Lua pour l’utilisation avec la Vera.

























Exelent article.
Merci
Merci pour cet article très intéressant
A quand la même chose via la zibase ??
Merci et tu dois lire dans mes pensées car hier soir, je me disais que ça serait sympas de pouvoir faire ça à l’approche de l’hiver.
En 10min chronos grace à ton tuto, j’ai pu avoir un début de graphe. Un grand Merci
Par contre, tu dois avoir une cheminée à proximité du capteur de température!!!
En fait le capteur est assez loin du poêle, mais parfois le poêle s’emballe un peu :p Il fait un peu frais et humide, d’où le feu, mais pas si froid que ca, du coup ca monte vite en température, là dedans :p
Article très intéressant effectivement et sachant que tu utilises aussi Homeseer, pourrions nous également avoir une méthode pour utiliser Pachube avec HS ?
Merci encore pour tous ces articles.
Bonne idée ! Je mets ca dans ma todo liste :D
Bonjour a tous.
Super article comme dab. ;-)
ca marche a merveille.
j’ai juste une question peux tu donner une piste pour afficher sur une même page plusieurs code personnaliser fournie dans l’interface?
merci
C’est assez facile, en fait. Le code qui t’est donné doit être utilisé comme l’adresse d’une image. Je t’ai fait un petit exemple très rapide, que tu peux voir là: http://www.maison-et-domotique.com/download/test_dashboard_pachube.html
En regardant le code source de la page, tu devrais comprendre le fonctionnement sans problème.
Je me rend compte que mon EZmotion 3 en 1 m’affiche finalement la température sans aucune décimale alors que sur la doc, la précision serait de 0,2°F.
Y’a t’il quelque chose à modifier pour avoir une plus grande précision dans la vera?
Merci
Merci pour ce nouveau test.
Moi aussi j’ai des EZMotion 3 en 1, et j’ai le même problème. Je n’arrive pas à avoir une précision inférieure à 1°C, pourtant les capteurs peuvent faire mieux.
Apparemment, les capteurs envoient les info multipliées par 100 et la vera doit diviser ensuite par 100 mais elle n’affiche pas les décimales.
J’ai le même problème avec les températures données par Météo Google, ce sont toujours des nombres entiers.
Quelqu’un sait-il comment remédier à ces problèmes ?
Merci d’avance
super ca marche top.
MERCI ;-)
Salut
Ça semble être un problème de typede variable.
Si vous faites une division, avec des valeurs qui sont des entiers, les chiffres après la virgule passent à la trappe.
Je ne connais pas les scripts de la Vera, mais il doit y avoir un type « float ».
A+
Vincent
Bien moi ça marche plus. pourtant j’ai rien changé.
Je n’arrive plus à envoyer les données vers pachube, sniff
C’est possible d’avoir une mise a jour du code pour UI5 et vera 2, merci
Le code fonctionne en UI5.
Le seul souci que je rencontre est que les données sont envoyées sans préciser date&heure. Du coup, c’est l’heure UTC qui est utilisé, probablement l’heure de réception de la requête côté PACHUBE. Il y a donc un décalage d’une heure en ce moment.
J’ai jeté un oeil très très rapide à l’API, et il faudrait a priori rajouter un « at » dans le JSON avec une valeur de temps qui préciserait la timezone, le problème étant de savoir comment générer le bon format de date/heure en lua…
Finalement, ça semble fonctionner en modifiant simplement la timezone au niveau du compte Pachube.
Ca semblait ne pas fonctionner hier soir, peut-être une histoire de cache à vider…
Finalement, ça semble fonctionner en modifiant simplement la timezone au niveau du compte Pachube.
Ca semblait ne pas fonctionner hier soir, peut-être une histoire de cache à vider…
Bonjour,
Super article…
Un détail m’échappe toutefois : l’urn à spécifier n’est pas le même que dans la config du module, onglet Advanced, dans le champ device_type ?
Je viens de galérer pour mon EZmotion et la température, j’ai fini par mettre urn:upnp-org:serviceId:TemperatureSensor1 alors que sur mon device c’est urn:schemas-micasaverde-com:device:TemperatureSensor:1… Je me suis effectivement basé sur le wiki pour le trouver…
Par contre, du coup, ça se complique pour le niveau des piles, qui remonte pourtant bien sur le device…
Quelle est la règle ?
Encore merci à Cédric et ses nombreux articles !
Super chrifabre ! Ton article m’inspire !
Ce que j’adore avec la domotique, c’est la communauté. Il faut avouer que c’est la jungle pour mettre en oeuvre ces solutions, mais heureusement qu’il y a les retours d’expérience des uns et des autres !
Bonjour Cédric,
Merci pour tes nombreux articles, un plaisir de lire ton site !
J’ai chez moi une petite trentaine de feed à mettre à jour, toutes les minutes pour l’état des devices (consommation électrique, état des chauffages et des lampes, capteurs de sécurité, etc…) et toutes les 5 minutes pour les données météo (température et humidité).
Avec cette première implémentation, j’ai autant de requête http que de feed à mettre à jour soit une petite trentaine de requête http à lancer de ma Vera !
J’ai donc modifié ton code (et adapté avec la récente migration de Pachube vers Cosm.com) de façon à passer un tableau contenant l’ID du feed et sa valeur à la fonction my_send_cosm !
Cette fonction my_send_cosm concatène l’ensemble des valeurs en JSON dans une seule requête pour faire l’update !
Du fait, au lieu de lancer les 30 requêtes toutes les minutes, j’en envoi plus qu’une seule !
Mon code est le suivant :
function my_send_cosm (feed, datas)
require(‘ltn12′)
local apikey = « <> »
local base_url = « http://api.cosm.com/v2/feeds/ »
local json_datas = {}
for i,v in pairs(datas) do
table.insert(json_datas, ‘{« id »: »‘ .. i .. ‘ », « current_value »: »‘ .. v .. ‘ »}’)
end
local json_data_str = ‘{ « version »: »1.0.0″, »datastreams »:[' .. table.concat(json_datas, ',') .. ']}’
local socket = require(« socket »)
local http = require(« socket.http »)
local response_body = {}
local response, status, header = http.request{
method = « PUT »,
url = base_url .. feed,
headers = {
["Content-Type"] = « application/json »,
["Content-Length"] = string.len(json_data_str),
["X-ApiKey"] = apikey
},
source = ltn12.source.string(json_data_str),
sink = ltn12.sink.table(response_body)
}
if status == 200 then
return true
end
end
Exemple d’utilisation :
local datas = {
– EnergyMetering : Watts & KHH
["HomeEnergyMeter"] = luup.variable_get(« urn:micasaverde-com:serviceId:EnergyMetering1″, « Watts », 45),
["HomeEnergyMeter_KWh"] = uup.variable_get(« urn:micasaverde-com:serviceId:EnergyMetering1″, « KWH », 45),
– SwitchPower
["Prise_TV"] = luup.variable_get(« urn:upnp-org:serviceId:SwitchPower1″, « Status », 23),
["Lampe_Bureau"] = luup.variable_get(« urn:upnp-org:serviceId:SwitchPower1″, « Status », 29),
– PilotWire
["Chauffage_Salon"] = luup.variable_get(« urn:antor-fr:serviceId:PilotWire1″, « Status », 32),
– SecuritySensor
["Porte_Terrasse"] = luup.variable_get(« urn:micasaverde-com:serviceId:SecuritySensor1″, « Tripped », 31)
– TemperatureSensor & HumiditySensor
["Temperature_Salon"] = luup.variable_get(« urn:upnp-org:serviceId:TemperatureSensor1″, « CurrentTemperature », 16),
["Humidite_Salon"] = luup.variable_get(« urn:micasaverde-com:serviceId:HumiditySensor1″, « CurrentLevel », 18)
}
return my_send_cosm(« <> », datas)
A bientôt
Pour plus de lisibilité du code, voir la page : http://pastebin.com/mHLzmRDB :)