Skip to content

Commit a3dbd43

Browse files
committed
Merge branch 'cluster/energy_preference' into 'main'
components/esp-matter: Add Energy Preference Cluster See merge request app-frameworks/esp-matter!938
2 parents 84b2a86 + 31f7240 commit a3dbd43

10 files changed

+203
-2
lines changed

components/esp_matter/esp_matter_attribute.cpp

+35
Original file line numberDiff line numberDiff line change
@@ -4811,5 +4811,40 @@ attribute_t *create_boost_state(cluster_t *cluster, uint8_t value)
48114811
} /* attribute */
48124812
} /* water_heater_management */
48134813

4814+
namespace energy_preference {
4815+
namespace attribute {
4816+
attribute_t *create_energy_balances(cluster_t *cluster, uint8_t *value, uint16_t length, uint16_t count)
4817+
{
4818+
return esp_matter::attribute::create(cluster, EnergyPreference::Attributes::EnergyBalances::Id, ATTRIBUTE_FLAG_NONE,
4819+
esp_matter_array(value, length, count));
4820+
}
4821+
4822+
attribute_t *create_current_energy_balance(cluster_t *cluster, uint8_t value)
4823+
{
4824+
return esp_matter::attribute::create(cluster, EnergyPreference::Attributes::CurrentEnergyBalance::Id,
4825+
ATTRIBUTE_FLAG_NONVOLATILE | ATTRIBUTE_FLAG_WRITABLE, esp_matter_uint8(value));
4826+
}
4827+
4828+
attribute_t *create_energy_priorities(cluster_t *cluster, uint8_t *value, uint16_t length, uint16_t count)
4829+
{
4830+
return esp_matter::attribute::create(cluster, EnergyPreference::Attributes::EnergyPriorities::Id, ATTRIBUTE_FLAG_NONE,
4831+
esp_matter_array(value, length, count));
4832+
}
4833+
4834+
attribute_t *create_low_power_mode_sensitivities(cluster_t *cluster, uint8_t *value, uint16_t length, uint16_t count)
4835+
{
4836+
return esp_matter::attribute::create(cluster, EnergyPreference::Attributes::LowPowerModeSensitivities::Id, ATTRIBUTE_FLAG_NONE,
4837+
esp_matter_array(value, length, count));
4838+
}
4839+
4840+
attribute_t *create_current_low_power_mode_sensitivity(cluster_t *cluster, uint8_t value)
4841+
{
4842+
return esp_matter::attribute::create(cluster, EnergyPreference::Attributes::CurrentLowPowerModeSensitivity::Id,
4843+
ATTRIBUTE_FLAG_NONVOLATILE | ATTRIBUTE_FLAG_WRITABLE, esp_matter_uint8(value));
4844+
}
4845+
4846+
} /* attribute */
4847+
} /* energy_preference */
4848+
48144849
} /* cluster */
48154850
} /* esp_matter */

components/esp_matter/esp_matter_attribute.h

+10
Original file line numberDiff line numberDiff line change
@@ -1171,5 +1171,15 @@ attribute_t *create_boost_state(cluster_t *cluster, uint8_t value);
11711171
} /* attribute */
11721172
} /* water_heater_management */
11731173

1174+
namespace energy_preference {
1175+
namespace attribute {
1176+
attribute_t *create_energy_balances(cluster_t *cluster, uint8_t *value, uint16_t length, uint16_t count);
1177+
attribute_t *create_current_energy_balance(cluster_t *cluster, uint8_t value);
1178+
attribute_t *create_energy_priorities(cluster_t *cluster, uint8_t *value, uint16_t length, uint16_t count);
1179+
attribute_t *create_low_power_mode_sensitivities(cluster_t *cluster, uint8_t *value, uint16_t length, uint16_t count);
1180+
attribute_t *create_current_low_power_mode_sensitivity(cluster_t *cluster, uint8_t value);
1181+
} /* attribute */
1182+
} /* energy_preference */
1183+
11741184
} /* cluster */
11751185
} /* esp_matter */

