Skip to content

Commit

Permalink
energy-management-app: refactor WH and EVSE into separate endpoints a…
Browse files Browse the repository at this point in the history
…nd fix conformance issues (#36201)

* Add missing Water Heater device to matter-devices.xml

This PR adds the missing Water Heater device to matter-devices.xml.

The description was generated using the Alchemy tool
(https://github.com/project-chip/alchemy) with the following command:

`alchemy zap --attribute="in-progress"  --sdkRoot=./connectedhomeip/
--specRoot=./connectedhomeip-spec/
./connectedhomeip-spec/src/device_types/WaterHeater.adoc`

I manually fixed the device nae from `Matter Water Heater` to `Water
Heater`.

* zap regen

* energy-management-app: Split WH and EVSE into 2 endpoints

This PR refactors the energy-management-app into 2 separate endpoints
(one for EVSE and another for WaterHeater).

This is the first step in making this app spec-conformant.

`TC_DeviceBasicComposition.py` failed on this app before this PR and now passes.

Changes:
* Split Water Heater and EVSE into two separate endpoints (1 and 2).
  Updated zap and code.
* Dinamically disable unused endpoint at runtime. Based on the app choice
  (command line argument on linux or #define in ESP32 or SIlabs), initialize
  the clusters in the correct endpoint and disable the other endpoint.
  For example, for Water Heater, initialize clusters on endpoint 2 and
  disable endpoint 1 (EVSE).
* Refactor/move the init code related to ElectricalSensor (PowerTopology, EPM and EEM) from inside EVSE
  into ElectricalSensorInit.h/.cpp so they can be easier to reuse by both WaterHeater and EVSE.
* Refactor/move DEM cluster init code into its own file so it can be
  better reused outside EVSE.

Test performed:
1. Check basic composition for EVSE:
```
scripts/run_in_python_env.sh out/python_env './scripts/tests/run_python_test.py --app ./out/linux-x64-energy-management-no-ble/chip-energy-management-app --app-args "--application evse --trace-to json:log" --script src/python_testing/TC_DeviceBasicComposition.py --script-args "--qr-code MT:-24J0AFN00KA0648G00"'
```

2. Check basic composition for WaterHeater:
```
scripts/run_in_python_env.sh out/python_env './scripts/tests/run_python_test.py --app ./out/linux-x64-energy-management-no-ble/chip-energy-management-app --app-args "--application water-heater --trace-to json:log" --script src/python_testing/TC_DeviceBasicComposition.py --script-args "--qr-code MT:-24J0AFN00KA0648G00"'
```

3. Check app against `TC_EEVSE_2_6.py`:
```
rm -f evse.bin; ./out/linux-x64-energy-management-no-ble/chip-energy-management-app --enable-key 000102030405060708090a0b0c0d0e0f --KVS evse.bin --featureSet 0x3d

python src/python_testing/TC_EEVSE_2_6.py --endpoint 1 -m on-network -n 1234 -p 20202021 -d 3840 --hex-arg enableKey:000102030405060708090a0b0c0d0e0f
```

* Use anon namespace instead of static.

* disable enpoint on esp32 and silabs

* address Tennessee's PR feedback

* Review suggestion: move GetMainAppEndpointId to another file

* zap regen

* fix matter-devices white space diffs

* App now builds on all-clusters app

* Fix typo on init

* fix all-clusters breakage on esp32

* fix misuse of namespace in header

* Fix breakage for silabs water heater

* Update WaterHeater endpoint for CI tests

This fixes REPL test CI breakage.

* Update WaterHeater tests to endpoint 2

* Bumped ClusterRevisions

Cluster 40 (0x28) BasicInformation - 3 -> 4
Cluster 47 (0x2f) PowerSource - 2 -> 3
Cluster 48 (0x30) GeneralCommissioning 1-> 2
Cluster 3 (0x03) Identify 4 -> 5
Cluster 153 (0x99) EnergyEvse 2 -> 3
Cluster 157 (0x9d) EnergyEvseMode 1-> 2
Cluster 159 (0x9f) DeviceEnergyManagementMode 1-> 2

* Update AccessControl featureMap to enable Extension attribute

* Remove AccessControl extension attribute

* Remove kStateForecastReporting from the default feature map

That feature can't be enabled together with kPowerAdjustment.

* Update TC_WHM_1_2 endpoint to 2

* Fix various conformance issues

Remove PowerSource from root node and move to EP1/evse
Bump cluster revisions where needed
Fix device type descriptions for each EP
Remove unused Thermostat cluster and added a TODO. We need to properly
implement this cluster for this app for temperature control.

* TC_WHM_1_2: Use endpoint id passed as argument instead of hardcoded
  • Loading branch information
soares-sergio authored Nov 27, 2024
1 parent 63bc8a3 commit 481270d
Show file tree
Hide file tree
Showing 29 changed files with 2,802 additions and 1,641 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,11 @@ static std::unique_ptr<EnergyEvseDelegate> gDelegate;
static std::unique_ptr<EvseTargetsDelegate> gEvseTargetsDelegate;
static std::unique_ptr<EnergyEvseManager> gInstance;

EndpointId GetEnergyDeviceEndpointId()
{
return chip::EndpointId(1);
}

void emberAfEnergyEvseClusterInitCallback(chip::EndpointId endpointId)
{
VerifyOrDie(endpointId == 1); // this cluster is only enabled for endpoint 1.
Expand Down
3 changes: 2 additions & 1 deletion examples/all-clusters-app/linux/main-common.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,7 @@ const Clusters::Descriptor::Structs::SemanticTagStruct::Type gEp3TagList[] = { {
.tag = kTagSwitchesUp } };
const Clusters::Descriptor::Structs::SemanticTagStruct::Type gEp4TagList[] = { { .namespaceID = kNamespaceSwitches,
.tag = kTagSwitchesDown } };

} // namespace

#ifdef MATTER_DM_PLUGIN_DISHWASHER_ALARM_SERVER
Expand Down Expand Up @@ -256,7 +257,7 @@ void ApplicationInit()
Clusters::ValveConfigurationAndControl::SetDefaultDelegate(chip::EndpointId(1), &sValveDelegate);
Clusters::TimeSynchronization::SetDefaultDelegate(&sTimeSyncDelegate);

Clusters::WaterHeaterManagement::WhmApplicationInit();
Clusters::WaterHeaterManagement::WhmApplicationInit(chip::EndpointId(1));

SetTagList(/* endpoint= */ 0, Span<const Clusters::Descriptor::Structs::SemanticTagStruct::Type>(gEp0TagList));
SetTagList(/* endpoint= */ 1, Span<const Clusters::Descriptor::Structs::SemanticTagStruct::Type>(gEp1TagList));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,5 +19,21 @@
#pragma once

#include <DeviceEnergyManagementDelegateImpl.h>
#include <DeviceEnergyManagementManager.h>
#include <ElectricalPowerMeasurementDelegate.h>
#include <PowerTopologyDelegate.h>
#include <lib/core/CHIPError.h>

// This app is configured by default with EP1 for EVSE and EP2 for WaterHeater, with only one endpoint
// enabled. On linux, there's a command line argument (--application) to dynamically enable
// "evse|water-heater", i.e. EP1 or EP2. On other platforms, it's a build time definition (#define).
chip::EndpointId GetEnergyDeviceEndpointId();

// The DEM Delegate is used for the TestEventTriggers
chip::app::Clusters::DeviceEnergyManagement::DeviceEnergyManagementDelegate * GetDEMDelegate();

void EvseApplicationInit();
void EvseApplicationShutdown();

void WaterHeaterApplicationInit();
void WaterHeaterApplicationShutdown();
Loading

0 comments on commit 481270d

Please sign in to comment.