Integracja ze stacją pogodową Netatmo


Netatmo Weather Station to popularna stacja pogodowa, która dostarcza nam informacji takich jak:

  • temperatura wewnątrz,
  • temperatura na zewnątrz,
  • ciśnienie atmosferyczne,
  • poziom CO2,
  • wilgotność.



W poniższej instrukcji zaprezentujemy kroki, które umożliwią wykonanie integracji stacji pogodowej z systemem Grenton.

 

Przygotowanie konta użytkownika 


W pierwszym kroku należy zainstalować stację pogodową i założyć konto na stronie.


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


 

Uzyskanie tokenu autoryzacyjnego, odczyt danych ze stacji pogodowej


Sposób uzyskania access tokenu został opisany na stronie.


1. W pierwszej kolejności należy utworzyć aplikację, gdzie znajdą się parametry client ID oraz client secret potrzebne w kolejnych krokach:


2. Następnie należy utworzyć link składający się z następujących parametrów:

image-png-Jan-03-2024-01-02-01-7705-PM
np.:

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


gdzie:

  • client_id - parametr client ID we wcześniej utworzonej aplikacji
  • redirect_uri - adres przekierowania wprowadzony w aplikacji (https://api.netatmo.com/oauth2)
  • scope - zakres uwierzytelniania (read_station)
  • state - można pominąć



3. W module Gate HTTP należy utworzyć następujące cechy użytkownika:

gdzie:

  • netatmo_client_id - cecha przyjmująca wartość parametru client ID z aplikacji,
  • netatmo_client_secret - cecha przyjmująca wartość parametru client secret z aplikacji,
  • netatmo_code - cecha przyjmująca wartość parametru code z przeglądarki (ustawiana w punkcie 14),
  • netatmo_access_token - cecha, do której zostanie zapisany access token,
  • netatmo_refresh_token - cecha, do której zostanie zapisany refresh token,
  • netatmo_Status,
  • netatmo_StationName,
  • netatmo_StationPlace,
  • netatmo_Temperature,
  • netatmo_CO2,
  • netatmo_Humidity,
  • netatmo_Noise.



4. Następnie w module CLU należy utworzyć persystentne cechy użytkownika:

gdzie:

  • netatmo_access_token_clu - persystentna cecha, do której zostanie zapisany access token,
  • netatmo_refresh_token_clu - persystentna cecha, do której zostanie zapisany refresh token.

Uwaga! Persystentne cechy użytkownika obsługiwane są przez CLU z FW 5.12.01-2330 lub wyższym.


5. W kolejnym kroku należy utworzyć obiekt wirtualny HttpRequest o nazwie netatmo_token_request:

gdzie:

  • Host: https://api.netatmo.com
  • Path: /oauth2/token
  • Method: POST
  • RequestType: FormData
  • ResponseType: JSON



6. Następnie należy utworzyć obiekt wirtualny HttpRequest o nazwie netatmo_getstationsdata_request:

gdzie:

  • Host: https://api.netatmo.com
  • Path: /api/getstationsdata
  • Method: GET
  • RequestType: Text
  • ResponseType: JSON



7. Kolejno należy utworzyć obiekt wirtualny Timer o nazwie netatmo_token_refresh_timer, który posłuży do odświeżania tokenu:

a jego uruchomienie przypisać do zdarzenia OnInit w module Gate HTTP:


8. Następnie należy utworzyć skrypt o nazwie netatmo_token_get, który pozwoli uzyskać access token oraz refresh token przy pierwszym uruchomieniu:

local body = {"&grant_type=authorization_code&client_id=" .. HTTP->netatmo_client_id .. "&client_secret=" .. HTTP->netatmo_client_secret .. "&code=" .. HTTP->netatmo_code .. "&redirect_uri=https%3A%2F%2Fapi.netatmo.com%2Foauth2&scope=read_station"}

HTTP->netatmo_token_request->SetRequestBody(body)
HTTP->netatmo_token_request->SendRequest()



9. W kolejnym kroku należy utworzyć skrypt o nazwie netatmo_token_response:

if(HTTP->netatmo_token_request->StatusCode==200) then
local resp = HTTP->netatmo_token_request->ResponseBody

HTTP->netatmo_access_token = resp.access_token
HTTP->netatmo_refresh_token = resp.refresh_token

clu.await(CLU->netatmo_access_token_clu = HTTP->netatmo_access_token)
clu.await(CLU->netatmo_refresh_token_clu = HTTP->netatmo_refresh_token)

HTTP->netatmo_token_refresh_timer->Start()
end


a jego wywołanie przypisać do zdarzenia OnResponse w obiekcie netatmo_token_request:


10. W kolejnym kroku należy utworzyć skrypt o nazwie netatmo_token_refresh, który będzie odpowiedzialny za odświeżanie tokenu:

local body = {"&grant_type=refresh_token&refresh_token=" .. CLU->netatmo_refresh_token_clu .. "&client_id=" .. HTTP->netatmo_client_id .. "&client_secret=" .. HTTP->netatmo_client_secret}

HTTP->netatmo_token_request->SetRequestBody(body)
HTTP->netatmo_token_request->SendRequest()


a jego wywołanie przypisać do zdarzenia OnTimer obiektu wirtualnego Timer o nazwie netatmo_token_refresh_timer:


11. W kolejnym kroku należy utworzyć skrypt o nazwie netatmo_getdata_request

local params = "device_id=70:ee:50:33:3e:36&get_favorites=false"
local key = "Authorization: Bearer " .. CLU->netatmo_access_token_clu .. "\r\n"

HTTP->netatmo_getstationsdata_request->SetQueryStringParams(params)
HTTP->netatmo_getstationsdata_request->SetRequestHeaders(key)
HTTP->netatmo_getstationsdata_request->SendRequest()


gdzie: 

  • device_id - adres MAC stacji pogodowej zawierający małe litery


a jego wywołanie przypisać do zdarzenia OnStart obiektu wirtualnego Timer o nazwie netatmo_token_refresh_timer:


12. Następnie utworzyć skrypt o nazwie netatmo_getdata_response, który będzie odpowiedzialny za uzyskanie danych na temat pogody:

if(HTTP->netatmo_getstationsdata_request->StatusCode==200) then
local resp = HTTP->netatmo_getstationsdata_request->ResponseBody
HTTP->netatmo_Status=resp.status
HTTP->netatmo_StationName=resp.body.devices[1].station_name
HTTP->netatmo_StationPlace=resp.body.devices[1].place.city
HTTP->netatmo_Temperature=resp.body.devices[1].dashboard_data.Temperature
HTTP->netatmo_CO2=resp.body.devices[1].dashboard_data.CO2
HTTP->netatmo_Humidity=resp.body.devices[1].dashboard_data.Humidity
HTTP->netatmo_Noise=resp.body.devices[1].dashboard_data.Noise
end


a jego wywołanie przypisać do zdarzenia OnResponse obiektu o nazwie netatmo_getstationsdata_request:


13. Należy utworzyć skrypt o nazwie netatmo_init, który automatycznie odświeży access oraz refresh token po przesłaniu konfiguracji:

if(CLU->netatmo_refresh_token_clu~="nil") then
HTTP->netatmo_token_refresh()
end


a jego wywołanie przypisać do zdarzenia OnInit w module Gate HTTP:


14. Przygotowany w punkcie 2 link należy wprowadzić do przeglądarki - w odpowiedzi pojawi się strona:

Obraz11-png-2


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

Wartość parametru code należy ustawić jako wartość początkową cechy użytkownika o nazwie w module Gate HTTP:


15. Tak utworzoną konfigurację należy przesłać do modułu Gate oraz CLU.


16. W przypadku pierwszego uruchomienia po utworzeniu konfiguracji należy wywołać skrypt o nazwie netatmo_token_get. Po jego wywołaniu cechy access i refresh token w module Gate oraz CLU powinny przyjąć odpowiednie wartości: