Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
21 changes: 17 additions & 4 deletions drivers/SmartThings/matter-thermostat/src/init.lua
Original file line number Diff line number Diff line change
Expand Up @@ -196,7 +196,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,
Expand Down Expand Up @@ -1575,10 +1576,21 @@ 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)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

probably shouldn't remove the clamp, right?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Restored in latest force push

if ib.data.value == nil then return end
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
local speed = utils.clamp_value(ib.data.value, MIN_ALLOWED_PERCENT_VALUE, MAX_ALLOWED_PERCENT_VALUE)
device:emit_event_for_endpoint(ib.endpoint_id, capabilities.fanSpeedPercent.percent(speed))
end
end

local function fan_speed_setting_attr_handler(driver, device, ib, response)
if ib.data.value == nil then return end
local speed = utils.clamp_value(ib.data.value, MIN_ALLOWED_PERCENT_VALUE, MAX_ALLOWED_PERCENT_VALUE)
device:emit_event_for_endpoint(ib.endpoint_id, capabilities.fanSpeedPercent.percent(speed))
end

Expand Down Expand Up @@ -2075,6 +2087,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,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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,
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -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)
}
},
{
Expand Down Expand Up @@ -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,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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,
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -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)
}
},
{
Expand Down Expand Up @@ -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,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,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,
Expand Down Expand Up @@ -179,7 +180,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,
Expand Down
107 changes: 54 additions & 53 deletions drivers/SmartThings/matter-thermostat/src/test/test_matter_fan.lua
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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)
}
},
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -154,7 +154,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,
Expand Down Expand Up @@ -203,7 +204,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,
Expand Down Expand Up @@ -259,7 +261,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,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -233,6 +233,7 @@ local new_cluster_subscribe_list = {
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.
}
Expand Down
Loading
Loading