This forum uses cookies
This forum makes use of cookies to store your login information if you are registered, and your last visit if you are not. Cookies are small text documents stored on your computer; the cookies set by this forum can only be used on this website and pose no security risk. Cookies on this forum also track the specific topics you have read and when you last read them. Please confirm that you accept these cookies being set.

Netatmo
#1
Updated version of Netatmo script with HTTPS (http is not allowed by netatmo anymore)

Task
How to get my Netatmo weather station readings into my KNX network using LogicMachine?

Things to prepare in advance Netatmo function
  • Add the following function in Common Functions or User Library
  • Fill in the script with client_idclient_secretusername and password
  • Rename object names with your own objects
  • Rename module names to match configuration in Netatmo

V2
Code:
require 'ltn12' require 'socket.http' json = require("json") https = require 'ssl.https' function refresh_netatmo()  local netatmo_debug = true  local client_id = "xxx"  local client_secret = "xxx"  local username = "xxx"  local password = "xxx"  local scope = "read_station"  -- optional device_id  local device_id = "xxx"  local request_token_url = "https://api.netatmo.net/oauth2/token"  local request_device_list = "https://api.netatmo.net/api/devicelist"  local response_body = { }  local export_data = {}  if (netatmo_debug) then    alert("netatmo start")  end    local request_body = "grant_type=password&client_id=" .. client_id .."&client_secret=" .. client_secret .. "&username=" .. username .. "&password=" .. password .. "&scope=" .. scope  local body, code, hdrs, stat = https.request  {    url = request_token_url;    method = "POST";    headers =    {      ["Content-Type"] = "application/x-www-form-urlencoded";      ["Content-Length"] = #request_body;    };    source = ltn12.source.string(request_body);    sink = ltn12.sink.table(response_body);  }  if (code ~= 200) then    alert("netatmo auth error : "..tostring(code)..","..tostring(body))    return  end  local response_decode = json.decode(table.concat(response_body))  local access_token = response_decode.access_token  if (netatmo_debug) then    alert("netatmo token %s",access_token)  end  -- request for all devices  local request_body = "access_token=" .. access_token .. "&app_type=app_station"  -- request to limit to only one device :  -- local request_body = "access_token=" .. access_token .. "&app_type=app_station&device_id=" .. device_id    local response_body = { }  local body, code, hdrs, stat = https.request  {    url = request_device_list;    method = "POST";    headers =    {      ["Content-Type"] = "application/x-www-form-urlencoded";      ["Content-Length"] = #request_body;    };    source = ltn12.source.string(request_body);    sink = ltn12.sink.table(response_body);  }  if (code ~= 200) then    alert("netatmo devicelist error : "..tostring(code)..","..tostring(body))    return  end  local response_decode = json.decode(table.concat(response_body))  -- Main module  if (netatmo_debug) then    alert("netatmo main module")  end  grp.write("netatmo temperature interieure",response_decode.body.devices[1].dashboard_data.Temperature,dt.float16)  grp.write("netatmo humidite interieure",response_decode.body.devices[1].dashboard_data.Humidity,dt.scale)  grp.write("netatmo pression",response_decode.body.devices[1].dashboard_data.Pressure,dt.uint16)  grp.write("netatmo CO2",response_decode.body.devices[1].dashboard_data.CO2,dt.float16)  grp.write("netatmo sonometre",response_decode.body.devices[1].dashboard_data.Noise,dt.uint8)  grp.write("netatmo temperature interieure minimum",response_decode.body.devices[1].dashboard_data.min_temp,dt.float16)  grp.write("netatmo temperature interieure maximum",response_decode.body.devices[1].dashboard_data.max_temp,dt.float16)  grp.write("netatmo pression absolue",response_decode.body.devices[1].dashboard_data.AbsolutePressure,dt.uint16)  grp.write("netatmo salon temperature",response_decode.body.devices[1].dashboard_data.Temperature,dt.float16)  grp.write("netatmo salon humidite",response_decode.body.devices[1].dashboard_data.Humidity,dt.scale)  grp.write("netatmo salon CO2",response_decode.body.devices[1].dashboard_data.CO2,dt.uint16)  -- search for additional modules by name    for index, value in ipairs(response_decode.body.modules) do    if (netatmo_debug) then      alert("netatmo module " .. tostring(index) .. ":" .. tostring(value.module_name))    end    if (value.module_name == "Pluviomètre") then      if (netatmo_debug) then        alert("netatmo module match pluviometre")      end      grp.write("netatmo pluviometre",value.dashboard_data.Rain,dt.float16)      grp.write("netatmo pluviometre 1h",value.dashboard_data.sum_rain_1,dt.float16)      grp.write("netatmo pluviometre 24h",value.dashboard_data.sum_rain_24,dt.float16)    elseif (value.module_name == "Extérieur") then      if (netatmo_debug) then        alert("netatmo module match exterieur")      end      grp.write("netatmo temperature exterieure",value.dashboard_data.Temperature,dt.float16)      grp.write("netatmo humidite exterieure",value.dashboard_data.Humidity,dt.float16)      grp.write("netatmo temperature exterieure minimum",value.dashboard_data.min_temp,dt.float16)      grp.write("netatmo temperature exterieure maximum",value.dashboard_data.max_temp,dt.float16)    elseif (value.module_name == "Chambre") then      if (netatmo_debug) then        alert("netatmo module match Chambre")      end      grp.write("netatmo chambre temperature",value.dashboard_data.Temperature,dt.float16)      grp.write("netatmo chambre CO2",value.dashboard_data.CO2,dt.float16)      grp.write("netatmo chambre humidite",value.dashboard_data.Humidity,dt.scale)        elseif (value.module_name == "Bureau") then      if (netatmo_debug) then        alert("netatmo module match Bureau")      end      grp.write("netatmo bureau temperature",value.dashboard_data.Temperature,dt.float16)      grp.write("netatmo bureau CO2",value.dashboard_data.CO2,dt.float16)      grp.write("netatmo bureau humidite",value.dashboard_data.Humidity,dt.scale)              elseif (value.module_name == "Studio") then      if (netatmo_debug) then        alert("netatmo module match Studio")      end      grp.write("netatmo studio temperature",value.dashboard_data.Temperature,dt.float16)      grp.write("netatmo studio CO2",value.dashboard_data.CO2,dt.float16)      grp.write("netatmo studio humidite",value.dashboard_data.Humidity,dt.scale)        end    end  if (netatmo_debug) then    alert("netatmo end")  end     end


v1
Code:
require 'ltn12' require 'socket.http' json = require("json") https = require 'ssl.https' function refresh_netatmo()  local netatmo_debug = false  local client_id = ""  local client_secret = ""  local username = ""  local password = ""  local scope = "read_station"  -- optional  --local device_id = ""  local request_token_url = "https://api.netatmo.net/oauth2/token"  local request_device_list = "https://api.netatmo.net/api/devicelist"  local response_body = { }  if (netatmo_debug) then    alert("netatmo start")  end    local request_body = "grant_type=password&client_id=" .. client_id .."&client_secret=" .. client_secret .. "&username=" .. username .. "&password=" .. password .. "&scope=" .. scope  local body, code, hdrs, stat = https.request  {    url = request_token_url;    method = "POST";    headers =    {      ["Content-Type"] = "application/x-www-form-urlencoded";      ["Content-Length"] = #request_body;    };    source = ltn12.source.string(request_body);    sink = ltn12.sink.table(response_body);  }  if (code ~= 200) then    alert("netatmo auth error")     error("netatmo auth error : "..tostring(code)..","..tostring(body))    return  end  local response_decode = json.decode(table.concat(response_body))  local access_token = response_decode.access_token  if (netatmo_debug) then    alert("netatmo token %s",access_token)  end    local request_body = "access_token=" .. access_token .. "&app_type=app_station"  -- to limit to only one device : --  local request_body = "access_token=" .. access_token .. "&app_type=app_station&device_id=" .. device_id    local response_body = { }  local body, code, hdrs, stat = https.request  {    url = request_device_list;    method = "POST";    headers =    {      ["Content-Type"] = "application/x-www-form-urlencoded";      ["Content-Length"] = #request_body;    };    source = ltn12.source.string(request_body);    sink = ltn12.sink.table(response_body);  }  if (code ~= 200) then    error("netatmo devicelist error")    return  end  local response_decode = json.decode(table.concat(response_body))  -- Module int  if (netatmo_debug) then    alert("netatmo device 1")  end  grp.write("Netatmo Température intérieure",response_decode.body.devices[1].dashboard_data.Temperature,dt.float16)  grp.write("Netatmo Humidité intérieure",response_decode.body.devices[1].dashboard_data.Humidity,dt.scale)  grp.write("Netatmo Pression",response_decode.body.devices[1].dashboard_data.Pressure,dt.uint16)  grp.write("Netatmo CO2",response_decode.body.devices[1].dashboard_data.CO2,dt.uint16)  grp.write("Netatmo Sonomètre",response_decode.body.devices[1].dashboard_data.Noise,dt.uint8)  grp.write("Netatmo Température intérieure minimum",response_decode.body.devices[1].dashboard_data.min_temp,dt.float16)  grp.write("Netatmo Température intérieure maximum",response_decode.body.devices[1].dashboard_data.max_temp,dt.float16)  grp.write("Netatmo Pression absolue",response_decode.body.devices[1].dashboard_data.AbsolutePressure,dt.uint16)    -- Module ext  if (netatmo_debug) then    alert("netatmo module 1")  end  grp.write("Netatmo Température extérieure",response_decode.body.modules[1].dashboard_data.Temperature,dt.float16)  grp.write("Netatmo Humidité extérieure",response_decode.body.modules[1].dashboard_data.Humidity,dt.float16)  grp.write("Netatmo Température extérieure minimum",response_decode.body.modules[1].dashboard_data.min_temp,dt.float16)  grp.write("Netatmo Température extérieure maximum",response_decode.body.modules[1].dashboard_data.max_temp,dt.float16)    -- Module Pluvio  if (netatmo_debug) then    alert("netatmo module 2")  end      grp.write("Netatmo Pluviomètre",response_decode.body.modules[2].dashboard_data.Rain,dt.float16)  grp.write("Netatmo Pluviomètre 1h",response_decode.body.modules[2].dashboard_data.sum_rain_1,dt.float16)  grp.write("Netatmo Pluviomètre 24h",response_decode.body.modules[2].dashboard_data.sum_rain_24,dt.float16)    if (netatmo_debug) then    alert("netatmo end")  end   end

Use the function in your programs
Either in Event-based, Scheduled or Resident script run the function by command refresh_netatmo().

example : a scheduled script that run every minute with the content :

Code:
refresh_netatmo()


Matthieu
Reply


Messages In This Thread
Netatmo - by Matt - 13.07.2015, 21:43
RE: Netatmo - by George - 16.08.2015, 10:59
RE: Netatmo - by gjniewenhuijse - 04.01.2016, 15:24
RE: Netatmo - by Matt - 04.01.2016, 21:10
RE: Netatmo - by gjniewenhuijse - 11.01.2016, 14:59
RE: Netatmo - by Matt - 11.01.2016, 20:38
RE: Netatmo - by gjniewenhuijse - 12.02.2016, 06:40
RE: Netatmo - by buuuudzik - 22.08.2016, 11:46
RE: Netatmo - by admin - 12.02.2016, 07:09
RE: Netatmo - by Matt - 12.02.2016, 07:37
RE: Netatmo - by gjniewenhuijse - 12.02.2016, 09:20
RE: Netatmo - by gjniewenhuijse - 23.02.2016, 07:05
RE: Netatmo - by buuuudzik - 11.05.2016, 12:02
RE: Netatmo - by admin - 11.05.2016, 12:38
RE: Netatmo - by buuuudzik - 11.05.2016, 13:59
RE: Netatmo - by Peter - 17.05.2016, 21:57
RE: Netatmo - by Matt - 18.05.2016, 10:27
RE: Netatmo - by admin - 24.08.2016, 11:25
RE: Netatmo - by buuuudzik - 24.08.2016, 13:16
RE: Netatmo - by gjniewenhuijse - 10.10.2017, 08:20
RE: Netatmo - by Slok - 15.10.2017, 06:53
RE: Netatmo - by Evens - 14.10.2018, 16:03
RE: Netatmo - by Matt - 20.10.2018, 20:09
RE: Netatmo - by Peter - 29.12.2018, 23:46
RE: Netatmo - by paalidar - 30.01.2019, 17:56
RE: Netatmo - by Matt - 30.01.2019, 20:11
RE: Netatmo - by paalidar - 30.01.2019, 20:15
RE: Netatmo - by Erwin van der Zwart - 30.01.2019, 21:27
RE: Netatmo - by victor.back - 26.09.2020, 10:58
RE: Netatmo - by pioneersteffen - 14.09.2021, 19:48
RE: Netatmo - by Daniel - 15.09.2021, 07:35
RE: Netatmo - by pioneersteffen - 15.09.2021, 11:00
RE: Netatmo - by stemic01 - 10.02.2022, 20:32
RE: Netatmo - by Erwin van der Zwart - 11.02.2022, 00:22
RE: Netatmo - by stemic01 - 11.02.2022, 12:08
RE: Netatmo - by iridium - 13.07.2023, 09:53
RE: Netatmo - by gjniewenhuijse - 13.07.2023, 13:41
RE: Netatmo - by admin - 14.07.2023, 08:46
RE: Netatmo - by gjniewenhuijse - 14.07.2023, 11:52
RE: Netatmo - by gjniewenhuijse - 17.07.2023, 13:40
RE: Netatmo - by iridium - 18.07.2023, 07:26
RE: Netatmo - by stemic01 - 20.07.2023, 08:28
RE: Netatmo - by gjniewenhuijse - 21.07.2023, 06:44
RE: Netatmo - by stemic01 - 03.08.2023, 20:45
RE: Netatmo - by Daniel - 04.08.2023, 07:30
RE: Netatmo - by stemic01 - 04.08.2023, 08:35
RE: Netatmo - by Daniel - 04.08.2023, 09:05
RE: Netatmo - by MLa - 04.08.2023, 10:34
RE: Netatmo - by stigen - 23.11.2023, 14:35
RE: Netatmo - by pioneersteffen - 23.12.2023, 14:13
RE: Netatmo - by MLa - 19.07.2024, 07:59
RE: Netatmo - by MaLe - 14.10.2024, 11:41
RE: Netatmo - by gjniewenhuijse - 07.11.2024, 09:28
RE: Netatmo - by Daniel - 07.11.2024, 09:31
RE: Netatmo - by gjniewenhuijse - 08.11.2024, 14:21
RE: Netatmo - by iridium - 03.12.2024, 17:47
RE: Netatmo - by gjniewenhuijse - 04.12.2024, 12:42
RE: Netatmo - by iridium - 12.12.2024, 15:35
RE: Netatmo - by stemic01 - 01.04.2025, 12:24
RE: Netatmo - by Igor - 15.05.2025, 13:26

Forum Jump: