From 0512e285a72e3c6001ccbaf5242a4f5a7208f75d Mon Sep 17 00:00:00 2001 From: James Harrow Date: Thu, 12 Sep 2024 21:47:17 +0100 Subject: [PATCH 1/3] Fix BUILD.gn which was broken in moving files around in energy management app. --- .../energy-management-app/silabs/BUILD.gn | 46 +++++++++++-------- 1 file changed, 28 insertions(+), 18 deletions(-) diff --git a/examples/energy-management-app/silabs/BUILD.gn b/examples/energy-management-app/silabs/BUILD.gn index b51ed59de6f52c..76e603aba3736c 100644 --- a/examples/energy-management-app/silabs/BUILD.gn +++ b/examples/energy-management-app/silabs/BUILD.gn @@ -101,7 +101,11 @@ if (wifi_soc) { "${examples_plat_dir}", "${chip_root}/src/lib", "${examples_common_plat_dir}", - "../energy-management-common/include", + "${chip_root}/examples/energy-management-app/energy-management-common/common/include", + "${chip_root}/examples/energy-management-app/energy-management-common/device-energy-management/include", + "${chip_root}/examples/energy-management-app/energy-management-common/energy-evse/include", + "${chip_root}/examples/energy-management-app/energy-management-common/energy-reporting/include", + "${chip_root}/examples/energy-management-app/energy-management-common/water-heater/include", ] if (use_wf200) { @@ -136,23 +140,29 @@ silabs_executable("energy-management-app") { } sources = [ - "${chip_root}/examples/energy-management-app/energy-management-common/src/ChargingTargetsMemMgr.cpp", - "${chip_root}/examples/energy-management-app/energy-management-common/src/DEMTestEventTriggers.cpp", - "${chip_root}/examples/energy-management-app/energy-management-common/src/DeviceEnergyManagementDelegateImpl.cpp", - "${chip_root}/examples/energy-management-app/energy-management-common/src/DeviceEnergyManagementManager.cpp", - "${chip_root}/examples/energy-management-app/energy-management-common/src/EVSEManufacturerImpl.cpp", - "${chip_root}/examples/energy-management-app/energy-management-common/src/ElectricalPowerMeasurementDelegate.cpp", - "${chip_root}/examples/energy-management-app/energy-management-common/src/EnergyEvseDelegateImpl.cpp", - "${chip_root}/examples/energy-management-app/energy-management-common/src/EnergyEvseEventTriggers.cpp", - "${chip_root}/examples/energy-management-app/energy-management-common/src/EnergyEvseMain.cpp", - "${chip_root}/examples/energy-management-app/energy-management-common/src/EnergyEvseManager.cpp", - "${chip_root}/examples/energy-management-app/energy-management-common/src/EnergyEvseTargetsStore.cpp", - "${chip_root}/examples/energy-management-app/energy-management-common/src/EnergyReportingEventTriggers.cpp", - "${chip_root}/examples/energy-management-app/energy-management-common/src/EnergyTimeUtils.cpp", - "${chip_root}/examples/energy-management-app/energy-management-common/src/FakeReadings.cpp", - "${chip_root}/examples/energy-management-app/energy-management-common/src/PowerTopologyDelegate.cpp", - "${chip_root}/examples/energy-management-app/energy-management-common/src/device-energy-management-mode.cpp", - "${chip_root}/examples/energy-management-app/energy-management-common/src/energy-evse-mode.cpp", + "${chip_root}/examples/energy-management-app/energy-management-common/common/src/EnergyTimeUtils.cpp", + "${chip_root}/examples/energy-management-app/energy-management-common/device-energy-management/src/DEMTestEventTriggers.cpp", + "${chip_root}/examples/energy-management-app/energy-management-common/device-energy-management/src/DeviceEnergyManagementDelegateImpl.cpp", + "${chip_root}/examples/energy-management-app/energy-management-common/device-energy-management/src/DeviceEnergyManagementManager.cpp", + "${chip_root}/examples/energy-management-app/energy-management-common/device-energy-management/src/device-energy-management-mode.cpp", + "${chip_root}/examples/energy-management-app/energy-management-common/energy-evse/src/ChargingTargetsMemMgr.cpp", + "${chip_root}/examples/energy-management-app/energy-management-common/energy-evse/src/EVSEManufacturerImpl.cpp", + "${chip_root}/examples/energy-management-app/energy-management-common/energy-evse/src/EnergyEvseDelegateImpl.cpp", + "${chip_root}/examples/energy-management-app/energy-management-common/energy-evse/src/EnergyEvseEventTriggers.cpp", + "${chip_root}/examples/energy-management-app/energy-management-common/energy-evse/src/EnergyEvseMain.cpp", + "${chip_root}/examples/energy-management-app/energy-management-common/energy-evse/src/EnergyEvseManager.cpp", + "${chip_root}/examples/energy-management-app/energy-management-common/energy-evse/src/EnergyEvseTargetsStore.cpp", + "${chip_root}/examples/energy-management-app/energy-management-common/energy-evse/src/energy-evse-mode.cpp", + "${chip_root}/examples/energy-management-app/energy-management-common/energy-reporting/src/ElectricalPowerMeasurementDelegate.cpp", + "${chip_root}/examples/energy-management-app/energy-management-common/energy-reporting/src/EnergyReportingEventTriggers.cpp", + "${chip_root}/examples/energy-management-app/energy-management-common/energy-reporting/src/FakeReadings.cpp", + "${chip_root}/examples/energy-management-app/energy-management-common/energy-reporting/src/PowerTopologyDelegate.cpp", + "${chip_root}/examples/energy-management-app/energy-management-common/water-heater/src/WaterHeaterMain.cpp", + "${chip_root}/examples/energy-management-app/energy-management-common/water-heater/src/WhmDelegateImpl.cpp", + "${chip_root}/examples/energy-management-app/energy-management-common/water-heater/src/WhmInstance.cpp", + "${chip_root}/examples/energy-management-app/energy-management-common/water-heater/src/WhmMain.cpp", + "${chip_root}/examples/energy-management-app/energy-management-common/water-heater/src/WhmManufacturer.cpp", + "${chip_root}/examples/energy-management-app/energy-management-common/water-heater/src/water-heater-mode.cpp", "${examples_common_plat_dir}/main.cpp", "src/AppTask.cpp", ] From 78d6af8bb3b93f223678cbf853cab7737f25377c Mon Sep 17 00:00:00 2001 From: James Harrow Date: Thu, 12 Sep 2024 23:59:55 +0100 Subject: [PATCH 2/3] Added BUILD.gn arguments to enable different feature support. Updated README. Added test event triggers. --- .../energy-management-app/silabs/BUILD.gn | 27 +++++ .../energy-management-app/silabs/README.md | 26 ++++- .../silabs/include/AppTask.h | 4 +- .../silabs/src/AppTask.cpp | 106 ++++++++++++++++-- .../platform/esp32/common/Esp32AppServer.cpp | 2 +- 5 files changed, 150 insertions(+), 15 deletions(-) diff --git a/examples/energy-management-app/silabs/BUILD.gn b/examples/energy-management-app/silabs/BUILD.gn index 76e603aba3736c..0387bbaf91cc42 100644 --- a/examples/energy-management-app/silabs/BUILD.gn +++ b/examples/energy-management-app/silabs/BUILD.gn @@ -47,6 +47,22 @@ import("${examples_common_plat_dir}/args.gni") declare_args() { # Dump memory usage at link time. chip_print_memory_usage = false + + # Enable test event triggers by default: Disable these in production devices + chip_enable_energy_evse_trigger = true + chip_enable_energy_reporting_trigger = true + chip_enable_water_heater_management_trigger = true + chip_enable_device_energy_management_trigger = true + + # Device Energy Management feature support - only one of these can be true + # or both can be disabled if forecasting is not supported + chip_dem_support_power_forecast_reporting = true + chip_dem_support_state_forecast_reporting = false + + # Only one of these examples should be enabled + chip_enable_example_evse_device = true + chip_enable_example_water_heater_device = false + } if (slc_generate) { @@ -135,6 +151,17 @@ silabs_executable("energy-management-app") { include_dirs = [ "include" ] defines = [] + defines += [ + "CHIP_DEVICE_CONFIG_ENABLE_ENERGY_EVSE_TRIGGER=${chip_enable_energy_evse_trigger}", + "CHIP_DEVICE_CONFIG_ENABLE_ENERGY_REPORTING_TRIGGER=${chip_enable_energy_reporting_trigger}", + "CHIP_DEVICE_CONFIG_ENABLE_WATER_HEATER_MANAGEMENT_TRIGGER=${chip_enable_water_heater_management_trigger}", + "CHIP_DEVICE_CONFIG_ENABLE_DEVICE_ENERGY_MANAGEMENT_TRIGGER=${chip_enable_device_energy_management_trigger}", + "CHIP_DEVICE_CONFIG_DEM_SUPPORT_POWER_FORECAST_REPORTING=${chip_dem_support_power_forecast_reporting}", + "CHIP_DEVICE_CONFIG_DEM_SUPPORT_STATE_FORECAST_REPORTING=${chip_dem_support_state_forecast_reporting}", + "CHIP_DEVICE_CONFIG_ENABLE_EXAMPLE_EVSE_DEVICE=${chip_enable_example_evse_device}", + "CHIP_DEVICE_CONFIG_ENABLE_EXAMPLE_WATER_HEATER_DEVICE=${chip_enable_example_water_heater_device}", + ] + if (silabs_board == "BRD2704A") { defines += [ "SL_STATUS_LED=0" ] } diff --git a/examples/energy-management-app/silabs/README.md b/examples/energy-management-app/silabs/README.md index 06fc6f5c46b176..96237911df0989 100644 --- a/examples/energy-management-app/silabs/README.md +++ b/examples/energy-management-app/silabs/README.md @@ -33,8 +33,8 @@ An example showing the use of CHIP on the Silicon Labs EFR32 MG12 and MG24. ## Introduction The EFR32 Energy Management example provides a baseline demonstration of a EVSE -device, built using Matter and the Silicon Labs gecko SDK. It can be controlled -by a Chip controller over an Openthread or Wifi network.. +or Water Heater device, built using Matter and the Silicon Labs gecko SDK. It +can be controlled by a Chip controller over an Openthread or Wifi network. The EFR32 device can be commissioned over Bluetooth Low Energy where the device and the Chip controller will exchange security information with the Rendez-vous @@ -45,9 +45,9 @@ If the LCD is enabled, the LCD on the Silabs WSTK shows a QR Code containing the needed commissioning information for the BLE connection and starting the Rendez-vous procedure. -The EVSE example is intended to serve both as a means to explore the workings of -Matter as well as a template for creating real products based on the Silicon -Labs platform. +The EVSE and Water Heater examples are intended to serve both as a means to +explore the workings of Matter Energy Management as well as a template for +creating real products based on the Silicon Labs platform. ## Building @@ -99,9 +99,25 @@ Labs platform. $ git submodule update --init $ source third_party/connectedhomeip/scripts/activate.sh $ export SILABS_BOARD=BRD4187C + + To build the EVSE example + $ gn gen out/debug $ ninja -C out/debug + To build the Water Heater example you can change the args to gn gen (see + BUILD.gn for arg options) + + $ gn gen out/debug --args='chip_enable_example_evse_device=false chip_enable_example_water_heater_device=true' + $ ninja -C out/debug + + To change Device Energy Management feature support (e.g. Power forecast or + State forecast reporting), you can change the args to gn gen (see BUILD.gn + for arg options) + + $ gn gen out/debug --args='chip_dem_support_state_forecast_reporting=true chip_dem_support_power_forecast_reporting=false' + $ ninja -C out/debug + - To delete generated executable, libraries and object files use: $ cd ~/connectedhomeip/examples/energy-management-app/silabs diff --git a/examples/energy-management-app/silabs/include/AppTask.h b/examples/energy-management-app/silabs/include/AppTask.h index 99114610948952..b7105da42878db 100644 --- a/examples/energy-management-app/silabs/include/AppTask.h +++ b/examples/energy-management-app/silabs/include/AppTask.h @@ -28,7 +28,7 @@ #include "AppEvent.h" #include "BaseApplication.h" -#include "EnergyEvseManager.h" + #include "FreeRTOS.h" #include "timers.h" // provides FreeRTOS timer support #include @@ -80,7 +80,7 @@ class AppTask : public BaseApplication private: static AppTask sAppTask; - static void EvseActionEventHandler(AppEvent * aEvent); + static void EnergyManagementActionEventHandler(AppEvent * aEvent); static void UpdateClusterState(intptr_t context); diff --git a/examples/energy-management-app/silabs/src/AppTask.cpp b/examples/energy-management-app/silabs/src/AppTask.cpp index 4ed73efb28711e..9b1a93e00949d1 100644 --- a/examples/energy-management-app/silabs/src/AppTask.cpp +++ b/examples/energy-management-app/silabs/src/AppTask.cpp @@ -21,7 +21,12 @@ #include "AppConfig.h" #include "AppEvent.h" #include "LEDWidget.h" +#if CHIP_DEVICE_CONFIG_ENABLE_EXAMPLE_EVSE_DEVICE #include +#endif +#if CHIP_DEVICE_CONFIG_ENABLE_EXAMPLE_WATER_HEATER_DEVICE +#include +#endif #include #include #include @@ -43,6 +48,19 @@ #include +#if CONFIG_CHIP_DEVICE_CONFIG_ENABLE_ENERGY_EVSE_TRIGGER +#include +#endif +#if CONFIG_CHIP_DEVICE_CONFIG_ENABLE_ENERGY_REPORTING_TRIGGER +#include +#endif +#if CONFIG_CHIP_DEVICE_CONFIG_ENABLE_WATER_HEATER_MANAGEMENT_TRIGGER +#include +#endif +#if CONFIG_CHIP_DEVICE_CONFIG_ENABLE_DEVICE_ENERGY_MANAGEMENT_TRIGGER +#include +#endif + #if (defined(SL_CATALOG_SIMPLE_LED_LED1_PRESENT) || defined(SIWX_917)) #define EVSE_LED 1 #else @@ -53,7 +71,7 @@ #define APP_EVSE_SWITCH 1 namespace { -LEDWidget sEvseLED; +LEDWidget sEnergyManagementLED; } using namespace chip; @@ -61,6 +79,7 @@ using namespace chip::app; using namespace chip::app::Clusters; using namespace chip::app::Clusters::DeviceEnergyManagement; using namespace chip::app::Clusters::DeviceEnergyManagement::Attributes; +using namespace chip::app::Clusters::WaterHeaterManagement; using namespace ::chip::DeviceLayer; using namespace ::chip::DeviceLayer::Silabs; using namespace ::chip::DeviceLayer::Internal; @@ -72,9 +91,21 @@ namespace Clusters { namespace DeviceEnergyManagement { // Keep track of the parsed featureMap option +#if (CHIP_DEVICE_CONFIG_DEM_SUPPORT_POWER_FORECAST_REPORTING) && (CHIP_DEVICE_CONFIG_DEM_SUPPORT_STATE_FORECAST_REPORTING) +#error Cannot define CHIP_DEVICE_CONFIG_DEM_SUPPORT_POWER_FORECAST_REPORTING and CHIP_DEVICE_CONFIG_DEM_SUPPORT_STATE_FORECAST_REPORTING +#endif + +#if CHIP_DEVICE_CONFIG_DEM_SUPPORT_POWER_FORECAST_REPORTING static chip::BitMask sFeatureMap(Feature::kPowerAdjustment, Feature::kPowerForecastReporting, - Feature::kStateForecastReporting, Feature::kStartTimeAdjustment, Feature::kPausable, - Feature::kForecastAdjustment, Feature::kConstraintBasedAdjustment); + Feature::kStartTimeAdjustment, Feature::kPausable, Feature::kForecastAdjustment, + Feature::kConstraintBasedAdjustment); +#elif CHIP_DEVICE_CONFIG_DEM_SUPPORT_STATE_FORECAST_REPORTING +static chip::BitMask sFeatureMap(Feature::kPowerAdjustment, Feature::kStateForecastReporting, + Feature::kStartTimeAdjustment, Feature::kPausable, Feature::kForecastAdjustment, + Feature::kConstraintBasedAdjustment); +#else +static chip::BitMask sFeatureMap(Feature::kPowerAdjustment); +#endif chip::BitMask GetFeatureMapFromCmdLine() { @@ -91,14 +122,33 @@ AppTask AppTask::sAppTask; void ApplicationInit() { chip::DeviceLayer::PlatformMgr().LockChipStack(); + SILABS_LOG("=================================================="); +#if CHIP_DEVICE_CONFIG_ENABLE_EXAMPLE_EVSE_DEVICE + SILABS_LOG("energy-management-example EVSE starting. featureMap 0x%08lx", DeviceEnergyManagement::sFeatureMap.Raw()); + EvseApplicationInit(); - sEvseLED.Init(EVSE_LED); +#endif // CONFIG_ENABLE_EXAMPLE_EVSE_DEVICE + +#if CHIP_DEVICE_CONFIG_ENABLE_EXAMPLE_WATER_HEATER_DEVICE + SILABS_LOG("energy-management-example WaterHeater starting. featureMap 0x%08lx", DeviceEnergyManagement::sFeatureMap.Raw()); + + FullWhmApplicationInit(); +#endif // CONFIG_ENABLE_EXAMPLE_WATER_HEATER_DEVICE + SILABS_LOG("=================================================="); + + sEnergyManagementLED.Init(EVSE_LED); chip::DeviceLayer::PlatformMgr().UnlockChipStack(); } void ApplicationShutdown() { chip::DeviceLayer::PlatformMgr().LockChipStack(); +#if CHIP_DEVICE_CONFIG_ENABLE_EXAMPLE_EVSE_DEVICE EvseApplicationShutdown(); +#endif // CONFIG_ENABLE_EXAMPLE_EVSE_DEVICE + +#if CHIP_DEVICE_CONFIG_ENABLE_EXAMPLE_WATER_HEATER_DEVICE + FullWhmApplicationShutdown(); +#endif // CONFIG_ENABLE_EXAMPLE_WATER_HEATER_DEVICE chip::DeviceLayer::PlatformMgr().UnlockChipStack(); } @@ -108,7 +158,11 @@ CHIP_ERROR AppTask::Init() chip::DeviceLayer::Silabs::GetPlatform().SetButtonsCb(AppTask::ButtonEventHandler); #ifdef DISPLAY_ENABLED - GetLCD().Init((uint8_t *) "energy-management-App"); +#if CHIP_DEVICE_CONFIG_ENABLE_EXAMPLE_EVSE_DEVICE + GetLCD().Init((uint8_t *) "energy-management-App (EVSE)"); +#elif CHIP_DEVICE_CONFIG_ENABLE_EXAMPLE_WATER_HEATER_DEVICE + GetLCD().Init((uint8_t *) "energy-management-App (WaterHeater)"); +#endif #endif err = BaseApplication::Init(); @@ -120,6 +174,44 @@ CHIP_ERROR AppTask::Init() ApplicationInit(); +#if (CONFIG_CHIP_DEVICE_CONFIG_ENABLE_ENERGY_EVSE_TRIGGER) || (CONFIG_CHIP_DEVICE_CONFIG_ENABLE_ENERGY_REPORTING_TRIGGER) || \ + (CONFIG_CHIP_DEVICE_CONFIG_ENABLE_WATER_HEATER_MANAGEMENT_TRIGGER) || \ + (CONFIG_CHIP_DEVICE_CONFIG_ENABLE_DEVICE_ENERGY_MANAGEMENT_TRIGGER) + TestEventTriggerDelegate * pTestEventDelegate = Server::GetInstance().GetTestEventTriggerDelegate(); +#endif + +#if CONFIG_CHIP_DEVICE_CONFIG_ENABLE_ENERGY_EVSE_TRIGGER + static EnergyEvseTestEventTriggerHandler sEnergyEvseTestEventTriggerHandler; + if (pTestEventDelegate != nullptr) + { + VerifyOrDie(pTestEventDelegate->AddHandler(&sEnergyEvseTestEventTriggerHandler) == CHIP_NO_ERROR); + } +#endif + +#if CONFIG_CHIP_DEVICE_CONFIG_ENABLE_ENERGY_REPORTING_TRIGGER + static EnergyReportingTestEventTriggerHandler sEnergyReportingTestEventTriggerHandler; + if (pTestEventDelegate != nullptr) + { + VerifyOrDie(pTestEventDelegate->AddHandler(&sEnergyReportingTestEventTriggerHandler) == CHIP_NO_ERROR); + } + +#endif +#if CONFIG_CHIP_DEVICE_CONFIG_ENABLE_WATER_HEATER_MANAGEMENT_TRIGGER + static WaterHeaterManagementTestEventTriggerHandler sWaterHeaterManagementTestEventTriggerHandler; + + if (pTestEventDelegate != nullptr) + { + VerifyOrDie(pTestEventDelegate->AddHandler(&sWaterHeaterManagementTestEventTriggerHandler) == CHIP_NO_ERROR); + } +#endif +#if CONFIG_CHIP_DEVICE_CONFIG_ENABLE_DEVICE_ENERGY_MANAGEMENT_TRIGGER + static DeviceEnergyManagementTestEventTriggerHandler sDeviceEnergyManagementTestEventTriggerHandler; + if (pTestEventDelegate != nullptr) + { + VerifyOrDie(pTestEventDelegate->AddHandler(&sDeviceEnergyManagementTestEventTriggerHandler) == CHIP_NO_ERROR); + } +#endif + // Update the LCD with the Stored value. Show QR Code if not provisioned #ifdef DISPLAY_ENABLED GetLCD().WriteDemoUI(LightMgr().IsLightOn()); @@ -168,7 +260,7 @@ void AppTask::AppTaskMain(void * pvParameter) } } -void AppTask::EvseActionEventHandler(AppEvent * aEvent) +void AppTask::EnergyManagementActionEventHandler(AppEvent * aEvent) { bool initiated = false; int32_t actor; @@ -201,7 +293,7 @@ void AppTask::ButtonEventHandler(uint8_t button, uint8_t btnAction) if (button == APP_EVSE_SWITCH && btnAction == static_cast(SilabsPlatform::ButtonAction::ButtonPressed)) { - button_event.Handler = EvseActionEventHandler; + button_event.Handler = EnergyManagementActionEventHandler; AppTask::GetAppTask().PostEvent(&button_event); } else if (button == APP_FUNCTION_BUTTON) diff --git a/examples/platform/esp32/common/Esp32AppServer.cpp b/examples/platform/esp32/common/Esp32AppServer.cpp index 37dd7f4fe4adcf..e5b58e451e45e5 100644 --- a/examples/platform/esp32/common/Esp32AppServer.cpp +++ b/examples/platform/esp32/common/Esp32AppServer.cpp @@ -22,7 +22,7 @@ #include #include #include -#include + #include #include #include From f7cb5a95e9ede24ec25352688c853c357d5d3405 Mon Sep 17 00:00:00 2001 From: James Harrow Date: Mon, 16 Sep 2024 16:45:52 +0100 Subject: [PATCH 3/3] Removed blank lines --- examples/energy-management-app/silabs/BUILD.gn | 4 ---- 1 file changed, 4 deletions(-) diff --git a/examples/energy-management-app/silabs/BUILD.gn b/examples/energy-management-app/silabs/BUILD.gn index 0387bbaf91cc42..5ddab3b6a8a7ea 100644 --- a/examples/energy-management-app/silabs/BUILD.gn +++ b/examples/energy-management-app/silabs/BUILD.gn @@ -47,22 +47,18 @@ import("${examples_common_plat_dir}/args.gni") declare_args() { # Dump memory usage at link time. chip_print_memory_usage = false - # Enable test event triggers by default: Disable these in production devices chip_enable_energy_evse_trigger = true chip_enable_energy_reporting_trigger = true chip_enable_water_heater_management_trigger = true chip_enable_device_energy_management_trigger = true - # Device Energy Management feature support - only one of these can be true # or both can be disabled if forecasting is not supported chip_dem_support_power_forecast_reporting = true chip_dem_support_state_forecast_reporting = false - # Only one of these examples should be enabled chip_enable_example_evse_device = true chip_enable_example_water_heater_device = false - } if (slc_generate) {