Skip to content

Commit 06361fb

Browse files
committed
add greater energy profiling logic for switches
1 parent c2c8cb6 commit 06361fb

File tree

6 files changed

+345
-149
lines changed

6 files changed

+345
-149
lines changed

drivers/SmartThings/matter-switch/src/init.lua

Lines changed: 226 additions & 132 deletions
Large diffs are not rendered by default.

drivers/SmartThings/matter-switch/src/test/test_aqara_light_switch_h2.lua

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,8 @@ local aqara_mock_device = test.mock_device.build_test_matter_device({
3535
clusters = {
3636
{cluster_id = clusters.Basic.ID, cluster_type = "SERVER"},
3737
{cluster_id = clusters.ElectricalPowerMeasurement.ID, cluster_type = "SERVER", cluster_revision = 1, feature_map = 2 },
38-
{cluster_id = clusters.ElectricalEnergyMeasurement.ID, cluster_type = "SERVER", cluster_revision = 1, feature_map = 5 }
38+
{cluster_id = clusters.ElectricalEnergyMeasurement.ID, cluster_type = "SERVER", cluster_revision = 1, feature_map = 5 },
39+
{cluster_id = clusters.PowerTopology.ID, cluster_type = "SERVER", cluster_revision = 1, feature_map = 1 } -- NODE_TOPOLOGY
3940
},
4041
device_types = {
4142
{device_type_id = 0x0016, device_type_revision = 1}, -- RootNode
@@ -271,21 +272,20 @@ test.register_coroutine_test(
271272
function()
272273
test.socket.matter:__queue_receive(
273274
{
274-
-- don't use "aqara_mock_children[aqara_child1_ep].id,"
275-
-- because energy management is at the root endpoint.
276-
aqara_mock_device.id,
275+
aqara_mock_children[aqara_child1_ep].id,
277276
clusters.ElectricalPowerMeasurement.attributes.ActivePower:build_test_report_data(aqara_mock_device, 1, 17000)
278277
}
279278
)
280279

281280
test.socket.capability:__expect_send(
282-
-- when energy management is in the root endpoint, the event is sent to the first switch endpoint in CHILD_EDGE.
283281
aqara_mock_children[aqara_child1_ep]:generate_test_message("main", capabilities.powerMeter.power({value = 17.0, unit="W"}))
284282
)
285283

284+
aqara_mock_children[aqara_child1_ep]:expect_native_attr_handler_registration("powerMeter", "power")
285+
286286
test.socket.matter:__queue_receive(
287287
{
288-
aqara_mock_device.id,
288+
aqara_mock_children[aqara_child1_ep].id,
289289
clusters.ElectricalEnergyMeasurement.attributes.CumulativeEnergyImported:build_test_report_data(aqara_mock_device, 1, cumulative_report_val_19)
290290
}
291291
)
@@ -298,7 +298,7 @@ test.register_coroutine_test(
298298
-- This is because related variable settings are required in set_poll_report_timer_and_schedule().
299299
test.socket.matter:__queue_receive(
300300
{
301-
aqara_mock_device.id,
301+
aqara_mock_children[aqara_child1_ep].id,
302302
clusters.ElectricalEnergyMeasurement.attributes.CumulativeEnergyImported:build_test_report_data(aqara_mock_device, 1, cumulative_report_val_29)
303303
}
304304
)
@@ -309,10 +309,8 @@ test.register_coroutine_test(
309309

310310
test.socket.matter:__queue_receive(
311311
{
312-
aqara_mock_device.id,
313-
clusters.ElectricalEnergyMeasurement.attributes.CumulativeEnergyImported:build_test_report_data(
314-
aqara_mock_device, 1, cumulative_report_val_39
315-
)
312+
aqara_mock_children[aqara_child1_ep].id,
313+
clusters.ElectricalEnergyMeasurement.attributes.CumulativeEnergyImported:build_test_report_data(aqara_mock_device, 1, cumulative_report_val_39)
316314
}
317315
)
318316

@@ -334,4 +332,3 @@ test.register_coroutine_test(
334332
)
335333

336334
test.run_registered_tests()
337-

drivers/SmartThings/matter-switch/src/test/test_electrical_sensor.lua

Lines changed: 64 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ local test = require "integration_test"
1616
local capabilities = require "st.capabilities"
1717
local clusters = require "st.matter.clusters"
1818
local t_utils = require "integration_test.utils"
19+
local uint32 = require "st.matter.data_types.Uint32"
1920
local version = require "version"
2021

2122
if version.api < 11 then
@@ -44,6 +45,7 @@ local mock_device = test.mock_device.build_test_matter_device({
4445
clusters = {
4546
{ cluster_id = clusters.ElectricalEnergyMeasurement.ID, cluster_type = "SERVER", feature_map = 14, },
4647
{ cluster_id = clusters.ElectricalPowerMeasurement.ID, cluster_type = "SERVER", feature_map = 0, },
48+
{ cluster_id = clusters.PowerTopology.ID, cluster_type = "SERVER", feature_map = 4, }, -- SET_TOPOLOGY
4749
},
4850
device_types = {
4951
{ device_type_id = 0x0510, device_type_revision = 1 }, -- Electrical Sensor
@@ -56,9 +58,29 @@ local mock_device = test.mock_device.build_test_matter_device({
5658
{cluster_id = clusters.LevelControl.ID, cluster_type = "SERVER", feature_map = 2}
5759
},
5860
device_types = {
59-
{ device_type_id = 0x010A, device_type_revision = 1 } -- OnOff Plug
61+
{ device_type_id = 0x010B, device_type_revision = 1 }, -- OnOff Dimmable Plug
6062
}
61-
}
63+
},
64+
{
65+
endpoint_id = 3,
66+
clusters = {
67+
{ cluster_id = clusters.ElectricalEnergyMeasurement.ID, cluster_type = "SERVER", feature_map = 14, },
68+
{ cluster_id = clusters.PowerTopology.ID, cluster_type = "SERVER", feature_map = 4, }, -- SET_TOPOLOGY
69+
},
70+
device_types = {
71+
{ device_type_id = 0x0510, device_type_revision = 1 }, -- Electrical Sensor
72+
}
73+
},
74+
{
75+
endpoint_id = 4,
76+
clusters = {
77+
{ cluster_id = clusters.OnOff.ID, cluster_type = "SERVER", cluster_revision = 1, feature_map = 0, },
78+
{ cluster_id = clusters.LevelControl.ID, cluster_type = "SERVER", feature_map = 2},
79+
},
80+
device_types = {
81+
{ device_type_id = 0x010B, device_type_revision = 1 }, -- OnOff Dimmable Plug }
82+
}
83+
},
6284
},
6385
})
6486

@@ -82,16 +104,20 @@ local mock_device_periodic = test.mock_device.build_test_matter_device({
82104
{
83105
endpoint_id = 1,
84106
clusters = {
107+
{ cluster_id = clusters.OnOff.ID, cluster_type = "SERVER", cluster_revision = 1, feature_map = 0, },
85108
{ cluster_id = clusters.ElectricalEnergyMeasurement.ID, cluster_type = "SERVER", feature_map = 10, },
109+
{ cluster_id = clusters.PowerTopology.ID, cluster_type = "SERVER", feature_map = 4, } -- SET_TOPOLOGY
86110
},
87111
device_types = {
88-
{ device_type_id = 0x0510, device_type_revision = 1 } -- Electrical Sensor
112+
{ device_type_id = 0x010A, device_type_revision = 1 }, -- OnOff Plug
113+
{ device_type_id = 0x0510, device_type_revision = 1 }, -- Electrical Sensor
89114
}
90115
},
91116
},
92117
})
93118

94119
local subscribed_attributes_periodic = {
120+
clusters.OnOff.attributes.OnOff,
95121
clusters.ElectricalEnergyMeasurement.attributes.PeriodicEnergyImported,
96122
clusters.ElectricalEnergyMeasurement.attributes.CumulativeEnergyImported,
97123
}
@@ -653,19 +679,52 @@ test.register_coroutine_test(
653679
test.register_coroutine_test(
654680
"Test profile change on init for Electrical Sensor device type",
655681
function()
682+
test.socket.device_lifecycle:__queue_receive({ mock_device.id, "added" })
683+
local read_req = clusters.PowerTopology.attributes.AvailableEndpoints:read(mock_device.id, 1)
684+
read_req:merge(clusters.PowerTopology.attributes.AvailableEndpoints:read(mock_device.id, 3))
685+
test.socket.matter:__expect_send({ mock_device.id, read_req })
686+
local subscribe_request = subscribed_attributes[1]:subscribe(mock_device)
687+
for i, cluster in ipairs(subscribed_attributes) do
688+
if i > 1 then
689+
subscribe_request:merge(cluster:subscribe(mock_device))
690+
end
691+
end
692+
test.socket.matter:__expect_send({ mock_device.id, subscribe_request })
656693
test.socket.device_lifecycle:__queue_receive({ mock_device.id, "doConfigure" })
657-
mock_device:expect_metadata_update({ profile = "plug-level-power-energy-powerConsumption" })
658694
mock_device:expect_metadata_update({ provisioning_state = "PROVISIONED" })
695+
test.wait_for_events()
696+
test.socket.matter:__queue_receive({ mock_device.id, clusters.PowerTopology.attributes.AvailableEndpoints:build_test_report_data(mock_device, 1, {uint32(2)})})
697+
test.socket.matter:__queue_receive({ mock_device.id, clusters.PowerTopology.attributes.AvailableEndpoints:build_test_report_data(mock_device, 3, {uint32(4)})})
698+
mock_device:expect_metadata_update({ profile = "plug-level-power-energy-powerConsumption" })
699+
mock_device:expect_device_create({
700+
type = "EDGE_CHILD",
701+
label = "nil 2",
702+
profile = "plug-level-energy-powerConsumption",
703+
parent_device_id = mock_device.id,
704+
parent_assigned_child_key = string.format("%d", 4)
705+
})
659706
end,
660707
{ test_init = test_init }
661708
)
662709

663710
test.register_coroutine_test(
664711
"Test profile change on init for only Periodic Electrical Sensor device type",
665712
function()
713+
test.socket.device_lifecycle:__queue_receive({ mock_device_periodic.id, "added" })
714+
local read_req = clusters.PowerTopology.attributes.AvailableEndpoints:read(mock_device_periodic.id, 1)
715+
test.socket.matter:__expect_send({ mock_device_periodic.id, read_req })
716+
local subscribe_request = subscribed_attributes_periodic[1]:subscribe(mock_device_periodic)
717+
for i, cluster in ipairs(subscribed_attributes_periodic) do
718+
if i > 1 then
719+
subscribe_request:merge(cluster:subscribe(mock_device_periodic))
720+
end
721+
end
722+
test.socket.matter:__expect_send({ mock_device_periodic.id, subscribe_request })
666723
test.socket.device_lifecycle:__queue_receive({ mock_device_periodic.id, "doConfigure" })
667-
mock_device_periodic:expect_metadata_update({ profile = "plug-energy-powerConsumption" })
668724
mock_device_periodic:expect_metadata_update({ provisioning_state = "PROVISIONED" })
725+
test.wait_for_events()
726+
test.socket.matter:__queue_receive({ mock_device_periodic.id, clusters.PowerTopology.attributes.AvailableEndpoints:build_test_report_data(mock_device_periodic, 1, {uint32(1)})})
727+
mock_device_periodic:expect_metadata_update({ profile = "plug-energy-powerConsumption" })
669728
end,
670729
{ test_init = test_init_periodic }
671730
)

drivers/SmartThings/matter-switch/src/test/test_matter_switch_device_types.lua

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -473,6 +473,8 @@ end
473473

474474
local function test_init_dimmer()
475475
test.mock_device.add_test_device(mock_device_dimmer)
476+
test.socket.device_lifecycle:__queue_receive({ mock_device_dimmer.id, "added" })
477+
test.socket.device_lifecycle:__queue_receive({ mock_device_dimmer.id, "init" })
476478
test.socket.device_lifecycle:__queue_receive({ mock_device_dimmer.id, "doConfigure" })
477479
mock_device_dimmer:expect_metadata_update({ profile = "switch-level" })
478480
mock_device_dimmer:expect_metadata_update({ provisioning_state = "PROVISIONED" })
@@ -505,6 +507,7 @@ local function test_init_mounted_on_off_control()
505507
test.socket.matter:__expect_send({mock_device_mounted_on_off_control.id, subscribe_request})
506508

507509
test.socket.device_lifecycle:__queue_receive({ mock_device_mounted_on_off_control.id, "doConfigure" })
510+
mock_device_mounted_on_off_control:expect_metadata_update({ profile = "switch-binary" })
508511
mock_device_mounted_on_off_control:expect_metadata_update({ provisioning_state = "PROVISIONED" })
509512
end
510513

@@ -526,6 +529,7 @@ local function test_init_mounted_dimmable_load_control()
526529
test.socket.matter:__expect_send({mock_device_mounted_dimmable_load_control.id, subscribe_request})
527530

528531
test.socket.device_lifecycle:__queue_receive({ mock_device_mounted_dimmable_load_control.id, "doConfigure" })
532+
mock_device_mounted_dimmable_load_control:expect_metadata_update({ profile = "switch-level" })
529533
mock_device_mounted_dimmable_load_control:expect_metadata_update({ provisioning_state = "PROVISIONED" })
530534
end
531535

@@ -566,6 +570,7 @@ local function test_init_parent_child_different_types()
566570
test.socket.matter:__expect_send({mock_device_parent_child_different_types.id, subscribe_request})
567571

568572
test.socket.device_lifecycle:__queue_receive({ mock_device_parent_child_different_types.id, "doConfigure" })
573+
mock_device_parent_child_different_types:expect_metadata_update({ profile = "switch-binary" })
569574
mock_device_parent_child_different_types:expect_metadata_update({ provisioning_state = "PROVISIONED" })
570575

571576
mock_device_parent_child_different_types:expect_device_create({
@@ -617,6 +622,7 @@ local function test_init_light_level_motion()
617622
test.socket.matter:__expect_send({mock_device_light_level_motion.id, subscribe_request})
618623

619624
test.socket.device_lifecycle:__queue_receive({ mock_device_light_level_motion.id, "doConfigure" })
625+
mock_device_light_level_motion:expect_metadata_update({ profile = "light-level-motion" })
620626
mock_device_light_level_motion:expect_metadata_update({ provisioning_state = "PROVISIONED" })
621627
end
622628

drivers/SmartThings/matter-switch/src/test/test_multi_switch_parent_child_lights.lua

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,7 @@ local function test_init()
189189
test.socket.matter:__expect_send({mock_device.id, subscribe_request})
190190

191191
test.socket.device_lifecycle:__queue_receive({ mock_device.id, "doConfigure" })
192+
mock_device:expect_metadata_update({ profile = "light-binary" })
192193
mock_device:expect_metadata_update({ provisioning_state = "PROVISIONED" })
193194

194195
for _, child in pairs(mock_children) do
@@ -260,6 +261,7 @@ local function test_init_parent_child_endpoints_non_sequential()
260261
test.socket.matter:__expect_send({mock_device_parent_child_endpoints_non_sequential.id, subscribe_request})
261262

262263
test.socket.device_lifecycle:__queue_receive({ mock_device_parent_child_endpoints_non_sequential.id, "doConfigure" })
264+
mock_device_parent_child_endpoints_non_sequential:expect_metadata_update({ profile = "light-binary" })
263265
mock_device_parent_child_endpoints_non_sequential:expect_metadata_update({ provisioning_state = "PROVISIONED" })
264266

265267
for _, child in pairs(mock_children_non_sequential) do

drivers/SmartThings/matter-switch/src/test/test_multi_switch_parent_child_plugs.lua

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ local child_profile_override = t_utils.get_profile_definition("switch-binary.yml
2424
local parent_ep = 10
2525
local child1_ep = 20
2626
local child2_ep = 30
27+
local child3_ep = 40
28+
local child4_ep = 50
2729

2830
local mock_device = test.mock_device.build_test_matter_device({
2931
label = "Matter Switch",
@@ -69,6 +71,24 @@ local mock_device = test.mock_device.build_test_matter_device({
6971
{device_type_id = 0x010A, device_type_revision = 2} -- On/Off Plug
7072
}
7173
},
74+
{
75+
endpoint_id = child3_ep,
76+
clusters = {
77+
{cluster_id = clusters.OnOff.ID, cluster_type = "SERVER"},
78+
},
79+
device_types = {
80+
{device_type_id = 0x010A, device_type_revision = 2} -- On/Off Plug
81+
}
82+
},
83+
{
84+
endpoint_id = child4_ep,
85+
clusters = {
86+
{cluster_id = clusters.OnOff.ID, cluster_type = "SERVER"},
87+
},
88+
device_types = {
89+
{device_type_id = 0x010A, device_type_revision = 2} -- On/Off Plug
90+
}
91+
}
7292
}
7393
})
7494

@@ -146,6 +166,7 @@ local function test_init()
146166
test.socket.matter:__expect_send({mock_device.id, subscribe_request})
147167

148168
test.socket.device_lifecycle:__queue_receive({ mock_device.id, "doConfigure" })
169+
mock_device:expect_metadata_update({ profile = "plug-binary" })
149170
mock_device:expect_metadata_update({ provisioning_state = "PROVISIONED" })
150171

151172
for _, child in pairs(mock_children) do
@@ -167,6 +188,22 @@ local function test_init()
167188
parent_device_id = mock_device.id,
168189
parent_assigned_child_key = string.format("%d", child2_ep)
169190
})
191+
192+
mock_device:expect_device_create({
193+
type = "EDGE_CHILD",
194+
label = "Matter Switch 4",
195+
profile = "plug-binary",
196+
parent_device_id = mock_device.id,
197+
parent_assigned_child_key = string.format("%d", child3_ep)
198+
})
199+
200+
mock_device:expect_device_create({
201+
type = "EDGE_CHILD",
202+
label = "Matter Switch 5",
203+
profile = "plug-binary",
204+
parent_device_id = mock_device.id,
205+
parent_assigned_child_key = string.format("%d", child4_ep)
206+
})
170207
end
171208

172209
local mock_children_child_profile_override = {}
@@ -196,6 +233,7 @@ local function test_init_child_profile_override()
196233
test.socket.matter:__expect_send({mock_device_child_profile_override.id, subscribe_request})
197234

198235
test.socket.device_lifecycle:__queue_receive({ mock_device_child_profile_override.id, "doConfigure" })
236+
mock_device_child_profile_override:expect_metadata_update({ profile = "plug-binary" })
199237
mock_device_child_profile_override:expect_metadata_update({ provisioning_state = "PROVISIONED" })
200238

201239
for _, child in pairs(mock_children_child_profile_override) do

0 commit comments

Comments
 (0)