From 2bea5e6a0cec1530d547dd9e8c802d60e54e9133 Mon Sep 17 00:00:00 2001 From: shripad621git Date: Wed, 16 Jul 2025 17:24:33 +0530 Subject: [PATCH] components/esp_matter: Add the missing bits from pressure measurement cluster, solar power and battery storage device type. --- .../data_model/esp_matter_attribute.h | 3 ++ .../data_model/esp_matter_endpoint.cpp | 6 +++- .../data_model/esp_matter_feature.cpp | 29 +++++++++++++++++++ .../data_model/esp_matter_feature.h | 20 +++++++++++++ 4 files changed, 57 insertions(+), 1 deletion(-) diff --git a/components/esp_matter/data_model/esp_matter_attribute.h b/components/esp_matter/data_model/esp_matter_attribute.h index 430bee20c..ca2b0ae6c 100644 --- a/components/esp_matter/data_model/esp_matter_attribute.h +++ b/components/esp_matter/data_model/esp_matter_attribute.h @@ -846,6 +846,7 @@ attribute_t *create_supported_calendar_types(cluster_t *cluster, uint8_t *value, } /* attribute */ } /* time_format_localization */ +// Note: Attribute name for the below cluster deviates from Matter spec namespace illuminance_measurement { namespace attribute { attribute_t *create_illuminance_measured_value(cluster_t *cluster, nullable value, nullable min, nullable max); @@ -856,6 +857,7 @@ attribute_t *create_illuminance_light_sensor_type(cluster_t *cluster, nullable value); @@ -870,6 +872,7 @@ attribute_t *create_pressure_scale(cluster_t *cluster, int8_t value); } /* attribute */ } /* pressure_measurement */ +// Note: Attribute name for the below cluster deviates from Matter spec namespace flow_measurement { namespace attribute { attribute_t *create_flow_measured_value(cluster_t *cluster, nullable value); diff --git a/components/esp_matter/data_model/esp_matter_endpoint.cpp b/components/esp_matter/data_model/esp_matter_endpoint.cpp index ac0f44d2c..5ed5a7598 100644 --- a/components/esp_matter/data_model/esp_matter_endpoint.cpp +++ b/components/esp_matter/data_model/esp_matter_endpoint.cpp @@ -1497,6 +1497,7 @@ esp_err_t add(endpoint_t *endpoint, config_t *config) esp_err_t err = add_device_type(endpoint, get_device_type_id(), get_device_type_version()); VerifyOrReturnError(err == ESP_OK, err); + config->power_topology.feature_flags |= power_topology::feature::node_topology::get_id(); power_topology::create(endpoint, &(config->power_topology), CLUSTER_FLAG_SERVER); electrical_power_measurement::create(endpoint, &(config->electrical_power_measurement), CLUSTER_FLAG_SERVER); @@ -1894,6 +1895,8 @@ esp_err_t add(endpoint_t *endpoint, config_t *config) config->power_source_device.power_source.feature_flags = power_source::feature::wired::get_id(); power_source_device::add(endpoint, &config->power_source_device); + config->electrical_energy_measurement.feature_flags = electrical_energy_measurement::feature::exported_energy::get_id() | electrical_energy_measurement::feature::cumulative_energy::get_id(); + config->electrical_sensor.electrical_power_measurement.feature_flags |= electrical_power_measurement::feature::alternating_current::get_id(); electrical_sensor::add(endpoint, &config->electrical_sensor); electrical_energy_measurement::create(endpoint, &(config->electrical_energy_measurement), CLUSTER_FLAG_SERVER); @@ -1945,11 +1948,12 @@ esp_err_t add(endpoint_t *endpoint, config_t *config) power_source::attribute::create_bat_charging_current(power_source_cluster, config->bat_charging_current, 0x00, 0xFFFF); power_source::attribute::create_active_bat_charge_faults(power_source_cluster, NULL, 0, 0); + config->electrical_energy_measurement.feature_flags = electrical_energy_measurement::feature::exported_energy::get_id() | electrical_energy_measurement::feature::cumulative_energy::get_id(); + config->electrical_sensor.electrical_power_measurement.feature_flags = electrical_power_measurement::feature::alternating_current::get_id(); electrical_sensor::add(endpoint, &config->electrical_sensor); electrical_energy_measurement::create(endpoint, &(config->electrical_energy_measurement), CLUSTER_FLAG_SERVER); cluster_t *elec_power_measurement_cluster = cluster::get(endpoint, ElectricalPowerMeasurement::Id); - electrical_power_measurement::attribute::create_voltage(elec_power_measurement_cluster, config->voltage); electrical_power_measurement::attribute::create_active_current(elec_power_measurement_cluster, config->active_current); diff --git a/components/esp_matter/data_model/esp_matter_feature.cpp b/components/esp_matter/data_model/esp_matter_feature.cpp index 5037789ad..1141ad293 100644 --- a/components/esp_matter/data_model/esp_matter_feature.cpp +++ b/components/esp_matter/data_model/esp_matter_feature.cpp @@ -1866,6 +1866,35 @@ esp_err_t add(cluster_t *cluster, config_t *config) } /* feature */ } /* mode_select */ + +namespace pressure_measurement { +namespace feature { + +namespace extended { + +uint32_t get_id() +{ + return (uint32_t)PressureMeasurement::Feature::kExtended; +} + +esp_err_t add(cluster_t *cluster, config_t *config) +{ + VerifyOrReturnError(cluster, ESP_ERR_INVALID_ARG, ESP_LOGE(TAG, "Cluster cannot be NULL")); + update_feature_map(cluster, get_id()); + + attribute::create_pressure_scaled_value(cluster, config->pressure_scaled_value); + attribute::create_pressure_min_scaled_value(cluster, config->pressure_min_scaled_value); + attribute::create_pressure_max_scaled_value(cluster, config->pressure_max_scaled_value); + attribute::create_pressure_scale(cluster, config->pressure_scale); + + return ESP_OK; +} + +} /* extended */ + +} /* feature */ +} /* pressure_measurement */ + namespace software_diagnostics { namespace feature { diff --git a/components/esp_matter/data_model/esp_matter_feature.h b/components/esp_matter/data_model/esp_matter_feature.h index d2cb4f68a..1b5382a24 100644 --- a/components/esp_matter/data_model/esp_matter_feature.h +++ b/components/esp_matter/data_model/esp_matter_feature.h @@ -1647,6 +1647,26 @@ esp_err_t add(cluster_t *cluster, config_t *config); } /* feature */ } /* energy_preference */ +namespace pressure_measurement { +namespace feature { + +namespace extended { + +typedef struct config { + nullable pressure_scaled_value; + nullable pressure_min_scaled_value; + nullable pressure_max_scaled_value; + uint8_t pressure_scale; + config() : pressure_scaled_value(), pressure_min_scaled_value(), pressure_max_scaled_value(), pressure_scale(0) {} +} config_t; + +uint32_t get_id(); +esp_err_t add(cluster_t *cluster, config_t *config); +} /* extended */ + +} /* feature */ +} /* pressure_measurement */ + namespace occupancy_sensing { namespace feature {