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.

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.
-- 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