![]() |
|
Airthings API - Printable Version +- LogicMachine Forum (https://forum.logicmachine.net) +-- Forum: LogicMachine eco-system (https://forum.logicmachine.net/forumdisplay.php?fid=1) +--- Forum: Gateway (https://forum.logicmachine.net/forumdisplay.php?fid=10) +--- Thread: Airthings API (/showthread.php?tid=5486) |
Airthings API - Fahd - 26.06.2024 Hey everyone, I'm want to read temperature and humidity data from the Airthings API through LM5, but I'm new to working with APIs . Could someone please help me get started? https://developer.airthings.com/api-docs https://developer.airthings.com/docs/api/getting-started#api-documentation Thanks in advance! RE: Airthings API - admin - 26.06.2024 Similar integration: https://forum.logicmachine.net/showthread.php?tid=4824&pid=31274#pid31274 RE: Airthings API - Fahd - 03.07.2024 (26.06.2024, 11:05)admin Wrote: Similar integration: https://forum.logicmachine.net/showthread.php?tid=4824&pid=31274#pid31274 In case someone needs it, below is a scheduled script that runs every 5 minutes to retrieve temp data from some sensors and write them into LM5 groups. (I'm pretty sure that it could be improved) Code: local https = require('ssl.https')
local json = require('json')
local ltn12 = require('ltn12')
-- Airthings API endpoints and credentials
local tokenEndpoint = 'https://accounts-api.airthings.com/v1/token'
local clientId = 'xx'
local clientSecret = 'xx'
-- local deviceSerialNumber = '3130000665' -- Specific device serial number
local devices = {
{ serialNumber = 'xx', location = '7east' },
{ serialNumber = 'xx', location = '7west' },
{ serialNumber = 'xx', location = '7mid' }
}
local accessToken
-- Custom logging function
-- Function to get access token
function getAccessToken()
local requestBody = 'grant_type=client_credentials'
.. '&client_id=' .. clientId
.. '&client_secret=' .. clientSecret
.. '&scope=read:device'
local response_body = {}
local _, code, headers, status = https.request{
url = tokenEndpoint,
method = 'POST',
headers = {
['Content-Type'] = 'application/x-www-form-urlencoded',
['Content-Length'] = #requestBody
},
source = ltn12.source.string(requestBody),
sink = ltn12.sink.table(response_body)
}
local response = table.concat(response_body)
-- log("DEBUG", "Response body: " .. response)
-- log("DEBUG", "HTTP status code: " .. tostring(code))
-- log("DEBUG", "HTTP status: " .. tostring(status))
if code == 200 then
local jsonResponse = json.decode(response)
accessToken = jsonResponse.access_token
log("INFO", 'Access token received: ' .. accessToken)
else
log("ERROR", 'Error fetching access token: ' .. tostring(code) .. ' ' .. tostring(status))
end
end
-- Function to get data from a specific device
function getDeviceData(serialNumber)
local deviceDataEndpoint = 'https://ext-api.airthings.com/v1/devices/' .. serialNumber .. '/latest-samples'
local response_body = {}
local _, code, headers, status = https.request{
url = deviceDataEndpoint,
method = 'GET',
headers = {
['Authorization'] = 'Bearer ' .. accessToken
},
sink = ltn12.sink.table(response_body)
}
local response = table.concat(response_body)
-- log("DEBUG", "Device data response body: " .. response)
-- log("DEBUG", "HTTP status code: " .. tostring(code))
-- log("DEBUG", "HTTP status: " .. tostring(status))
if code == 200 then
local jsonResponse = json.decode(response)
return jsonResponse
else
-- log("ERROR", 'Error fetching device data: ' .. tostring(code) .. ' ' .. tostring(status))
return nil
end
end
-- Main script
getAccessToken()
-- if accessToken then
-- local data = getDeviceData(deviceSerialNumber)
-- if data then
-- log("INFO", "Data for device " .. deviceSerialNumber .. ": " .. json.encode(data))
-- end
-- end
-- Main script
getAccessToken()
if accessToken then
i = 1 -- Initialize index
for _, device in ipairs(devices) do
i = i + 1 -- Increment index for group address
local data = getDeviceData(device.serialNumber)
if data then
local temperature = tostring(data.data.temp)
log("INFO", "Temperature " .. device.location .. " == " .. temperature)
-- Inside your loop for devices
grp.checkwrite("32/1/" .. i, temperature) -- Write temperature to group address
-- log(i)
end
end
end |