Skip to content

Commit 280f514

Browse files
committed
Merge branch 'device/battery_storage' into 'main'
components/esp-matter: Add Battery Storage device type. See merge request app-frameworks/esp-matter!952
2 parents fb47702 + f8c5bbf commit 280f514

File tree

5 files changed

+99
-4
lines changed

5 files changed

+99
-4
lines changed

SUPPORTED_DEVICE_TYPES.md

+1
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ j. Energy
8484
1. EVSE (Electric Vehicle Supply Equipment)
8585
2. Water Heater
8686
3. Solar Power
87+
4. Battery Storage
8788

8889
k. Network Infrastructure
8990
1. Thread Border Router

components/esp_matter/esp_matter_endpoint.cpp

+62-4
Original file line numberDiff line numberDiff line change
@@ -2083,21 +2083,79 @@ esp_err_t add(endpoint_t *endpoint, config_t *config)
20832083

20842084
cluster_t *power_source_cluster = cluster::get(endpoint, PowerSource::Id);
20852085
power_source::feature::wired::add(power_source_cluster, &config->power_source_device.power_source.wired);
2086-
20872086
electrical_sensor::add(endpoint, &config->electrical_sensor);
20882087
electrical_energy_measurement::create(endpoint, &(config->electrical_energy_measurement), CLUSTER_FLAG_SERVER, electrical_energy_measurement::feature::exported_energy::get_id() | electrical_energy_measurement::feature::cumulative_energy::get_id());
20892088

2090-
cluster_t *ele_power_measurement_cluster = cluster::get(endpoint, ElectricalPowerMeasurement::Id);
2089+
cluster_t *elec_power_measurement_cluster = cluster::get(endpoint, ElectricalPowerMeasurement::Id);
20912090

20922091
nullable<int64_t> voltage = 0, active_current = 0;
2093-
electrical_power_measurement::attribute::create_voltage(ele_power_measurement_cluster, voltage);
2094-
electrical_power_measurement::attribute::create_active_current(ele_power_measurement_cluster, active_current);
2092+
electrical_power_measurement::attribute::create_voltage(elec_power_measurement_cluster, voltage);
2093+
electrical_power_measurement::attribute::create_active_current(elec_power_measurement_cluster, active_current);
20952094

20962095

20972096
return ESP_OK;
20982097
}
20992098
} /* solar_power */
21002099

2100+
namespace battery_storage {
2101+
uint32_t get_device_type_id()
2102+
{
2103+
return ESP_MATTER_BATTERY_STORAGE_DEVICE_TYPE_ID;
2104+
}
2105+
2106+
uint8_t get_device_type_version()
2107+
{
2108+
return ESP_MATTER_BATTERY_STORAGE_DEVICE_TYPE_VERSION;
2109+
}
2110+
2111+
endpoint_t *create(node_t *node, config_t *config, uint8_t flags, void *priv_data)
2112+
{
2113+
return common::create<config_t>(node, config, flags, priv_data, add);
2114+
}
2115+
2116+
esp_err_t add(endpoint_t *endpoint, config_t *config)
2117+
{
2118+
VerifyOrReturnError(endpoint != nullptr, ESP_ERR_INVALID_ARG, ESP_LOGE(TAG, "Endpoint cannot be NULL"));
2119+
esp_err_t err = add_device_type(endpoint, get_device_type_id(), get_device_type_version());
2120+
if (err != ESP_OK) {
2121+
ESP_LOGE(TAG, "Failed to add device type id:%" PRIu32 ",err: %d", get_device_type_id(), err);
2122+
return err;
2123+
}
2124+
2125+
cluster_t *descriptor_cluster = cluster::get(endpoint, Descriptor::Id);
2126+
descriptor::feature::taglist::add(descriptor_cluster);
2127+
2128+
power_source_device::add(endpoint, &config->power_source_device);
2129+
2130+
cluster_t *power_source_cluster = cluster::get(endpoint, PowerSource::Id);
2131+
power_source::feature::wired::add(power_source_cluster, &config->power_source_device.power_source.wired);
2132+
power_source::feature::battery::add(power_source_cluster, &config->power_source_device.power_source.battery);
2133+
2134+
power_source::attribute::create_bat_voltage(power_source_cluster, config->bat_voltage, 0x00, 0xFFFF);
2135+
power_source::attribute::create_bat_percent_remaining(power_source_cluster, config->bat_percent_remaining, 0, 200);
2136+
power_source::attribute::create_bat_time_remaining(power_source_cluster, config->bat_time_remaining, 0x00, 0xFFFF);
2137+
power_source::attribute::create_active_bat_faults(power_source_cluster, NULL, 0, 0);
2138+
power_source::attribute::create_bat_capacity(power_source_cluster, config->bat_capacity, 0x00, 0xFFFF);
2139+
power_source::attribute::create_bat_time_to_full_charge(power_source_cluster, config->bat_time_to_full_charge, 0x00, 0xFFFF);
2140+
power_source::attribute::create_bat_charging_current(power_source_cluster, config->bat_charging_current, 0x00, 0xFFFF);
2141+
power_source::attribute::create_active_bat_charge_faults(power_source_cluster, NULL, 0, 0);
2142+
2143+
electrical_sensor::add(endpoint, &config->electrical_sensor);
2144+
electrical_energy_measurement::create(endpoint, &(config->electrical_energy_measurement), CLUSTER_FLAG_SERVER, electrical_energy_measurement::feature::exported_energy::get_id() | electrical_energy_measurement::feature::cumulative_energy::get_id());
2145+
2146+
cluster_t *elec_power_measurement_cluster = cluster::get(endpoint, ElectricalPowerMeasurement::Id);
2147+
2148+
electrical_power_measurement::attribute::create_voltage(elec_power_measurement_cluster, config->voltage);
2149+
electrical_power_measurement::attribute::create_active_current(elec_power_measurement_cluster, config->active_current);
2150+
2151+
device_energy_management::add(endpoint, &config->device_energy_management);
2152+
2153+
cluster_t *device_energy_management_cluster = cluster::get(endpoint, DeviceEnergyManagement::Id);
2154+
cluster::device_energy_management::feature::power_adjustment::add(device_energy_management_cluster);
2155+
return ESP_OK;
2156+
}
2157+
} /* battery_storage */
2158+
21012159
} /* endpoint */
21022160

