Skip to content

Commit b0b7b50

Browse files
committed
add greater energy profiling logic for switches
1 parent a961e67 commit b0b7b50

13 files changed

+400
-173
lines changed
Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,24 @@
11
name: light-level-power-energy-powerConsumption
22
components:
3-
- id: main
4-
capabilities:
5-
- id: switch
6-
version: 1
7-
- id: switchLevel
8-
version: 1
9-
config:
10-
values:
11-
- key: "level.value"
12-
range: [1, 100]
13-
- id: powerMeter
14-
version: 1
15-
- id: energyMeter
16-
version: 1
17-
- id: powerConsumptionReport
18-
version: 1
19-
- id: firmwareUpdate
20-
version: 1
21-
- id: refresh
22-
version: 1
23-
categories:
24-
- name: Light
3+
- id: main
4+
capabilities:
5+
- id: switch
6+
version: 1
7+
- id: switchLevel
8+
version: 1
9+
config:
10+
values:
11+
- key: "level.value"
12+
range: [1, 100]
13+
- id: powerMeter
14+
version: 1
15+
- id: energyMeter
16+
version: 1
17+
- id: powerConsumptionReport
18+
version: 1
19+
- id: firmwareUpdate
20+
version: 1
21+
- id: refresh
22+
version: 1
23+
categories:
24+
- name: Light
Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,18 @@
11
name: light-power-energy-powerConsumption
22
components:
3-
- id: main
4-
capabilities:
5-
- id: switch
6-
version: 1
7-
- id: powerMeter
8-
version: 1
9-
- id: energyMeter
10-
version: 1
11-
- id: powerConsumptionReport
12-
version: 1
13-
- id: firmwareUpdate
14-
version: 1
15-
- id: refresh
16-
version: 1
17-
categories:
18-
- name: Light
3+
- id: main
4+
capabilities:
5+
- id: switch
6+
version: 1
7+
- id: powerMeter
8+
version: 1
9+
- id: energyMeter
10+
version: 1
11+
- id: powerConsumptionReport
12+
version: 1
13+
- id: firmwareUpdate
14+
version: 1
15+
- id: refresh
16+
version: 1
17+
categories:
18+
- name: Light

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

Lines changed: 217 additions & 118 deletions
Large diffs are not rendered by default.

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,7 @@ local function test_init()
141141
end
142142

