From e201ff7ab4d2447594aa3a32f4138baa72006688 Mon Sep 17 00:00:00 2001 From: Hunsup Jung Date: Tue, 3 Feb 2026 20:24:37 +0900 Subject: [PATCH 1/2] Support DPS feature Signed-off-by: Hunsup Jung --- .../lock-modular-embedded-unlatch.yml | 3 ++ .../matter-lock/profiles/lock-modular.yml | 3 ++ .../matter-lock/src/new-matter-lock/init.lua | 33 +++++++++++++++++++ 3 files changed, 39 insertions(+) diff --git a/drivers/SmartThings/matter-lock/profiles/lock-modular-embedded-unlatch.yml b/drivers/SmartThings/matter-lock/profiles/lock-modular-embedded-unlatch.yml index 3d9e68b44c..253374212b 100644 --- a/drivers/SmartThings/matter-lock/profiles/lock-modular-embedded-unlatch.yml +++ b/drivers/SmartThings/matter-lock/profiles/lock-modular-embedded-unlatch.yml @@ -6,6 +6,9 @@ components: version: 1 - id: lockAlarm version: 1 + - id: doorState + version: 1 + optional: true - id: remoteControlStatus version: 1 - id: lockUsers diff --git a/drivers/SmartThings/matter-lock/profiles/lock-modular.yml b/drivers/SmartThings/matter-lock/profiles/lock-modular.yml index 3a8a53bf70..7a664767dd 100644 --- a/drivers/SmartThings/matter-lock/profiles/lock-modular.yml +++ b/drivers/SmartThings/matter-lock/profiles/lock-modular.yml @@ -4,6 +4,9 @@ components: capabilities: - id: lock version: 1 + - id: doorState + version: 1 + optional: true - id: lockAlarm version: 1 - id: remoteControlStatus diff --git a/drivers/SmartThings/matter-lock/src/new-matter-lock/init.lua b/drivers/SmartThings/matter-lock/src/new-matter-lock/init.lua index e47a883143..24b509c5c3 100644 --- a/drivers/SmartThings/matter-lock/src/new-matter-lock/init.lua +++ b/drivers/SmartThings/matter-lock/src/new-matter-lock/init.lua @@ -105,6 +105,9 @@ local subscribed_attributes = { [capabilities.lock.ID] = { DoorLock.attributes.LockState }, + [capabilities.doorState.ID] = { + DoorLock.attributes.DoorState + }, [capabilities.remoteControlStatus.ID] = { DoorLock.attributes.OperatingMode }, @@ -221,6 +224,12 @@ local function match_profile_modular(driver, device) local clus_has_feature = function(feature_bitmap) return DoorLock.are_features_supported(feature_bitmap, ep_cluster.feature_map) end + if clus_has_feature(DoorLock.types.Feature.DOOR_POSITION_SENSOR) then + table.insert(main_component_capabilities, capabilities.doorState.ID) + device.thread:call_with_delay(5, function(t) + device:emit_event(capabilities.doorState.supportedDoorStates({"open", "closed"}, {visibility = {displayed = false}})) -- open and closed are madatory + end) + end if clus_has_feature(DoorLock.types.Feature.USER) then table.insert(main_component_capabilities, capabilities.lockUsers.ID) end @@ -383,6 +392,29 @@ local function lock_state_handler(driver, device, ib, response) end) end +local function door_state_handler(driver, device, ib, response) + local DoorStateEnum = DoorLock.types.DoorStateEnum + local doorState = capabilities.doorState.doorState + local DOOR_STATE_MAP = { + [DoorStateEnum.DOOR_OPEN] = doorState.open, + [DoorStateEnum.DOOR_CLOSED] = doorState.closed, + [DoorStateEnum.DOOR_JAMMED] = doorState.jameed, + [DoorStateEnum.DOOR_FORCED_OPEN] = doorState.forcedOpen, + [DoorStateEnum.DOOR_UNSPECIFIED_ERROR] = doorState.unspecifiedError, + [DoorStateEnum.DOOR_AJAR] = doorState.ajar + } + device:emit_event(DOOR_STATE_MAP[ib.data.value]()) + + local supportedDoorStates = device:get_latest_state("main", capabilities.doorState.ID, capabilities.doorState.supportedDoorStates.NAME) or {} + for _, state in pairs(supportedDoorStates) do + if state == DOOR_STATE_MAP[ib.data.value].NAME then + return + end + end + table.insert(supportedDoorStates, DOOR_STATE_MAP[ib.data.value].NAME); + device:emit_event(capabilities.doorState.supportedDoorStates(supportedDoorStates, {visibility = {displayed = false}})) +end + --------------------- -- Operating Modes -- --------------------- @@ -2884,6 +2916,7 @@ local new_matter_lock_handler = { attr = { [DoorLock.ID] = { [DoorLock.attributes.LockState.ID] = lock_state_handler, + [DoorLock.attributes.DoorState.ID] = door_state_handler, [DoorLock.attributes.OperatingMode.ID] = operating_modes_handler, [DoorLock.attributes.NumberOfTotalUsersSupported.ID] = total_users_supported_handler, [DoorLock.attributes.NumberOfPINUsersSupported.ID] = pin_users_supported_handler, From 6d1d895d2d1d94f0019b0f4a7ebc9eff66c7d32e Mon Sep 17 00:00:00 2001 From: Hunsup Jung Date: Wed, 4 Feb 2026 14:44:46 +0900 Subject: [PATCH 2/2] Fix typo Signed-off-by: Hunsup Jung --- drivers/SmartThings/matter-lock/src/new-matter-lock/init.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/SmartThings/matter-lock/src/new-matter-lock/init.lua b/drivers/SmartThings/matter-lock/src/new-matter-lock/init.lua index 24b509c5c3..c3f4832fbc 100644 --- a/drivers/SmartThings/matter-lock/src/new-matter-lock/init.lua +++ b/drivers/SmartThings/matter-lock/src/new-matter-lock/init.lua @@ -227,7 +227,7 @@ local function match_profile_modular(driver, device) if clus_has_feature(DoorLock.types.Feature.DOOR_POSITION_SENSOR) then table.insert(main_component_capabilities, capabilities.doorState.ID) device.thread:call_with_delay(5, function(t) - device:emit_event(capabilities.doorState.supportedDoorStates({"open", "closed"}, {visibility = {displayed = false}})) -- open and closed are madatory + device:emit_event(capabilities.doorState.supportedDoorStates({"open", "closed"}, {visibility = {displayed = false}})) -- open and closed are mandatory end) end if clus_has_feature(DoorLock.types.Feature.USER) then @@ -398,7 +398,7 @@ local function door_state_handler(driver, device, ib, response) local DOOR_STATE_MAP = { [DoorStateEnum.DOOR_OPEN] = doorState.open, [DoorStateEnum.DOOR_CLOSED] = doorState.closed, - [DoorStateEnum.DOOR_JAMMED] = doorState.jameed, + [DoorStateEnum.DOOR_JAMMED] = doorState.jammed, [DoorStateEnum.DOOR_FORCED_OPEN] = doorState.forcedOpen, [DoorStateEnum.DOOR_UNSPECIFIED_ERROR] = doorState.unspecifiedError, [DoorStateEnum.DOOR_AJAR] = doorState.ajar