Aller au contenu

Station météo Netatmo


jimbo007be

Messages recommandés

  • 2 semaines après...

Bonjour,

 

J'ai l'impression d'être le seul à  ne pas savoir se connecter correctement sur la Netatmo à  partir du HC2. Est-ce qu'une bonne âme charitable voudrait bien m'aider afin que je puisse dormir un jour à  nouveau ?

 

J'ai utilisé le script de Cédric Locqueneux concernant la mise en place d'un fichier script netatmo.php sur un serveur... (avec les différentes données, username, password, id, secret).

 

Dans ce script, il est mentionné le fait que si on interroge l'adresse : http://www.xxxxx.xxx/script/netatmo.php?intext=int, on doit obtenir une suite d'information type : 

 

{"status":"ok","body":[{"beg_time":1399902868,"value":[[19.5,455,56]]}],"time_exec":0.011034965515137,"time_server":1399903486}

 

ce qui semble être mon cas, uniquement lorsque je change le https par http dans ledit script. Dans le cas ou je garde à  l'identique le script, j'obtiens une erreur du type :

 

Warning: file_get_contents(https://api.netatmo.net/oauth2/token) [ function.file-get-contents]: failed to open stream: Invalid argument.

 

Je précise une chose, si j'utilise le lien de Pascal Stephany de www.domotique-info.fr, cela semble fonctionner correctement (à  part évidemment que j'ai ses valeurs au lieu des miennes).

 

J'ai tenté d'utiliser le code de Krikroff dans un module virtuel en ayant préalablement créer les étiquettes qui vont bien et il semble que j'ai le même type d'erreur, c'est à  dire :

 

[DEBUG] 09:46:36: Récupération des données interieurs: false
[DEBUG] 09:46:36: err: [string "while true do..."]:87: Expected value but found invalid token at character 1
[DEBUG] 09:46:36: Récupération des données extérieurs : false
[DEBUG] 09:46:36: err: [string "while true do..."]:43: Expected value but found invalid token at character 1

 

 

Donc voici mes questions :

 

1) Doit-on utiliser https ou http ?

2) Dans le cas de https, à  Part le fichier netatmo.php, doit-on copier d'autres fichiers sur le serveur, type SDK ?

​3) Y a t-il quelques choses à  faire par rapport à  "Scope" ?

4) Heu? Pourquoi cela ne fonctionne pas ?

 

​Merci pour votre aide.

 

Bonne journée.

 

Arnaud

 

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

Merci pour cette précision, mais il n'y a pas de rapport avec la capacité ou non de la HC2 à  gérer les Https.

 

Un script, dumoins plusieurs sont actuellement ici ou sur d'autres forums. Lorsque j'utilise le module virtuel de Krikroff avec le domaine de Pascal Stephany. cela fonctionne correctement. Je pense qu'il y a une petite chose à  faire sur le serveur qui détient le script, mais je ne sais pas quoi exactement.

 

Merci.

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

Je me réponds à  moi-même au cas ou d'autres personnes seraient dans le même cas.

 

Les différents scripts que l'on peut retrouver pour faire fonctionner le retour d'information de la Netatmo sur la HC2 ne fonctionne pas dans mon cas sans que je ne change les lignes d'accès à  l'API par http au lieu de https.

 

(cela dit dans la création de mon compte sur le site de Netatmo, les informations de connexion montraient 'http').

 

J'ai donc fait les changements, mais malgré cela, j'avais toujours un problème d'interprétation du Json via le module virtuel.

 

Après différents essai, j'ai remarqué que malgré que fichier généré par l'appel de la page PHP était identique à  un autre fichier fonctionnant (depuis le site de Pascal Stéphany) celui-ci n'était pas interpréter de la même façon. J'ai changé le code d'enregistrement de mon fichier script PHP en ISO-8859-1 au lieu de Utf-8 et maintenant cela fonctionne bien pour les différents devices et modules (5 au total).

 

