From 93a326f14c068763d0194152a84785d0d9ae2795 Mon Sep 17 00:00:00 2001 From: Harrison Carter Date: Fri, 27 Sep 2024 17:06:24 -0500 Subject: [PATCH] Update PR based on comments --- .../matter-appliance/src/matter-oven/init.lua | 4 +- .../matter-appliance/src/test/test_oven.lua | 2 +- drivers/SmartThings/matter-evse/src/init.lua | 58 +++---- .../src/test/test_evse_energy_meas.lua | 3 +- .../SmartThings/matter-switch/src/init.lua | 21 ++- .../src/test/test_electrical_sensor.lua | 144 +++++++++++++++--- 6 files changed, 166 insertions(+), 66 deletions(-) diff --git a/drivers/SmartThings/matter-appliance/src/matter-oven/init.lua b/drivers/SmartThings/matter-appliance/src/matter-oven/init.lua index d7d036010a..d284501551 100644 --- a/drivers/SmartThings/matter-appliance/src/matter-oven/init.lua +++ b/drivers/SmartThings/matter-appliance/src/matter-oven/init.lua @@ -163,8 +163,8 @@ local function temperature_setpoint_attr_handler(driver, device, ib, response) maximum = max, } - -- Only emit the capability for RPC version >= 5 (unit conversion for - -- range capabilities is only supported for RPC >= 5) + -- Only emit the capability for RPC version >= 5, since unit conversion for + -- range capabilities is only supported in that case. if version.rpc >= 5 then device:emit_event_for_endpoint(ib.endpoint_id, capabilities.temperatureSetpoint.temperatureSetpointRange({value = range, unit = unit},{visibility = {displayed = false}})) diff --git a/drivers/SmartThings/matter-appliance/src/test/test_oven.lua b/drivers/SmartThings/matter-appliance/src/test/test_oven.lua index 0de6983e4c..e57e149c68 100644 --- a/drivers/SmartThings/matter-appliance/src/test/test_oven.lua +++ b/drivers/SmartThings/matter-appliance/src/test/test_oven.lua @@ -525,4 +525,4 @@ test.register_message_test( } ) -test.run_registered_tests() \ No newline at end of file +test.run_registered_tests() diff --git a/drivers/SmartThings/matter-evse/src/init.lua b/drivers/SmartThings/matter-evse/src/init.lua index 1ce82ad144..04b3b6a64f 100644 --- a/drivers/SmartThings/matter-evse/src/init.lua +++ b/drivers/SmartThings/matter-evse/src/init.lua @@ -116,7 +116,7 @@ local function tbl_contains(array, value) end -- MAPS -- -local EVSE_STATE_ENUM_TO_CAPABILITY_MAP = { +local EVSE_STATE_ENUM_MAP = { -- Since PLUGGED_IN_DISCHARGING is not to be supported, it is not checked. [clusters.EnergyEvse.types.StateEnum.NOT_PLUGGED_IN] = capabilities.evseState.state.notPluggedIn, [clusters.EnergyEvse.types.StateEnum.PLUGGED_IN_NO_DEMAND] = capabilities.evseState.state.pluggedInNoDemand, @@ -126,7 +126,7 @@ local EVSE_STATE_ENUM_TO_CAPABILITY_MAP = { [clusters.EnergyEvse.types.StateEnum.FAULT] = capabilities.evseState.state.fault, } -local EVSE_SUPPLY_STATE_ENUM_TO_CAPABILITY_MAP = { +local EVSE_SUPPLY_STATE_ENUM_MAP = { [clusters.EnergyEvse.types.SupplyStateEnum.DISABLED] = capabilities.evseState.supplyState.disabled, [clusters.EnergyEvse.types.SupplyStateEnum.CHARGING_ENABLED] = capabilities.evseState.supplyState.chargingEnabled, [clusters.EnergyEvse.types.SupplyStateEnum.DISCHARGING_ENABLED] = capabilities.evseState.supplyState.dischargingEnabled, @@ -134,7 +134,7 @@ local EVSE_SUPPLY_STATE_ENUM_TO_CAPABILITY_MAP = { [clusters.EnergyEvse.types.SupplyStateEnum.DISABLED_DIAGNOSTICS] = capabilities.evseState.supplyState.disabledDiagnostics, } -local EVSE_FAULTY_STATE_ENUM_TO_CAPABILITY_MAP = { +local EVSE_FAULT_STATE_ENUM_MAP = { [clusters.EnergyEvse.types.FaultStateEnum.NO_ERROR] = capabilities.evseState.faultState.noError, [clusters.EnergyEvse.types.FaultStateEnum.METER_FAILURE] = capabilities.evseState.faultState.meterFailure, [clusters.EnergyEvse.types.FaultStateEnum.OVER_VOLTAGE] = capabilities.evseState.faultState.overVoltage, @@ -155,12 +155,10 @@ local EVSE_FAULTY_STATE_ENUM_TO_CAPABILITY_MAP = { } local function read_cumulative_energy_imported(device) - local electrical_energy_measurement_eps = embedded_cluster_utils.get_endpoints(device, - clusters.ElectricalEnergyMeasurement.ID) or {} - if #electrical_energy_measurement_eps > 0 then - local read_req = clusters.ElectricalEnergyMeasurement.attributes.CumulativeEnergyImported:read(device, - electrical_energy_measurement_eps[1]) - for i, ep in ipairs(electrical_energy_measurement_eps) do + local electrical_energy_meas_eps = embedded_cluster_utils.get_endpoints(device, clusters.ElectricalEnergyMeasurement.ID) + if electrical_energy_meas_eps and #electrical_energy_meas_eps > 0 then + local read_req = clusters.ElectricalEnergyMeasurement.attributes.CumulativeEnergyImported:read(device, electrical_energy_meas_eps[1]) + for i, ep in ipairs(electrical_energy_meas_eps) do if i > 1 then read_req:merge(clusters.ElectricalEnergyMeasurement.attributes.CumulativeEnergyImported:read(device, ep)) end @@ -254,7 +252,7 @@ local function device_init(driver, device) create_poll_schedules_for_cumulative_energy_imported(device) local current_time = os.time() local current_time_iso8601 = epoch_to_iso8601(current_time) - --emit current time by default + -- emit current time by default device:emit_event(capabilities.evseChargingSession.targetEndTime(current_time_iso8601)) end @@ -276,7 +274,7 @@ local function do_configure(driver, device) local device_energy_mgmt_eps = embedded_cluster_utils.get_endpoints(device, clusters.DeviceEnergyManagementMode) or {} local profile_name = "evse" - --As per spec, atleast one of electrical energy measurement or electrical power measurement clusters are to be supported. + -- As per spec, at least one of the electrical energy measurement or electrical power measurement clusters are to be supported. if #energy_meas_eps > 0 then profile_name = profile_name .. "-energy-meas" end @@ -288,7 +286,7 @@ local function do_configure(driver, device) profile_name = profile_name .. "-energy-mgmt-mode" end - log.info_with({ hub_logs = true }, "Updating device profile to " .. profile_name) + device.log.info_with({ hub_logs = true }, string.format("Updating device profile to %s.", profile_name)) device:try_update_metadata({ profile = profile_name }) end @@ -328,7 +326,7 @@ local function evse_state_handler(driver, device, ib, response) capabilities.evseState.ID, capabilities.evseState.supplyState.NAME ) - local event = EVSE_STATE_ENUM_TO_CAPABILITY_MAP[evse_state] + local event = EVSE_STATE_ENUM_MAP[evse_state] if event then device:emit_event_for_endpoint(ib.endpoint_id, event()) charging_readiness_state_handler(driver, device, event, {NAME=latest_supply_state}) @@ -345,7 +343,7 @@ local function evse_supply_state_handler(driver, device, ib, response) capabilities.evseState.ID, capabilities.evseState.state.NAME ) - local event = EVSE_SUPPLY_STATE_ENUM_TO_CAPABILITY_MAP[evse_supply_state] + local event = EVSE_SUPPLY_STATE_ENUM_MAP[evse_supply_state] if event then device:emit_event_for_endpoint(ib.endpoint_id, event()) charging_readiness_state_handler(driver, device, {NAME=latest_evse_state}, event) @@ -354,14 +352,14 @@ local function evse_supply_state_handler(driver, device, ib, response) end end -local function evse_faulty_state_handler(driver, device, ib, response) - local evse_faulty_state = ib.data.value - local event = EVSE_FAULTY_STATE_ENUM_TO_CAPABILITY_MAP[evse_faulty_state] +local function evse_fault_state_handler(driver, device, ib, response) + local evse_fault_state = ib.data.value + local event = EVSE_FAULT_STATE_ENUM_MAP[evse_fault_state] if event then device:emit_event_for_endpoint(ib.endpoint_id, event()) return end - log.warn("evse_faulty_state_handler invalid EVSE Faulty State: " .. evse_faulty_state) + log.warn("Invalid EVSE fault state received: " .. evse_fault_state) end local function evse_charging_enabled_until_handler(driver, device, ib, response) @@ -375,7 +373,7 @@ local function evse_charging_enabled_until_handler(driver, device, ib, response) device:emit_event_for_endpoint(ep, capabilities.evseChargingSession.targetEndTime(targetEndTime)) return end - log.warn("evse_charging_enabled_until_handler invalid EVSE Target End TIme, not reporting!") + log.warn("Charging enabled handler received an invalid target end time, not reporting") end local function evse_current_limit_handler(event) @@ -439,8 +437,7 @@ local function energy_evse_supported_modes_attr_handler(driver, device, ib, resp end local function energy_evse_mode_attr_handler(driver, device, ib, response) - device.log.info_with({ hub_logs = true }, - string.format("energy_evse_modes_attr_handler currentMode: %s", ib.data.value)) + device.log.info(string.format("energy_evse_modes_attr_handler currentMode: %s", ib.data.value)) local supportedEvseModesMap = device:get_field(SUPPORTED_EVSE_MODES_MAP) or {} local supportedEvseModes = supportedEvseModesMap[ib.endpoint_id] or {} @@ -469,8 +466,7 @@ local function device_energy_mgmt_supported_modes_attr_handler(driver, device, i end local function device_energy_mgmt_mode_attr_handler(driver, device, ib, response) - device.log.info_with({ hub_logs = true }, - string.format("device_energy_mgmt_mode_attr_handler currentMode: %s", ib.data.value)) + device.log.info(string.format("device_energy_mgmt_mode_attr_handler currentMode: %s", ib.data.value)) local supportedDeviceEnergyMgmtModesMap = device:get_field(SUPPORTED_DEVICE_ENERGY_MANAGEMENT_MODES_MAP) or {} local supportedDeviceEnergyMgmtModes = supportedDeviceEnergyMgmtModesMap[ib.endpoint_id] or {} @@ -571,7 +567,7 @@ local handle_set_charging_parameters = function(cap, arg) log.warn_with({hub_logs=true}, "Clipping Max Current as it cannot be greater than 80A") end local capability_event = cap(cmd.args[arg]) - log.info_with({hub_logs=true}, "Setting value " .. (cmd.args[arg]) .. " for".. (cap.NAME)) + log.info("Setting value " .. (cmd.args[arg]) .. " for " .. (cap.NAME)) device:emit_event(capability_event) end end @@ -625,7 +621,7 @@ matter_driver_template = { [clusters.EnergyEvse.ID] = { [clusters.EnergyEvse.attributes.State.ID] = evse_state_handler, [clusters.EnergyEvse.attributes.SupplyState.ID] = evse_supply_state_handler, - [clusters.EnergyEvse.attributes.FaultState.ID] = evse_faulty_state_handler, + [clusters.EnergyEvse.attributes.FaultState.ID] = evse_fault_state_handler, [clusters.EnergyEvse.attributes.ChargingEnabledUntil.ID] = evse_charging_enabled_until_handler, [clusters.EnergyEvse.attributes.MinimumChargeCurrent.ID] = evse_current_limit_handler(capabilities .evseChargingSession.minCurrent), @@ -642,15 +638,12 @@ matter_driver_template = { [clusters.EnergyEvseMode.attributes.CurrentMode.ID] = energy_evse_mode_attr_handler, }, [clusters.DeviceEnergyManagementMode.ID] = { - [clusters.DeviceEnergyManagementMode.attributes.SupportedModes.ID] = - device_energy_mgmt_supported_modes_attr_handler, + [clusters.DeviceEnergyManagementMode.attributes.SupportedModes.ID] = device_energy_mgmt_supported_modes_attr_handler, [clusters.DeviceEnergyManagementMode.attributes.CurrentMode.ID] = device_energy_mgmt_mode_attr_handler, }, [clusters.ElectricalEnergyMeasurement.ID] = { - [clusters.ElectricalEnergyMeasurement.attributes.CumulativeEnergyImported.ID] = - cumulative_energy_imported_handler, - [clusters.ElectricalEnergyMeasurement.attributes.PeriodicEnergyImported.ID] = - periodic_energy_imported_handler + [clusters.ElectricalEnergyMeasurement.attributes.CumulativeEnergyImported.ID] = cumulative_energy_imported_handler, + [clusters.ElectricalEnergyMeasurement.attributes.PeriodicEnergyImported.ID] = periodic_energy_imported_handler }, }, }, @@ -702,6 +695,5 @@ matter_driver_template = { } local matter_driver = MatterDriver("matter-evse", matter_driver_template) -log.info_with({ hub_logs = true }, - string.format("Starting %s driver, with dispatcher: %s", matter_driver.NAME, matter_driver.matter_dispatcher)) +log.info(string.format("Starting %s driver, with dispatcher: %s", matter_driver.NAME, matter_driver.matter_dispatcher)) matter_driver:run() diff --git a/drivers/SmartThings/matter-evse/src/test/test_evse_energy_meas.lua b/drivers/SmartThings/matter-evse/src/test/test_evse_energy_meas.lua index 0388f52b24..b5b51236bd 100644 --- a/drivers/SmartThings/matter-evse/src/test/test_evse_energy_meas.lua +++ b/drivers/SmartThings/matter-evse/src/test/test_evse_energy_meas.lua @@ -164,7 +164,7 @@ test.register_coroutine_test( ) test.register_coroutine_test( - "Ensure the total accumulated powerConsumption for both endpoins is reported every 15 minutes", + "Ensure the total accumulated powerConsumption for both endpoints is reported every 15 minutes", function() test.socket.matter:__set_channel_ordering("relaxed") test.socket.capability:__set_channel_ordering("relaxed") @@ -189,6 +189,7 @@ test.register_coroutine_test( ELECTRICAL_SENSOR_EP_TWO, clusters.ElectricalEnergyMeasurement.types.EnergyMeasurementStruct({ energy = 150000, start_timestamp = 0, end_timestamp = 0, start_systime = 0, end_systime = 0 })) }) --150Wh + test.wait_for_events() test.mock_time.advance_time(60 * 15) test.socket.capability:__expect_send( diff --git a/drivers/SmartThings/matter-switch/src/init.lua b/drivers/SmartThings/matter-switch/src/init.lua index 3695e0e662..6368b237da 100644 --- a/drivers/SmartThings/matter-switch/src/init.lua +++ b/drivers/SmartThings/matter-switch/src/init.lua @@ -151,13 +151,13 @@ local detect_matter_thing local CUMULATIVE_REPORTS_NOT_SUPPORTED = "__cumulative_reports_not_supported" local FIRST_EXPORT_REPORT_TIMESTAMP = "__first_export_report_timestamp" -local EXPORT_POLL_TIMER_IS_SET = "__export_poll_timer_is_set" +local EXPORT_POLL_TIMER_SETTING_ATTEMPTED = "__export_poll_timer_setting_attempted" local EXPORT_REPORT_TIMEOUT = "__export_report_timeout" local TOTAL_EXPORTED_ENERGY = "__total_exported_energy" local LAST_EXPORTED_REPORT_TIMESTAMP = "__last_exported_report_timestamp" local RECURRING_EXPORT_REPORT_POLL_TIMER = "__recurring_export_report_poll_timer" local MINIMUM_ST_ENERGY_REPORT_INTERVAL = (15 * 60) -- 15 minutes, reported in seconds -local SUBSCIPTION_REPORT_OCCURRED = "__subscription_report_occurred" +local SUBSCRIPTION_REPORT_OCCURRED = "__subscription_report_occurred" local embedded_cluster_utils = require "embedded-cluster-utils" @@ -179,7 +179,7 @@ local function delete_export_poll_schedule(device) if export_poll_timer then device.thread:cancel_timer(export_poll_timer) device:set_field(RECURRING_EXPORT_REPORT_POLL_TIMER, nil) - device:set_field(EXPORT_POLL_TIMER_IS_SET, nil) + device:set_field(EXPORT_POLL_TIMER_SETTING_ATTEMPTED, nil) end end @@ -223,8 +223,8 @@ local function set_poll_report_timer_and_schedule(device, is_cumulative_report) end if #cumul_eps > 0 and not is_cumulative_report then return - elseif not device:get_field(SUBSCIPTION_REPORT_OCCURRED) then - device:set_field(SUBSCIPTION_REPORT_OCCURRED, true) + elseif not device:get_field(SUBSCRIPTION_REPORT_OCCURRED) then + device:set_field(SUBSCRIPTION_REPORT_OCCURRED, true) elseif not device:get_field(FIRST_EXPORT_REPORT_TIMESTAMP) then device:set_field(FIRST_EXPORT_REPORT_TIMESTAMP, os.time()) else @@ -236,7 +236,7 @@ local function set_poll_report_timer_and_schedule(device, is_cumulative_report) if device:supports_capability(capabilities.powerConsumptionReport) then create_poll_report_schedule(device) end - device:set_field(EXPORT_POLL_TIMER_IS_SET, true) + device:set_field(EXPORT_POLL_TIMER_SETTING_ATTEMPTED, true) end end @@ -934,7 +934,7 @@ end local function energy_report_handler_factory(is_cumulative_report) return function(driver, device, ib, response) - if not device:get_field(EXPORT_POLL_TIMER_IS_SET) then + if not device:get_field(EXPORT_POLL_TIMER_SETTING_ATTEMPTED) then set_poll_report_timer_and_schedule(device, is_cumulative_report) end if is_cumulative_report then @@ -1167,6 +1167,13 @@ local matter_driver_template = { [capabilities.battery.ID] = { clusters.PowerSource.attributes.BatPercentRemaining, }, + [capabilities.energyMeter.ID] = { + clusters.ElectricalEnergyMeasurement.attributes.CumulativeEnergyExported, + clusters.ElectricalEnergyMeasurement.attributes.PeriodicEnergyExported + }, + [capabilities.powerMeter.ID] = { + clusters.ElectricalPowerMeasurement.attributes.ActivePower + } }, subscribed_events = { [capabilities.button.ID] = { diff --git a/drivers/SmartThings/matter-switch/src/test/test_electrical_sensor.lua b/drivers/SmartThings/matter-switch/src/test/test_electrical_sensor.lua index a1304912bd..23125b002a 100644 --- a/drivers/SmartThings/matter-switch/src/test/test_electrical_sensor.lua +++ b/drivers/SmartThings/matter-switch/src/test/test_electrical_sensor.lua @@ -44,7 +44,16 @@ local mock_device = test.mock_device.build_test_matter_device({ { cluster_id = clusters.ElectricalPowerMeasurement.ID, cluster_type = "SERVER", feature_map = 0, }, }, device_types = { - { device_type_id = 0x0510, device_type_revision = 1 } -- Electrical Sensor + { device_type_id = 0x0510, device_type_revision = 1 }, -- Electrical Sensor + } + }, + { + endpoint_id = 2, + clusters = { + { cluster_id = clusters.OnOff.ID, cluster_type = "SERVER", cluster_revision = 1, feature_map = 0, }, + }, + device_types = { + { device_type_id = 0x010A, device_type_revision = 1 } -- OnOff Plug } }, }, @@ -81,11 +90,13 @@ local mock_device_periodic = test.mock_device.build_test_matter_device({ local subscribed_attributes_periodic = { clusters.ElectricalEnergyMeasurement.attributes.PeriodicEnergyExported, + clusters.ElectricalEnergyMeasurement.attributes.CumulativeEnergyExported, } local subscribed_attributes = { - clusters.ElectricalPowerMeasurement.attributes.ActivePower, - clusters.ElectricalEnergyMeasurement.attributes.CumulativeEnergyExported, - clusters.ElectricalEnergyMeasurement.attributes.PeriodicEnergyExported, + clusters.OnOff.attributes.OnOff, + clusters.ElectricalPowerMeasurement.attributes.ActivePower, + clusters.ElectricalEnergyMeasurement.attributes.CumulativeEnergyExported, + clusters.ElectricalEnergyMeasurement.attributes.PeriodicEnergyExported, } local cumulative_report_val_19 = { @@ -127,6 +138,7 @@ local function test_init() subscribe_request:merge(cluster:subscribe(mock_device)) end end + test.socket.matter:__expect_send({ mock_device.id, subscribe_request }) test.mock_device.add_test_device(mock_device) end test.set_test_init_function(test_init) @@ -134,30 +146,25 @@ test.set_test_init_function(test_init) local function test_init_periodic() local subscribe_request = subscribed_attributes_periodic[1]:subscribe(mock_device_periodic) for i, cluster in ipairs(subscribed_attributes_periodic) do - if i > 1 then - subscribe_request:merge(cluster:subscribe(mock_device_periodic)) - end + if i > 1 then + subscribe_request:merge(cluster:subscribe(mock_device_periodic)) + end end + test.socket.matter:__expect_send({ mock_device_periodic.id, subscribe_request }) test.mock_device.add_test_device(mock_device_periodic) - - test.socket["matter"]:__queue_receive( - { - mock_device_periodic.id, - clusters.ElectricalEnergyMeasurement.attributes.CumulativeEnergyExported:build_test_report_data( - mock_device_periodic, 1, periodic_report_val_23 - ) - } - ) - test.socket["capability"]:__expect_send( - mock_device_periodic:generate_test_message("main", capabilities.energyMeter.energy({ value = 23, unit = "Wh" })) - ) end test.register_coroutine_test( "Check the power and energy meter when the device is added", function() test.socket.matter:__set_channel_ordering("relaxed") test.socket.device_lifecycle:__queue_receive({ mock_device.id, "added" }) - + local subscribe_request = subscribed_attributes[1]:subscribe(mock_device) + for i, cluster in ipairs(subscribed_attributes) do + if i > 1 then + subscribe_request:merge(cluster:subscribe(mock_device)) + end + end + test.socket.matter:__expect_send({ mock_device.id, subscribe_request }) test.socket.capability:__expect_send( mock_device:generate_test_message("main", capabilities.powerMeter.power({ value = 0.0, unit = "W" })) ) @@ -170,6 +177,66 @@ test.register_coroutine_test( end ) +test.register_message_test( + "On command should send the appropriate commands", + { + channel = "devices", + direction = "send", + message = { + "register_native_capability_cmd_handler", + { device_uuid = mock_device.id, capability_id = "switch", capability_cmd_id = "on" } + } + }, + { + { + channel = "capability", + direction = "receive", + message = { + mock_device.id, + { capability = "switch", component = "main", command = "on", args = { } } + } + }, + { + channel = "matter", + direction = "send", + message = { + mock_device.id, + clusters.OnOff.server.commands.On(mock_device, 2) + } + } + } +) + +test.register_message_test( + "Off command should send the appropriate commands", + { + channel = "devices", + direction = "send", + message = { + "register_native_capability_cmd_handler", + { device_uuid = mock_device.id, capability_id = "switch", capability_cmd_id = "off" } + } + }, + { + { + channel = "capability", + direction = "receive", + message = { + mock_device.id, + { capability = "switch", component = "main", command = "off", args = { } } + } + }, + { + channel = "matter", + direction = "send", + message = { + mock_device.id, + clusters.OnOff.server.commands.Off(mock_device, 2) + } + } + } +) + test.register_message_test( "Active power measurement should generate correct messages", { @@ -282,6 +349,19 @@ test.register_message_test( test.register_message_test( "Periodic Energy measurement should generate correct messages", { + { + channel = "matter", + direction = "receive", + message = { + mock_device_periodic.id, + clusters.ElectricalEnergyMeasurement.server.attributes.PeriodicEnergyExported:build_test_report_data(mock_device_periodic, 1, periodic_report_val_23) + } + }, + { + channel = "capability", + direction = "send", + message = mock_device_periodic:generate_test_message("main", capabilities.energyMeter.energy({value = 23, unit="Wh"})) + }, { channel = "matter", direction = "receive", @@ -499,7 +579,17 @@ test.register_coroutine_test( test.register_coroutine_test( "Generated periodic export energy device poll timer (<15 minutes) gets correctly set", function() - + test.socket["matter"]:__queue_receive( + { + mock_device_periodic.id, + clusters.ElectricalEnergyMeasurement.attributes.PeriodicEnergyExported:build_test_report_data( + mock_device_periodic, 1, periodic_report_val_23 + ) + } + ) + test.socket["capability"]:__expect_send( + mock_device_periodic:generate_test_message("main", capabilities.energyMeter.energy({ value = 23, unit = "Wh" })) + ) test.socket["matter"]:__queue_receive( { mock_device_periodic.id, @@ -545,7 +635,17 @@ test.register_coroutine_test( test.register_coroutine_test( "Generated periodic export energy device poll timer (>15 minutes) gets correctly set", function() - + test.socket["matter"]:__queue_receive( + { + mock_device_periodic.id, + clusters.ElectricalEnergyMeasurement.attributes.PeriodicEnergyExported:build_test_report_data( + mock_device_periodic, 1, periodic_report_val_23 + ) + } + ) + test.socket["capability"]:__expect_send( + mock_device_periodic:generate_test_message("main", capabilities.energyMeter.energy({ value = 23, unit = "Wh" })) + ) test.socket["matter"]:__queue_receive( { mock_device_periodic.id,