components/esp_matter/esp_matter_cluster.cpp

+43
Original file line numberDiff line numberDiff line change
@@ -3651,6 +3651,49 @@ cluster_t *create(endpoint_t *endpoint, config_t *config, uint8_t flags)
36513651
}
36523652
} /* water_heater_mode */
36533653

3654+
namespace energy_preference {
3655+
const function_generic_t *function_list = NULL;
3656+
const int function_flags = CLUSTER_FLAG_NONE;
3657+
3658+
cluster_t *create(endpoint_t *endpoint, config_t *config, uint8_t flags, uint32_t features)
3659+
{
3660+
cluster_t *cluster = cluster::create(endpoint, EnergyPreference::Id, flags);
3661+
if (!cluster) {
3662+
ESP_LOGE(TAG, "Could not create cluster");
3663+
return NULL;
3664+
}
3665+
if (flags & CLUSTER_FLAG_SERVER) {
3666+
if (config -> delegate != nullptr) {
3667+
static const auto delegate_init_cb = EnergyPreferenceDelegateInitCB;
3668+
set_delegate_and_init_callback(cluster, delegate_init_cb, config->delegate);
3669+
}
3670+
static const auto plugin_server_init_cb = CALL_ONCE(MatterEnergyPreferencePluginServerInitCallback);
3671+
set_plugin_server_init_callback(cluster, plugin_server_init_cb);
3672+
add_function_list(cluster, function_list, function_flags);
3673+
3674+
/* Attributes managed internally */
3675+
global::attribute::create_feature_map(cluster, 0);
3676+
3677+
/** Attributes not managed internally **/
3678+
global::attribute::create_cluster_revision(cluster, cluster_revision);
3679+
}
3680+
3681+
if (flags & CLUSTER_FLAG_CLIENT) {
3682+
create_default_binding_cluster(endpoint);
3683+
}
3684+
3685+
/* Features */
3686+
if (features & feature::energy_balance::get_id()) {
3687+
feature::energy_balance::add(cluster, &(config->energy_balance));
3688+
}
3689+
if (features & feature::low_power_mode_sensitivity::get_id()) {
3690+
feature::low_power_mode_sensitivity::add(cluster, &(config->low_power_mode_sensitivity));
3691+
}
3692+
3693+
return cluster;
3694+
}
3695+
} /* energy_preference */
3696+
36543697
// namespace binary_input_basic {
36553698
// // ToDo
36563699
// } /* binary_input_basic */

components/esp_matter/esp_matter_cluster.h

+11
Original file line numberDiff line numberDiff line change
@@ -930,5 +930,16 @@ typedef struct config {
930930
cluster_t *create(endpoint_t *endpoint, config_t *config, uint8_t flags);
931931
} /* water_heater_mode */
932932

933+
namespace energy_preference {
934+
typedef struct config {
935+
feature::energy_balance::config_t energy_balance;
936+
feature::low_power_mode_sensitivity::config_t low_power_mode_sensitivity;
937+
void *delegate;
938+
config() : delegate(nullptr) {}
939+
} config_t;
940+
941+
cluster_t *create(endpoint_t *endpoint, config_t *config, uint8_t flags, uint32_t features);
942+
} /* energy_preference */
943+
933944
} /* cluster */
934945
} /* esp_matter */

components/esp_matter/esp_matter_delegate_callbacks.cpp

+11
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
#include <app/clusters/mode-select-server//supported-modes-manager.h>
4040
#include <app/clusters/thread-border-router-management-server/thread-border-router-management-server.h>
4141
#include <app/clusters/water-heater-management-server/water-heater-management-server.h>
42+
#include <app/clusters/energy-preference-server/energy-preference-server.h>
4243