:60:  je vais enfin pouvoir dormir...

 

 

Bonne journée.

Lien vers le commentaire
Partager sur d’autres sites

  • 4 semaines après...
  • 2 semaines après...

Bonjour,

 

Je suis encore nouveau, donc soyez indulgent.  :13:

J'ai à  peine déballé mon nouveau HC2 est installé quelques modules, que j'ai voulu y ajouter mon netatmo

 

Autant cela marche sur une vera-lite, autant ici je n'y arrive pas, malgré les tutoriels.

 

J'ai le script hébergé en local, que je peux appeler donc mon navigateur et qui le retourne les infos

J'ai créé un device virtuel (comme expliqué dans le tuto) inséré :

 

FHTE = Net.FHttp(« www.domotique-info.fr »)
response = FHTE:GET(« 192.168.1.1/fibaro/scripts/netatmo.php »)
– decoding json string to table 
result = json.decode(response)
fibaro:setGlobal(« NetTempExt », result.body[1].value[1][1]);
fibaro:setGlobal(« NetHumExt », result.body[1].value[1][2]);
fibaro:log(fibaro:getGlobalValue(« NetTempExt »).. » °C « ..fibaro:getGlobalValue(« NetHumExt »).. » % « )

 

Dans le debug, j'ai toujours la même erreur : 

[ERROR] 14:50:41: line 1: unexpected symbol near '�'

 
Je précise que je n'y connais rien en programmation ...
 
Merci à  vous
Lien vers le commentaire
Partager sur d’autres sites

Tu peux essayer en mettant l'adresse IP pour accéder àton script dans le Net.FHttp et juste le chemin dans le GET ;)

Envoyé de mon iPhone àl'aide de Tapatalk

Lien vers le commentaire
Partager sur d’autres sites

Merci pour la réponse (je me sens très très nul)

J'ai progressé (quand j'ai eu le temps) mais je suis toujours bloqué :

 

1 FHTE = Net.FHttp("192.168.1.1")
2 response = FHTE:GET("fibaro/scripts/netatmo.php")
3 -- decoding json string to table 
4  result = json.decode(response)
5 fibaro:setGlobal(" NetTempExt ", result.body[1].value[1][1]);
6 fibaro:setGlobal(" NetHumExt ", result.body[1].value[1][2]);
7 fibaro:log(fibaro:getGlobalValue(" NetTempExt ").. " °C " ..fibaro:getGlobalValue(" NetHumExt ").. " % " )
 
[ERROR] 12:47:01: line 4: Expected value but found invalid token at character 1
 
Merci
Lien vers le commentaire
Partager sur d’autres sites

Je suis mauvais, j'ai l'impression d'avancer ligne par ligne  :13:

 

Bon, cela va mieux avec le "/" puisque le module affiche "C° %" mais pas la réponse générée par le fichier php

 

Pourtant, en local, j'ai 

{"status":"ok","body":[{"beg_time":1404155542,"value":[[29.7,61]]}],"time_exec":0.011050939559937,"time_server":1404155611}

 

​J'aurais jamais du faire le droit....

Lien vers le commentaire
Partager sur d’autres sites

Bon, ça avance c' est déjà  ça ;)

 

Tu peux faire un debug juste après la ligne 4 avec ça pour voir

fibaro:debug("temperature_interieure" .. result.body[1].value[1][1] or "n.c");

et aussi ... FHTE:GET("/netatmo/netatmo.php?intext=int") pour la station intérieur

Lien vers le commentaire
Partager sur d’autres sites

Bon ok, çà  marche  :60:

 

Et moi qui suit débutant en programmation Lua, j'ai découvert que

 

fibaro:setGlobal('NetTempExt', result.body[1].value[1][1]);


fibaro:setGlobal("NetTempExt", result.body[1].value[1][1]);


fibaro:setGlobal(' NetTempExt ', result.body[1].value[1][1]);


