Hi, has anybody successfully integrated the Shelly ST1820 thermosat? I'm looking for device code if it's out there!
Thanks
Hi, has anybody successfully integrated the Shelly ST1820 thermosat? I'm looking for device code if it's out there!
Thanks
I added this to my Shelly Device Manager app (here)
I don't have one of these on hand, so I'm not able to test it verifiably, so this is just coded up based on documentation/specs for the device. All the important code HAS been tested, since Shelly devices are just a mix of various standardized components and services, such as switch, input, temperature, etc. These are all the same across all devices that use them, and I've tested the code for all of these components and services with other Shelly devices, so the majority of the code these devices would use has been tested.
Thanks Daniel, just tried the app and I'm getting some errors which seem related to an inability to find a device driver, as follows:
app:15272026-04-29 11:17:47.882
debug
Reusing existing cookie
app:15272026-04-29 11:17:47.578
error
No driver available for 192.168.1.43. Device may not have supported components.
app:15272026-04-29 11:17:47.566
debug
Reusing existing cookie
app:15272026-04-29 11:17:47.564
debug
determineDeviceDriver: no recognized components found in device status
app:15272026-04-29 11:17:47.549
info
Discovered device has input(s): 0
app:15272026-04-29 11:17:47.534
info
Discovered device has switch(es): 0
app:15272026-04-29 11:17:47.517
debug
determineDeviceDriver: deviceStatus keys=[ble, bthome, cloud, mqtt, service:0, sys, wifi, ws]
app:15272026-04-29 11:17:47.498
debug
fetchAndStoreDeviceInfo: deviceStatus keys=[ble, bthome, cloud, mqtt, service:0, sys, wifi, ws]
app:15272026-04-29 11:17:47.483
debug
fetchAndStoreDeviceInfo: deviceConfig keys=[ble, bthome, cloud, mqtt, service:0, sys, wifi, ws]
app:15272026-04-29 11:17:47.469
debug
fetchAndStoreDeviceInfo: deviceInfo keys=[app, auth_domain, auth_en, batch, fw_id, fw_sbits, gen, id, jti, jws, jwt, key, mac, model, name, slot, svc0, ver]
app:15272026-04-29 11:17:47.439
debug
fetchAndStoreDeviceInfo: supported webhook events: [boolean.change, bthomedevice.double_push, bthomedevice.long_double_push, bthomedevice.long_push, bthomedevice.long_triple_push, bthomedevice.rotate_left, bthomedevice.rotate_right, bthomedevice.single_push, bthomedevice.triple_push, bthomesensor.state_change, bthomesensor.value_change, button.double_push, button.long_push, button.single_push, button.triple_push, enum.change, number.change, object.change, text.change]
app:15272026-04-29 11:17:47.169
debug
fetchAndStoreDeviceInfo: fetching from http://192.168.1.43/rpc
app:15272026-04-29 11:17:47.141
info
Device info/driver not yet available for 192.168.1.43 — fetching now...
app:15272026-04-29 11:17:47.127
info
Creating device for 192.168.1.43
app:15272026-04-29 11:17:47.033
info
Creating device for 192.168.1.43 via config table
NB the Hubitat is 192.168.1.40, and the ST1820 is at 192.168.1.43.
Thanks
Andy
Thanks for the logs... I updated a few things. Specifically the fact that it uses "service:0" and no other components, so it never matched to any driver because there weren't other components on it. It should match up the driver to the device now. You'll need to click on "update" on both the app and driver, on the app page, to bring in version 1.0.42, which has the (hopefully) fixed driver detection working.
Thanks Dan, the driver is now pulling in. Perhaps not an issue but the app error log is showing
I'll come back to you on the driver next.
Thanks
Andy
When I then look at the driver:
Hope you can make sense of this? Appreciate your help.
Regards
Andy
Thanks for more logs. Shelly Device Manager 1.0.43 has some updates that hopefully get everything else working. That update also includes a number of trace level logging additions on these drivers, so if there's still anything not working properly, please turn on trace level logging so I can get a better understanding of how these thermostats work.
Hi Dan, I updated the driver, deleted the device (using the Shelly app) and recreated the instance. Rebooted the Hubitat and then tried it again (just to be sure!). Still the same issues - the setpoint command works, the on/off switch now works, but the status for setpoint, switch, humidity and measued temps are not working. The Hubitat logs show:
and I've enabled logging on the ST1820 via it's web page and info from that end is as follows:
[
{
"data": "Connected.",
"ts": 1777618254.332,
"level": 2,
"fd": 1
},
{
"seq": 183,
"ts": 1777618253.858,
"level": 2,
"data": "shelly_debug.cpp:236 Streaming logs to 192.168.1.65:51784",
"fd": 1
},
{
"seq": 184,
"ts": 1777618254.494,
"level": 2,
"data": "shos_rpc_inst.c:243 Shelly.GetComponents via SHC 34.185.185.69:6022",
"fd": 1
},
{
"seq": 185,
"ts": 1777618254.495,
"level": 2,
"data": "shos_init.c:94 New min heap free: 92084",
"fd": 1
},
{
"seq": 186,
"ts": 1777618254.598,
"level": 2,
"data": "shos_rpc_inst.c:243 Shelly.GetComponents via SHC 34.185.185.69:6022",
"fd": 1
},
{
"seq": 187,
"ts": 1777618256.553,
"level": 2,
"data": "shos_dns_sd_respond:236 ws(0x3fcc2b48): Announced ST1820-B08184F672EC any@any (fe80::b281:84ff:fef6:72ec)",
"fd": 1
},
{
"seq": 188,
"ts": 1777618256.8,
"level": 2,
"data": "shos_dns_sd_respond:236 ws(0x3fcc2b48): Announced ST1820-B08184F672EC any@any (192.168.1.43)",
"fd": 1
},
{
"seq": 189,
"ts": 1777618257.319,
"level": 2,
"data": "shos_rpc_inst.c:243 Shelly.GetStatus via HTTP_in POST 192.168.1.40:58870",
"fd": 1
},
{
"seq": 190,
"ts": 1777618270.036,
"level": 2,
"data": "shos_rpc_inst.c:243 Number.Set via HTTP_in POST 192.168.1.40:58930",
"fd": 1
},
{
"seq": 191,
"ts": 1777618270.074,
"level": 2,
"data": "shelly_notification:165 Status change of number:202: {"id":202,"value":20}",
"fd": 1
},
{
"seq": 192,
"ts": 1777618270.123,
"level": 2,
"data": "[ Tuya ] DP value changed 2 dp value 200 dp type 2 value type number",
"fd": 100
},
{
"seq": 193,
"ts": 1777618270.164,
"level": 2,
"data": "shelly_notification:165 Status change of number:202: {"id":202,"source":"sys"}",
"fd": 1
},
{
"seq": 194,
"ts": 1777618272.194,
"level": 2,
"data": "shelly_tuya.cpp:807 add 163(enum) = 4",
"fd": 1
},
{
"seq": 195,
"ts": 1777618272.196,
"level": 2,
"data": "[ Tuya ] DP value changed 163 dp value 4 dp type 4 value type number",
"fd": 100
},
{
"seq": 196,
"ts": 1777618272.281,
"level": 2,
"data": "shos_rpc_inst.c:243 Shelly.GetStatus via HTTP_in POST 192.168.1.40:58936",
"fd": 1
},
{
"seq": 197,
"ts": 1777618274.622,
"level": 2,
"data": "shos_rpc_inst.c:243 Shelly.GetStatus via HTTP_in POST 192.168.1.40:58938",
"fd": 1
},
{
"seq": 198,
"ts": 1777618299.631,
"level": 2,
"data": "[ Tuya ] DP value changed 3 dp value 222 dp type 2 value type number",
"fd": 100
},
{
"seq": 199,
"ts": 1777618299.632,
"level": 2,
"data": "[ Tuya ] DP value changed 102 dp value 45 dp type 2 value type number",
"fd": 100
},
{
"seq": 200,
"ts": 1777618299.661,
"level": 2,
"data": "shelly_notification:165 Status change of number:201: {"id":201,"value":22.2}",
"fd": 1
},
{
"seq": 201,
"ts": 1777618299.663,
"level": 2,
"data": "shelly_notification:165 Status change of number:200: {"id":200,"value":45}",
"fd": 1
},
{
"seq": 202,
"ts": 1777618299.687,
"level": 2,
"data": "shos_init.c:94 New min heap free: 89856",
"fd": 1
},
{
"seq": 203,
"ts": 1777618317.355,
"level": 2,
"data": "shos_rpc_inst.c:243 Shelly.GetStatus via HTTP_in POST 192.168.1.40:58954",
"fd": 1
}
]
FYI, 192.168.1.65 is the PC I'm checking from, and 192.168.1.40 is the Hubitat,
Hope you can make sense of this, but to my untrained eye it appears that the St1820 is reporting back parameter 201 as the measured temp, and 200 is the Humidity but the device driver is not interpreting these correctly. Similarly 202 looks like the setpoint reporting back.
Thanks, Andy
Thanks again... I put out another update with some more changes based on these logs. Give it a go and let me know!
Sorry Daniel, still not reading the status data.
Device Log:
App Log:
The web log from the ST1820 (but not in sync with the others as I hadnt started it):
Is there anything specific you want me to try and capture?
Regards
Andy
Alright, made a few more updates. Nothing specific to capture, just the full logs of each attempt. Just need logs to help narrow down exactly how these thermostats work. They use just a "service" and some virtual numbers/booleans, so they're a bit different than most every other Shelly device.
Give this new update a try and post the complete logs here again if there's still issues. Thanks!
Hi Daniel,
Fantastic progress, I can now see and have access to the attributes of the device for heatingSetpoint, humidity and temperature. These are all I need to run my app for my house heating, as I make the decision in a Hubitat to enable heating based on this data and use a PWM algorithm rather than the thermostat output switch.
However, the reported switch status in the driver is the status of whether the thermostat is enabled - the device allows for itself to be turned on or put into a sleep mode. The switch status in the driver is not reading the status of the 'heat' output relay. I'd suggest for completion of the driver it would be good to get this right.
Other areas as follows:
So logs from the device are:
dev:11152026-05-03 20:47:02.330
info
st1820-b08184f672ec: Heating setpoint: 22.0°C
dev:11152026-05-03 20:47:02.327
trace
st1820-b08184f672ec: handleRoleUpdate: role=target_temperature, value=22, scale=C
dev:11152026-05-03 20:47:02.317
trace
st1820-b08184f672ec: distributeStatus iter: key=number:202, resolved role=target_temperature, data=[last_update_ts:1777837518, source:sys, value:22]
dev:11152026-05-03 20:47:02.315
info
st1820-b08184f672ec: Temperature: 24.0°C
dev:11152026-05-03 20:47:02.312
trace
st1820-b08184f672ec: handleRoleUpdate: role=current_temperature, value=24, scale=C
dev:11152026-05-03 20:47:02.310
trace
st1820-b08184f672ec: distributeStatus iter: key=number:201, resolved role=current_temperature, data=[last_update_ts:1777837583, source:sys, value:24]
dev:11152026-05-03 20:47:02.307
trace
st1820-b08184f672ec: handleRoleUpdate: role=current_humidity, value=48, scale=C
dev:11152026-05-03 20:47:02.305
trace
st1820-b08184f672ec: distributeStatus iter: key=number:200, resolved role=current_humidity, data=[last_update_ts:1777837583, source:sys, value:48]
dev:11152026-05-03 20:47:02.302
info
st1820-b08184f672ec: Thermostat on
dev:11152026-05-03 20:47:02.300
trace
st1820-b08184f672ec: handleRoleUpdate: role=enable, value=true, scale=C
dev:11152026-05-03 20:47:02.297
trace
st1820-b08184f672ec: distributeStatus iter: key=boolean:202, resolved role=enable, data=[last_update_ts:1777837347, source:rpc, value:true]
dev:11152026-05-03 20:47:02.295
trace
st1820-b08184f672ec: handleRoleUpdate: role=child_lock, value=false, scale=C
dev:11152026-05-03 20:47:02.292
trace
st1820-b08184f672ec: distributeStatus iter: key=boolean:201, resolved role=child_lock, data=[last_update_ts:1777661047, source:rpc, value:false]
dev:11152026-05-03 20:47:02.290
trace
st1820-b08184f672ec: handleRoleUpdate: role=anti_freeze, value=false, scale=C
dev:11152026-05-03 20:47:02.287
trace
st1820-b08184f672ec: distributeStatus iter: key=boolean:200, resolved role=anti_freeze, data=[last_update_ts:1777661447, source:rpc, value:false]
dev:11152026-05-03 20:47:02.285
trace
st1820-b08184f672ec: distributeStatus: reverseMap=[number:201:current_temperature, boolean:202:enable, number:200:current_humidity, number:202:target_temperature, boolean:200:anti_freeze, boolean:201:child_lock]
dev:11152026-05-03 20:47:02.282
trace
st1820-b08184f672ec: distributeStatus: virtualMap=[current_temperature:number:201, enable:boolean:202, current_humidity:number:200, target_temperature:number:202, anti_freeze:boolean:200, child_lock:boolean:201], serviceConfig keys=[power_down_memory, temp_range, temp_anti_freeze, temp_offset, temp_hysteresis, humidity_offset, id]
dev:11152026-05-03 20:47:02.279
trace
st1820-b08184f672ec: ensureServiceConfig: cache hit
dev:11152026-05-03 20:47:02.277
trace
st1820-b08184f672ec: ensureVirtualMap: cache hit ([current_temperature:number:201, enable:boolean:202, current_humidity:number:200, target_temperature:number:202, anti_freeze:boolean:200, child_lock:boolean:201])
dev:11152026-05-03 20:47:02.274
trace
st1820-b08184f672ec: { "distributeStatus_input": { "boolean:200": { "last_update_ts": 1777661447, "source": "rpc", "value": false }, "boolean:201": { "last_update_ts": 1777661047, "source": "rpc", "value": false }, "boolean:202": { "last_update_ts": 1777837347, "source": "rpc", "value": true }, "number:200": { "last_update_ts": 1777837583, "source": "sys", "value": 48 }, "number:201": { "last_update_ts": 1777837583, "source": "sys", "value": 24 }, "number:202": { "last_update_ts": 1777837518, "source": "sys", "value": 22 } } }
dev:11152026-05-03 20:47:02.235
trace
st1820-b08184f672ec: fetchAndDistribute: parent returned 6 status keys: [boolean:200, boolean:201, boolean:202, number:200, number:201, number:202]
dev:11152026-05-03 20:47:00.345
debug
st1820-b08184f672ec: scheduledPoll() triggered
dev:11152026-05-03 20:46:02.378
info
st1820-b08184f672ec: Heating setpoint: 22.0°C
dev:11152026-05-03 20:46:02.375
trace
st1820-b08184f672ec: handleRoleUpdate: role=target_temperature, value=22, scale=C
dev:11152026-05-03 20:46:02.373
trace
st1820-b08184f672ec: distributeStatus iter: key=number:202, resolved role=target_temperature, data=[last_update_ts:1777837518, source:sys, value:22]
dev:11152026-05-03 20:46:02.371
info
st1820-b08184f672ec: Temperature: 23.9°C
dev:11152026-05-03 20:46:02.368
trace
st1820-b08184f672ec: handleRoleUpdate: role=current_temperature, value=23.9, scale=C
dev:11152026-05-03 20:46:02.366
trace
st1820-b08184f672ec: distributeStatus iter: key=number:201, resolved role=current_temperature, data=[last_update_ts:1777837283, source:sys, value:23.9]
dev:11152026-05-03 20:46:02.363
trace
st1820-b08184f672ec: handleRoleUpdate: role=current_humidity, value=49, scale=C
dev:11152026-05-03 20:46:02.361
trace
st1820-b08184f672ec: distributeStatus iter: key=number:200, resolved role=current_humidity, data=[last_update_ts:1777837283, source:sys, value:49]
dev:11152026-05-03 20:46:02.358
info
st1820-b08184f672ec: Thermostat on
dev:11152026-05-03 20:46:02.352
trace
st1820-b08184f672ec: handleRoleUpdate: role=enable, value=true, scale=C
dev:11152026-05-03 20:46:02.349
trace
st1820-b08184f672ec: distributeStatus iter: key=boolean:202, resolved role=enable, data=[last_update_ts:1777837347, source:rpc, value:true]
dev:11152026-05-03 20:46:02.343
trace
st1820-b08184f672ec: handleRoleUpdate: role=child_lock, value=false, scale=C
dev:11152026-05-03 20:46:02.341
trace
st1820-b08184f672ec: distributeStatus iter: key=boolean:201, resolved role=child_lock, data=[last_update_ts:1777661047, source:rpc, value:false]
dev:11152026-05-03 20:46:02.338
trace
st1820-b08184f672ec: handleRoleUpdate: role=anti_freeze, value=false, scale=C
dev:11152026-05-03 20:46:02.336
trace
st1820-b08184f672ec: distributeStatus iter: key=boolean:200, resolved role=anti_freeze, data=[last_update_ts:1777661447, source:rpc, value:false]
dev:11152026-05-03 20:46:02.333
trace
st1820-b08184f672ec: distributeStatus: reverseMap=[number:201:current_temperature, boolean:202:enable, number:200:current_humidity, number:202:target_temperature, boolean:200:anti_freeze, boolean:201:child_lock]
dev:11152026-05-03 20:46:02.330
trace
st1820-b08184f672ec: distributeStatus: virtualMap=[current_temperature:number:201, enable:boolean:202, current_humidity:number:200, target_temperature:number:202, anti_freeze:boolean:200, child_lock:boolean:201], serviceConfig keys=[power_down_memory, temp_range, temp_anti_freeze, temp_offset, temp_hysteresis, humidity_offset, id]
dev:11152026-05-03 20:46:02.328
trace
st1820-b08184f672ec: ensureServiceConfig: cache hit
dev:11152026-05-03 20:46:02.325
trace
st1820-b08184f672ec: ensureVirtualMap: cache hit ([current_temperature:number:201, enable:boolean:202, current_humidity:number:200, target_temperature:number:202, anti_freeze:boolean:200, child_lock:boolean:201])
dev:11152026-05-03 20:46:02.322
trace
st1820-b08184f672ec: { "distributeStatus_input": { "boolean:200": { "last_update_ts": 1777661447, "source": "rpc", "value": false }, "boolean:201": { "last_update_ts": 1777661047, "source": "rpc", "value": false }, "boolean:202": { "last_update_ts": 1777837347, "source": "rpc", "value": true }, "number:200": { "last_update_ts": 1777837283, "source": "sys", "value": 49 }, "number:201": { "last_update_ts": 1777837283, "source": "sys", "value": 23.9 }, "number:202": { "last_update_ts": 1777837518, "source": "sys", "value": 22 } } }
dev:11152026-05-03 20:46:02.315
trace
st1820-b08184f672ec: fetchAndDistribute: parent returned 6 status keys: [boolean:200, boolean:201, boolean:202, number:200, number:201, number:202]
dev:11152026-05-03 20:46:00.366
debug
st1820-b08184f672ec: scheduledPoll() triggered
Then logs from the app:
app:15282026-05-03 21:01:02.052
debug
componentLinkedgoFetchStatus: st1820-b08184f672ec returning 6 component statuses: [boolean:200, boolean:201, boolean:202, number:200, number:201, number:202]
app:15282026-05-03 21:01:02.007
trace
componentLinkedgoFetchStatus: raw response={ "dst": "linkedgoFetchStatus", "id": 0, "result": { "cfg_rev": 39, "components": [ { "key": "ble", "status": { } }, { "attrs": { "owner": "service:0", "role": "anti_freeze" }, "key": "boolean:200", "status": { "last_update_ts": 1777838128, "source": "sys", "value": false } }, { "attrs": { "owner": "service:0", "role": "child_lock" }, "key": "boolean:201", "status": { "last_update_ts": 1777837920, "source": "sys", "value": false } }, { "attrs": { "owner": "service:0", "role": "enable" }, "key": "boolean:202", "status": { "last_update_ts": 1777837347, "source": "rpc", "value": true } }, { "key": "bthome", "status": { "errors": [ "bluetooth_disabled" ] } }, { "key": "cloud", "status": { "connected": false } }, { "key": "mqtt", "status": { "connected": false } }, { "attrs": { "owner": "service:0", "role": "current_humidity" }, "key": "number:200", "status": { "last_update_ts": 1777838123, "source": "sys", "value": 48 } }, { "attrs": { "owner": "service:0", "role": "current_temperature" }, "key": "number:201", "status": { "last_update_ts": 1777838423, "source": "sys", "value": 24.1 } }, { "attrs": { "owner": "service:0", "role": "target_temperature" }, "key": "number:202", "status": { "last_update_ts": 1777837518, "source": "sys", "value": 22 } }, { "key": "service:0", "status": { "etag": "b1e382fe2058d34efebf0847fa088284", "state": "running", "stats": { "mem": 800, "mem_peak": 960 } } }, { "key": "sys", "status": { "available_updates": { }, "btrelay_rev": 0, "cfg_rev": 39, "fs_free": 585728, "fs_size": 1048576, "kvs_rev": 0, "last_sync_ts": 1777837953, "mac": "B08184F672EC", "ram_free": 112896, "ram_min_free": 91312, "ram_size": 253116, "reset_reason": 1, "restart_required": false, "schedule_rev": 0, "time": "21:00", "unixtime": 1777838459, "uptime": 185919, "webhook_rev": 1 } }, { "key": "wifi", "status": { "rssi": -31, "ssid": "HomeLAN", "sta_ip": "192.168.1.43", "status": "got ip" } }, { "key": "ws", "status": { "connected": false } } ], "offset": 0, "total": 14 }, "src": "st1820-b08184f672ec" }
app:15282026-05-03 21:01:01.690
trace
postCommandSync returned from http://192.168.1.43/rpc: { "dst": "linkedgoFetchStatus", "id": 0, "result": { "cfg_rev": 39, "components": [ { "key": "ble", "status": { } }, { "attrs": { "owner": "service:0", "role": "anti_freeze" }, "key": "boolean:200", "status": { "last_update_ts": 1777838128, "source": "sys", "value": false } }, { "attrs": { "owner": "service:0", "role": "child_lock" }, "key": "boolean:201", "status": { "last_update_ts": 1777837920, "source": "sys", "value": false } }, { "attrs": { "owner": "service:0", "role": "enable" }, "key": "boolean:202", "status": { "last_update_ts": 1777837347, "source": "rpc", "value": true } }, { "key": "bthome", "status": { "errors": [ "bluetooth_disabled" ] } }, { "key": "cloud", "status": { "connected": false } }, { "key": "mqtt", "status": { "connected": false } }, { "attrs": { "owner": "service:0", "role": "current_humidity" }, "key": "number:200", "status": { "last_update_ts": 1777838123, "source": "sys", "value": 48 } }, { "attrs": { "owner": "service:0", "role": "current_temperature" }, "key": "number:201", "status": { "last_update_ts": 1777838423, "source": "sys", "value": 24.1 } }, { "attrs": { "owner": "service:0", "role": "target_temperature" }, "key": "number:202", "status": { "last_update_ts": 1777837518, "source": "sys", "value": 22 } }, { "key": "service:0", "status": { "etag": "b1e382fe2058d34efebf0847fa088284", "state": "running", "stats": { "mem": 800, "mem_peak": 960 } } }, { "key": "sys", "status": { "available_updates": { }, "btrelay_rev": 0, "cfg_rev": 39, "fs_free": 585728, "fs_size": 1048576, "kvs_rev": 0, "last_sync_ts": 1777837953, "mac": "B08184F672EC", "ram_free": 112896, "ram_min_free": 91312, "ram_size": 253116, "reset_reason": 1, "restart_required": false, "schedule_rev": 0, "time": "21:00", "unixtime": 1777838459, "uptime": 185919, "webhook_rev": 1 } }, { "key": "wifi", "status": { "rssi": -31, "ssid": "HomeLAN", "sta_ip": "192.168.1.43", "status": "got ip" } }, { "key": "ws", "status": { "connected": false } } ], "offset": 0, "total": 14 }, "src": "st1820-b08184f672ec" }
app:15282026-05-03 21:01:01.392
trace
postCommandSync sending to http://192.168.1.43/rpc: { "uri": "http://192.168.1.43/rpc", "contentType": "application/json", "requestContentType": "application/json", "body": { "id": 0, "src": "linkedgoFetchStatus", "method": "Shelly.GetComponents", "params": { "include": [ "status" ] } }, "timeout": 10 }
app:15282026-05-03 21:01:01.327
trace
componentLinkedgoFetchStatus: URI=http://192.168.1.43/rpc request={"id":0,"src":"linkedgoFetchStatus","method":"Shelly.GetComponents","params":{"include":["status"]}}
app:15282026-05-03 21:00:13.184
trace
watchdogProcessResults: no mDNS entries found
app:15282026-05-03 21:00:12.163
trace
watchdogProcessResults: checking for IP changes
app:15282026-05-03 21:00:03.014
debug
componentLinkedgoFetchStatus: st1820-b08184f672ec returning 6 component statuses: [boolean:200, boolean:201, boolean:202, number:200, number:201, number:202]
app:15282026-05-03 21:00:03.009
trace
componentLinkedgoFetchStatus: raw response={ "dst": "linkedgoFetchStatus", "id": 0, "result": { "cfg_rev": 39, "components": [ { "key": "ble", "status": { } }, { "attrs": { "owner": "service:0", "role": "anti_freeze" }, "key": "boolean:200", "status": { "last_update_ts": 1777838128, "source": "sys", "value": false } }, { "attrs": { "owner": "service:0", "role": "child_lock" }, "key": "boolean:201", "status": { "last_update_ts": 1777837920, "source": "sys", "value": false } }, { "attrs": { "owner": "service:0", "role": "enable" }, "key": "boolean:202", "status": { "last_update_ts": 1777837347, "source": "rpc", "value": true } }, { "key": "bthome", "status": { "errors": [ "bluetooth_disabled" ] } }, { "key": "cloud", "status": { "connected": false } }, { "key": "mqtt", "status": { "connected": false } }, { "attrs": { "owner": "service:0", "role": "current_humidity" }, "key": "number:200", "status": { "last_update_ts": 1777838123, "source": "sys", "value": 48 } }, { "attrs": { "owner": "service:0", "role": "current_temperature" }, "key": "number:201", "status": { "last_update_ts": 1777838303, "source": "sys", "value": 24.2 } }, { "attrs": { "owner": "service:0", "role": "target_temperature" }, "key": "number:202", "status": { "last_update_ts": 1777837518, "source": "sys", "value": 22 } }, { "key": "service:0", "status": { "etag": "b1e382fe2058d34efebf0847fa088284", "state": "running", "stats": { "mem": 800, "mem_peak": 960 } } }, { "key": "sys", "status": { "available_updates": { }, "btrelay_rev": 0, "cfg_rev": 39, "fs_free": 585728, "fs_size": 1048576, "kvs_rev": 0, "last_sync_ts": 1777837953, "mac": "B08184F672EC", "ram_free": 112596, "ram_min_free": 91312, "ram_size": 253092, "reset_reason": 1, "restart_required": false, "schedule_rev": 0, "time": "21:00", "unixtime": 1777838400, "uptime": 185860, "webhook_rev": 1 } }, { "key": "wifi", "status": { "rssi": -31, "ssid": "HomeLAN", "sta_ip": "192.168.1.43", "status": "got ip" } }, { "key": "ws", "status": { "connected": false } } ], "offset": 0, "total": 14 }, "src": "st1820-b08184f672ec" }
app:15282026-05-03 21:00:02.681
trace
postCommandSync returned from http://192.168.1.43/rpc: { "dst": "linkedgoFetchStatus", "id": 0, "result": { "cfg_rev": 39, "components": [ { "key": "ble", "status": { } }, { "attrs": { "owner": "service:0", "role": "anti_freeze" }, "key": "boolean:200", "status": { "last_update_ts": 1777838128, "source": "sys", "value": false } }, { "attrs": { "owner": "service:0", "role": "child_lock" }, "key": "boolean:201", "status": { "last_update_ts": 1777837920, "source": "sys", "value": false } }, { "attrs": { "owner": "service:0", "role": "enable" }, "key": "boolean:202", "status": { "last_update_ts": 1777837347, "source": "rpc", "value": true } }, { "key": "bthome", "status": { "errors": [ "bluetooth_disabled" ] } }, { "key": "cloud", "status": { "connected": false } }, { "key": "mqtt", "status": { "connected": false } }, { "attrs": { "owner": "service:0", "role": "current_humidity" }, "key": "number:200", "status": { "last_update_ts": 1777838123, "source": "sys", "value": 48 } }, { "attrs": { "owner": "service:0", "role": "current_temperature" }, "key": "number:201", "status": { "last_update_ts": 1777838303, "source": "sys", "value": 24.2 } }, { "attrs": { "owner": "service:0", "role": "target_temperature" }, "key": "number:202", "status": { "last_update_ts": 1777837518, "source": "sys", "value": 22 } }, { "key": "service:0", "status": { "etag": "b1e382fe2058d34efebf0847fa088284", "state": "running", "stats": { "mem": 800, "mem_peak": 960 } } }, { "key": "sys", "status": { "available_updates": { }, "btrelay_rev": 0, "cfg_rev": 39, "fs_free": 585728, "fs_size": 1048576, "kvs_rev": 0, "last_sync_ts": 1777837953, "mac": "B08184F672EC", "ram_free": 112596, "ram_min_free": 91312, "ram_size": 253092, "reset_reason": 1, "restart_required": false, "schedule_rev": 0, "time": "21:00", "unixtime": 1777838400, "uptime": 185860, "webhook_rev": 1 } }, { "key": "wifi", "status": { "rssi": -31, "ssid": "HomeLAN", "sta_ip": "192.168.1.43", "status": "got ip" } }, { "key": "ws", "status": { "connected": false } } ], "offset": 0, "total": 14 }, "src": "st1820-b08184f672ec" }
app:15282026-05-03 21:00:02.241
trace
postCommandSync sending to http://192.168.1.43/rpc: { "uri": "http://192.168.1.43/rpc", "contentType": "application/json", "requestContentType": "application/json", "body": { "id": 0, "src": "linkedgoFetchStatus", "method": "Shelly.GetComponents", "params": { "include": [ "status" ] } }, "timeout": 10 }
app:15282026-05-03 21:00:02.225
trace
componentLinkedgoFetchStatus: URI=http://192.168.1.43/rpc request={"id":0,"src":"linkedgoFetchStatus","method":"Shelly.GetComponents","params":{"include":["status"]}}
app:15282026-05-03 21:00:02.137
trace
Registered mDNS listener: _http._tcp
app:15282026-05-03 21:00:02.129
trace
Registered mDNS listener: _shelly._tcp
app:15282026-05-03 21:00:02.110
trace
watchdogScan: starting mDNS scan for IP changes
Then from the ST1820 device (note as I up the setpoint the output relay comes in and seems to be reported 'DP Value Changed163 - 4 seems to be output relay off, and 3 is on... or something like??
shos_rpc_inst.c:243 service.getresources via WS_in 192.168.1.65:59955
21:01:53
shos_rpc_inst.c:243 service.getinfo via WS_in 192.168.1.65:59955
21:01:53
shos_init.c:94 New min heap free: 91136
21:01:53
shelly_debug.cpp:236 Streaming logs to 192.168.1.65:52384
21:01:53
shos_rpc_inst.c:243 number.set via WS_in 192.168.1.65:59955
21:01:56
shelly_notification:165 Status change of number:202: {"id":202,"source":"rpc"}
21:01:56
shos_rpc_inst.c:243 Shelly.GetComponents via HTTP_in POST 192.168.1.40:35254
21:01:59
[ Tuya ] DP value changed 3 dp value 240 dp type 2 value type number
21:02:23
shelly_notification:165 Status change of number:201: {"id":201,"value":24}
21:02:23
[ Tuya ] DP value changed 2 dp value 250 dp type 2 value type number
21:02:38
shelly_notification:165 Status change of number:202: {"id":202,"source":"sys","value":25}
21:02:38
[ Tuya ] DP value changed 2 dp value 270 dp type 2 value type number
21:02:40
[ Tuya ] DP value changed 163 dp value 3 dp type 4 value type number
21:02:40
shelly_notification:165 Status change of number:202: {"id":202,"value":27}
21:02:40
shos_rpc_inst.c:243 Shelly.GetComponents via HTTP_in POST 192.168.1.40:35332
21:02:59
shos_rpc_inst.c:243 Shelly.GetComponents via HTTP_in POST 192.168.1.40:35424
21:03:59
[ Tuya ] DP value changed 2 dp value 230 dp type 2 value type number
21:04:05
shelly_notification:165 Status change of number:202: {"id":202,"value":23}
21:04:05
[ Tuya ] DP value changed 163 dp value 4 dp type 4 value type number
21:04:07
[ Tuya ] DP value changed 3 dp value 238 dp type 2 value type number
21:04:24
shelly_notification:165 Status change of number:201: {"id":201,"value":23.8}
21:04:24
shos_rpc_inst.c:243 Shelly.GetComponents via HTTP_in POST 192.168.1.40:35512
21:05:00
Hi Daniel,
One other thought - could you add the 'Thermostat' capability in the device driver to allow the Hubitat to see the device as a Thermostat? It makes the integration into heating schedules simpler.
Only other issue I am seeing is that after a reboot of the ST1820 the read temperature seems to freeze at the default of 20.0 degC. An intervention at the ST1820 (web or local control) then seems to allow correct data to be upated to the Hubitat. This appears to be an issue with the ST1820....
Regards
Andy
What sort of intervention? I might be able to bake that into the driver so it's automatic.
From what I can see here in logs, the actual operating state on the device isn't exposed on RPC. The driver is updated to use current_temperature vs. target_temperature using the device's own temp_hysteresis (read from Service.GetConfig , fallback 0.5 °C) to calculate the current operating state.
The other quirk with the device is that "switch" will reflect the state of the device's heat output relay, but on/off doesn't directly control that, it will instead control having the device on/in sleep mode.
Let me know what "intervention" you're doing and I'll get that plus the changes based on the latest logs and your comments put out in a new version here later today.
Hi Daniel, by intervention I mean I went onto the device's inbuilt web page and changed the setpoint. Up until then the setpoint and measured temperature reflected in the Hubitat driver status were the default values after the addition of a new device. This seems to indicate it's a device issue rather than an issue with your code or the Hubitat framework. Once comms is running it seems rock steady.
The switch status in the device code is simply reflecting whether the ST1820 is enabled or not. The device command switch ON/OFF is simply enabling the Thermostat to operate or not. As you say there's no obvious feedback of the output relay state. This doesnt worry me, as I don't need the output relay as I do my own thing to create a PWM output based on temperature difference to target, but I was offering to help get this output relay state captured if at all feasible. It sounds like it isn't.
Once again many thanks for your work,.
Regards
Andy
Hmm, did a reboot to see if this would kick off the communication again and the Shelly Manager app has disappeared:
So, perhaps the 'null' the driver is reporting is more to do with the parent app corrupting?
There are no longer any log entries for the app, so looks like to get this working I will need to delete the driver, reinstall the app then reinstall the driver.
PS I am running firmware version 2.5.0.126 - the latest supported release.
Regards
Andy
Hi Daniel,
I'm afraid the ST1820 has stopped communicating again at 00:17:
When I check the installed apps, again the Shelly Manager is no longer there, so definitely looks like an app issue.
Nothing in the logs of any use either:
Any thoughts?
Regards
Andy
OK, there's a new update out that should address all these issues. I put in a download sha verification. I think that perhaps you're running into some sort of file transfer issue that causes the app to improperly update. Hubitat shouldn't let it update and safely fail on the update, but maybe it's somehow failing in a way that causes it to uninstall itself.
Also put in some more fixes regarding the thermostat itself to address the issues recently described with it, as well.
Hi Daniel,
Apologies for the late update - I was away for the weekend. I'm afraid this now adds the device, reads the data once then stops working. To check this properly, I've deleted the app and driver instance, updaated the hubitat, then reloaded the app and recreated the ST1820 device. App log shows:
app:15342026-05-11 18:12:13.320
info
Unknown webhook event 'text.change' available on st1820-b08184f672ec — not configured in webhookDefinitions
app:15342026-05-11 18:12:13.314
info
Unknown webhook event 'object.change' available on st1820-b08184f672ec — not configured in webhookDefinitions
app:15342026-05-11 18:12:13.307
info
Unknown webhook event 'button.triple_push' available on st1820-b08184f672ec — not configured in webhookDefinitions
app:15342026-05-11 18:12:13.300
info
Unknown webhook event 'button.single_push' available on st1820-b08184f672ec — not configured in webhookDefinitions
app:15342026-05-11 18:12:13.294
info
Unknown webhook event 'button.long_push' available on st1820-b08184f672ec — not configured in webhookDefinitions
app:15342026-05-11 18:12:13.287
info
Unknown webhook event 'button.double_push' available on st1820-b08184f672ec — not configured in webhookDefinitions
app:15342026-05-11 18:12:13.280
info
Unknown webhook event 'bthomedevice.triple_push' available on st1820-b08184f672ec — not configured in webhookDefinitions
app:15342026-05-11 18:12:13.273
info
Unknown webhook event 'bthomedevice.single_push' available on st1820-b08184f672ec — not configured in webhookDefinitions
app:15342026-05-11 18:12:13.266
info
Unknown webhook event 'bthomedevice.rotate_right' available on st1820-b08184f672ec — not configured in webhookDefinitions
app:15342026-05-11 18:12:13.259
info
Unknown webhook event 'bthomedevice.rotate_left' available on st1820-b08184f672ec — not configured in webhookDefinitions
app:15342026-05-11 18:12:13.252
info
Unknown webhook event 'bthomedevice.long_triple_push' available on st1820-b08184f672ec — not configured in webhookDefinitions
app:15342026-05-11 18:12:13.245
info
Unknown webhook event 'bthomedevice.long_push' available on st1820-b08184f672ec — not configured in webhookDefinitions
app:15342026-05-11 18:12:13.238
info
Unknown webhook event 'bthomedevice.long_double_push' available on st1820-b08184f672ec — not configured in webhookDefinitions
app:15342026-05-11 18:12:13.218
info
Unknown webhook event 'bthomedevice.double_push' available on st1820-b08184f672ec — not configured in webhookDefinitions
app:15342026-05-11 18:12:12.720
info
════════════════════════════════════════════════════════════
app:15342026-05-11 18:12:12.715
info
✓ DEVICE CREATION COMPLETE: st1820-b08184f672ec
app:15342026-05-11 18:12:12.710
info
════════════════════════════════════════════════════════════
app:15342026-05-11 18:12:12.704
info
Reinitialization complete for 192.168.1.43
app:15342026-05-11 18:12:12.487
info
No actions required for this device
app:15342026-05-11 18:12:12.480
info
Unknown webhook event 'text.change' available on st1820-b08184f672ec — not configured in webhookDefinitions
app:15342026-05-11 18:12:12.473
info
Unknown webhook event 'object.change' available on st1820-b08184f672ec — not configured in webhookDefinitions
app:15342026-05-11 18:12:12.464
info
Unknown webhook event 'button.triple_push' available on st1820-b08184f672ec — not configured in webhookDefinitions
app:15342026-05-11 18:12:12.458
info
Unknown webhook event 'button.single_push' available on st1820-b08184f672ec — not configured in webhookDefinitions
app:15342026-05-11 18:12:12.451
info
Unknown webhook event 'button.long_push' available on st1820-b08184f672ec — not configured in webhookDefinitions
app:15342026-05-11 18:12:12.444
info
Unknown webhook event 'button.double_push' available on st1820-b08184f672ec — not configured in webhookDefinitions
app:15342026-05-11 18:12:12.436
info
Unknown webhook event 'bthomedevice.triple_push' available on st1820-b08184f672ec — not configured in webhookDefinitions
app:15342026-05-11 18:12:12.429
info
Unknown webhook event 'bthomedevice.single_push' available on st1820-b08184f672ec — not configured in webhookDefinitions
app:15342026-05-11 18:12:12.422
info
Unknown webhook event 'bthomedevice.rotate_right' available on st1820-b08184f672ec — not configured in webhookDefinitions
app:15342026-05-11 18:12:12.415
info
Unknown webhook event 'bthomedevice.rotate_left' available on st1820-b08184f672ec — not configured in webhookDefinitions
app:15342026-05-11 18:12:12.408
info
Unknown webhook event 'bthomedevice.long_triple_push' available on st1820-b08184f672ec — not configured in webhookDefinitions
app:15342026-05-11 18:12:12.401
info
Unknown webhook event 'bthomedevice.long_push' available on st1820-b08184f672ec — not configured in webhookDefinitions
app:15342026-05-11 18:12:12.394
info
Unknown webhook event 'bthomedevice.long_double_push' available on st1820-b08184f672ec — not configured in webhookDefinitions
app:15342026-05-11 18:12:12.387
info
Unknown webhook event 'bthomedevice.double_push' available on st1820-b08184f672ec — not configured in webhookDefinitions
app:15342026-05-11 18:12:11.764
info
Registered auto-generated driver: ShellyDeviceManager.Shelly Linkedgo ST1820 v1.0.50 with components: [service:0]
app:15342026-05-11 18:12:11.754
info
New version: 6
app:15342026-05-11 18:12:11.750
info
Driver ID: 1946
app:15342026-05-11 18:12:11.729
info
✓ Driver updated successfully!
app:15342026-05-11 18:11:56.460
info
Driver already exists (ID: 1946), updating...
app:15342026-05-11 18:11:56.057
info
Installing/updating generated driver...
app:15342026-05-11 18:11:56.052
info
Downloaded pre-built driver 'Shelly Linkedgo ST1820' as 'Shelly Linkedgo ST1820 v1.0.50' (30181 chars)
app:15342026-05-11 18:11:55.988
info
Downloading pre-built driver from: https://raw.githubusercontent.com/ShellyUSA/Hubitat-Drivers/master/UniversalDrivers/ShellyLinkedgoST1820.groovy
app:15342026-05-11 18:11:55.977
info
Found service component: service:0
app:15342026-05-11 18:11:55.972
info
Discovered device has input(s): 0
app:15342026-05-11 18:11:55.868
info
Discovered device has switch(es): 0
app:15342026-05-11 18:11:55.591
info
Registered auto-generated driver: ShellyDeviceManager.Shelly Linkedgo ST1820 v1.0.50 with components:
app:15342026-05-11 18:11:55.583
info
New version: 5
app:15342026-05-11 18:11:55.578
info
Driver ID: 1946
app:15342026-05-11 18:11:55.557
info
✓ Driver updated successfully!
app:15342026-05-11 18:11:42.984
info
Driver already exists (ID: 1946), updating...
app:15342026-05-11 18:11:42.592
info
Installing/updating generated driver...
app:15342026-05-11 18:11:42.587
info
Downloaded pre-built driver 'Shelly Linkedgo ST1820' as 'Shelly Linkedgo ST1820 v1.0.50' (30181 chars)
app:15342026-05-11 18:11:42.514
info
Downloading pre-built driver from: https://raw.githubusercontent.com/ShellyUSA/Hubitat-Drivers/master/UniversalDrivers/ShellyLinkedgoST1820.groovy
app:15342026-05-11 18:11:42.507
info
Updating parent driver 'Shelly Linkedgo ST1820' from GitHub...
app:15342026-05-11 18:11:42.500
info
Reinitializing device at 192.168.1.43
app:15342026-05-11 18:11:42.438
info
Created device: st1820-b08184f672ec using driver Shelly Linkedgo ST1820 v1.0.50
app:15342026-05-11 18:11:41.008
info
Generation: 3
app:15342026-05-11 18:11:41.005
info
MAC: B08184F672EC
app:15342026-05-11 18:11:41.001
info
Model: S3XT-0S
app:15342026-05-11 18:11:40.997
info
IP: 192.168.1.43
app:15342026-05-11 18:11:40.993
info
Driver: Shelly Linkedgo ST1820 v1.0.50
app:15342026-05-11 18:11:40.989
info
DNI: B08184F672EC
app:15342026-05-11 18:11:40.884
info
════════════════════════════════════════════════════════════
app:15342026-05-11 18:11:40.880
info
STARTING DEVICE CREATION: st1820-b08184f672ec
app:15342026-05-11 18:11:40.875
info
════════════════════════════════════════════════════════════
app:15342026-05-11 18:11:40.850
info
Registered auto-generated driver: ShellyDeviceManager.Shelly Linkedgo ST1820 v1.0.50 with components: [service:0]
app:15342026-05-11 18:11:40.819
info
New version: 4
app:15342026-05-11 18:11:40.815
info
Driver ID: 1946
app:15342026-05-11 18:11:40.792
info
✓ Driver updated successfully!
app:15342026-05-11 18:11:19.377
info
Driver already exists (ID: 1946), updating...
app:15342026-05-11 18:11:18.614
info
Installing/updating generated driver...
app:15342026-05-11 18:11:18.596
info
Downloaded pre-built driver 'Shelly Linkedgo ST1820' as 'Shelly Linkedgo ST1820 v1.0.50' (30181 chars)
app:15342026-05-11 18:11:17.987
info
Downloading pre-built driver from: https://raw.githubusercontent.com/ShellyUSA/Hubitat-Drivers/master/UniversalDrivers/ShellyLinkedgoST1820.groovy
app:15342026-05-11 18:11:17.880
info
Found service component: service:0
app:15342026-05-11 18:11:17.863
info
Discovered device has input(s): 0
app:15342026-05-11 18:11:17.859
info
Discovered device has switch(es): 0
app:15342026-05-11 18:11:17.086
info
Device info/driver not yet available for 192.168.1.43 — fetching now...
app:15342026-05-11 18:11:17.081
info
Creating device for 192.168.1.43
app:15342026-05-11 18:11:17.053
info
Creating device for 192.168.1.43 via config table
app:15342026-05-11 18:11:05.309
info
First install detected, storing app version: 1.0.50
app:15342026-05-11 18:10:59.460
info
Checking for app updates...
app:15342026-05-11 18:10:59.435
info
Manual force update of app requested
app:15342026-05-11 18:10:38.580
debug
Reusing existing cookie
app:15342026-05-11 18:10:38.442
debug
Driver tracking initialized, currently tracking 0 drivers
app:15342026-05-11 18:10:35.698
debug
Reusing existing cookie
app:15342026-05-11 18:10:35.555
debug
App is up to date (current: 1.0.50, latest: 1.0.50)
app:15342026-05-11 18:10:35.316
info
Checking for app updates...
app:15342026-05-11 18:10:35.283
info
Manual force update of app requested
app:15342026-05-11 18:10:31.550
debug
Reusing existing cookie
app:15342026-05-11 18:10:30.463
debug
Reusing existing cookie
app:15342026-05-11 18:10:23.226
debug
Reusing existing cookie
app:15342026-05-11 18:10:22.876
debug
App is up to date (current: 1.0.50, latest: 1.0.50)
app:15342026-05-11 18:10:21.920
info
Checking for app updates...
app:15342026-05-11 18:10:21.909
info
Manual force update of app requested
app:15342026-05-11 18:10:14.238
debug
Got cookie: HUBSESSION=node05t44...
app:15342026-05-11 18:10:14.217
debug
Login response status: 200
app:15342026-05-11 18:10:13.424
debug
ShellyHelper found 5 new device(s), total: 5
app:15342026-05-11 18:10:13.420
debug
Found NEW Shelly (ShellyHelper): Garden Lights at 192.168.1.53 (gen=0, mac=048308DE89E0)
app:15342026-05-11 18:10:13.336
debug
Scheduling async device info fetch for 192.168.1.43 in 500ms
app:15342026-05-11 18:10:13.331
debug
Found NEW Shelly (ShellyHelper): st1820-b08184f672ec at 192.168.1.43 (gen=3, mac=B08184F672EC)
app:15342026-05-11 18:10:13.240
debug
Scheduling async device info fetch for 192.168.1.52 in 400ms
app:15342026-05-11 18:10:13.233
debug
Found NEW Shelly (ShellyHelper): Elec - HW Control at 192.168.1.52 (gen=2, mac=FCB467A68EE0)
app:15342026-05-11 18:10:13.125
debug
Scheduling async device info fetch for 192.168.1.51 in 300ms
app:15342026-05-11 18:10:13.121
debug
Found NEW Shelly (ShellyHelper): Gas - HW & CH control at 192.168.1.51 (gen=2, mac=A0A3B35CE614)
app:15342026-05-11 18:10:13.078
debug
Scheduling async device info fetch for 192.168.1.56 in 200ms
app:15342026-05-11 18:10:13.069
debug
Found NEW Shelly (ShellyHelper): Lamp (Table) - Kitchen at 192.168.1.56 (gen=2, mac=048308DD9514)
app:15342026-05-11 18:10:12.280
debug
startDiscovery: starting discovery for 60 seconds
Then the device log shows:
dev:11182026-05-11 18:11:42.434
error
groovy.lang.GroovyRuntimeException: Cannot read write-only property: schedule on line 180 (method installed)
dev:11182026-05-11 18:11:42.380
info
st1820-b08184f672ec: Heating setpoint: 15.0°C
dev:11182026-05-11 18:11:42.372
info
st1820-b08184f672ec: Temperature: 18.2°C
dev:11182026-05-11 18:11:42.356
info
st1820-b08184f672ec: Thermostat on
Hope you can interpret these OK.
Regards
Andy