4344
using namespace chip::app::Clusters;
4445
namespace esp_matter {
@@ -399,6 +400,16 @@ void WaterHeaterManagementDelegateInitCB(void *delegate, uint16_t endpoint_id)
399400
wHtrInstance->Init();
400401
}
401402

403+
void EnergyPreferenceDelegateInitCB(void *delegate, uint16_t endpoint_id)
404+
{
405+
if(delegate == nullptr)
406+
{
407+
return;
408+
}
409+
EnergyPreference::Delegate *energy_preference_delegate = static_cast<EnergyPreference::Delegate*>(delegate);
410+
EnergyPreference::SetDelegate(energy_preference_delegate);
411+
}
412+
402413
} // namespace delegate_cb
403414

404415
} // namespace cluster

components/esp_matter/esp_matter_delegate_callbacks.h

+1
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ void ModeSelectDelegateInitCB(void *delegate, uint16_t endpoint_id);
4949
void ThreadBorderRouterManagementDelegateInitCB(void *delegate, uint16_t endpoint_id);
5050
void ServiceAreaDelegateInitCB(void *delegate, uint16_t endpoint_id);
5151
void WaterHeaterManagementDelegateInitCB(void *delegate, uint16_t endpoint_id);
52+
void EnergyPreferenceDelegateInitCB(void *delegate, uint16_t endpoint_id);
5253
} // namespace delegate_cb
5354

5455
} // namespace cluster

components/esp_matter/esp_matter_feature.cpp

+51
Original file line numberDiff line numberDiff line change
@@ -4902,5 +4902,56 @@ esp_err_t add(cluster_t *cluster, config_t *config)
49024902
} /* feature */
49034903
} /* water_heater_management */
49044904

4905+
namespace energy_preference {
4906+
namespace feature {
4907+
4908+
namespace energy_balance {
4909+
4910+
uint32_t get_id()
4911+
{
4912+
return (uint32_t)EnergyPreference::Feature::kEnergyBalance;
4913+
}
4914+
4915+
esp_err_t add(cluster_t *cluster, config_t *config)
4916+
{
4917+
if (!cluster) {
4918+
ESP_LOGE(TAG, "Cluster cannot be NULL");
4919+
return ESP_ERR_INVALID_ARG;
4920+
}
4921+
update_feature_map(cluster, get_id());
4922+
4923+
attribute::create_energy_balances(cluster, NULL, 0, 0);
4924+
attribute::create_current_energy_balance(cluster, config->current_energy_balance);
4925+
attribute::create_energy_priorities(cluster, NULL, 0, 0);
4926+
4927+
return ESP_OK;
4928+
}
4929+
} /* energy_balance */
4930+
4931+
namespace low_power_mode_sensitivity {
4932+
4933+
uint32_t get_id()
4934+
{
4935+
return (uint32_t)EnergyPreference::Feature::kLowPowerModeSensitivity;
4936+
}
4937+
4938+
esp_err_t add(cluster_t *cluster, config_t *config)
4939+
{
4940+
if (!cluster) {
4941+
ESP_LOGE(TAG, "Cluster cannot be NULL");
4942+
return ESP_ERR_INVALID_ARG;
4943+
}
4944+
update_feature_map(cluster, get_id());
4945+
4946+
attribute::create_low_power_mode_sensitivities(cluster, NULL, 0, 0);
4947+
attribute::create_current_low_power_mode_sensitivity(cluster, config->current_low_power_mode_sensitivity);
4948+
4949+
return ESP_OK;
4950+
}
4951+
} /* low_power_mode_sensitivity */
4952+
4953+
} /* feature */
4954+
} /* energy_preference */
4955+
49054956
} /* cluster */
49064957
} /* esp_matter */

components/esp_matter/esp_matter_feature.h

+26-2
Original file line numberDiff line numberDiff line change
@@ -2147,11 +2147,35 @@ typedef struct config {
21472147

21482148
uint32_t get_id();
21492149
esp_err_t add(cluster_t *cluster, config_t *config);
2150-
21512150
} /* tank_percent */
2152-
21532151
} /* feature */
21542152
} /* water_heater_management */
21552153

