Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions drivers/SinuxSoft/britzyhub/fingerprints.yml
Original file line number Diff line number Diff line change
@@ -1,3 +1,15 @@
matterManufacturer:
- id: "4673/32846"
deviceLabel: AIHomeKit
vendorId: 0x1241
productId: 0x804E
deviceProfileName: matter-bridge
- id: "5174/32780"
deviceLabel: BritzyHub
vendorId: 0x1436
productId: 0x800C
deviceProfileName: matter-bridge

matterGeneric:
- id: "elevator"
deviceLabel: Elevator
Expand Down
10 changes: 10 additions & 0 deletions drivers/SinuxSoft/britzyhub/profiles/matter-bridge.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
name: matter-bridge
components:
- id: main
capabilities:
- id: firmwareUpdate
version: 1
- id: refresh
version: 1
categories:
- name: Bridges
7 changes: 6 additions & 1 deletion drivers/SinuxSoft/britzyhub/src/elevator/init.lua
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
local capabilities = require "st.capabilities"
local clusters = require "st.matter.clusters"
local log = require "log"
local britz_utils = require "utils"


local elevator_cap = capabilities.elevatorCall
local onoff_cluster = clusters.OnOff
Expand Down Expand Up @@ -39,8 +41,11 @@ local function component_to_endpoint(device, component_name, cluster_id)
end

local function device_init(driver, device)
device:subscribe()
device:set_component_to_endpoint_fn(component_to_endpoint)
device:extend_device("subscribe", britz_utils.make_subscribe({
[elevator_cap.ID] = { onoff_cluster.attributes.OnOff }
}))
device:subscribe()
end

local function info_changed(driver, device, event, args)
Expand Down
6 changes: 5 additions & 1 deletion drivers/SinuxSoft/britzyhub/src/gas-valve/init.lua
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
local capabilities = require "st.capabilities"
local clusters = require "st.matter.clusters"
local log = require "log"
local britz_utils = require "utils"

local valve_cap = capabilities.safetyValve
local onoff_cluster = clusters.OnOff
Expand Down Expand Up @@ -39,8 +40,11 @@ local function component_to_endpoint(device, component_name, cluster_id)
end

local function device_init(driver, device)
device:subscribe()
device:set_component_to_endpoint_fn(component_to_endpoint)
device:extend_device("subscribe", britz_utils.make_subscribe({
[valve_cap.ID] = { onoff_cluster.attributes.OnOff }
}))
device:subscribe()
end

local function info_changed(driver, device, event, args)
Expand Down
7 changes: 7 additions & 0 deletions drivers/SinuxSoft/britzyhub/src/init.lua
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,14 @@
local MatterDriver = require "st.matter.driver"
local log = require "log"

local function bridge_init(driver, device)

@ctowns ctowns Jul 14, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I wonder if the issue is that there was no subscription being sent my the bridge device if this bridge_init function was not previously populated?

@DongHoon-Ryu could you check if just removing this function causes the issue to occur again during hub replace? And then if adding it back fixes the issue?

The reason I am more suspicious of this is because the other subscribe logic above is very similar to what already exists in the subscribe function, so I'm not sure yet how that is providing a change in functionality.

@KyuminAhn KyuminAhn Jul 17, 2026

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I ran the test you asked for.
With bridge_init removed and the rest of the changes left in place, after a hub replace:

  • Toggling on/off from the device list screen in the SmartThings app still works.
  • But opening an individual device's detail view and toggling on/off fails with a connection error
  • ("There was a problem with the connection" - you can see the pic attached
Screenshot_20260717_211910_SmartThings ).

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

HI @KyuminAhn, would you mind providing hub logs around the time of the error you are seeing in the app? Thank you

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@hcarter-775 Please check MTR-1083. If additional logs are needed, please leave a comment on the ticket.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you for testing this!

Based on this, I believe this shows that the part of these changes that were fixing this issue are isolated to this file. Therefore, to move forward, I propose that we keep the changes in these files:

  • drivers/SinuxSoft/britzyhub/src/init.lua
  • drivers/SinuxSoft/britzyhub/fingerprints.yml
  • drivers/SinuxSoft/britzyhub/profiles/matter-bridge.yml

But I do not believe the changes in the sub drivers are neccessary, so we could remove the changes in the remaining files:

  • drivers/SinuxSoft/britzyhub/src/elevator/init.lua
  • drivers/SinuxSoft/britzyhub/src/gas-valve/init.lua
  • drivers/SinuxSoft/britzyhub/src/vent/init.lua
  • drivers/SinuxSoft/britzyhub/src/utils.lua

My comment on the ticket has more detail. I believe if we adjust the changes as I have mentioned above and re-test, we should see that the subscription is now handled properly without the need to add additional sub driver changes. Please let me know if you have any questions!

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@ctowns Problems continue to occur when only the files you suggested are modified. Please refer to the comments in MTR-1083.

device:subscribe()
end

local matter_driver = MatterDriver("britzyhub-matter", {
lifecycle_handlers = {
init = bridge_init,
},
sub_drivers = {
require ("elevator"),
require ("gas-valve"),
Expand Down
33 changes: 33 additions & 0 deletions drivers/SinuxSoft/britzyhub/src/utils.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
-- SinuxSoft (c) 2025
-- Licensed under the Apache License, Version 2.0

local im = require "st.matter.interaction_model"
local log = require "log"

local utils = {}

-- Sends subscription request directly via device:send(), following the matter-switch pattern.
-- The default device:subscribe() reuses cached sessions, which causes timeout after hub
-- replacement because the hub Node ID changes and all sessions expire.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am surprised that we have not seen this issue in other devices during hub replace, but overall the changes make sense and I think we can move forward. I am still not confident in the root cause, but these changes are well understood and follow along with other examples (see our default lua libs handling, or see how subscriptions are handled the matter-switch driver for a comparison). So, I think we can move forward with these changes since they will resolve the issue now, but we should try to better understand the root cause and investigate as we move on.

-- device:send() creates a new session directly, so it works correctly after hub replacement.
function utils.make_subscribe(subscribed_attributes)
return function(device)
local subscribe_request = im.InteractionRequest(im.InteractionRequest.RequestType.SUBSCRIBE, {})
for cap_id, attributes in pairs(subscribed_attributes) do
if device:supports_capability_by_id(cap_id) then
for _, attr in ipairs(attributes) do
local cluster_id = (attr._cluster and attr._cluster.ID) or attr.cluster
local attr_id = attr.ID or attr.attribute
local ib = im.InteractionInfoBlock(nil, cluster_id, attr_id)
subscribe_request:with_info_block(ib)
end
end
end
if #subscribe_request.info_blocks > 0 then
log.info_with({hub_logs=true}, string.format("[britzyhub] subscribe via send: %d blocks", #subscribe_request.info_blocks))
device:send(subscribe_request)
end
end
end

return utils
4 changes: 3 additions & 1 deletion drivers/SinuxSoft/britzyhub/src/vent/init.lua
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
local capabilities = require "st.capabilities"
local clusters = require "st.matter.clusters"
local log = require "log"
local britz_utils = require "utils"

local VENTILATOR_DEVICE_TYPE_ID = 0xFF03

Expand Down Expand Up @@ -101,9 +102,10 @@ local function set_fan_mode(driver, device, cmd)
end

local function device_init(driver, device)
device:subscribe()
device:set_component_to_endpoint_fn(component_to_endpoint)
device:set_endpoint_to_component_fn(endpoint_to_component)
device:extend_device("subscribe", britz_utils.make_subscribe(subscribed_attributes))
device:subscribe()
end

local function info_changed(driver, device, event, args)
Expand Down
Loading