fibaro:setGlobal(" NetHumExt ", result.body[1].value[1][2]);

c'est la même chose, soit ' ou " avec ou sans espace

 

Par contre

fibaro:log(fibaro:getGlobalValue('_NetTempExt_').. " °C " ..fibaro:getGlobalValue("NetHumExt").. " % " )




soit un espace entre le ' et la variable.... ca marche pas

 

Je vais continuer à  tester la HC2 en faisant les tutoriels du site car cela m'a fait progresser et découvrir ce qui marche et ne marche pas

 

Merci pour les coups de pouces et les encouragements

 

PS : Je vais peut-être attendre la V4 et le module d'intégration du Netatmo, car :

- oui cela marche, je récupère TempEtx et Humext

- mais j'ai 2 "sites" avec des Netatmo dont un (mon petit coin de paradis où j'ai 4 modules intérieurs 

Je ne sais pas trop comment les interroger et je suppose qu'il faut d'abord modifier le fichier php

Lien vers le commentaire
Partager sur d’autres sites

  • 3 semaines après...

Salut tout le monde,

 

j'ai fais l'acquisition de la station récemment et j'ai trouvé le moyen de contourné le problème du HTTPS, à  l'aide d'un reverse proxy.

 

http -> api.netatmo.mondomaine.com => [Reverse Proxy] => https -> api.netatmo.net

 

Notre cher box accède en HTTP sur api.netatmo.mondomaine.com et obtiens donc l'API Netatmo

 

Avantages :

Evite d'avoir un serveur Web qui héberge le script

Peut servir pour d'autre service (api) inaccessible en http mais uniquement en https

 

Inconvénients :

Mettre en place un reverse Proxy

Reverse proxy toujours allumé (tout comme le serveur web pour le script php)

 

C'est pas des plus simple, mais ça permet églement de faire passé d'autre appli.

Exemple sur mon syno

http://photo.mondomaine.com => https://localhost/photo

https://synology.mondomaine.com => https://localhost:5001

http://fibaro.mondomaine.com => http://10.10.10.32 (ip de la box fibaro)

...

 

Perso je n'utilise pas HA Proxy, mais il y a un très bon tuto de Lazer sur ce dernier pour bien comprendre le principe d'un reverse proxy et le mettre en place sur un Syno.

 

Il reste plus qu'a faire un virtual device qui communique avec l'api :)

Lien vers le commentaire
Partager sur d’autres sites

Oui, ça fonctionne, le problème c'est la method post j'arrive pas encore a générer l'authentification. J'ai une erreur de requête. Je n'arrive pas a positionner l'enchainement des parametres (client id, client secret... ) et je vais peut être avoir un problème avec le header :s

Lien vers le commentaire
Partager sur d’autres sites

Pour le header tu vas devoir utiliser le socket TCP et pas Net.FHttp et puis l' API Netatmo renvoi il me semble un json mal-formé avec régulièrement des espaces en début de chaîne et ça fait planter la lib json du HC2... que du bonheur :) 

Lien vers le commentaire
Partager sur d’autres sites

Oui c'est bien du LUA ;) tu peux jeter un œil àmon framework LUA pour cela. Je l'utilise dans mes devices SONOS et Freebox entre autres ....

Envoyé de mon iPhone àl'aide de Tapatalk

Lien vers le commentaire
Partager sur d’autres sites

Merci Krikroff nikel joli boulot avec le Framework ! 

 

Il y a un truc qui coince c'est comment formater mes data : 

 

  
  local payload = [[
  {
    "grant_type"="password",
  "client_id"="zzzzzz",
    "client_secret"="zzzzz",
    "username"="zz@zzzz",
    "password"="zzzz"
  }
]];
 
J'ai essayé avec sans crochet, sans les guillements, avec des simples quotes... rien n'y fait
Lien vers le commentaire
Partager sur d’autres sites

