Aller au contenu

Station météo Netatmo


jimbo007be

Messages recommandés

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.

 

 

Lien vers le commentaire
Partager sur d’autres sites

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à.

  • Confused 1
Lien vers le commentaire
Partager sur d’autres sites

  • 3 mois après...

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
})

 

 

Lien vers le commentaire
Partager sur d’autres sites

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 ... :D

Lien vers le commentaire
Partager sur d’autres sites

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é par Yorino
Lien vers le commentaire
Partager sur d’autres sites

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}

Lien vers le commentaire
Partager sur d’autres sites

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.

 

Lien vers le commentaire
Partager sur d’autres sites

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)  

Lien vers le commentaire
Partager sur d’autres sites

×
×
  • Créer...