Collecter les données Netatmo depuis une Vera

Je vous propose aujourd’hui de mettre en place une collecte directe et dynamique des données météo de votre station Netatmo, et cela sans aucun script php mais uniquement avec un script Lua dans une scène et un plugin VContainer. Cela fait plusieurs mois que je dois mettre au point un plugin de cette fonctionnalité, mais le temps me manque cruellement en ces temps. Bonne lecture et bonne mise en place.

Pré-requis

Nous aurons besoins pour ce tutoriel des éléments suivants :

  • Une Station Netatmo installée (ou un accès partagé ;
  • Déclarer une application sur dev.netatmo.com ;
  • Une Vera ;
  • Le plugin VContainer installé sur la Vera (2 containers x 5 valeurs pour 7 données) ;
  • La librairie JSON ;
  • Déclarer une application sur dev.netatmo.com.

La librairie Json.lua

Nous allons d’abord vérifier si nous disposons de la librairie « Json.lua » dans « /usr/lib/lua ». Pour cela, nous nous connecterons en mode console (avec Putty par exemple) à la Vera en utilisant le compte « root » et le mot de passe stipulé sur l’étiquette de votre Vera.

Allons dans le répertoire « lua » en saisissant le commande « cd /usr/lib/lua » et vérifions la présence du fichier en frappant « ls« .

Si nous avons le fichier l’affaire et terminée, si non il faudra la télécharger avec la commande suivante : « wget http://domotique-info.fr/wp-content/uploads/2013/05/json.lua_.txt -O json.lua ».

Pour ceux mal habile avec la console, vous pouvez installer le plugin « Google Calendar » pour forcer l’installation de la librairie Json.lua.

Déclarer une interface applicative Netatmo (API)

Dans un premier temps, il faut déclarer une application sur le portail dev.netatmo.com:

  • Soit vous êtes propriétaire de la station et donc vous disposez d’un compte d’accès utilisé lors de la configuration de votre station avec lequel vous pouvez déclarer votre application.
  • Soit vous demandez à une de vos connaissances disposant d’une station de partager l’accès en autorisant un compte, et en lui demandant de déclarer une application pour vous.

La vidéo Youtube suivante vous accompagne dans cet démarche de déclaration :  (http://www.youtube.com/watch?v=U7lB2oihYvE) .

Une fois l’application déclarée, les éléments d’authentification « client_id » et « client_secret » seront utiles à compléter le script Lua en lieux et places des « XXXXXXXXXXXXXXXXXXXX«  de la section ci-dessous.

Le plugin « Variable Container »

Allez dans l’onglet [APPS] & [Install APPS] de votre Vera (Désolé ma Vera est en anglais), puis installez le plugin « Variable Container ».

myapps020sj-netatmo-00-dashbvc

Créez le premier container et notez l’ID (#34 dans mon cas) , donnez lui un nom puis affecté le à une pièce.

myapps030

Créez un deuxième container depuis le plugin (APPS) puis notez le deuxième ID (Veuillez réspecter la relation ID et la zone intérieure ou extérieure).

myapps040

Le code Lua de votre scène  (LUUP)

Maintenant, il faut créer votre scène avec un déclencheur (pour ma part, toutes les 5 minutes).

sj-netatmo-00-scene

myapps050

Une fois votre script ci-dessous à jour des informations, stockez le dans une scène (Onglet LUUP).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
------------------------------------------------------------------------
-- NAME: netatmo-vera.lua
-- AUTHOR: Sébastien Joly
-- DATE  : 29/01/2013
-- COMMENT: Collecter les données d'une station Netatmo
------------------------------------------------------------------------
-- MODIFIER LES ELEMENTS D'AUTHENTIFICATION PAR VOS DONNEES
------------------------------------------------------------------------
local s_client_id = "XXXXXXXXXXXXXXXXXXXX"
local s_client_secret = "XXXXXXXXXXXXXXXXXXXX"
local s_username = "XXXXXXXXXXXXXXXXXXXX"
local s_password = "XXXXXXXXXXXXXXXXXXXX"
------------------------------------------------------------------------
local request_body = "grant_type=password&client_id=" .. s_client_id .."&client_secret=" .. s_client_secret .. "&username=" .. s_username .. "&password=" .. s_password
------------------------------------------------------------------------
-- LIBRAIRIES
------------------------------------------------------------------------
require 'ltn12'
require 'socket.http'
json = require("json")-- PAS NATIF SUR LA VERA
------------------------------------------------------------------------
-- FONCTION HTTP POST
------------------------------------------------------------------------
function posthttp(p_url,p_body)
local response_body = { }
local res, code, response_headers = socket.http.request
{
  url = p_url;
  method = "POST";
  headers =
  {
    ["Content-Type"] = "application/x-www-form-urlencoded";
    ["Content-Length"] = #p_body;
  };
  source = ltn12.source.string(p_body);
  sink = ltn12.sink.table(response_body);
}
return json.decode(table.concat(response_body),true)
end
------------------------------------------------------------------------
-- PROCEDURE
------------------------------------------------------------------------
reponsepost = posthttp("https://api.netatmo.net/oauth2/token",request_body)
access_token = reponsepost.access_token
reponsepost = posthttp("https://api.netatmo.net/api/devicelist","access_token=" .. access_token)
module_interne = reponsepost.body.devices[1]._id
module_externe = reponsepost.body.modules[1]._id
reponsepost = posthttp("https://api.netatmo.net/api/getmeasure","access_token=" ..access_token .."&device_id=" .. module_interne .. "&scale=max&type=Temperature,CO2,Humidity,Pressure,Noise&date_end=last")
luup.log ("---------------")
temperature_interieure =reponsepost.body[1].value[1][1]
co2 =reponsepost.body[1].value[1][2]
humidite_interne =reponsepost.body[1].value[1][3]
pression =reponsepost.body[1].value[1][4]
bruit =reponsepost.body[1].value[1][5]
luup.log(temperature_interieure)
luup.log (co2)
luup.log (humidite_interne)
luup.log (pression)
luup.log (bruit)
reponsepost = posthttp("https://api.netatmo.net/api/getmeasure","access_token=" ..access_token .."&device_id=" .. module_interne .. "&module_id=" .. module_externe .. "&scale=max&type=Temperature,Humidity&date_end=last")
temperature_externe =reponsepost.body[1].value[1][1]
humidite_externe =reponsepost.body[1].value[1][2]
luup.log(temperature_externe)
luup.log (humidite_externe)
luup.log ("---------------")
------------------------------------------------------------------------
-- CHARGEMENT DES VARIABLES LOCALES DANS LES DEUX VCONTAINER
------------------------------------------------------------------------
local SID_Vc = "urn:upnp-org:serviceId:VContainer1"
local ID_modint = 34 -- pour ma vera Module intérieur VC ID #34
local ID_modext = 35 -- pour ma vera Module extérieur VC ID #35
local currentTime = os.date("%X")
-- currentTime
      luup.variable_set(SID_Vc, "VariableName3","Heure", ID_modext)
         luup.variable_set(SID_Vc, "Variable3", os.date("%X"), ID_modext)
-- temperature exterieure
      luup.variable_set(SID_Vc, "VariableName1","Température", ID_modext)
         luup.variable_set(SID_Vc, "Variable1", temperature_externe, ID_modext)
-- humidite exterieure
      luup.variable_set(SID_Vc, "VariableName2","Humidité", ID_modext)
         luup.variable_set(SID_Vc, "Variable2", humidite_externe, ID_modext)
-- temperature interieure
        luup.variable_set(SID_Vc, "VariableName1","Température °C", ID_modint)
           luup.variable_set(SID_Vc, "Variable1", temperature_interieure, ID_modint)
-- Humidite interieure
      luup.variable_set(SID_Vc, "VariableName2","Humidité %", ID_modint)
         luup.variable_set(SID_Vc, "Variable2", humidite_interne, ID_modint) 
-- Pression
      luup.variable_set(SID_Vc, "VariableName3","Pression Hpa", ID_modint)
         luup.variable_set(SID_Vc, "Variable3", pression , ID_modint) 
-- CO²
      luup.variable_set(SID_Vc, "VariableName4","CO2 PPM", ID_modint)
         luup.variable_set(SID_Vc, "Variable4", co2, ID_modint) 
-- Bruit
      luup.variable_set(SID_Vc, "VariableName5","Bruit db", ID_modint)
         luup.variable_set(SID_Vc, "Variable5", bruit, ID_modint) 
------------------------------------------------------------------------
-- FIN
------------------------------------------------------------------------

Résultat

sj-netatmo-00-rslt

Apres avoir réalisé ce « pull » d’informations, Il serait intéressant de mettre en place un « push » vers un container permettant l’historisation de ces données. Pour certains, les informations devraient-être externalisées vers des services web tiers, et pour d’autres vers une base de données (MySQL). Un futur article ?

Author: Sébastien Joly

Passionné de plongée, de voile croisière, de navigation, d'océans, de géomatique, de domotique, d'informatique ... des tictictics, je suis technophile un point c'est tout. Je m'intéresse à la domotique depuis plusieurs années mais je me suis lancé fin 2012 seulement. [ Accéder à mes articles ] [ Mon installation domotique ]

Share This Post On

4 Comments

  1. Super script je ne connaissais pas le plugin variable contener, cela semble un moyen pratique pour éviter de créer son propre plugin mais pour pouvoir stocker des variables de façon élégante

  2. Effectivement, le plugin Variable Container répond au besoin de stockage temporaire et dynamique. Un prochain article nous offrira peut-être une alternative de stockage et d’historisation.

  3. Pour l’historisation, j’utilise le plugin dataMine qui permet de suivre chaque variable sélectionnée de la Vera et d’en faire des graphiques

    @+

  4. Je viens d’avoir ma station, et j’ai mis en place ce script pour récupérer les infos sur ma Vera.
    Fonctionne du premier coup.
    Excellentissime. :)

    Merci.

Laisser un commentaire