Tu peux essayer comme cela...

local payload = [[{
  "grant_type"="password",
  "client_id"="zzzzzz",
  "client_secret"="zzzzz",
  "username"="zz@zzzz",
  "password"="zzzz"
}]];
Sinon, le debug donne quoi ?
Lien vers le commentaire
Partager sur d’autres sites

Merci pour ta réponse, je viens d'essayer ça ne fonctionne pas :s.

 

Voici ce que cela donne niveau débug : 

[DEBUG] 17:31:50: -------------------------------------------------------------------------
[DEBUG] 17:31:50: -- HC2 Toolkit Framework version 1.0.4
[DEBUG] 17:31:50: -- Current interpreter version is Lua 5.1
[DEBUG] 17:31:50: -- Total memory in use by Lua: 87.53 Kbytes
[DEBUG] 17:31:50: -------------------------------------------------------------------------
[DEBUG] 17:31:50: Toolkit.Net loaded in memory...
[DEBUG] 17:31:50: Toolkit.Debug loaded in memory...
[DEBUG] 17:31:50: Benchmark [Toolkit.Debug lib]: elapsed time: 0.000 cpu secs
[DEBUG] 17:31:50: Toolkit.Collections.Queue loaded in memory...
[DEBUG] 17:31:50: Benchmark [Toolkit.Collections.Queue lib]: elapsed time: 0.000 cpu secs
[DEBUG] 17:31:50: status: 400
[DEBUG] 17:31:50: reponse: {"error":"invalid_request"}

Ci-dessous le code que j'ai "constituer" basé sur le périphérique de la Freebox.

function requestAuthorization()
  
local payload = [[{
"grant_type"="password",
"client_id"="xxxx",
"client_secret"="xxxxx",
"username"="xxxx@xxxx",
"password"="xxxxxx"
}]];

  --Toolkit.Net.isTraceEnabled = true;
  local HttpClient = Toolkit.Net.HttpRequest(NetatmoObject._host, 80);
  HttpClient:setReadTimeout(1000);
  local response, status, errorCode = HttpClient:request("POST","/oauth2/token", {"Content-Type: application/x-www-form-urlencoded"}, payload);
  HttpClient:disconnect();
  HttpClient:dispose();
  HttpClient = nil;
  --Toolkit.Net.isTraceEnabled = false;
  
  -- check for error
  if errorCode == 0 then
    if tonumber(status) == 200 then
      local jsonTable = json.decode(response);
      if (jsonTable.success == true ) then
        Tk:trace("Authentification OK");
      	NetatmoObject._accessToken = jsonTable.result.app_token;
        NetatmoObject._refreshToken = jsonTable.result.track_id;
        fibaro:setGlobal("netatmo_accessToken", NetatmoObject._accessToken);
        fibaro:setGlobal("netatmo_refreshToken", NetatmoObject._refreshToken);            
        local n = 0;
        while(tostring(NetatmoObject._accessToken) == "") do
          fibaro:sleep(1000);
          if n > 10 then break end
          n = n + 1;
        end
      else
        Tk:trace("1.1 - Request authorization failled");
      end
    else
      Tk:trace("status: "..status);
      Tk:trace("reponse: "..response);
    end
  else
    Tk:trace("Communication error");
  end
end

requestAuthorization();
Lien vers le commentaire
Partager sur d’autres sites

Je pense que tu peux enlever la lib

Toolkit.Collections.Queue

de ton script si tu ne compte pas l' utiliser ;) et ainsi gagner de la place.

 

Pour revenir au problème c'est effectivement étrange et à  première vue je ne vois la raison de ce Bad Request! Tu peux essayer d'activer les traces en de commentant la ligne et en passant isTraceEnabled sur True

Toolkit.Net.isTraceEnabled = true;

Sinon comment répond ton proxy en direct ? Est-ce qu'il y a une redirection à  un quelconque moment ?

