Merge branch 'cluster/energy_preference' into 'main'

components/esp-matter: Add Energy Preference Cluster

See merge request app-frameworks/esp-matter!938
This commit is contained in:
Hrishikesh Dhayagude
2024-11-18 15:03:04 +08:00
10 changed files with 203 additions and 2 deletions
@@ -4811,5 +4811,40 @@ attribute_t *create_boost_state(cluster_t *cluster, uint8_t value)
} /* attribute */
} /* water_heater_management */
namespace energy_preference {
namespace attribute {
attribute_t *create_energy_balances(cluster_t *cluster, uint8_t *value, uint16_t length, uint16_t count)
{
return esp_matter::attribute::create(cluster, EnergyPreference::Attributes::EnergyBalances::Id, ATTRIBUTE_FLAG_NONE,
esp_matter_array(value, length, count));
}
attribute_t *create_current_energy_balance(cluster_t *cluster, uint8_t value)
{
return esp_matter::attribute::create(cluster, EnergyPreference::Attributes::CurrentEnergyBalance::Id,
ATTRIBUTE_FLAG_NONVOLATILE | ATTRIBUTE_FLAG_WRITABLE, esp_matter_uint8(value));
}
attribute_t *create_energy_priorities(cluster_t *cluster, uint8_t *value, uint16_t length, uint16_t count)
{
return esp_matter::attribute::create(cluster, EnergyPreference::Attributes::EnergyPriorities::Id, ATTRIBUTE_FLAG_NONE,
esp_matter_array(value, length, count));
}
attribute_t *create_low_power_mode_sensitivities(cluster_t *cluster, uint8_t *value, uint16_t length, uint16_t count)
{
return esp_matter::attribute::create(cluster, EnergyPreference::Attributes::LowPowerModeSensitivities::Id, ATTRIBUTE_FLAG_NONE,
esp_matter_array(value, length, count));
}
attribute_t *create_current_low_power_mode_sensitivity(cluster_t *cluster, uint8_t value)
{
return esp_matter::attribute::create(cluster, EnergyPreference::Attributes::CurrentLowPowerModeSensitivity::Id,
ATTRIBUTE_FLAG_NONVOLATILE | ATTRIBUTE_FLAG_WRITABLE, esp_matter_uint8(value));
}
} /* attribute */
} /* energy_preference */
} /* cluster */
} /* esp_matter */
@@ -1171,5 +1171,15 @@ attribute_t *create_boost_state(cluster_t *cluster, uint8_t value);
} /* attribute */
} /* water_heater_management */
namespace energy_preference {
namespace attribute {
attribute_t *create_energy_balances(cluster_t *cluster, uint8_t *value, uint16_t length, uint16_t count);
attribute_t *create_current_energy_balance(cluster_t *cluster, uint8_t value);
attribute_t *create_energy_priorities(cluster_t *cluster, uint8_t *value, uint16_t length, uint16_t count);
attribute_t *create_low_power_mode_sensitivities(cluster_t *cluster, uint8_t *value, uint16_t length, uint16_t count);
attribute_t *create_current_low_power_mode_sensitivity(cluster_t *cluster, uint8_t value);
} /* attribute */
} /* energy_preference */
} /* cluster */
} /* esp_matter */
@@ -3651,6 +3651,49 @@ cluster_t *create(endpoint_t *endpoint, config_t *config, uint8_t flags)
}
} /* water_heater_mode */
namespace energy_preference {
const function_generic_t *function_list = NULL;
const int function_flags = CLUSTER_FLAG_NONE;
cluster_t *create(endpoint_t *endpoint, config_t *config, uint8_t flags, uint32_t features)
{
cluster_t *cluster = cluster::create(endpoint, EnergyPreference::Id, flags);
if (!cluster) {
ESP_LOGE(TAG, "Could not create cluster");
return NULL;
}
if (flags & CLUSTER_FLAG_SERVER) {
if (config -> delegate != nullptr) {
static const auto delegate_init_cb = EnergyPreferenceDelegateInitCB;
set_delegate_and_init_callback(cluster, delegate_init_cb, config->delegate);
}
static const auto plugin_server_init_cb = CALL_ONCE(MatterEnergyPreferencePluginServerInitCallback);
set_plugin_server_init_callback(cluster, plugin_server_init_cb);
add_function_list(cluster, function_list, function_flags);
/* Attributes managed internally */
global::attribute::create_feature_map(cluster, 0);
/** Attributes not managed internally **/
global::attribute::create_cluster_revision(cluster, cluster_revision);
}
if (flags & CLUSTER_FLAG_CLIENT) {
create_default_binding_cluster(endpoint);
}
/* Features */
if (features & feature::energy_balance::get_id()) {
feature::energy_balance::add(cluster, &(config->energy_balance));
}
if (features & feature::low_power_mode_sensitivity::get_id()) {
feature::low_power_mode_sensitivity::add(cluster, &(config->low_power_mode_sensitivity));
}
return cluster;
}
} /* energy_preference */
// namespace binary_input_basic {
// // ToDo
// } /* binary_input_basic */
@@ -930,5 +930,16 @@ typedef struct config {
cluster_t *create(endpoint_t *endpoint, config_t *config, uint8_t flags);
} /* water_heater_mode */
namespace energy_preference {
typedef struct config {
feature::energy_balance::config_t energy_balance;
feature::low_power_mode_sensitivity::config_t low_power_mode_sensitivity;
void *delegate;
config() : delegate(nullptr) {}
} config_t;
cluster_t *create(endpoint_t *endpoint, config_t *config, uint8_t flags, uint32_t features);
} /* energy_preference */
} /* cluster */
} /* esp_matter */
@@ -39,6 +39,7 @@
#include <app/clusters/mode-select-server//supported-modes-manager.h>
#include <app/clusters/thread-border-router-management-server/thread-border-router-management-server.h>
#include <app/clusters/water-heater-management-server/water-heater-management-server.h>
#include <app/clusters/energy-preference-server/energy-preference-server.h>
using namespace chip::app::Clusters;
namespace esp_matter {
@@ -399,6 +400,16 @@ void WaterHeaterManagementDelegateInitCB(void *delegate, uint16_t endpoint_id)
wHtrInstance->Init();
}
void EnergyPreferenceDelegateInitCB(void *delegate, uint16_t endpoint_id)
{
if(delegate == nullptr)
{
return;
}
EnergyPreference::Delegate *energy_preference_delegate = static_cast<EnergyPreference::Delegate*>(delegate);
EnergyPreference::SetDelegate(energy_preference_delegate);
}
} // namespace delegate_cb
} // namespace cluster
@@ -49,6 +49,7 @@ void ModeSelectDelegateInitCB(void *delegate, uint16_t endpoint_id);
void ThreadBorderRouterManagementDelegateInitCB(void *delegate, uint16_t endpoint_id);
void ServiceAreaDelegateInitCB(void *delegate, uint16_t endpoint_id);
void WaterHeaterManagementDelegateInitCB(void *delegate, uint16_t endpoint_id);
void EnergyPreferenceDelegateInitCB(void *delegate, uint16_t endpoint_id);
} // namespace delegate_cb
} // namespace cluster
@@ -4902,5 +4902,56 @@ esp_err_t add(cluster_t *cluster, config_t *config)
} /* feature */
} /* water_heater_management */
namespace energy_preference {
namespace feature {
namespace energy_balance {
uint32_t get_id()
{
return (uint32_t)EnergyPreference::Feature::kEnergyBalance;
}
esp_err_t add(cluster_t *cluster, config_t *config)
{
if (!cluster) {
ESP_LOGE(TAG, "Cluster cannot be NULL");
return ESP_ERR_INVALID_ARG;
}
update_feature_map(cluster, get_id());
attribute::create_energy_balances(cluster, NULL, 0, 0);
attribute::create_current_energy_balance(cluster, config->current_energy_balance);
attribute::create_energy_priorities(cluster, NULL, 0, 0);
return ESP_OK;
}
} /* energy_balance */
namespace low_power_mode_sensitivity {
uint32_t get_id()
{
return (uint32_t)EnergyPreference::Feature::kLowPowerModeSensitivity;
}
esp_err_t add(cluster_t *cluster, config_t *config)
{
if (!cluster) {
ESP_LOGE(TAG, "Cluster cannot be NULL");
return ESP_ERR_INVALID_ARG;
}
update_feature_map(cluster, get_id());
attribute::create_low_power_mode_sensitivities(cluster, NULL, 0, 0);
attribute::create_current_low_power_mode_sensitivity(cluster, config->current_low_power_mode_sensitivity);
return ESP_OK;
}
} /* low_power_mode_sensitivity */
} /* feature */
} /* energy_preference */
} /* cluster */
} /* esp_matter */
+26 -2
View File
@@ -2147,11 +2147,35 @@ typedef struct config {
uint32_t get_id();
esp_err_t add(cluster_t *cluster, config_t *config);
} /* tank_percent */
} /* feature */
} /* water_heater_management */
namespace energy_preference {
namespace feature {
namespace energy_balance {
typedef struct config {
uint8_t current_energy_balance;
config() : current_energy_balance(0) {}
} config_t;
uint32_t get_id();
esp_err_t add(cluster_t *cluster, config_t *config);
} /* energy_balance */
namespace low_power_mode_sensitivity {
typedef struct config {
uint8_t current_low_power_mode_sensitivity;
config() : current_low_power_mode_sensitivity(0) {}
} config_t;
uint32_t get_id();
esp_err_t add(cluster_t *cluster, config_t *config);
} /* low_power_mode_sensitivity */
} /* feature */
} /* energy_preference */
} /* cluster */
} /* esp_matter */
@@ -391,6 +391,10 @@ namespace water_heater_management {
constexpr uint16_t cluster_revision = 2;
} // namespace water_heater_management
namespace energy_preference {
constexpr uint16_t cluster_revision = 1;
} // namespace energy_preference
} // namespace cluster
} // namespace esp_matter
+11
View File
@@ -46,6 +46,7 @@ List of clusters with delegate:
- Target Navigator Cluster.
- Mode Select Cluster.
- Water Heater Management Cluster.
- Energy Preference Cluster.
9.1.1 Mode Base Cluster
-----------------------
@@ -226,6 +227,14 @@ ModeWaterHeater, ModeRefrigerator, ModeLaundryWasher and ModeMicrowaveOven.
`Water Heater Management`_, `Water Heater Management Delegate`_
9.1.21 Energy Preference Cluster
--------------------------------
.. csv-table::
:header: "Delegate Class", "Reference Implementation"
`Energy Preference`_, `Energy Preference Delegate`_
.. note::
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.
.. _`Mode Select Delegate`: https://github.com/espressif/connectedhomeip/blob/ea679d2dc674f576f4d391d1d71af1489010e580/examples/all-clusters-app/all-clusters-common/include/static-supported-modes-manager.h
.. _`Water Heater Management`: https://github.com/espressif/connectedhomeip/blob/ea679d2dc674f576f4d391d1d71af1489010e580/src/app/clusters/water-heater-management-server/water-heater-management-server.h
.. _`Water Heater Management Delegate`: https://github.com/espressif/connectedhomeip/blob/ea679d2dc674f576f4d391d1d71af1489010e580/examples/energy-management-app/energy-management-common/water-heater/include/WhmDelegate.h
.. _`Energy Preference`: https://github.com/espressif/connectedhomeip/blob/ea679d2dc674f576f4d391d1d71af1489010e580/src/app/clusters/energy-preference-server/energy-preference-server.h
.. _`Energy Preference Delegate`: https://github.com/espressif/connectedhomeip/blob/ea679d2dc674f576f4d391d1d71af1489010e580/examples/all-clusters-app/all-clusters-common/src/energy-preference-delegate.cpp