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 } )