From 5af44f8b21451070a7524afa24ec587fece6e545 Mon Sep 17 00:00:00 2001 From: Harrison Carter Date: Mon, 18 Aug 2025 15:08:19 -0500 Subject: [PATCH 1/4] gate pre-57 required logic --- .../src/air-quality-sensor/init.lua | 16 +++--- .../matter-thermostat/src/init.lua | 50 +++++++++++-------- 2 files changed, 37 insertions(+), 29 deletions(-) diff --git a/drivers/SmartThings/matter-sensor/src/air-quality-sensor/init.lua b/drivers/SmartThings/matter-sensor/src/air-quality-sensor/init.lua index b4af0445c3..e588b1b623 100644 --- a/drivers/SmartThings/matter-sensor/src/air-quality-sensor/init.lua +++ b/drivers/SmartThings/matter-sensor/src/air-quality-sensor/init.lua @@ -401,13 +401,15 @@ local function match_modular_profile(driver, device) device:try_update_metadata({profile = profile_name, optional_component_capabilities = optional_supported_component_capabilities}) - -- add mandatory capabilities for subscription - local total_supported_capabilities = optional_supported_component_capabilities - table.insert(total_supported_capabilities[MAIN_COMPONENT_IDX][CAPABILITIES_LIST_IDX], capabilities.airQualityHealthConcern.ID) - table.insert(total_supported_capabilities[MAIN_COMPONENT_IDX][CAPABILITIES_LIST_IDX], capabilities.refresh.ID) - table.insert(total_supported_capabilities[MAIN_COMPONENT_IDX][CAPABILITIES_LIST_IDX], capabilities.firmwareUpdate.ID) - - device:set_field(SUPPORTED_COMPONENT_CAPABILITIES, total_supported_capabilities, { persist = true }) + if version.api < 15 and version.rpc < 9 then + -- add mandatory capabilities for subscription + local total_supported_capabilities = optional_supported_component_capabilities + table.insert(total_supported_capabilities[MAIN_COMPONENT_IDX][CAPABILITIES_LIST_IDX], capabilities.airQualityHealthConcern.ID) + table.insert(total_supported_capabilities[MAIN_COMPONENT_IDX][CAPABILITIES_LIST_IDX], capabilities.refresh.ID) + table.insert(total_supported_capabilities[MAIN_COMPONENT_IDX][CAPABILITIES_LIST_IDX], capabilities.firmwareUpdate.ID) + + device:set_field(SUPPORTED_COMPONENT_CAPABILITIES, total_supported_capabilities, { persist = true }) + end end local function do_configure(driver, device) diff --git a/drivers/SmartThings/matter-thermostat/src/init.lua b/drivers/SmartThings/matter-thermostat/src/init.lua index baa20bc31c..7ea4aa545d 100644 --- a/drivers/SmartThings/matter-thermostat/src/init.lua +++ b/drivers/SmartThings/matter-thermostat/src/init.lua @@ -985,14 +985,16 @@ local function match_modular_profile_air_purifer(driver, device) device:try_update_metadata({profile = profile_name, optional_component_capabilities = optional_supported_component_capabilities}) - -- add mandatory capabilities for subscription - local total_supported_capabilities = optional_supported_component_capabilities - table.insert(total_supported_capabilities[MAIN_COMPONENT_IDX][CAPABILITIES_LIST_IDX], capabilities.airPurifierFanMode.ID) - table.insert(total_supported_capabilities[MAIN_COMPONENT_IDX][CAPABILITIES_LIST_IDX], capabilities.fanSpeedPercent.ID) - table.insert(total_supported_capabilities[MAIN_COMPONENT_IDX][CAPABILITIES_LIST_IDX], capabilities.refresh.ID) - table.insert(total_supported_capabilities[MAIN_COMPONENT_IDX][CAPABILITIES_LIST_IDX], capabilities.firmwareUpdate.ID) + if version.api < 15 and version.rpc < 9 then + -- add mandatory capabilities for subscription + local total_supported_capabilities = optional_supported_component_capabilities + table.insert(total_supported_capabilities[MAIN_COMPONENT_IDX][CAPABILITIES_LIST_IDX], capabilities.airPurifierFanMode.ID) + table.insert(total_supported_capabilities[MAIN_COMPONENT_IDX][CAPABILITIES_LIST_IDX], capabilities.fanSpeedPercent.ID) + table.insert(total_supported_capabilities[MAIN_COMPONENT_IDX][CAPABILITIES_LIST_IDX], capabilities.refresh.ID) + table.insert(total_supported_capabilities[MAIN_COMPONENT_IDX][CAPABILITIES_LIST_IDX], capabilities.firmwareUpdate.ID) - device:set_field(SUPPORTED_COMPONENT_CAPABILITIES, total_supported_capabilities, { persist = true }) + device:set_field(SUPPORTED_COMPONENT_CAPABILITIES, total_supported_capabilities, { persist = true }) + end end local function match_modular_profile_thermostat(driver, device) @@ -1035,14 +1037,16 @@ local function match_modular_profile_thermostat(driver, device) table.insert(optional_supported_component_capabilities, {"main", main_component_capabilities}) device:try_update_metadata({profile = profile_name, optional_component_capabilities = optional_supported_component_capabilities}) - -- add mandatory capabilities for subscription - local total_supported_capabilities = optional_supported_component_capabilities - table.insert(main_component_capabilities, capabilities.thermostatMode.ID) - table.insert(main_component_capabilities, capabilities.temperatureMeasurement.ID) - table.insert(main_component_capabilities, capabilities.refresh.ID) - table.insert(main_component_capabilities, capabilities.firmwareUpdate.ID) + if version.api < 15 and version.rpc < 9 then + -- add mandatory capabilities for subscription + local total_supported_capabilities = optional_supported_component_capabilities + table.insert(main_component_capabilities, capabilities.thermostatMode.ID) + table.insert(main_component_capabilities, capabilities.temperatureMeasurement.ID) + table.insert(main_component_capabilities, capabilities.refresh.ID) + table.insert(main_component_capabilities, capabilities.firmwareUpdate.ID) - device:set_field(SUPPORTED_COMPONENT_CAPABILITIES, total_supported_capabilities, { persist = true }) + device:set_field(SUPPORTED_COMPONENT_CAPABILITIES, total_supported_capabilities, { persist = true }) + end end local function match_modular_profile_room_ac(driver, device) @@ -1086,15 +1090,17 @@ local function match_modular_profile_room_ac(driver, device) table.insert(optional_supported_component_capabilities, {"main", main_component_capabilities}) device:try_update_metadata({profile = profile_name, optional_component_capabilities = optional_supported_component_capabilities}) - -- add mandatory capabilities for subscription - local total_supported_capabilities = optional_supported_component_capabilities - table.insert(main_component_capabilities, capabilities.switch.ID) - table.insert(main_component_capabilities, capabilities.temperatureMeasurement.ID) - table.insert(main_component_capabilities, capabilities.thermostatMode.ID) - table.insert(main_component_capabilities, capabilities.refresh.ID) - table.insert(main_component_capabilities, capabilities.firmwareUpdate.ID) + if version.api < 15 and version.rpc < 9 then + -- add mandatory capabilities for subscription + local total_supported_capabilities = optional_supported_component_capabilities + table.insert(main_component_capabilities, capabilities.switch.ID) + table.insert(main_component_capabilities, capabilities.temperatureMeasurement.ID) + table.insert(main_component_capabilities, capabilities.thermostatMode.ID) + table.insert(main_component_capabilities, capabilities.refresh.ID) + table.insert(main_component_capabilities, capabilities.firmwareUpdate.ID) - device:set_field(SUPPORTED_COMPONENT_CAPABILITIES, total_supported_capabilities, { persist = true }) + device:set_field(SUPPORTED_COMPONENT_CAPABILITIES, total_supported_capabilities, { persist = true }) + end end local function match_modular_profile(driver, device, device_type) From 77f297d5f74028178482d3bc298fc70461c8d12d Mon Sep 17 00:00:00 2001 From: Harrison Carter Date: Tue, 19 Aug 2025 17:21:51 -0500 Subject: [PATCH 2/4] fixup! respond to comments --- .../matter-sensor/src/air-quality-sensor/init.lua | 4 +++- drivers/SmartThings/matter-thermostat/src/init.lua | 12 +++++++++--- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/drivers/SmartThings/matter-sensor/src/air-quality-sensor/init.lua b/drivers/SmartThings/matter-sensor/src/air-quality-sensor/init.lua index e588b1b623..b25a660b31 100644 --- a/drivers/SmartThings/matter-sensor/src/air-quality-sensor/init.lua +++ b/drivers/SmartThings/matter-sensor/src/air-quality-sensor/init.lua @@ -401,7 +401,9 @@ local function match_modular_profile(driver, device) device:try_update_metadata({profile = profile_name, optional_component_capabilities = optional_supported_component_capabilities}) - if version.api < 15 and version.rpc < 9 then + -- earlier modular profile gating (min api v14, rpc 8) ensures we are running >= 0.57 FW. + -- This gating specifies a workaround required only for 0.57 FW, which is not needed for 0.58 and higher. + if version.api < 15 or version.rpc < 9 then -- add mandatory capabilities for subscription local total_supported_capabilities = optional_supported_component_capabilities table.insert(total_supported_capabilities[MAIN_COMPONENT_IDX][CAPABILITIES_LIST_IDX], capabilities.airQualityHealthConcern.ID) diff --git a/drivers/SmartThings/matter-thermostat/src/init.lua b/drivers/SmartThings/matter-thermostat/src/init.lua index 7ea4aa545d..f167de0e64 100644 --- a/drivers/SmartThings/matter-thermostat/src/init.lua +++ b/drivers/SmartThings/matter-thermostat/src/init.lua @@ -985,7 +985,9 @@ local function match_modular_profile_air_purifer(driver, device) device:try_update_metadata({profile = profile_name, optional_component_capabilities = optional_supported_component_capabilities}) - if version.api < 15 and version.rpc < 9 then + -- earlier modular profile gating (min api v14, rpc 8) ensures we are running >= 0.57 FW. + -- This gating specifies a workaround required only for 0.57 FW, which is not needed for 0.58 and higher. + if version.api < 15 or version.rpc < 9 then -- add mandatory capabilities for subscription local total_supported_capabilities = optional_supported_component_capabilities table.insert(total_supported_capabilities[MAIN_COMPONENT_IDX][CAPABILITIES_LIST_IDX], capabilities.airPurifierFanMode.ID) @@ -1037,7 +1039,9 @@ local function match_modular_profile_thermostat(driver, device) table.insert(optional_supported_component_capabilities, {"main", main_component_capabilities}) device:try_update_metadata({profile = profile_name, optional_component_capabilities = optional_supported_component_capabilities}) - if version.api < 15 and version.rpc < 9 then + -- earlier modular profile gating (min api v14, rpc 8) ensures we are running >= 0.57 FW. + -- This gating specifies a workaround required only for 0.57 FW, which is not needed for 0.58 and higher. + if version.api < 15 or version.rpc < 9 then -- add mandatory capabilities for subscription local total_supported_capabilities = optional_supported_component_capabilities table.insert(main_component_capabilities, capabilities.thermostatMode.ID) @@ -1090,7 +1094,9 @@ local function match_modular_profile_room_ac(driver, device) table.insert(optional_supported_component_capabilities, {"main", main_component_capabilities}) device:try_update_metadata({profile = profile_name, optional_component_capabilities = optional_supported_component_capabilities}) - if version.api < 15 and version.rpc < 9 then + -- earlier modular profile gating (min api v14, rpc 8) ensures we are running >= 0.57 FW. + -- This gating specifies a workaround required only for 0.57 FW, which is not needed for 0.58 and higher. + if version.api < 15 or version.rpc < 9 then -- add mandatory capabilities for subscription local total_supported_capabilities = optional_supported_component_capabilities table.insert(main_component_capabilities, capabilities.switch.ID) From e78111335947205719006cc0af6696f3e0671d06 Mon Sep 17 00:00:00 2001 From: Harrison Carter Date: Tue, 19 Aug 2025 17:23:28 -0500 Subject: [PATCH 3/4] fixup! remove whitespace --- .../matter-sensor/src/air-quality-sensor/init.lua | 4 ++-- drivers/SmartThings/matter-thermostat/src/init.lua | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/drivers/SmartThings/matter-sensor/src/air-quality-sensor/init.lua b/drivers/SmartThings/matter-sensor/src/air-quality-sensor/init.lua index b25a660b31..1627bade20 100644 --- a/drivers/SmartThings/matter-sensor/src/air-quality-sensor/init.lua +++ b/drivers/SmartThings/matter-sensor/src/air-quality-sensor/init.lua @@ -401,8 +401,8 @@ local function match_modular_profile(driver, device) device:try_update_metadata({profile = profile_name, optional_component_capabilities = optional_supported_component_capabilities}) - -- earlier modular profile gating (min api v14, rpc 8) ensures we are running >= 0.57 FW. - -- This gating specifies a workaround required only for 0.57 FW, which is not needed for 0.58 and higher. + -- earlier modular profile gating (min api v14, rpc 8) ensures we are running >= 0.57 FW. + -- This gating specifies a workaround required only for 0.57 FW, which is not needed for 0.58 and higher. if version.api < 15 or version.rpc < 9 then -- add mandatory capabilities for subscription local total_supported_capabilities = optional_supported_component_capabilities diff --git a/drivers/SmartThings/matter-thermostat/src/init.lua b/drivers/SmartThings/matter-thermostat/src/init.lua index f167de0e64..85bf443ffc 100644 --- a/drivers/SmartThings/matter-thermostat/src/init.lua +++ b/drivers/SmartThings/matter-thermostat/src/init.lua @@ -985,8 +985,8 @@ local function match_modular_profile_air_purifer(driver, device) device:try_update_metadata({profile = profile_name, optional_component_capabilities = optional_supported_component_capabilities}) - -- earlier modular profile gating (min api v14, rpc 8) ensures we are running >= 0.57 FW. - -- This gating specifies a workaround required only for 0.57 FW, which is not needed for 0.58 and higher. + -- earlier modular profile gating (min api v14, rpc 8) ensures we are running >= 0.57 FW. + -- This gating specifies a workaround required only for 0.57 FW, which is not needed for 0.58 and higher. if version.api < 15 or version.rpc < 9 then -- add mandatory capabilities for subscription local total_supported_capabilities = optional_supported_component_capabilities @@ -1039,8 +1039,8 @@ local function match_modular_profile_thermostat(driver, device) table.insert(optional_supported_component_capabilities, {"main", main_component_capabilities}) device:try_update_metadata({profile = profile_name, optional_component_capabilities = optional_supported_component_capabilities}) - -- earlier modular profile gating (min api v14, rpc 8) ensures we are running >= 0.57 FW. - -- This gating specifies a workaround required only for 0.57 FW, which is not needed for 0.58 and higher. + -- earlier modular profile gating (min api v14, rpc 8) ensures we are running >= 0.57 FW. + -- This gating specifies a workaround required only for 0.57 FW, which is not needed for 0.58 and higher. if version.api < 15 or version.rpc < 9 then -- add mandatory capabilities for subscription local total_supported_capabilities = optional_supported_component_capabilities @@ -1094,8 +1094,8 @@ local function match_modular_profile_room_ac(driver, device) table.insert(optional_supported_component_capabilities, {"main", main_component_capabilities}) device:try_update_metadata({profile = profile_name, optional_component_capabilities = optional_supported_component_capabilities}) - -- earlier modular profile gating (min api v14, rpc 8) ensures we are running >= 0.57 FW. - -- This gating specifies a workaround required only for 0.57 FW, which is not needed for 0.58 and higher. + -- earlier modular profile gating (min api v14, rpc 8) ensures we are running >= 0.57 FW. + -- This gating specifies a workaround required only for 0.57 FW, which is not needed for 0.58 and higher. if version.api < 15 or version.rpc < 9 then -- add mandatory capabilities for subscription local total_supported_capabilities = optional_supported_component_capabilities From 235213e575a48b44797b289cf61047d50b61073b Mon Sep 17 00:00:00 2001 From: Harrison Carter Date: Fri, 22 Aug 2025 10:45:43 -0500 Subject: [PATCH 4/4] remove table after 58 update --- .../matter-sensor/src/air-quality-sensor/init.lua | 11 ++++++++--- drivers/SmartThings/matter-thermostat/src/init.lua | 11 ++++++++--- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/drivers/SmartThings/matter-sensor/src/air-quality-sensor/init.lua b/drivers/SmartThings/matter-sensor/src/air-quality-sensor/init.lua index 1627bade20..22ce708ea4 100644 --- a/drivers/SmartThings/matter-sensor/src/air-quality-sensor/init.lua +++ b/drivers/SmartThings/matter-sensor/src/air-quality-sensor/init.lua @@ -440,9 +440,14 @@ end local function device_init(driver, device) if device:get_field(SUPPORTED_COMPONENT_CAPABILITIES) then - -- assume that device is using a modular profile, override supports_capability_by_id - -- library function to utilize optional capabilities - device:extend_device("supports_capability_by_id", supports_capability_by_id_modular) + if version.api >= 15 and version.rpc >= 9 then + -- the device used this modular profile workaround on 0.57 FW but no longer requires this table with >=0.58 FW + device:set_field(SUPPORTED_COMPONENT_CAPABILITIES, nil) + else + -- assume that device is using a modular profile on 0.57 FW, override supports_capability_by_id + -- library function to utilize optional capabilities + device:extend_device("supports_capability_by_id", supports_capability_by_id_modular) + end end device:subscribe() end diff --git a/drivers/SmartThings/matter-thermostat/src/init.lua b/drivers/SmartThings/matter-thermostat/src/init.lua index 85bf443ffc..1e2c3422f3 100644 --- a/drivers/SmartThings/matter-thermostat/src/init.lua +++ b/drivers/SmartThings/matter-thermostat/src/init.lua @@ -492,9 +492,14 @@ end local function device_init(driver, device) if device:get_field(SUPPORTED_COMPONENT_CAPABILITIES) then - -- assume that device is using a modular profile, override supports_capability_by_id - -- library function to utilize optional capabilities - device:extend_device("supports_capability_by_id", supports_capability_by_id_modular) + if version.api >= 15 and version.rpc >= 9 then + -- the device used this modular profile workaround on 0.57 FW but no longer requires this table with >=0.58 FW + device:set_field(SUPPORTED_COMPONENT_CAPABILITIES, nil) + else + -- assume that device is using a modular profile on 0.57 FW, override supports_capability_by_id + -- library function to utilize optional capabilities + device:extend_device("supports_capability_by_id", supports_capability_by_id_modular) + end end device:subscribe() device:set_component_to_endpoint_fn(component_to_endpoint)