![]() |
|
Smartthings status update - 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: Smartthings status update (/showthread.php?tid=5812) |
Smartthings status update - CristianAgata - 02.01.2025 Good morning and happy new year st all. I'm working with Smartthings API, in command mode I reached good results. My problem it is the status update and I'm asking at the community if some other is working on this.... I 've thought to use the 'https://api.smartthings.com/v1/devices/<deviceId>/components/<componentID>/status' and create a resident script for x seconds to update the values reading the response Json. I'm asking, is there a more pretty solution? Best regards Cristian RE: Smartthings status update - admin - 02.01.2025 Looks like polling is the only way to get the status info. RE: Smartthings status update - CristianAgata - 02.01.2025 (02.01.2025, 11:35)admin Wrote: Looks like polling is the only way to get the status info. How many time in a minute, by your experience, do you suggest? I don't want overload the communication with the cloud. BR Cristian RE: Smartthings status update - admin - 02.01.2025 This is a question for Smartthings support ![]() Check if API has any rate limits and adjust your scripts accordingly. RE: Smartthings status update - CristianAgata - 02.01.2025 (02.01.2025, 14:30)admin Wrote: This is a question for Smartthings support Ok I will check again. BR Cristian Smartthings command execution not works - Ozturker - 02.10.2025 Hello all I am successfully reading the status of individual devices from Smartthings But when I am trying to set the status via command I am receiving 422. Same code works from Postman. Is it a string issue? Thank you in advanced for the comments Code: local https = require('ssl.https')
local ltn12 = require('ltn12')
local token = '++++++++'
local cam_id = '++++++++++'
-- Function to turn camera on or off using a raw JSON string
local function set_camera_onoff(cam_id, state)
local cmd = state and 'on' or 'off'
local body = string.format([[
{
"commands": [
{
"component": "main",
"capability": "switch",
"command": "%s"
}
]
}
]], cmd)
log('Request body: ' .. body)
local sink_tbl = {}
local res, code = https.request({
url = 'https://api.smartthings.com/v1/devices/' .. cam_id .. '/commands',
method = 'POST',
headers = {
['Content-Type'] = 'application/json',
['Authorization'] = 'Bearer ' .. token,
['Accept'] = 'application/json',
['User-Agent'] = 'Mozilla/5.0',
['Content-Length'] = tostring(#body)
},
source = ltn12.source.string(body),
sink = ltn12.sink.table(sink_tbl),
})
local response_body = table.concat(sink_tbl)
log('SmartThings response code: ' .. tostring(code))
log('SmartThings response body: ' .. response_body)
return res, code, response_body
end
-- Usage:
set_camera_onoff(cam_id, true) -- to turn ON
set_camera_onoff(cam_id, false) -- to turn OFFRE: Smartthings status update - admin - 02.10.2025 What do you get in response? It should contain some explanation on what is wrong with the request. RE: Smartthings status update - Ozturker - 02.10.2025 (02.10.2025, 11:04)admin Wrote: What do you get in response? It should contain some explanation on what is wrong with the request. Code: string: SmartThings response body: {"requestId":"7895205675944081778","error":{"code":"ConstraintViolationError","message":"The request is malformed.","details":[{"code":"BodyMalformedError","target":"httpRequestBody","message":"The request body is malformed and cannot be processed by server.","details":[]}]}}RE: Smartthings status update - admin - 02.10.2025 Try encoding POST body using JSON library: Code: local body = require('json').encode({
commands = {
{
component = 'main',
capability = 'switch',
command = cmd,
}
}
})RE: Smartthings status update - Ozturker - 02.10.2025 I receıved below 422 Code: * string: Request body: {"commands":[{"capability":"switch","command":"on","component":"main"}]}
* string: SmartThings response code: 422
* string: SmartThings response body: {"requestId":"391879646930462279","error":{"code":"ConstraintViolationError","message":"The request is malformed.","details":[{"code":"BodyMalformedError","target":"httpRequestBody","message":"The request body is malformed and cannot be processed by server.","details":[]}]}}Here is the full code Code: local https = require('ssl.https')
local json = require('json')
local ltn12 = require('ltn12')
-- ⚠️ put your smartthings pat here
local token = '*************'
local livingr_cam_id = '**************************'
-- Camera KNX group objects (choose addresses as needed)
local ga_cam_onoff_set = grp.create({ datatype = dt.bool, address = '33/4/1', name = 'Camera On/Off' })
local ga_cam_onoff = grp.create({ datatype = dt.bool, address = '33/4/2', name = 'Camera On/Off Status' })
local ga_cam_motion = grp.create({ datatype = dt.bool, address = '33/4/11', name = 'Camera Motion Detected' })
local ga_cam_sound = grp.create({ datatype = dt.bool, address = '33/4/12', name = 'Camera Sound Detected' })
local cam_set = grp.getvalue(ga_cam_onoff_set) -- Set
local cam_set_status = grp.getvalue(ga_cam_onoff) -- Status
-- Helper to turn camera on or off using a raw JSON string
local function set_camera_onoff(cam_id, state)
local cmd = state and 'on' or 'off'
local body = require('json').encode({
commands = {
{
component = 'main',
capability = 'switch',
command = cmd,
}
}
})
log('Request body: ' .. body)
local sink_tbl = {}
local res, code = https.request({
url = 'https://api.smartthings.com/v1/devices/' .. cam_id .. '/commands',
method = 'POST',
headers = {
['authorization'] = 'Bearer ' .. token,
['content-type'] = 'application/json; charset=utf-8',
['accept'] = 'application/json',
},
source = ltn12.source.string(body),
sink = ltn12.sink.table(sink_tbl),
})
local response_body = table.concat(sink_tbl)
log('SmartThings response code: ' .. tostring(code))
log('SmartThings response body: ' .. response_body)
return res, code, response_body
end
if cam_set == true then
if cam_set_status == false then
set_camera_onoff(livingr_cam_id, true)
end
elseif cam_set == false then
if cam_set_status == true then
set_camera_onoff(livingr_cam_id, false)
end
end
Here is the working postman cURL Code: curl --location 'https://api.smartthings.com/v1/devices/***************************/commands' \
--header 'Content-Type: application/json' \
--header 'Authorization: **********' \
--data '{
"commands": [
{
"component": "main",
"capability": "switch",
"command": "on"
} ]
}'Thank you for the support RE: Smartthings status update - admin - 03.10.2025 Your code is missing content-length header. If it still does not work then send your token and device ID via PM. RE: Smartthings status update - CristianAgata - 03.10.2025 (02.10.2025, 18:44)Ozturker Wrote: I receıved below 422 Hi, try to add this in the header, for me works ['content-length'] = #body, Best regards Cristian RE: Smartthings status update - Ozturker - 03.10.2025 (03.10.2025, 10:02)CristianAgata Wrote:(02.10.2025, 18:44)Ozturker Wrote: I receıved below 422 Thank you Cristian. Thank you both. NOW IT IS WORKING properly. |