2154+
namespace energy_preference {
2155+
namespace feature {
2156+
2157+
namespace energy_balance {
2158+
typedef struct config {
2159+
uint8_t current_energy_balance;
2160+
config() : current_energy_balance(0) {}
2161+
} config_t;
2162+
2163+
uint32_t get_id();
2164+
esp_err_t add(cluster_t *cluster, config_t *config);
2165+
} /* energy_balance */
2166+
2167+
namespace low_power_mode_sensitivity {
2168+
typedef struct config {
2169+
uint8_t current_low_power_mode_sensitivity;
2170+
config() : current_low_power_mode_sensitivity(0) {}
2171+
} config_t;
2172+
2173+
uint32_t get_id();
2174+
esp_err_t add(cluster_t *cluster, config_t *config);
2175+
} /* low_power_mode_sensitivity */
2176+
2177+
} /* feature */
2178+
} /* energy_preference */
2179+
21562180
} /* cluster */
21572181
} /* esp_matter */

components/esp_matter/private/esp_matter_cluster_revisions.h

+4
Original file line numberDiff line numberDiff line change
@@ -391,6 +391,10 @@ namespace water_heater_management {
391391
constexpr uint16_t cluster_revision = 2;
392392
} // namespace water_heater_management
393393

394+
namespace energy_preference {
395+
constexpr uint16_t cluster_revision = 1;
396+
} // namespace energy_preference
397+
394398
} // namespace cluster
395399
} // namespace esp_matter
396400

docs/en/app_guide.rst

+11
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ List of clusters with delegate:
4646
- Target Navigator Cluster.
4747
- Mode Select Cluster.
4848
- Water Heater Management Cluster.
49+
- Energy Preference Cluster.
4950

5051
9.1.1 Mode Base Cluster
5152
-----------------------
@@ -226,6 +227,14 @@ ModeWaterHeater, ModeRefrigerator, ModeLaundryWasher and ModeMicrowaveOven.
226227

227228
`Water Heater Management`_, `Water Heater Management Delegate`_
228229

230+
9.1.21 Energy Preference Cluster
231+
--------------------------------
232+
233+
.. csv-table::
234+
:header: "Delegate Class", "Reference Implementation"
235+
236+
`Energy Preference`_, `Energy Preference Delegate`_
237+
229238

230239
.. note::
231240
Make sure that after implementing delegate class, you set the delegate class pointer at the time of creating cluster.
@@ -282,3 +291,5 @@ ModeWaterHeater, ModeRefrigerator, ModeLaundryWasher and ModeMicrowaveOven.
282291
.. _`Mode Select Delegate`: https://github.com/espressif/connectedhomeip/blob/ea679d2dc674f576f4d391d1d71af1489010e580/examples/all-clusters-app/all-clusters-common/include/static-supported-modes-manager.h
283292
.. _`Water Heater Management`: https://github.com/espressif/connectedhomeip/blob/ea679d2dc674f576f4d391d1d71af1489010e580/src/app/clusters/water-heater-management-server/water-heater-management-server.h
284293
.. _`Water Heater Management Delegate`: https://github.com/espressif/connectedhomeip/blob/ea679d2dc674f576f4d391d1d71af1489010e580/examples/energy-management-app/energy-management-common/water-heater/include/WhmDelegate.h
294+
.. _`Energy Preference`: https://github.com/espressif/connectedhomeip/blob/ea679d2dc674f576f4d391d1d71af1489010e580/src/app/clusters/energy-preference-server/energy-preference-server.h
295+
.. _`Energy Preference Delegate`: https://github.com/espressif/connectedhomeip/blob/ea679d2dc674f576f4d391d1d71af1489010e580/examples/all-clusters-app/all-clusters-common/src/energy-preference-delegate.cpp

0 commit comments

Comments
 (0)