21032161
namespace node {

components/esp_matter/esp_matter_endpoint.h

+29
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,8 @@
140140
#define ESP_MATTER_WATER_HEATER_DEVICE_TYPE_VERSION 1
141141
#define ESP_MATTER_SOLAR_POWER_DEVICE_TYPE_ID 0x0017
142142
#define ESP_MATTER_SOLAR_POWER_DEVICE_TYPE_VERSION 1
143+
#define ESP_MATTER_BATTERY_STORAGE_DEVICE_TYPE_ID 0x0018
144+
#define ESP_MATTER_BATTERY_STORAGE_DEVICE_TYPE_VERSION 1
143145

144146
#define ESP_MATTER_THREAD_BORDER_ROUTER_DEVICE_TYPE_ID 0x0091
145147
#define ESP_MATTER_THREAD_BORDER_ROUTER_DEVICE_TYPE_VERSION 1
@@ -860,6 +862,33 @@ endpoint_t *create(node_t *node, config_t *config, uint8_t flags, void *priv_dat
860862
esp_err_t add(endpoint_t *endpoint, config_t *config);
861863
} /* solar_power */
862864

865+
namespace battery_storage {
866+
typedef struct config {
867+
cluster::descriptor::config_t descriptor;
868+
power_source_device::config_t power_source_device;
869+
electrical_sensor::config_t electrical_sensor;
870+
device_energy_management::config_t device_energy_management;
871+
cluster::electrical_energy_measurement::config_t electrical_energy_measurement;
872+
873+
nullable<uint32_t> bat_voltage;
874+
nullable<uint8_t> bat_percent_remaining;
875+
nullable<uint32_t> bat_time_remaining;
876+
uint32_t bat_capacity;
877+
nullable<uint32_t> bat_time_to_full_charge;
878+
nullable<uint32_t> bat_charging_current;
879+
880+
nullable<int64_t> voltage;
881+
nullable<int64_t> active_current;
882+
883+
config(): bat_voltage(), bat_percent_remaining(), bat_capacity(0), bat_time_to_full_charge(), bat_charging_current(), voltage(0), active_current(0) {}
884+
} config_t;
885+
886+
uint32_t get_device_type_id();
887+
uint8_t get_device_type_version();
888+
endpoint_t *create(node_t *node, config_t *config, uint8_t flags, void *priv_data);
889+
esp_err_t add(endpoint_t *endpoint, config_t *config);
890+
} /** battery_storage **/
891+
863892
} /* endpoint */
864893

865894
namespace node {

examples/all_device_types_app/main/device_types.h

+2
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ enum device_type_enum {
5757
ESP_MATTER_MOUNTED_DIMMABLE_LOAD_CONTROL,
5858
ESP_MATTER_WATER_HEATER,
5959
ESP_MATTER_SOLAR_POWER,
60+
ESP_MATTER_BATTERY_STORAGE,
6061
ESP_MATTER_DEVICE_TYPE_MAX
6162
};
6263

@@ -120,5 +121,6 @@ const device_type_name device_type_list[ESP_MATTER_DEVICE_TYPE_MAX] = {
120121
{"mounted_dimmable_load_control", ESP_MATTER_MOUNTED_DIMMABLE_LOAD_CONTROL},
121122
{"water_heater", ESP_MATTER_WATER_HEATER},
122123
{"solar_power", ESP_MATTER_SOLAR_POWER},
124+
{"battery_storage", ESP_MATTER_BATTERY_STORAGE},
123125
};
124126
} /* namespace esp_matter */

examples/all_device_types_app/main/esp_matter_console_helpers.cpp

+5
Original file line numberDiff line numberDiff line change
@@ -539,6 +539,11 @@ int create(uint8_t device_type_index)
539539
endpoint = esp_matter::endpoint::solar_power::create(node, &solar_power_config, ENDPOINT_FLAG_NONE, NULL);
540540
break;
541541
}
542+
case ESP_MATTER_BATTERY_STORAGE: {
543+
esp_matter::endpoint::battery_storage::config_t battery_storage_config;
544+
endpoint = esp_matter::endpoint::battery_storage::create(node, &battery_storage_config, ENDPOINT_FLAG_NONE, NULL);
545+
break;
546+
}
542547
default: {
543548
ESP_LOGE(TAG, "Please input a valid device type");
544549
break;

0 commit comments

Comments
 (0)