Logic Machine Forum
Glamox / Adax Cloud - Printable Version

+- Logic Machine Forum (https://forum.logicmachine.net)
+-- Forum: LogicMachine eco-system (https://forum.logicmachine.net/forumdisplay.php?fid=1)
+--- Forum: Scripting (https://forum.logicmachine.net/forumdisplay.php?fid=8)
+--- Thread: Glamox / Adax Cloud (/showthread.php?tid=4361)



Glamox / Adax Cloud - tomnord - 08.11.2022

Hello. I've written this code to access cloud token and read content from cloud, and also to write target value to the heater.
Feel free to use it, and post any updates in this thread. Also thanks to ADMIN for help with this.


Code:
--Authentication script for Adax and Glamox heaters
--
--Put this script as scheduled


require('json')
require('ssl.https')
require('socket.http')
require('ltn12')

-- Set credentials for Adax API
clientID ='xxxxxxx' --- You find this ID in your app.
clientSecret ='xxxxxxx'    -- Activate this in the app, under third party integration




function GetToken()
  request_token_url = 'https://api-1.adax.no/client-api/auth/token'
  local response_body = {}
  local request_body = 'grant_type=password&username=' .. clientID .. '&password=' .. clientSecret
  local body, code, hdrs, stat = socket.http.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);
  }
  log(code)
  if code == 200 then
    ret = table.concat(response_body)
    ret = json.pdecode(ret)
    return ret.access_token
  else
    log('request failed', body, code, hdrs, stat)
  end
end


Token = GetToken()
storage.set('AdaxToken', Token) --Writes token to storage for use in other scripts

Code:
--Script for reading contant from API. You get Homes, Rooms and Devices. You can read the actual temperature and current target value among other things.
-- Load modules


require('json')
require('ssl.https')
require('socket.http')
require('ltn12')

-- Get token from storage
Token = storage.get('GlamoxToken')




function RequestFromAdax(request)
  request_url = 'https://api-1.adax.no/client-api' .. request
  local response_body = {}
  local request_body = ""
  local body, code, hdrs, stat = socket.http.request{
    url = request_url;
    method = "GET";
    headers =
    {
      ["Content-Type"] = "application/json";
      ["Content-Length"] = #request_body;
      ["Authorization"] = "Bearer " .. Token;
    };
    source = ltn12.source.string(request_body);
    sink = ltn12.sink.table(response_body);
  }
  
  if code == 200 then
    ret = table.concat(response_body)
    ret = json.pdecode(ret)
    return ret
  else
    log('request failed', body, code, hdrs, stat)
  end
end



getContent = RequestFromAdax('/rest/v1/content/')


Code:
--Example for writing new target value to a room. You get roomID from /content/, use this to write to correct room. Script returns a status table.
--Adax/Glamox
--
require('json')
require('ssl.https')
require('socket.http')
require('ltn12')

--Get token from storage
Token = storage.get('GlamoxToken')


function WriteToAdax(request, request_body)
  request_url = 'https://api-1.adax.no/client-api' .. request
  local response_body = {}
  local content_length
  if type(request_body) == "string" then
    content_length = #request_body
  else
    request_body = ""
  end
 
  local body, code, hdrs, stat = ssl.https.request{
    url = request_url;
    method = "POST";
    headers =
    {
     ["Content-Type"] = "application/json";
     ["Authorization"] = "Bearer " .. Token;
     ["Content-Length"] = #request_body;
    };
    source = ltn12.source.string(request_body);
    sink = ltn12.sink.table(response_body);
  }
  --log(code)
      if code == 200 then
    ret = table.concat(response_body)
    ret = json.pdecode(ret)
    return ret
  else
     log('request failed', body, code, hdrs, stat)
  end
end


room_id = 123456
temperature = 25

body = json.encode({
    rooms = {
    { id = room_id, targetTemperature = (tostring(temperature))*100 }
  }
})



data = WriteToAdax('/rest/v1/control/', body)

The API is documented here: https://adax.no/wi-fi/api-development/
It does not have all the functions as the app does, because Adax did not want to much trafic on their servers. There will be a more functional update on the local API some months from now they say.
I have not made a script for local access, maybe someone will complete this task and post here?