Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
7c945d0
add firstled-io_M2S2BAC (#3054)
thinkaName Jul 14, 2026
0bc3f6d
add firstled-io_M1S1BAC (#3055)
thinkaName Jul 14, 2026
eb2f3b6
add firstled-io_DL1S1BAC (#3056)
thinkaName Jul 14, 2026
e6cc489
add firstled-io_DL2S2BAC (#3057)
thinkaName Jul 14, 2026
22ed345
add firstled-io_DL3S3BAC (#3058)
thinkaName Jul 14, 2026
795d63a
add firstled-io_DL4S4BAC (#3059)
thinkaName Jul 14, 2026
d132e86
add firstled-io_G1S1BAC (#3060)
thinkaName Jul 14, 2026
4320d74
add firstled-io_G2S2BAC (#3061)
thinkaName Jul 15, 2026
1fbeb0e
add firstled-io_G3S3BAC (#3062)
thinkaName Jul 15, 2026
1a4b258
add firstled-io_MX1S2BAC (#3063)
thinkaName Jul 15, 2026
4f1da83
add firstled-io_MX2S2BAC (#3064)
thinkaName Jul 15, 2026
f884d83
add firstled-io_MX3S2BAC (#3065)
thinkaName Jul 15, 2026
a46cfc2
add firstled-io_MX4S2BAC (#3066)
thinkaName Jul 15, 2026
eacd051
add firstled-io_P1S1BAC (#3067)
thinkaName Jul 15, 2026
fb83efe
add firstled-io_P2S2BAC (#3068)
thinkaName Jul 15, 2026
0adce65
add firstled-io_P3S3BAC (#3069)
thinkaName Jul 15, 2026
fe336b6
Matter Switch: Support 3R Garage Door Subdriver (#2702)
hcarter-775 Jul 10, 2026
074ee39
Merge pull request #2858 from JanJakubiszyn/Hager_WAASYS_device_support
hcarter-775 Jul 1, 2026
aa38369
Merge pull request #3085 from JanJakubiszyn/revert-2858-Hager_WAASYS_…
hcarter-775 Jul 2, 2026
95a26a6
fix: reapply Hager WAASYS device support (#3104)
JanJakubiszyn Jul 15, 2026
4b77007
add firstled-io_M3S3BAC (#3053)
thinkaName Jul 15, 2026
841fd6f
Zigbee Humidity Sensor: Add category to profile (#3117)
hcarter-775 Jul 13, 2026
cc0a3af
WWSTCERT-12695 Smart WiFi Outdoor Plug (#3123)
cbaumler Jul 21, 2026
282a3f1
Matter Lock: Update deprecated fingerprints (#3138)
HunsupJung Jul 22, 2026
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
20 changes: 10 additions & 10 deletions drivers/SmartThings/matter-lock/fingerprints.yml
Original file line number Diff line number Diff line change
Expand Up @@ -117,48 +117,48 @@ matterManufacturer:
deviceLabel: Level Lock Plus (Matter)
vendorId: 0x129F
productId: 0x0001
deviceProfileName: lock-nocodes-notamper-batteryLevel
deviceProfileName: lock
- id: "4767/3"
deviceLabel: Level Bolt (Matter)
vendorId: 0x129F
productId: 0x0003
deviceProfileName: lock-nocodes-notamper-batteryLevel
deviceProfileName: lock
- id: "4767/4"
deviceLabel: Level Lock Pro
vendorId: 0x129F
productId: 0x0004
deviceProfileName: lock-nocodes-notamper-batteryLevel
deviceProfileName: lock
- id: "4767/5"
deviceLabel: Level Lock (Matter)
vendorId: 0x129F
productId: 0x0005
deviceProfileName: lock-nocodes-notamper-batteryLevel
deviceProfileName: lock
#Nuki
- id: "4957/161"
deviceLabel: Nuki Smart Lock Ultra
vendorId: 0x135D
productId: 0x00A1
deviceProfileName: lock-nocodes-notamper
deviceProfileName: lock
- id: "Nuki Smart Lock"
deviceLabel: Nuki Smart Lock
vendorId: 0x135d
productId: 0xb0
deviceProfileName: lock-nocodes-notamper
deviceProfileName: lock
- id: "Nuki Smart Lock Pro"
deviceLabel: Nuki Smart Lock Pro
vendorId: 0x135d
productId: 0xb1
deviceProfileName: lock-nocodes-notamper
deviceProfileName: lock
- id: "4957/178"
deviceLabel: Nuki Smart Lock Pro
vendorId: 0x135D
productId: 0x00B2
deviceProfileName: lock-nocodes-notamper
deviceProfileName: lock
- id: "4957/193"
deviceLabel: Nuki Smart Lock Go
vendorId: 0x135D
productId: 0x00C1
deviceProfileName: lock-nocodes-notamper
deviceProfileName: lock
#U-tec
- id: "5247/1"
deviceLabel: ULTRALOQ Bolt Fingerprint Smart Matter Deadbolt
Expand Down Expand Up @@ -202,4 +202,4 @@ matterGeneric:
deviceLabel: Matter Door Lock
deviceTypes:
- id: 0x000A # Door Lock
deviceProfileName: base-lock
deviceProfileName: lock
30 changes: 30 additions & 0 deletions drivers/SmartThings/matter-switch/fingerprints.yml
Original file line number Diff line number Diff line change
Expand Up @@ -269,6 +269,11 @@ matterManufacturer:
vendorId: 0x1407
productId: 0x1388
deviceProfileName: 12-button-keyboard
- id: "5127/4248"
deviceLabel: Smart Garage Door Opener
vendorId: 0x1407
productId: 0x1098
deviceProfileName: garage-door-battery

#Edishine
- id: "5458/3328"
Expand Down Expand Up @@ -904,6 +909,26 @@ matterManufacturer:
vendorId: 0x1285
productId: 0x0009
deviceProfileName: 4-button-batteryLevel
- id: "4741/5"
deviceLabel: Hager Switch 1G
vendorId: 0x1285
productId: 0x0005
deviceProfileName: matter-bridge
- id: "4741/6"
deviceLabel: Hager Switch 2G
vendorId: 0x1285
productId: 0x0006
deviceProfileName: matter-bridge
- id: "4741/7"
deviceLabel: Hager PIR 1.1M
vendorId: 0x1285
productId: 0x0007
deviceProfileName: matter-bridge
- id: "4741/10"
deviceLabel: Hager PIR 2.2M
vendorId: 0x1285
productId: 0x000A
deviceProfileName: matter-bridge
# HAOJAI
- id: "5530/4113"
deviceLabel: HAOJAI Smart Switch 3-key
Expand Down Expand Up @@ -4174,6 +4199,11 @@ matterManufacturer:
vendorId: 0x1392
productId: 0x0106
deviceProfileName: plug-power-energy-powerConsumption
- id: "5010/276"
deviceLabel: Smart WiFi Outdoor Plug
vendorId: 0x1392
productId: 0x0114
deviceProfileName: plug-energy-powerConsumption
#GIANT LIGHTING
- id: "5707/1"
deviceLabel: Floor Lamp
Expand Down
14 changes: 14 additions & 0 deletions drivers/SmartThings/matter-switch/profiles/garage-door-battery.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
name: garage-door-battery
components:
- id: main
capabilities:
- id: doorControl
version: 1
- id: battery
version: 1
- id: firmwareUpdate
version: 1
- id: refresh
version: 1
categories:
- name: GarageDoor
14 changes: 14 additions & 0 deletions drivers/SmartThings/matter-switch/profiles/motion-illuminance.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
name: motion-illuminance
components:
- id: main
capabilities:
- id: motionSensor
version: 1
- id: illuminanceMeasurement
version: 1
- id: firmwareUpdate
version: 1
- id: refresh
version: 1
categories:
- name: MotionSensor
21 changes: 21 additions & 0 deletions drivers/SmartThings/matter-switch/profiles/window-covering.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
name: window-covering
components:
- id: main
capabilities:
- id: windowShade
version: 1
- id: windowShadePreset
version: 1
- id: windowShadeLevel
version: 1
- id: firmwareUpdate
version: 1
- id: refresh
version: 1
categories:
- name: Blind
preferences:
- preferenceId: presetPosition
explicit: true
- preferenceId: reverse
explicit: true
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

local cluster_base = require "st.matter.cluster_base"
local DescriptorServerAttributes = require "embedded_clusters.Descriptor.server.attributes"
local DescriptorTypes = require "embedded_clusters.Descriptor.types"

local Descriptor = {}

Expand All @@ -11,9 +12,11 @@ Descriptor.NAME = "Descriptor"
Descriptor.server = {}
Descriptor.client = {}
Descriptor.server.attributes = DescriptorServerAttributes:set_parent_cluster(Descriptor)
Descriptor.types = DescriptorTypes

function Descriptor:get_attribute_by_id(attr_id)
local attr_id_map = {
[0x0000] = "DeviceTypeList",
[0x0003] = "PartsList",
}
local attr_name = attr_id_map[attr_id]
Expand All @@ -33,6 +36,7 @@ function Descriptor:get_server_command_by_id(command_id)
end

Descriptor.attribute_direction_map = {
["DeviceTypeList"] = "server",
["PartsList"] = "server",
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
-- Copyright © 2026 SmartThings, Inc.
-- Licensed under the Apache License, Version 2.0

local cluster_base = require "st.matter.cluster_base"
local data_types = require "st.matter.data_types"
local TLVParser = require "st.matter.TLV.TLVParser"

local DeviceTypeList = {
ID = 0x0000,
NAME = "DeviceTypeList",
base_type = require "st.matter.data_types.Array",
element_type = require "embedded_clusters.Descriptor.types.DeviceTypeStruct",
}

function DeviceTypeList:augment_type(data_type_obj)
for i, v in ipairs(data_type_obj.elements) do
data_type_obj.elements[i] = data_types.validate_or_build_type(v, DeviceTypeList.element_type)
end
end

function DeviceTypeList:new_value(...)
local o = self.base_type(table.unpack({ ... }))
return o
end

function DeviceTypeList:read(device, endpoint_id)
return cluster_base.read(
device,
endpoint_id,
self._cluster.ID,
self.ID,
nil
)
end

function DeviceTypeList:subscribe(device, endpoint_id)
return cluster_base.subscribe(
device,
endpoint_id,
self._cluster.ID,
self.ID,
nil
)
end

function DeviceTypeList:set_parent_cluster(cluster)
self._cluster = cluster
return self
end

function DeviceTypeList:build_test_report_data(
device,
endpoint_id,
value,
status
)
local data = data_types.validate_or_build_type(value, self.base_type)
self:augment_type(data)

return cluster_base.build_test_report_data(
device,
endpoint_id,
self._cluster.ID,
self.ID,
data,
status
)
end

function DeviceTypeList:deserialize(tlv_buf)
local data = TLVParser.decode_tlv(tlv_buf)
self:augment_type(data)
return data
end

setmetatable(DeviceTypeList, { __call = DeviceTypeList.new_value, __index = DeviceTypeList.base_type })
return DeviceTypeList

Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
-- Copyright 2026 SmartThings
-- Licensed under the Apache License, Version 2.0

local data_types = require "st.matter.data_types"
local StructureABC = require "st.matter.data_types.base_defs.StructureABC"

local DeviceTypeStruct = {}
local new_mt = StructureABC.new_mt({ NAME = "DeviceTypeStruct", ID = data_types.name_to_id_map["Structure"] })

DeviceTypeStruct.field_defs = {
{
name = "device_type",
field_id = 0,
is_nullable = false,
is_optional = false,
data_type = require "st.matter.data_types.Uint32",
},
{
name = "revision",
field_id = 1,
is_nullable = false,
is_optional = false,
data_type = require "st.matter.data_types.Uint16",
},
}

DeviceTypeStruct.init = function(cls, tbl)
local o = {}
o.elements = {}
o.num_elements = 0
setmetatable(o, new_mt)
for _idx, field_def in ipairs(cls.field_defs) do
-- Note: _idx is 1 when field_id is 0
if (not field_def.is_optional and not field_def.is_nullable) and not tbl[field_def.name] then
error("Missing non optional or non_nullable field: " .. field_def.name)
elseif not (field_def.is_optional and tbl[field_def.name] == nil) then
o.elements[field_def.name] = data_types.validate_or_build_type(tbl[field_def.name], field_def.data_type, field_def.name)
o.elements[field_def.name].field_id = field_def.field_id
o.num_elements = o.num_elements + 1
end
end
return o
end

DeviceTypeStruct.serialize = function(self, buf, include_control, tag)
return data_types['Structure'].serialize(self.elements, buf, include_control, tag)
end

new_mt.__call = DeviceTypeStruct.init
new_mt.__index.serialize = DeviceTypeStruct.serialize

DeviceTypeStruct.augment_type = function(self, val)
local elems = {}
local num_elements = 0
for _, v in pairs(val.elements) do
for _, field_def in ipairs(self.field_defs) do
if field_def.field_id == v.field_id and
field_def.is_nullable and
(v.value == nil and v.elements == nil) then
elems[field_def.name] = data_types.validate_or_build_type(v, data_types.Null, field_def.field_name)
num_elements = num_elements + 1
elseif field_def.field_id == v.field_id and not
(field_def.is_optional and v.value == nil and v.elements == nil) then
elems[field_def.name] = data_types.validate_or_build_type(v, field_def.data_type, field_def.field_name)
num_elements = num_elements + 1
if field_def.element_type ~= nil then
for i, e in ipairs(elems[field_def.name].elements) do
elems[field_def.name].elements[i] = data_types.validate_or_build_type(e, field_def.element_type)
end
end
end
end
end
val.elements = elems
val.num_elements = num_elements
setmetatable(val, new_mt)
end

setmetatable(DeviceTypeStruct, new_mt)

return DeviceTypeStruct

Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
-- Copyright 2026 SmartThings
-- Licensed under the Apache License, Version 2.0

local types_mt = {}
types_mt.__types_cache = {}
types_mt.__index = function(self, key)
if types_mt.__types_cache[key] == nil then
types_mt.__types_cache[key] = require("embedded_clusters.Descriptor.types." .. key)
end
return types_mt.__types_cache[key]
end

local DescriptorTypes = {}

setmetatable(DescriptorTypes, types_mt)

return DescriptorTypes
2 changes: 2 additions & 0 deletions drivers/SmartThings/matter-switch/src/init.lua
Original file line number Diff line number Diff line change
Expand Up @@ -374,7 +374,9 @@ local matter_driver_template = {
switch_utils.lazy_load_if_possible("sub_drivers.aqara_cube"),
switch_utils.lazy_load("sub_drivers.camera"),
switch_utils.lazy_load_if_possible("sub_drivers.eve_energy"),
switch_utils.lazy_load_if_possible("sub_drivers.hager"),
switch_utils.lazy_load_if_possible("sub_drivers.ikea_scroll"),
switch_utils.lazy_load_if_possible("sub_drivers.third_reality_garage_door"),
switch_utils.lazy_load_if_possible("sub_drivers.third_reality_mk1")
},
shared_device_thread_enabled = true,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
-- Copyright © 2026 SmartThings, Inc.
-- Licensed under the Apache License, Version 2.0

return function(opts, driver, device, ...)
local device_lib = require "st.device"
local get_product_override_field = require "switch_utils.utils".get_product_override_field

local checked_device = device.network_type == device_lib.NETWORK_TYPE_MATTER and device or device:get_parent_device()
if get_product_override_field(checked_device, "needs_hager_subdriver") then
return true, require("sub_drivers.hager")
end
return false
end
Loading
Loading