Nico Posté(e) le 3 mars Signaler Posté(e) le 3 mars Bon, sur HC2 cette fois c'est la fin, je ne sais pas si vous avez eu le mail : Citation Starting May 29, 2024, this behavior will change to comply with the OAuth2 Authorization Framework RFC recommendations (section 10.4) and improve the security of our users' data. When refreshing the tokens, the Access Token and Refresh Token will be different from the previous ones and the old tokens will be invalidated.
Lazer Posté(e) le 3 mars Signaler Posté(e) le 3 mars Oui en effet j'ai aussi reçu le mail cette semaine...
jojo Posté(e) le 3 mars Signaler Posté(e) le 3 mars tu deviens vieux, tu te répètes ... En réalité tu n'es pas super motivé, car quand il faut on trouve le temps 1
Nico Posté(e) le 4 mars Signaler Posté(e) le 4 mars Je me répète en espérant une aide d'un pro pour gagner du temps Et non Jojo, j'aimerai vraiment pouvoir trouver le temps, mais là juste impossible, vraiment impossible tellement j'ai de choses ouvertes... Après ça tourne, donc voilà. 1
Nico Posté(e) le 7 mars Signaler Posté(e) le 7 mars Voui, it is life. Mais je ne me plains pas hein, je constate.
Yorino Posté(e) le 24 juin Signaler Posté(e) le 24 juin Bonjour à tous, Je reviens sur le sujet Netatmo car je sèche complètement avec mes maigres compétences en LUA. Mon besoin : Lire la station météo pour récupérer la valeur d'humidité d'un module externe. J'ai réussi a gérer l'histoire des Token et refresh Token. Ca fonctionne nikel pour mes 2 présences, j'arrive toujours à les actionner malgré la dernère update de securité de NetAtmo. Par contre la station Météo, impossible de comprendre comment écrire la requete http. Je me retrouve toujours avec le retour suivant : [DEBUG] 21:41:28: Erreur lors de la requête [DEBUG] 21:41:28: Statut HTTP : 400 [DEBUG] 21:41:28: Réponse : {"error":{"code":10,"message":"Argument(s) is(are) missing"}} Voici mon code LUA écrit avec les pieds.... Si une âme charitable peut me dire quoi écrire poru gérer la demande et stocker le résultat dans une variable ca serait top. ------------------------------------------------------------------------------------------------------------------------ --[[ %% properties %% events %% globals --]] -------------------------------------------------------------------------------------- -- Déclaration des fonctions local function callback(response) if response.status == 200 then -- Action pour Réponse Ok fibaro:debug("Réponse Ok") -- Code pour gérer la réponse de la requete. Stockage dans variable du résultat. else -- Gérer les erreurs ici fibaro:debug("Erreur lors de la requête") fibaro:debug("Statut HTTP : " .. response.status) fibaro:debug("Réponse : " .. response.data) end end -------------------------------------------------------------------------------------- -- Début du code fibaro:debug("Début de la scène, nombre d'instance: "..fibaro:countScenes()) -- Limitation à une seule scène en même temps. if (fibaro:countScenes() > 1) then fibaro:abort() end -- Etape 1 - Chargement des informations + ID de la station météo fibaro:debug("Etape 1 - Chargement des variables") local http = net.HTTPClient() -- Chargement des variables NetAtmo local clientId = fibaro:getGlobal('NetAtmoMeteoCltId') local clientSecret = fibaro:getGlobal('NetAtmoMeteoCltSc') local accessToken = fibaro:getGlobal('NetAtmoMeteo_Tk') local refreshToken = fibaro:getGlobal('NetAtmoMeteo_RTk') local homeID = fibaro:getGlobal('NetAtmoHome_Id') fibaro:debug("Chargement des variables effectués") -- Etape 2 - Contrôle et Refresh des tokens -- Requête HTTP POST contrôle et renouvellement des Tokens fibaro:debug("Etape 2 - Debut de procédure Refresh Token") http:request("https://api.netatmo.com/oauth2/token", {options={ checkCertificate=false, method='POST', headers={['Content-Type']='application/x-www-form-urlencoded;charset=UTF-8'}, data="grant_type=refresh_token&client_id="..clientId.."&client_secret="..clientSecret.."&refresh_token="..refreshToken,timeout=40000}, success = function(response) label=pcall(function()chk_data=json.decode(response.data)if type(chk_data)~="table" then error() print("Erreur") else print("Table reçue") end end) fibaro:debug("Décodage des tokens reçus") -- affichage des informations reçues & traitement local NewToken = chk_data.access_token print("Nouveau Token:" .. NewToken) local NewRefresh = chk_data.refresh_token print("Nouveau RefreshToken:" .. NewRefresh) print("Délai expiration:" .. chk_data.expires_in) -- comparaison des données Token et action if accessToken ~= NewToken then fibaro:debug("Token différent - Remplacement dans les variables globales") fibaro:setGlobal('NetAtmoMeteo_Tk', NewToken) fibaro:debug("Nouveau Token :" .. fibaro:getGlobal('NetAtmoMeteo_Tk')) fibaro:setGlobal('NetAtmoMeteo_RTk', NewRefresh) fibaro:debug("Nouveau Refresh Token :" .. fibaro:getGlobal('NetAtmoMeteo_RTk')) else fibaro:debug("Token identique - Pas d'action") end -- comparaison des données RefreshToken et action if refreshToken ~= NewRefresh then fibaro:debug("RefreshToken différent - Remplacement dans les variables globales") fibaro:setGlobal('NetAtmoMeteo_RTk', NewRefresh) fibaro:debug("Nouveau Token :" .. fibaro:getGlobal('NetAtmoMeteo_RTk')) else fibaro:debug("Token identique - Pas d'action") accessToken = fibaro:getGlobal('NetAtmoMeteo_Tk') refreshToken = fibaro:getGlobal('NetAtmoMeteo_RTk') end -- Etape 2 - Interrogation Netatmo fibaro:debug("Début du code Action") accessToken = fibaro:getGlobal('NetAtmoMeteo_Tk') fibaro:debug(accessToken) refreshToken = fibaro:getGlobal('NetAtmoMeteo_RTk') fibaro:debug(refreshToken) DeviceID = fibaro:getGlobal('NetAtmoWeathSal_Id') fibaro:debug(DeviceID) ModuleID = fibaro:getGlobal('NetAtmoWeathGar_Id') fibaro:debug(ModuleID) http:request("https://api.netatmo.net/api/getmeasure", {options = {method = 'GET', headers = { ["Content-Type"] = "application/json", }, "access_token="..accessToken.."&device_id="..DeviceID.."&module_id="..ModuleID.."&scale=1hour&type=Humidity&limit=1&optimize=false&real_time=false&date_End="..os.date(), }, success = callback, error = callback }) end, error = function(error) fibaro:debug("Failed to authenticate: " .. error) end })
Kana-chan Posté(e) le 25 juin Signaler Posté(e) le 25 juin Bonjour, Je ne crois pas que ce soit dans le header qu'il faut mettre le device_id, module_id... Je pense qu'il faut mettre cela dans un champ params = {}. Un truc du genre : http:request( "https://api.netatmo.net/api/getmeasure", { options = { method = 'GET', headers = { "Content-Type": "application/json", "Authorization": "Bearer "..accessToken, }, params={ "device_id": DeviceID, "module_id": ModuleID, "scale": "1hour", "type": "Humidity", "limit": "1", "optimize": "false", "real_time": "false", "date_End": os.date() }, success = callback, error = callback }, end, error = function(error) fibaro:debug("Failed to authenticate: " .. error) end } ) À adapter ...
Yorino Posté(e) le 25 juin Signaler Posté(e) le 25 juin (modifié) Merci pour la réponse, alors j'ai testé le code ci dessus et même problématique. Du coup je suis reparti du code existant pour gérer le Token et Refresh Token et j'ai écris le code sur la même base et miracle, "Réponse Ok" ! Il ne me reste plus qu'à trouver comment décoder la réponse désormais.... ;-) Le morceau de code qui fonctionne : Clock = os.time()-3600 http:request("https://api.netatmo.net/api/getmeasure?", {options={ checkCertificate=false, method='POST', headers={['Content-Type']='application/x-www-form-urlencoded;charset=UTF-8'}, data="access_token="..accessToken.."&device_id="..DeviceID.."&scale=1hour&type=Temperature,CO2,Humidity,Pressure,Noise&limit=2&optimize=false&real_time=true&date_begin="..Clock.."date_end="..os.time()}, success = callback, error = callback }) Modifié le 25 juin par Yorino
Yorino Posté(e) le 25 juin Signaler Posté(e) le 25 juin La réponse arrive bien et je récupère bien l'info qui m'intéresse à savoir la dernière mesure de la station. Et bien évidemment, bah je n'arrive pas à stocker les valeurs de la réponse dans des variables. Si vous avez une petite idée, pour ce soir j'arrête là je vais dodo... le code qui gère la réponse : if response.status == 200 then -- Action pour Réponse Ok fibaro:debug("Réponse Ok") fibaro:debug(response.data) Voila la réponse, et en gras la partie qui m'interesse : [DEBUG] 23:09:12: Réponse Ok [DEBUG] 23:09:12: {"body":{"1719346149":[24.8,433,65,1010.8,42]},"status":"ok","time_exec":0.017178058624267578,"time_server":1719349752}
mprinfo Posté(e) le 26 juin Signaler Posté(e) le 26 juin Si mes souvenirs sont bon il faut utiliser json.encode ou json.decode Pour convertir le Json en tableEnvoyé de mon Pixel 8 Pro en utilisant Tapatalk
Yorino Posté(e) le 26 juin Signaler Posté(e) le 26 juin J'ai essayé le json.decode mais sans succès. Je dois mal faire la manip je pense...
Kana-chan Posté(e) le 26 juin Signaler Posté(e) le 26 juin a=json.encode(response.data) fibaro:debug(a["body"]) fibaro:debug(a["body"]["1719346149"]) Un truc du genre... mais si le big numéro change alors il faut chercher un peu. Pour cela, tu as Google, et en cherchant "LUA JSON get values, get keys" tu devrais pouvoir trouver.
Yorino Posté(e) le 26 juin Signaler Posté(e) le 26 juin Bon, je suis parti sur l'option de travailler directement sur la String retournée en la découpant. Je ne vais récupérer que les 3 mêmes informations sur tous mes modules (T°, CO2 et Humidité) donc la découpe sera valable tout le temps, quelque soit le module interrogé. Il me reste à faire les créations des variables pour le stockage des infos, et la découpe finale. ;-) local function callback(response) if response.status == 200 then -- Action pour Réponse Ok fibaro:debug("Réponse Ok") ResultatMesure = string.sub(response.data, string.find(response.data, "body") + 21, string.find(response.data, "status") - 5) fibaro:debug(ResultatMesure)
Messages recommandés