143143
test.socket.matter:__expect_send({aqara_mock_device.id, subscribe_request})
144+
aqara_mock_device:set_field("__ELECTRICAL_TOPOLOGY", {topology = false, tags_on_ep = {}}, {persist = false}) -- since we're assuming this would have happened during device_added in this case.
144145
test.socket.device_lifecycle:__queue_receive({ aqara_mock_device.id, "doConfigure" })
145146
local read_attribute_list = clusters.PowerSource.attributes.AttributeList:read()
146147
test.socket.matter:__expect_send({aqara_mock_device.id, read_attribute_list})

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

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,8 @@ local aqara_mock_device = test.mock_device.build_test_matter_device({
3838
clusters = {
3939
{cluster_id = clusters.Basic.ID, cluster_type = "SERVER"},
4040
{cluster_id = clusters.ElectricalPowerMeasurement.ID, cluster_type = "SERVER", cluster_revision = 1, feature_map = 2 },
41-
{cluster_id = clusters.ElectricalEnergyMeasurement.ID, cluster_type = "SERVER", cluster_revision = 1, feature_map = 5 }
41+
{cluster_id = clusters.ElectricalEnergyMeasurement.ID, cluster_type = "SERVER", cluster_revision = 1, feature_map = 5 },
42+
{cluster_id = clusters.PowerTopology.ID, cluster_type = "SERVER", cluster_revision = 1, feature_map = 1 } -- NODE_TOPOLOGY
4243
},
4344
device_types = {
4445
{device_type_id = 0x0016, device_type_revision = 1}, -- RootNode
@@ -177,10 +178,12 @@ local function test_init()
177178
end
178179
end
179180
test.socket.matter:__expect_send({aqara_mock_device.id, subscribe_request})
181+
182+
-- Test added -> doConfigure logic
183+
test.socket.device_lifecycle:__queue_receive({ aqara_mock_device.id, "added" })
184+
test.socket.matter:__expect_send({aqara_mock_device.id, subscribe_request})
180185
test.socket.device_lifecycle:__queue_receive({ aqara_mock_device.id, "doConfigure" })
181-
test.mock_devices_api._expected_device_updates[aqara_mock_device.device_id] = "00000000-1111-2222-3333-000000000001"
182-
test.mock_devices_api._expected_device_updates[1] = {device_id = "00000000-1111-2222-3333-000000000001"}
183-
test.mock_devices_api._expected_device_updates[1].metadata = {deviceId="00000000-1111-2222-3333-000000000001", profileReference="4-button"}
186+
aqara_mock_device:expect_metadata_update({ profile = "4-button" })
184187
aqara_mock_device:expect_metadata_update({ provisioning_state = "PROVISIONED" })
185188
test.mock_device.add_test_device(aqara_mock_device)
186189
-- to test powerConsumptionReport
@@ -277,7 +280,7 @@ test.register_coroutine_test(
277280
{
278281
-- don't use "aqara_mock_children[aqara_child1_ep].id,"
279282
-- because energy management is at the root endpoint.
280-
aqara_mock_device.id,
283+
aqara_mock_children[aqara_child1_ep].id,
281284
clusters.ElectricalPowerMeasurement.attributes.ActivePower:build_test_report_data(aqara_mock_device, 1, 17000)
282285
}
283286
)
@@ -289,7 +292,7 @@ test.register_coroutine_test(
289292

290293
test.socket.matter:__queue_receive(
291294
{
292-
aqara_mock_device.id,
295+
aqara_mock_children[aqara_child1_ep].id,
293296
clusters.ElectricalEnergyMeasurement.attributes.CumulativeEnergyImported:build_test_report_data(aqara_mock_device, 1, cumulative_report_val_19)
294297
}
295298
)
@@ -302,7 +305,7 @@ test.register_coroutine_test(
302305
-- This is because related variable settings are required in set_poll_report_timer_and_schedule().
303306
test.socket.matter:__queue_receive(
304307
{
305-
aqara_mock_device.id,
308+
aqara_mock_children[aqara_child1_ep].id,
306309
clusters.ElectricalEnergyMeasurement.attributes.CumulativeEnergyImported:build_test_report_data(aqara_mock_device, 1, cumulative_report_val_29)
307310
}
308311
)
@@ -313,10 +316,8 @@ test.register_coroutine_test(
313316

314317
test.socket.matter:__queue_receive(
315318
{
316-
aqara_mock_device.id,
317-
clusters.ElectricalEnergyMeasurement.attributes.CumulativeEnergyImported:build_test_report_data(
318-
aqara_mock_device, 1, cumulative_report_val_39
319-
)
319+
aqara_mock_children[aqara_child1_ep].id,
320+
clusters.ElectricalEnergyMeasurement.attributes.CumulativeEnergyImported:build_test_report_data(aqara_mock_device, 1, cumulative_report_val_39)
320321
}
321322
)
322323

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

Lines changed: 65 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
local test = require "integration_test"
1616
local capabilities = require "st.capabilities"
1717
local t_utils = require "integration_test.utils"
18+
local uint32 = require "st.matter.data_types.Uint32"
1819

1920
local clusters = require "st.matter.clusters"
2021

@@ -42,6 +43,7 @@ local mock_device = test.mock_device.build_test_matter_device({
4243
clusters = {
4344
{ cluster_id = clusters.ElectricalEnergyMeasurement.ID, cluster_type = "SERVER", feature_map = 14, },
4445
{ cluster_id = clusters.ElectricalPowerMeasurement.ID, cluster_type = "SERVER", feature_map = 0, },
46+
{ cluster_id = clusters.PowerTopology.ID, cluster_type = "SERVER", feature_map = 4, }, -- SET_TOPOLOGY
4547
},
4648
device_types = {
4749
{ device_type_id = 0x0510, device_type_revision = 1 }, -- Electrical Sensor
@@ -51,10 +53,30 @@ local mock_device = test.mock_device.build_test_matter_device({
5153
endpoint_id = 2,
5254
clusters = {
5355
{ cluster_id = clusters.OnOff.ID, cluster_type = "SERVER", cluster_revision = 1, feature_map = 0, },
54-
{cluster_id = clusters.LevelControl.ID, cluster_type = "SERVER", feature_map = 2}
56+
{ cluster_id = clusters.LevelControl.ID, cluster_type = "SERVER", feature_map = 2},
5557
},
5658
device_types = {
57-
{ device_type_id = 0x010A, device_type_revision = 1 } -- OnOff Plug
59+
{ device_type_id = 0x010B, device_type_revision = 1 }, -- OnOff Dimmable Plug
60+
}
61+
},
62+
{
63+
endpoint_id = 3,
64+
clusters = {
65+
{ cluster_id = clusters.ElectricalEnergyMeasurement.ID, cluster_type = "SERVER", feature_map = 14, },
66+
{ cluster_id = clusters.PowerTopology.ID, cluster_type = "SERVER", feature_map = 4, }, -- SET_TOPOLOGY
67+
},
68+
device_types = {
69+
{ device_type_id = 0x0510, device_type_revision = 1 }, -- Electrical Sensor
70+
}
71+
},
72+
{
73+
endpoint_id = 4,
74+
clusters = {
75+
{ cluster_id = clusters.OnOff.ID, cluster_type = "SERVER", cluster_revision = 1, feature_map = 0, },
76+
{ cluster_id = clusters.LevelControl.ID, cluster_type = "SERVER", feature_map = 2},
77+
},
78+
device_types = {
79+
{ device_type_id = 0x010B, device_type_revision = 1 }, -- OnOff Dimmable Plug
5880
}
5981
},
6082
},
@@ -80,16 +102,20 @@ local mock_device_periodic = test.mock_device.build_test_matter_device({
80102
{
81103
endpoint_id = 1,
82104
clusters = {
105+
{ cluster_id = clusters.OnOff.ID, cluster_type = "SERVER", cluster_revision = 1, feature_map = 0, },
83106
{ cluster_id = clusters.ElectricalEnergyMeasurement.ID, cluster_type = "SERVER", feature_map = 10, },
107+
{ cluster_id = clusters.PowerTopology.ID, cluster_type = "SERVER", feature_map = 4, } -- SET_TOPOLOGY
84108
},
85109
device_types = {
86-
{ device_type_id = 0x0510, device_type_revision = 1 } -- Electrical Sensor
110+
{ device_type_id = 0x010A, device_type_revision = 1 }, -- OnOff Plug
111+
{ device_type_id = 0x0510, device_type_revision = 1 }, -- Electrical Sensor
87112
}
88113
},
89114
},
90115
})
91116

92117
local subscribed_attributes_periodic = {
118+
clusters.OnOff.attributes.OnOff,
93119
clusters.ElectricalEnergyMeasurement.attributes.PeriodicEnergyImported,
94120
clusters.ElectricalEnergyMeasurement.attributes.CumulativeEnergyImported,
95121
}
@@ -643,19 +669,52 @@ test.register_coroutine_test(
643669
test.register_coroutine_test(
644670
"Test profile change on init for Electrical Sensor device type",
645671
function()
672+
test.socket.device_lifecycle:__queue_receive({ mock_device.id, "added" })
673+
local read_req = clusters.PowerTopology.attributes.AvailableEndpoints:read(mock_device.id, 1)
674+
read_req:merge(clusters.PowerTopology.attributes.AvailableEndpoints:read(mock_device.id, 3))
675+
test.socket.matter:__expect_send({ mock_device.id, read_req })
676+
local subscribe_request = subscribed_attributes[1]:subscribe(mock_device)
677+
for i, cluster in ipairs(subscribed_attributes) do
678+
if i > 1 then
679+
subscribe_request:merge(cluster:subscribe(mock_device))
680+
end
681+
end
682+
test.socket.matter:__expect_send({ mock_device.id, subscribe_request })
646683
test.socket.device_lifecycle:__queue_receive({ mock_device.id, "doConfigure" })
647-
mock_device:expect_metadata_update({ profile = "plug-level-power-energy-powerConsumption" })
648684
mock_device:expect_metadata_update({ provisioning_state = "PROVISIONED" })
685+
test.wait_for_events()
686+
test.socket.matter:__queue_receive({ mock_device.id, clusters.PowerTopology.attributes.AvailableEndpoints:build_test_report_data(mock_device, 1, {uint32(2)})})
687+
test.socket.matter:__queue_receive({ mock_device.id, clusters.PowerTopology.attributes.AvailableEndpoints:build_test_report_data(mock_device, 3, {uint32(4)})})
688+
mock_device:expect_metadata_update({ profile = "plug-level-power-energy-powerConsumption" })
689+
mock_device:expect_device_create({
690+
type = "EDGE_CHILD",
691+
label = "nil 2",
692+
profile = "plug-level-energy-powerConsumption",
693+
parent_device_id = mock_device.id,
694+
parent_assigned_child_key = string.format("%d", 4)
695+
})
649696
end,
650697
{ test_init = test_init }
651698
)
652699

653700
test.register_coroutine_test(
654701
"Test profile change on init for only Periodic Electrical Sensor device type",
655702
function()
703+
test.socket.device_lifecycle:__queue_receive({ mock_device_periodic.id, "added" })
704+
local read_req = clusters.PowerTopology.attributes.AvailableEndpoints:read(mock_device_periodic.id, 1)
705+
test.socket.matter:__expect_send({ mock_device_periodic.id, read_req })
706+
local subscribe_request = subscribed_attributes_periodic[1]:subscribe(mock_device_periodic)
707+
for i, cluster in ipairs(subscribed_attributes_periodic) do
708+
if i > 1 then
709+
subscribe_request:merge(cluster:subscribe(mock_device_periodic))
710+
end
711+
end
712+
test.socket.matter:__expect_send({ mock_device_periodic.id, subscribe_request })
656713
test.socket.device_lifecycle:__queue_receive({ mock_device_periodic.id, "doConfigure" })
657-
mock_device_periodic:expect_metadata_update({ profile = "plug-energy-powerConsumption" })
658714
mock_device_periodic:expect_metadata_update({ provisioning_state = "PROVISIONED" })
715+
test.wait_for_events()
716+
test.socket.matter:__queue_receive({ mock_device_periodic.id, clusters.PowerTopology.attributes.AvailableEndpoints:build_test_report_data(mock_device_periodic, 1, {uint32(1)})})
717+
mock_device_periodic:expect_metadata_update({ profile = "plug-energy-powerConsumption" })
659718
end,
660719
{ test_init = test_init_periodic }
661720
)
@@ -692,7 +751,7 @@ test.register_message_test(
692751
direction = "receive",
693752
message = {
694753
mock_device.id,
695-
clusters.LevelControl.server.commands.MoveToLevelWithOnOff:build_test_command_response(mock_device, 2)
754+
clusters.LevelControl.server.commands.MoveToLevelWithOnOff:build_test_command_response(mock_device, 1)
696755
}
697756
},
698757
{

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ local function test_init()
6363
if i > 1 then subscribe_request:merge(clus:subscribe(mock_device)) end
6464
end
6565
test.socket.matter:__expect_send({mock_device.id, subscribe_request})
66+
mock_device:set_field("__ELECTRICAL_TOPOLOGY", {topology = false, tags_on_ep = {}}, {persist = false}) -- since we're assuming this would have happened during device_added in this case.
6667
test.socket.device_lifecycle:__queue_receive({ mock_device.id, "doConfigure" })
6768
mock_device:expect_metadata_update({ provisioning_state = "PROVISIONED" })
6869
test.mock_device.add_test_device(mock_device)

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@ local function test_init()
9090
end
9191
test.socket.matter:__expect_send({mock_device.id, subscribe_request})
9292
test.mock_device.add_test_device(mock_device)
93+
mock_device:set_field("__ELECTRICAL_TOPOLOGY", {topology = false, tags_on_ep = {}}, {persist = false}) -- since we're assuming this would have happened during device_added in this case.
9394
test.socket.device_lifecycle:__queue_receive({ mock_device.id, "doConfigure" })
9495
mock_device:expect_metadata_update({ profile = "light-color-level-fan" })
9596
mock_device:expect_metadata_update({ provisioning_state = "PROVISIONED" })

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,7 @@ local function test_init()
122122
if i > 1 then subscribe_request:merge(clus:subscribe(mock_device)) end
123123
end
124124
test.socket.matter:__expect_send({mock_device.id, subscribe_request})
125+
mock_device:set_field("__ELECTRICAL_TOPOLOGY", {topology = false, tags_on_ep = {}}, {persist = false}) -- since we're assuming this would have happened during device_added in this case.
125126
test.socket.device_lifecycle:__queue_receive({ mock_device.id, "doConfigure" })
126127
mock_device:expect_metadata_update({ provisioning_state = "PROVISIONED" })
127128
test.mock_device.add_test_device(mock_device)

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,7 @@ local function test_init()
198198
if i > 1 then subscribe_request:merge(clus:subscribe(mock_device)) end
199199
end
200200
test.socket.matter:__expect_send({mock_device.id, subscribe_request})
201+
mock_device:set_field("__ELECTRICAL_TOPOLOGY", {topology = false, tags_on_ep = {}}, {persist = false}) -- since we're assuming this would have happened during device_added in this case.
201202
test.socket.device_lifecycle:__queue_receive({ mock_device.id, "doConfigure" })
202203
mock_device:expect_metadata_update({ profile = "light-level-3-button" })
203204
mock_device:expect_metadata_update({ provisioning_state = "PROVISIONED" })
@@ -236,6 +237,7 @@ local function test_init_mcd_unsupported_switch_device_type()
236237
end
237238
end
238239
test.socket.matter:__expect_send({mock_device_mcd_unsupported_switch_device_type.id, subscribe_request})
240+
mock_device_mcd_unsupported_switch_device_type:set_field("__ELECTRICAL_TOPOLOGY", {topology = false, tags_on_ep = {}}, {persist = false}) -- since we're assuming this would have happened during device_added in this case.
239241
test.socket.device_lifecycle:__queue_receive({ mock_device_mcd_unsupported_switch_device_type.id, "doConfigure" })
240242
mock_device_mcd_unsupported_switch_device_type:expect_metadata_update({ profile = "2-button" })
241243
mock_device_mcd_unsupported_switch_device_type:expect_metadata_update({ provisioning_state = "PROVISIONED" })

0 commit comments

Comments
 (0)