Lien vers le commentaire
Partager sur d’autres sites

Je viens d'activer les traces, les voici : 

[DEBUG] 21:08:48: -------------------------------------------------------------------------
[DEBUG] 21:08:48: -- HC2 Toolkit Framework version 1.0.4
[DEBUG] 21:08:48: -- Current interpreter version is Lua 5.1
[DEBUG] 21:08:48: -- Total memory in use by Lua: 81.07 Kbytes
[DEBUG] 21:08:48: -------------------------------------------------------------------------
[DEBUG] 21:08:48: Toolkit.Net loaded in memory...
[DEBUG] 21:08:48: Toolkit.Debug loaded in memory...
[DEBUG] 21:08:48: Benchmark [Toolkit.Debug lib]: elapsed time: 0.000 cpu secs
[DEBUG] 21:08:48: Toolkit.Net.HttpRequest > Total memory in use by Lua: 83.08 Kbytes
[DEBUG] 21:08:48: Toolkit.Net.HttpRequest > Create Session on port: 80, host: api.netatmo.mondomaine.com
[DEBUG] 21:08:48: Toolkit.Net.HttpRequest::setReadTimeout > Timeout set to 1000 ms
[DEBUG] 21:08:48: Toolkit.Net.HttpRequest::request > /oauth2/token with method POST
[DEBUG] 21:08:48: Toolkit.Net.HttpRequest::request > Add header [POST /oauth2/token HTTP/1.1]
[DEBUG] 21:08:48: Toolkit.Net.HttpRequest::request > Add header [Host: api.netatmo.mondomaine.com:80]
[DEBUG] 21:08:48: Toolkit.Net.HttpRequest::request > Add header [Content-Type: application/x-www-form-urlencoded]
[DEBUG] 21:08:48: Toolkit.Net.HttpRequest::request > Add header [Content-Length: 195]
[DEBUG] 21:08:48: Toolkit.Net.HttpRequest::request > Body length is 195
[DEBUG] 21:08:48: Toolkit.Net.HttpRequest::receive > Length of result: 247
[DEBUG] 21:08:48: Toolkit.Net.HttpRequest::receive > Status 400
[DEBUG] 21:08:48: Toolkit.Net.HttpRequest::receive > Length of headers reponse 219
[DEBUG] 21:08:48: Toolkit.Net.HttpRequest::disconnect > Connected: false
[DEBUG] 21:08:48: Toolkit.Net.HttpRequest::dispose > Successfully disposed
[DEBUG] 21:08:48: Toolkit.Net.HttpRequest::dispose > Total memory in use by Lua: 85.59 Kbytes
[DEBUG] 21:08:48: status: 400
[DEBUG] 21:08:48: reponse: {"error":"invalid_request"}

Niveau de mon Proxy pour moi c'est transparent, ce qui me fait pensé cela : 

- Si je remplace dans le script php le https://api.netatmo.net par http://api.netatmo.mondomaine.com cela fonctionne.

- Si je teste avec un plugin firefox qui permet de faire appel a une method post cela fonctionne.

- Depuis mon navigateur le code source de la page est identique.

 

Ce qui me fait dire qu'il y a un problème dans mes datas c'est quand j'ai tester depuis le plugin Firefox tant que j'avais pas trouvé la bonne syntax in m'indiquer une invalid request.

dans le plugin je le fourni comme cela : grant_type=password&client_id=xxxxxxxxx&client_secret=xxxxx&username=xxx@xxx&password=xxxx (comme avec un curl).

Lien vers le commentaire
Partager sur d’autres sites

Oui ce n'est pas une enveloppe json donc, tu peux essayer un truc comme cela:

local payload = [[
grant_type=password&client_id=xxxxxxxxx&client_secret=xxxxx&username=xxx@xxx&password=xxxx
]];
Lien vers le commentaire
Partager sur d’autres sites

×
×
  • Créer...