Integracja z stacją pogodową Netatmo

 

Netatmo Weather Station jest to popularna stacja pogodowa, która dostarcza nam informacji takich jak temperatura wewnątrz i zewnątrz, ciśnienie atmosferyczne, poziom CO2, wilgotność itp.

W niniejszym tutorialu chcemy przedstawić integrację z systemem Grenton.

Do integracji jest wymagane uzyskanie tokenu, który pozwoli na autoryzację wysłanego zapytania o pomiary.

W pierwszym korku należy zainstalować stację pogodową i założyć konto na stronie https://www.netatmo.com/pl-pl



Gdy konto jest już aktywne i stacja zwraca nam pomiary jak poniżej, możemy przejść do kolejnych kroków.


1. Uzyskanie tokenu

Instrukcja uzyskania tokenu jest dostępna pod adresem; https://dev.netatmo.com/apidocumentation/oauth


W pierwszym kroku należy utworzyć konto, gdzie znajdziemy client ID oraz client secret, który będzie potrzebne w kolejnych krokach -https://dev.netatmo.com/apps/createanapp#form



Aby pozyskać token należy wysłać Request. Można to wykonać za pomocą przeglądarki lub programu Postman.

Dane które powinien zawierać Request:

Host: https://api.netatmo.com


Path:  /oauth2/token 


RequestBody:

- client_id - pobrany z App Technical Parameters

- client_secret - pobrany z App Technical Parameters 

- grant_type - password

- username - nazwa użytkownika

- password - hasło użytkownika


Poniżej zamieszczamy przykład wysłania Request i odpowiedziw programie Postman:


W odpowiedzi otrzymujemy:

- access token

- refresh token

- czas po jakim token wygaśnie




2. Pobieranie danych 


Po uzyskaniu tokenu możemy przejść do utworzenia konfiguracji na module Gate HTTP.


W pierwszym kroku tworzymy obiekt wirtualny HttpRequest


Następnie należy przygotować skrypt (netatmo_initial), który wykona metodę SendRequest z podaniem MAC adresu stacji i aktualnego tokenu 

local params="device_id=70%3AEG%3A52%3A33%3A8F%3A73&get_favorites=false"
local key="Authorization: Bearer **************|***************** \r\n"
Gate_HTTP->NetAtmo_Request_StationData->SetQueryStringParams(params)
Gate_HTTP->NetAtmo_Request_StationData->SetRequestHeaders(key)
Gate_HTTP->NetAtmo_Request_StationData->SendRequest()

 

Nasz MAC adres to 70:EG:52:33:8F:73 i znajduje się w tej linijce:

local params="device_id=70%3AEG%3A52%3A33%3A8F%3A73&get_favorites=false"

 znak ":" został zastąpiony %3A


Token należy wkleić do:

local key="Authorization: Bearer twój token \r\n"



Teraz należy przygotować cechy użytkownika do których będziemy zapisywać odpowiedzi:


Ostatni krok to utworzenie skryptu (netatmo_stationdata_response), który przekażę odpowiedz do cech użytkownika oraz przypisanie go do zdarzenia OnResponse

local resp = Gate_HTTP->NetAtmo_Request_StationData->ResponseBody  
Gate_HTTP->netatmo_Status=resp.status
Gate_HTTP->netatmo_StationName=resp.body.devices[1].station_name
Gate_HTTP->netatmo_StationPlace=resp.body.devices[1].place.city 
Gate_HTTP->netatmo_Temperature=resp.body.devices[1].dashboard_data.Temperature
Gate_HTTP->netatmo_CO2=resp.body.devices[1].dashboard_data.CO2
Gate_HTTP->netatmo_Humidity=resp.body.devices[1].dashboard_data.Humidity
Gate_HTTP->netatmo_Noise=resp.body.devices[1].dashboard_data.Noise

 

oraz przypisanie go do zdarzenia OnResponse


Po wywołani skryptu (netatmo_initial) wartości cech użytkownika są aktualizowane:



3. Odświeżanie tokenu


Token traci swoją ważność po upływie 10800s,  więc należy go cyklicznie aktualizować. W tym celu warto przygotować mechanizm, który będzie to robił.

Poniżej przykład jak można to wykonać:


Tworzymy cechę użytkownika, której wartość początkowa to refresh_token  (znajdziemy ją jako odpowiedź w programie Postman)

oraz cechę, do której bedziemy przekazywać aktualny token

Następnie należy przygotować skrypt (netatmo_refresh_token), gdzie podamy client_id oraz client_secret

local content = "&grant_type=refresh_token&refresh_token=" .. Gate_HTTP->refresh_token_netatmo .. "&client_id=5f7f9bea3ef0f64cf48t9n2em&client_secret=Z0qFJmY8ZUenN8iNle3mBt6u4oRvmGoT9b2JbjaFdv6"
Gate_HTTP->NetAtmo_Request_Token->SetRequestBody(content)
Gate_HTTP->NetAtmo_Request_Token->SendRequest()

 


W kolejnym kroku musimy utworzyć obiekt wirtualny HttpRequest 


Pozostało nam tylko jeszcze przypisać zmodyfikowany skrypt (netatmo_initial) do zdarzenia OnResponse :


Zmieniony skrypt (netatmo_initial ):

local resp = Gate_HTTP->NetAtmo_Request_Token->ResponseBody 
Gate_HTTP->access_token=resp.access_token 

local params="device_id=70%3AEG%3A52%3A33%3A8F%3A73&get_favorites=false"
local key="Authorization: Bearer ".. Gate_HTTP->access_token.."  \r\n"
Gate_HTTP->NetAtmo_Request_StationData->SetQueryStringParams(params)
Gate_HTTP->NetAtmo_Request_StationData->SetRequestHeaders(key)
Gate_HTTP->NetAtmo_Request_StationData->SendRequest()

 


Do stałego aktualizowania tokenu warto utworzyć obiekt wirtualny Timer, który będzie cyklicznie uruchamiał skrypt (netatmo_refresh_token)