From ae3bd7f4191ddaa96d597d86c7791cdf0554ead7 Mon Sep 17 00:00:00 2001 From: Nick DeBoom Date: Wed, 24 Sep 2025 11:31:53 -0500 Subject: [PATCH] Use fanSpeedPercent for thermostats This change adds the fanSpeedPercent capability to the thermostat-modular profile. Additionally, PercentSetting is subscribed in addition to PercentCurrent to set this capability, since it provides an accurate representation of the speed of the fan while helping avoid the following situation: (1) The fan speed is changed in the app and PercentSetting is routed to the device (2) The fan reports back a value of PercentCurrent that doesn't match PercentSetting because the speed takes a little while to change (3) The fanSpeedPercent capability jumps to the value reported by PercentCurrent PercentCurrent is still subscribed to, but its attribute handler is gated on the current fan mode being AUTO, in which case PercentSetting is NULL on the device side and PercentCurrent is used as a fallback for setting the capability. --- .../profiles/thermostat-modular.yml | 3 + .../matter-thermostat/src/init.lua | 26 +++-- .../src/test/test_matter_air_purifier.lua | 27 +---- .../test/test_matter_air_purifier_api9.lua | 27 +---- .../test/test_matter_air_purifier_modular.lua | 4 +- .../src/test/test_matter_fan.lua | 107 +++++++++--------- .../src/test/test_matter_room_ac.lua | 11 +- .../src/test/test_matter_room_ac_modular.lua | 9 +- ...st_matter_thermo_multiple_device_types.lua | 3 + .../src/test/test_matter_thermostat.lua | 2 - .../test/test_matter_thermostat_modular.lua | 29 ++++- 11 files changed, 130 insertions(+), 118 deletions(-) diff --git a/drivers/SmartThings/matter-thermostat/profiles/thermostat-modular.yml b/drivers/SmartThings/matter-thermostat/profiles/thermostat-modular.yml index 1e7bd97dc7..7d3dd309f2 100644 --- a/drivers/SmartThings/matter-thermostat/profiles/thermostat-modular.yml +++ b/drivers/SmartThings/matter-thermostat/profiles/thermostat-modular.yml @@ -9,6 +9,9 @@ components: - id: fanMode version: 1 optional: true + - id: fanSpeedPercent + version: 1 + optional: true - id: fanOscillationMode version: 1 optional: true diff --git a/drivers/SmartThings/matter-thermostat/src/init.lua b/drivers/SmartThings/matter-thermostat/src/init.lua index baa20bc31c..8706275f5d 100644 --- a/drivers/SmartThings/matter-thermostat/src/init.lua +++ b/drivers/SmartThings/matter-thermostat/src/init.lua @@ -17,16 +17,15 @@ local log = require "log" local clusters = require "st.matter.clusters" local embedded_cluster_utils = require "embedded-cluster-utils" local im = require "st.matter.interaction_model" - local MatterDriver = require "st.matter.driver" local utils = require "st.utils" +local version = require "version" local SUPPORTED_COMPONENT_CAPABILITIES = "__supported_component_capabilities" -- declare match_profile function for use throughout file local match_profile -- Include driver-side definitions when lua libs api version is < 10 -local version = require "version" if version.api < 10 then clusters.HepaFilterMonitoring = require "HepaFilterMonitoring" clusters.ActivatedCarbonFilterMonitoring = require "ActivatedCarbonFilterMonitoring" @@ -100,8 +99,6 @@ local HEAT_PUMP_DEVICE_TYPE_ID = 0x0309 local THERMOSTAT_DEVICE_TYPE_ID = 0x0301 local ELECTRICAL_SENSOR_DEVICE_TYPE_ID = 0x0510 -local MIN_ALLOWED_PERCENT_VALUE = 0 -local MAX_ALLOWED_PERCENT_VALUE = 100 local DEFAULT_REPORT_TIME_INTERVAL = 15 * 60 -- Report cumulative energy every 15 minutes local MAX_REPORT_TIMEOUT = 30 * 60 local POLL_INTERVAL = 60 -- To read CumulativeEnergyImported every 60 seconds. @@ -201,7 +198,8 @@ local subscribed_attributes = { clusters.FanControl.attributes.FanMode }, [capabilities.fanSpeedPercent.ID] = { - clusters.FanControl.attributes.PercentCurrent + clusters.FanControl.attributes.PercentCurrent, + clusters.FanControl.attributes.PercentSetting }, [capabilities.windMode.ID] = { clusters.FanControl.attributes.WindSupport, @@ -1012,6 +1010,7 @@ local function match_modular_profile_thermostat(driver, device) if #fan_eps > 0 then table.insert(main_component_capabilities, capabilities.fanMode.ID) + table.insert(main_component_capabilities, capabilities.fanSpeedPercent.ID) end if #rock_eps > 0 then table.insert(main_component_capabilities, capabilities.fanOscillationMode.ID) @@ -1613,11 +1612,19 @@ local function fan_mode_sequence_handler(driver, device, ib, response) end local function fan_speed_percent_attr_handler(driver, device, ib, response) - local speed = 0 - if ib.data.value ~= nil then - speed = utils.clamp_value(ib.data.value, MIN_ALLOWED_PERCENT_VALUE, MAX_ALLOWED_PERCENT_VALUE) + local thermostat_mode = device:get_latest_state( + device:endpoint_to_component(ib.endpoint_id), + capabilities.thermostatMode.ID, + capabilities.thermostatMode.thermostatMode.NAME + ) + if thermostat_mode == capabilities.thermostatMode.thermostatMode.auto() then + device:emit_event_for_endpoint(ib.endpoint_id, capabilities.fanSpeedPercent.percent(ib.data.value)) end - device:emit_event_for_endpoint(ib.endpoint_id, capabilities.fanSpeedPercent.percent(speed)) +end + +local function fan_speed_setting_attr_handler(driver, device, ib, response) + if ib.data.value == nil then return end + device:emit_event_for_endpoint(ib.endpoint_id, capabilities.fanSpeedPercent.percent(ib.data.value)) end local function wind_support_handler(driver, device, ib, response) @@ -2125,6 +2132,7 @@ local matter_driver_template = { [clusters.FanControl.attributes.FanModeSequence.ID] = fan_mode_sequence_handler, [clusters.FanControl.attributes.FanMode.ID] = fan_mode_handler, [clusters.FanControl.attributes.PercentCurrent.ID] = fan_speed_percent_attr_handler, + [clusters.FanControl.attributes.PercentSetting.ID] = fan_speed_setting_attr_handler, [clusters.FanControl.attributes.WindSupport.ID] = wind_support_handler, [clusters.FanControl.attributes.WindSetting.ID] = wind_setting_handler, [clusters.FanControl.attributes.RockSupport.ID] = rock_support_handler, diff --git a/drivers/SmartThings/matter-thermostat/src/test/test_matter_air_purifier.lua b/drivers/SmartThings/matter-thermostat/src/test/test_matter_air_purifier.lua index d9cb8c6309..9c320e0a04 100644 --- a/drivers/SmartThings/matter-thermostat/src/test/test_matter_air_purifier.lua +++ b/drivers/SmartThings/matter-thermostat/src/test/test_matter_air_purifier.lua @@ -277,6 +277,7 @@ local cluster_subscribe_list = { clusters.FanControl.attributes.FanModeSequence, clusters.FanControl.attributes.FanMode, clusters.FanControl.attributes.PercentCurrent, + clusters.FanControl.attributes.PercentSetting, clusters.FanControl.attributes.WindSupport, clusters.FanControl.attributes.WindSetting, clusters.HepaFilterMonitoring.attributes.ChangeIndication, @@ -289,6 +290,7 @@ local cluster_subscribe_list_rock = { clusters.FanControl.attributes.FanModeSequence, clusters.FanControl.attributes.FanMode, clusters.FanControl.attributes.PercentCurrent, + clusters.FanControl.attributes.PercentSetting, clusters.FanControl.attributes.WindSupport, clusters.FanControl.attributes.WindSetting, clusters.FanControl.attributes.RockSupport, @@ -327,7 +329,8 @@ local cluster_subscribe_list_configured = { clusters.FanControl.attributes.FanMode }, [capabilities.fanSpeedPercent.ID] = { - clusters.FanControl.attributes.PercentCurrent + clusters.FanControl.attributes.PercentCurrent, + clusters.FanControl.attributes.PercentSetting }, [capabilities.windMode.ID] = { clusters.FanControl.attributes.WindSupport, @@ -581,7 +584,7 @@ test.register_message_test( direction = "receive", message = { mock_device.id, - clusters.FanControl.attributes.PercentCurrent:build_test_report_data(mock_device, 1, 10) + clusters.FanControl.attributes.PercentSetting:build_test_report_data(mock_device, 1, 10) } }, { @@ -764,26 +767,6 @@ test.register_message_test( } ) -test.register_message_test( - "Set percent command should clamp invalid percentage values", - { - { - channel = "matter", - direction = "receive", - message = { - mock_device.id, - clusters.FanControl.attributes.PercentCurrent:build_test_report_data(mock_device, 1, 255) - } - }, - { - channel = "capability", - direction = "send", - message = mock_device:generate_test_message("main", capabilities.fanSpeedPercent.percent(100)) - }, - } -) - - local supportedFanRock = { capabilities.fanOscillationMode.fanOscillationMode.off.NAME, capabilities.fanOscillationMode.fanOscillationMode.horizontal.NAME, diff --git a/drivers/SmartThings/matter-thermostat/src/test/test_matter_air_purifier_api9.lua b/drivers/SmartThings/matter-thermostat/src/test/test_matter_air_purifier_api9.lua index 871693d5a6..c60f2cff64 100644 --- a/drivers/SmartThings/matter-thermostat/src/test/test_matter_air_purifier_api9.lua +++ b/drivers/SmartThings/matter-thermostat/src/test/test_matter_air_purifier_api9.lua @@ -277,6 +277,7 @@ local cluster_subscribe_list = { clusters.FanControl.attributes.FanModeSequence, clusters.FanControl.attributes.FanMode, clusters.FanControl.attributes.PercentCurrent, + clusters.FanControl.attributes.PercentSetting, clusters.FanControl.attributes.WindSupport, clusters.FanControl.attributes.WindSetting, clusters.HepaFilterMonitoring.attributes.ChangeIndication, @@ -289,6 +290,7 @@ local cluster_subscribe_list_rock = { clusters.FanControl.attributes.FanModeSequence, clusters.FanControl.attributes.FanMode, clusters.FanControl.attributes.PercentCurrent, + clusters.FanControl.attributes.PercentSetting, clusters.FanControl.attributes.WindSupport, clusters.FanControl.attributes.WindSetting, clusters.FanControl.attributes.RockSupport, @@ -327,7 +329,8 @@ local cluster_subscribe_list_configured = { clusters.FanControl.attributes.FanMode }, [capabilities.fanSpeedPercent.ID] = { - clusters.FanControl.attributes.PercentCurrent + clusters.FanControl.attributes.PercentCurrent, + clusters.FanControl.attributes.PercentSetting }, [capabilities.windMode.ID] = { clusters.FanControl.attributes.WindSupport, @@ -581,7 +584,7 @@ test.register_message_test( direction = "receive", message = { mock_device.id, - clusters.FanControl.attributes.PercentCurrent:build_test_report_data(mock_device, 1, 10) + clusters.FanControl.attributes.PercentSetting:build_test_report_data(mock_device, 1, 10) } }, { @@ -765,26 +768,6 @@ test.register_message_test( } ) -test.register_message_test( - "Set percent command should clamp invalid percentage values", - { - { - channel = "matter", - direction = "receive", - message = { - mock_device.id, - clusters.FanControl.attributes.PercentCurrent:build_test_report_data(mock_device, 1, 255) - } - }, - { - channel = "capability", - direction = "send", - message = mock_device:generate_test_message("main", capabilities.fanSpeedPercent.percent(100)) - } - } -) - - local supportedFanRock = { capabilities.fanOscillationMode.fanOscillationMode.off.NAME, capabilities.fanOscillationMode.fanOscillationMode.horizontal.NAME, diff --git a/drivers/SmartThings/matter-thermostat/src/test/test_matter_air_purifier_modular.lua b/drivers/SmartThings/matter-thermostat/src/test/test_matter_air_purifier_modular.lua index e5f44e3289..d4de1b4679 100644 --- a/drivers/SmartThings/matter-thermostat/src/test/test_matter_air_purifier_modular.lua +++ b/drivers/SmartThings/matter-thermostat/src/test/test_matter_air_purifier_modular.lua @@ -145,6 +145,7 @@ local cluster_subscribe_list = { clusters.FanControl.attributes.FanModeSequence, clusters.FanControl.attributes.FanMode, clusters.FanControl.attributes.PercentCurrent, + clusters.FanControl.attributes.PercentSetting, clusters.FanControl.attributes.WindSupport, clusters.FanControl.attributes.WindSetting, clusters.HepaFilterMonitoring.attributes.ChangeIndication, @@ -181,7 +182,8 @@ local cluster_subscribe_list_configured = { clusters.FanControl.attributes.FanMode }, [capabilities.fanSpeedPercent.ID] = { - clusters.FanControl.attributes.PercentCurrent + clusters.FanControl.attributes.PercentCurrent, + clusters.FanControl.attributes.PercentSetting }, [capabilities.windMode.ID] = { clusters.FanControl.attributes.WindSupport, diff --git a/drivers/SmartThings/matter-thermostat/src/test/test_matter_fan.lua b/drivers/SmartThings/matter-thermostat/src/test/test_matter_fan.lua index 4a94a9a7e9..607bdec26c 100644 --- a/drivers/SmartThings/matter-thermostat/src/test/test_matter_fan.lua +++ b/drivers/SmartThings/matter-thermostat/src/test/test_matter_fan.lua @@ -13,79 +13,80 @@ -- limitations under the License. local test = require "integration_test" local t_utils = require "integration_test.utils" - local clusters = require "st.matter.clusters" local mock_device = test.mock_device.build_test_matter_device({ - profile = t_utils.get_profile_definition("fan-rock-wind.yml"), - manufacturer_info = { - vendor_id = 0x0000, - product_id = 0x0000, + profile = t_utils.get_profile_definition("fan-rock-wind.yml"), + manufacturer_info = { + vendor_id = 0x0000, + product_id = 0x0000, + }, + endpoints = { + { + endpoint_id = 0, + clusters = { + {cluster_id = clusters.Basic.ID, cluster_type = "SERVER"}, + }, + device_types = { + {device_type_id = 0x0016, device_type_revision = 1,} -- RootNode + } }, - endpoints = { - { - endpoint_id = 0, - clusters = { - {cluster_id = clusters.Basic.ID, cluster_type = "SERVER"}, - }, - device_types = { - {device_type_id = 0x0016, device_type_revision = 1,} -- RootNode - } + { + endpoint_id = 1, + clusters = { + {cluster_id = clusters.FanControl.ID, cluster_type = "SERVER", feature_map = 15}, }, - { - endpoint_id = 1, - clusters = { - {cluster_id = clusters.FanControl.ID, cluster_type = "SERVER", feature_map = 15}, - }, - device_types = { - {device_type_id = 0x002B, device_type_revision = 1,} -- Fan - } + device_types = { + {device_type_id = 0x002B, device_type_revision = 1,} -- Fan } } + } }) local mock_device_generic = test.mock_device.build_test_matter_device({ - profile = t_utils.get_profile_definition("fan-generic.yml"), - manufacturer_info = { - vendor_id = 0x0000, - product_id = 0x0000, + profile = t_utils.get_profile_definition("fan-generic.yml"), + manufacturer_info = { + vendor_id = 0x0000, + product_id = 0x0000, + }, + endpoints = { + { + endpoint_id = 0, + clusters = { + {cluster_id = clusters.Basic.ID, cluster_type = "SERVER"}, + }, + device_types = { + {device_type_id = 0x0016, device_type_revision = 1,} -- RootNode + } }, - endpoints = { - { - endpoint_id = 0, - clusters = { - {cluster_id = clusters.Basic.ID, cluster_type = "SERVER"}, - }, - device_types = { - {device_type_id = 0x0016, device_type_revision = 1,} -- RootNode - } + { + endpoint_id = 1, + clusters = { + {cluster_id = clusters.FanControl.ID, cluster_type = "SERVER", feature_map = 0}, }, - { - endpoint_id = 1, - clusters = { - {cluster_id = clusters.FanControl.ID, cluster_type = "SERVER", feature_map = 0}, - }, - device_types = { - {device_type_id = 0x002B, device_type_revision = 1,} -- Fan - } + device_types = { + {device_type_id = 0x002B, device_type_revision = 1,} -- Fan } } + } }) local cluster_subscribe_list = { - clusters.FanControl.attributes.FanMode, - clusters.FanControl.attributes.FanModeSequence, - clusters.FanControl.attributes.PercentCurrent, - clusters.FanControl.attributes.WindSupport, - clusters.FanControl.attributes.WindSetting, - clusters.FanControl.attributes.RockSupport, - clusters.FanControl.attributes.RockSetting, + clusters.FanControl.attributes.FanMode, + clusters.FanControl.attributes.FanModeSequence, + clusters.FanControl.attributes.PercentCurrent, + clusters.FanControl.attributes.PercentSetting, + clusters.FanControl.attributes.WindSupport, + clusters.FanControl.attributes.WindSetting, + clusters.FanControl.attributes.RockSupport, + clusters.FanControl.attributes.RockSetting, } local cluster_subscribe_list_generic = { - clusters.FanControl.attributes.FanMode, - clusters.FanControl.attributes.FanModeSequence, - clusters.FanControl.attributes.PercentCurrent, + clusters.FanControl.attributes.FanMode, + clusters.FanControl.attributes.FanModeSequence, + clusters.FanControl.attributes.PercentCurrent, + clusters.FanControl.attributes.PercentSetting, } local function test_init() diff --git a/drivers/SmartThings/matter-thermostat/src/test/test_matter_room_ac.lua b/drivers/SmartThings/matter-thermostat/src/test/test_matter_room_ac.lua index cec0cb9ffc..39bb8bab60 100644 --- a/drivers/SmartThings/matter-thermostat/src/test/test_matter_room_ac.lua +++ b/drivers/SmartThings/matter-thermostat/src/test/test_matter_room_ac.lua @@ -146,7 +146,8 @@ local function test_init() clusters.FanControl.attributes.FanMode }, [capabilities.fanSpeedPercent.ID] = { - clusters.FanControl.attributes.PercentCurrent + clusters.FanControl.attributes.PercentCurrent, + clusters.FanControl.attributes.PercentSetting }, [capabilities.windMode.ID] = { clusters.FanControl.attributes.WindSupport, @@ -204,7 +205,8 @@ local function test_init_configure() clusters.FanControl.attributes.FanMode }, [capabilities.fanSpeedPercent.ID] = { - clusters.FanControl.attributes.PercentCurrent + clusters.FanControl.attributes.PercentCurrent, + clusters.FanControl.attributes.PercentSetting }, [capabilities.windMode.ID] = { clusters.FanControl.attributes.WindSupport, @@ -259,7 +261,8 @@ local function test_init_nostate() clusters.FanControl.attributes.FanMode }, [capabilities.fanSpeedPercent.ID] = { - clusters.FanControl.attributes.PercentCurrent + clusters.FanControl.attributes.PercentCurrent, + clusters.FanControl.attributes.PercentSetting }, } local subscribe_request = nil @@ -324,7 +327,7 @@ test.register_message_test( direction = "receive", message = { mock_device.id, - clusters.FanControl.attributes.PercentCurrent:build_test_report_data(mock_device, 1, 10) + clusters.FanControl.attributes.PercentSetting:build_test_report_data(mock_device, 1, 10) } }, { diff --git a/drivers/SmartThings/matter-thermostat/src/test/test_matter_room_ac_modular.lua b/drivers/SmartThings/matter-thermostat/src/test/test_matter_room_ac_modular.lua index 9be85cd84b..903b5c2cf0 100644 --- a/drivers/SmartThings/matter-thermostat/src/test/test_matter_room_ac_modular.lua +++ b/drivers/SmartThings/matter-thermostat/src/test/test_matter_room_ac_modular.lua @@ -156,7 +156,8 @@ local function test_init_basic() clusters.FanControl.attributes.FanMode }, [capabilities.fanSpeedPercent.ID] = { - clusters.FanControl.attributes.PercentCurrent + clusters.FanControl.attributes.PercentCurrent, + clusters.FanControl.attributes.PercentSetting }, [capabilities.windMode.ID] = { clusters.FanControl.attributes.WindSupport, @@ -205,7 +206,8 @@ local subscribed_attributes_no_state = { clusters.FanControl.attributes.FanMode }, [capabilities.fanSpeedPercent.ID] = { - clusters.FanControl.attributes.PercentCurrent + clusters.FanControl.attributes.PercentCurrent, + clusters.FanControl.attributes.PercentSetting }, [capabilities.windMode.ID] = { clusters.FanControl.attributes.WindSupport, @@ -261,7 +263,8 @@ local function test_init_no_state() clusters.FanControl.attributes.FanMode }, [capabilities.fanSpeedPercent.ID] = { - clusters.FanControl.attributes.PercentCurrent + clusters.FanControl.attributes.PercentCurrent, + clusters.FanControl.attributes.PercentSetting }, [capabilities.windMode.ID] = { clusters.FanControl.attributes.WindSupport, diff --git a/drivers/SmartThings/matter-thermostat/src/test/test_matter_thermo_multiple_device_types.lua b/drivers/SmartThings/matter-thermostat/src/test/test_matter_thermo_multiple_device_types.lua index 2086036be5..b52d20cbbd 100644 --- a/drivers/SmartThings/matter-thermostat/src/test/test_matter_thermo_multiple_device_types.lua +++ b/drivers/SmartThings/matter-thermostat/src/test/test_matter_thermo_multiple_device_types.lua @@ -210,6 +210,7 @@ local expected_metadata = { { "relativeHumidityMeasurement", "fanMode", + "fanSpeedPercent", "fanOscillationMode", "thermostatHeatingSetpoint", "thermostatCoolingSetpoint" @@ -233,6 +234,8 @@ local new_cluster_subscribe_list = { clusters.RelativeHumidityMeasurement.attributes.MeasuredValue, clusters.FanControl.attributes.FanMode, clusters.FanControl.attributes.FanModeSequence, + clusters.FanControl.attributes.PercentCurrent, + clusters.FanControl.attributes.PercentSetting, clusters.FanControl.attributes.RockSupport, -- These two attributes will be subscribed to following the profile clusters.FanControl.attributes.RockSetting, -- change since the fanOscillationMode capability will be enabled. } diff --git a/drivers/SmartThings/matter-thermostat/src/test/test_matter_thermostat.lua b/drivers/SmartThings/matter-thermostat/src/test/test_matter_thermostat.lua index 44ed395797..5e5fe81f75 100644 --- a/drivers/SmartThings/matter-thermostat/src/test/test_matter_thermostat.lua +++ b/drivers/SmartThings/matter-thermostat/src/test/test_matter_thermostat.lua @@ -331,8 +331,6 @@ test.register_message_test( } ) --- test.socket.matter:__expect_send({mock_device_auto.id, clusters.Thermostat.attributes.MinSetpointDeadBand:read(mock_device_auto)}) - test.register_message_test( "Thermostat mode reports should generate correct messages", { diff --git a/drivers/SmartThings/matter-thermostat/src/test/test_matter_thermostat_modular.lua b/drivers/SmartThings/matter-thermostat/src/test/test_matter_thermostat_modular.lua index 9c42c03ddb..7815e295ae 100644 --- a/drivers/SmartThings/matter-thermostat/src/test/test_matter_thermostat_modular.lua +++ b/drivers/SmartThings/matter-thermostat/src/test/test_matter_thermostat_modular.lua @@ -51,6 +51,7 @@ local mock_device_basic = test.mock_device.build_test_matter_device({ {cluster_id = clusters.TemperatureMeasurement.ID, cluster_type = "SERVER"}, {cluster_id = clusters.RelativeHumidityMeasurement.ID, cluster_type = "SERVER"}, {cluster_id = clusters.PowerSource.ID, cluster_type = "SERVER", feature_map = 0}, + {cluster_id = clusters.FanControl.ID, cluster_type = "SERVER", feature_map = 0}, }, device_types = { {device_type_id = 0x0301, device_type_revision = 1} -- Thermostat @@ -67,7 +68,6 @@ local function initialize_mock_device(generic_mock_device, generic_subscribed_at subscribe_request:merge(cluster:subscribe(generic_mock_device)) end end - test.socket.matter:__expect_send({generic_mock_device.id, subscribe_request}) return subscribe_request end @@ -109,6 +109,7 @@ local function test_init() test.socket.device_lifecycle:__queue_receive({ mock_device_basic.id, "init" }) subscribe_request_basic = initialize_mock_device(mock_device_basic, subscribed_attributes) + test.socket.matter:__expect_send({mock_device_basic.id, subscribe_request_basic}) end -- run the profile configuration tests @@ -125,6 +126,7 @@ local function test_thermostat_device_type_update_modular_profile(generic_mock_d local device_info_copy = utils.deep_copy(generic_mock_device.raw_st_data) device_info_copy.profile.id = "thermostat-modular" local device_info_json = dkjson.encode(device_info_copy) + test.wait_for_events() test.socket.device_lifecycle:__queue_receive({ generic_mock_device.id, "infoChanged", device_info_json }) test.socket.matter:__expect_send({generic_mock_device.id, subscribe_request}) end @@ -136,6 +138,7 @@ local expected_metadata = { { "relativeHumidityMeasurement", "fanMode", + "fanSpeedPercent", "thermostatHeatingSetpoint", "thermostatCoolingSetpoint" }, @@ -147,7 +150,29 @@ local expected_metadata = { test.register_coroutine_test( "Device with modular profile should enable correct optional capabilities", function() - test_thermostat_device_type_update_modular_profile(mock_device_basic, expected_metadata, subscribe_request_basic) + local subscribed_attributes = { + clusters.Thermostat.attributes.LocalTemperature, + clusters.Thermostat.attributes.OccupiedCoolingSetpoint, + clusters.Thermostat.attributes.OccupiedHeatingSetpoint, + clusters.Thermostat.attributes.AbsMinCoolSetpointLimit, + clusters.Thermostat.attributes.AbsMaxCoolSetpointLimit, + clusters.Thermostat.attributes.AbsMinHeatSetpointLimit, + clusters.Thermostat.attributes.AbsMaxHeatSetpointLimit, + clusters.Thermostat.attributes.SystemMode, + clusters.Thermostat.attributes.ThermostatRunningState, + clusters.Thermostat.attributes.ControlSequenceOfOperation, + clusters.TemperatureMeasurement.attributes.MeasuredValue, + clusters.TemperatureMeasurement.attributes.MinMeasuredValue, + clusters.TemperatureMeasurement.attributes.MaxMeasuredValue, + clusters.RelativeHumidityMeasurement.attributes.MeasuredValue, + clusters.FanControl.attributes.FanMode, + clusters.FanControl.attributes.FanModeSequence, + clusters.FanControl.attributes.PercentCurrent, + clusters.FanControl.attributes.PercentSetting, + clusters.PowerSource.attributes.BatPercentRemaining, + } + local subscribe_request = initialize_mock_device(mock_device_basic, subscribed_attributes) + test_thermostat_device_type_update_modular_profile(mock_device_basic, expected_metadata, subscribe_request) end, { test_init = test_init } )