Integracja ze stacją pogodową Netatmo

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

 

W niniejszym tutorialu zaprezentujemy kroki, które umożliwią wykonanie integracji stacji z systemem Grenton. Przebieg będzie następujący:

1. Przygotowanie konta użytkownika

2. Uzyskanie tokenu autoryzacyjnego

3. Konfiguracja modułu Gate HTTP

W pierwszym kroku 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.


Autoryzacja dostępu

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

W pierwszej kolejności należy utworzyć aplikację, gdzie znajdziemy client ID oraz secret ID, które będą potrzebne w kolejnych krokach - https://dev.netatmo.com/apps/createanapp#form



Przekierowanie użytkownika do platformy uwierzytelnienia

Utwórz link składający się z następujących parametrów:

image-png-Jan-03-2024-01-02-01-7705-PM

https://api.netatmo.com/oauth2/authorize?client_id=5fbf9bad3ef0f64c4859b2e6&redirect_uri=https://api.netatmo.com/oauth2&scope=read_station

client_id - sprawdź swoje client ID w aplikacji, którą utworzyłeś: https://dev.netatmo.com/apps/createanapp#form

redirect_uri - adres przekierowania, który podałeś w aplikacji: https://api.netatmo.com/oauth2

scope - zakres uwierzytelniania - w naszym przypadku będziemy pobierać dane (read_station)

state - można pominąć

Tak przygotowany link możesz wprowadzić do przeglądarki. W odpowiedzi pojawi się strona:

Obraz11-png-2


Po zatwierdzeniu autoryzacji pojawi się okno z nowym parametrem (code):


Po uzyskaniu parametru code należy wysłać request:

grant_type - authorization_code

client_id - sprawdź swoje client ID w aplikacji, którą utworzyłeś: https://dev.netatmo.com/apps/createanapp#form
client_secret - sprawdź swoje client secret w aplikacji, którą utworzyłeś: https://dev.netatmo.com/apps/createanapp#form
code - parametr uzyskany w poprzednim kroku

redirect_uri - adres przekierowania, który podałeś w aplikacji: https://api.netatmo.com/oauth2

scope - zakres uwierzytelniania - w naszym przypadku będziemy pobierać dane (read_station)

Zapytanie można wysłać za pomocą programu Postman. Poniżej zamieszczamy przykład wysłania zapytania oraz odpowiedzi.


Capture3-PNG


W odpowiedzi otrzymujemy:

- access token

- refresh token

- czas po jakim token wygaśnie (wyrażony w sekundach)

Otrzymane wartości access_token oraz refresh_token wprowadź jako wartości początkowe cech użytkownika na module Gate_HTTP (access_ token oraz refresh_token_netatmo) - patrz punkt 3.



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że odpowiedź do cech użytkownika.

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

A następnie przypisanie go do zdarzenia OnResponse



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

3. Odświeżanie tokenu

Token traci swoją ważność po upływie 10800 s,  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ą w odpowiedzi w programie Postman):


oraz cechę, do której będziemy 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).