Skip to content

Commit fbefadb

Browse files
Matter Thermostat: Add OnOff cluster support
Add OnOff cluster support for Air Purifier and Fan device types. This cluster is optionally supported for these device types starting with Matter 1.4. CHAD-17538
1 parent c24e29e commit fbefadb

6 files changed

Lines changed: 419 additions & 62 deletions

File tree

drivers/SmartThings/matter-thermostat/profiles/air-purifier-modular.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@ name: air-purifier-modular
22
components:
33
- id: main
44
capabilities:
5+
- id: switch
6+
version: 1
7+
optional: true
58
- id: airPurifierFanMode
69
version: 1
710
- id: fanSpeedPercent
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
name: fan-modular
2+
components:
3+
- id: main
4+
capabilities:
5+
- id: switch
6+
version: 1
7+
optional: true
8+
- id: fanMode
9+
version: 1
10+
- id: fanSpeedPercent
11+
version: 1
12+
- id: fanOscillationMode
13+
version: 1
14+
optional: true
15+
- id: windMode
16+
version: 1
17+
optional: true
18+
- id: firmwareUpdate
19+
version: 1
20+
- id: refresh
21+
version: 1
22+
categories:
23+
- name: Fan
24+
metadata:
25+
mnmn: SmartThingsEdge
26+
vid: generic-fan-rock-wind

drivers/SmartThings/matter-thermostat/src/test/test_matter_air_purifier_modular.lua

Lines changed: 28 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ local mock_device_basic = test.mock_device.build_test_matter_device({
4949
{cluster_id = clusters.FanControl.ID, cluster_type = "SERVER", feature_map = 0},
5050
{cluster_id = clusters.HepaFilterMonitoring.ID, cluster_type = "SERVER", feature_map = 7},
5151
{cluster_id = clusters.ActivatedCarbonFilterMonitoring.ID, cluster_type = "SERVER", feature_map = 7},
52+
{cluster_id = clusters.OnOff.ID, cluster_type = "SERVER"}
5253
},
5354
device_types = {
5455
{device_type_id = 0x002D, device_type_revision = 1} -- AP
@@ -256,7 +257,7 @@ local function test_init_ap_thermo_aqs_preconfigured()
256257
test.socket.matter:__expect_send({ mock_device_ap_thermo_aqs.id, read_request })
257258

258259
test.socket.device_lifecycle:__queue_receive({ mock_device_ap_thermo_aqs.id, "init" })
259-
local subscribe_request = nil
260+
local subscribe_request
260261
for _, attributes in pairs(cluster_subscribe_list_configured) do
261262
for _, attribute in ipairs(attributes) do
262263
if subscribe_request == nil then
@@ -269,11 +270,13 @@ local function test_init_ap_thermo_aqs_preconfigured()
269270
test.socket.matter:__expect_send({mock_device_ap_thermo_aqs.id, subscribe_request})
270271
end
271272

272-
local expected_update_metadata= {
273-
optional_component_capabilities={
273+
local expected_update_metadata = {
274+
optional_component_capabilities = {
274275
{
275276
"main",
276-
{},
277+
{
278+
"switch",
279+
},
277280
},
278281
{
279282
"activatedCarbonFilter",
@@ -293,13 +296,6 @@ local expected_update_metadata= {
293296
profile="air-purifier-modular",
294297
}
295298

296-
local subscribe_request = cluster_subscribe_list[1]:subscribe(mock_device_basic)
297-
for i, cluster in ipairs(cluster_subscribe_list) do
298-
if i > 1 then
299-
subscribe_request:merge(cluster:subscribe(mock_device_basic))
300-
end
301-
end
302-
303299
test.register_coroutine_test(
304300
"Test profile change on init for basic Air Purifier device",
305301
function()
@@ -313,13 +309,20 @@ test.register_coroutine_test(
313309
{enabled_optional_capabilities = expected_update_metadata.optional_component_capabilities}
314310
)
315311
test.socket.device_lifecycle:__queue_receive(mock_device_basic:generate_info_changed({ profile = updated_device_profile }))
312+
local subscribe_request = cluster_subscribe_list[1]:subscribe(mock_device_basic)
313+
for i, cluster in ipairs(cluster_subscribe_list) do
314+
if i > 1 then
315+
subscribe_request:merge(cluster:subscribe(mock_device_basic))
316+
end
317+
end
318+
subscribe_request:merge(clusters.OnOff.attributes.OnOff:subscribe(mock_device_basic))
316319
test.socket.matter:__expect_send({mock_device_basic.id, subscribe_request})
317320
end,
318321
{ test_init = test_init_basic }
319322
)
320323

321-
local expected_update_metadata= {
322-
optional_component_capabilities={
324+
local expected_update_metadata_configured = {
325+
optional_component_capabilities = {
323326
{
324327
"main",
325328
{
@@ -358,17 +361,6 @@ local expected_update_metadata= {
358361
profile="air-purifier-modular",
359362
}
360363

361-
local subscribe_request = nil
362-
for _, attributes in pairs(cluster_subscribe_list_configured) do
363-
for _, attribute in ipairs(attributes) do
364-
if subscribe_request == nil then
365-
subscribe_request = attribute:subscribe(mock_device_ap_thermo_aqs)
366-
else
367-
subscribe_request:merge(attribute:subscribe(mock_device_ap_thermo_aqs))
368-
end
369-
end
370-
end
371-
372364
test.register_coroutine_test(
373365
"Test profile change on init for AP and Thermo and AQS combined device type",
374366
function()
@@ -379,14 +371,24 @@ test.register_coroutine_test(
379371
mock_device_ap_thermo_aqs.id,
380372
clusters.Thermostat.attributes.AttributeList:build_test_report_data(mock_device_ap_thermo_aqs, 1, {uint32(0)})
381373
})
382-
mock_device_ap_thermo_aqs:expect_metadata_update(expected_update_metadata)
374+
mock_device_ap_thermo_aqs:expect_metadata_update(expected_update_metadata_configured)
383375

384376
test.wait_for_events()
385377

386378
local updated_device_profile = t_utils.get_profile_definition("air-purifier-modular.yml",
387-
{enabled_optional_capabilities = expected_update_metadata.optional_component_capabilities}
379+
{enabled_optional_capabilities = expected_update_metadata_configured.optional_component_capabilities}
388380
)
389381
test.socket.device_lifecycle:__queue_receive(mock_device_ap_thermo_aqs:generate_info_changed({ profile = updated_device_profile }))
382+
local subscribe_request
383+
for _, attributes in pairs(cluster_subscribe_list_configured) do
384+
for _, attribute in ipairs(attributes) do
385+
if subscribe_request == nil then
386+
subscribe_request = attribute:subscribe(mock_device_ap_thermo_aqs)
387+
else
388+
subscribe_request:merge(attribute:subscribe(mock_device_ap_thermo_aqs))
389+
end
390+
end
391+
end
390392
test.socket.matter:__expect_send({mock_device_ap_thermo_aqs.id, subscribe_request})
391393
end,
392394
{ test_init = test_init_ap_thermo_aqs_preconfigured }

drivers/SmartThings/matter-thermostat/src/test/test_matter_fan.lua

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22
-- Licensed under the Apache License, Version 2.0
33

44
local test = require "integration_test"
5+
test.set_rpc_version(0)
56
local t_utils = require "integration_test.utils"
6-
77
local clusters = require "st.matter.clusters"
88

99
local mock_device = test.mock_device.build_test_matter_device({

0 commit comments

Comments
 (0)