From 08d74ce220c397bdde401096b3f0dcd73573ce70 Mon Sep 17 00:00:00 2001 From: mahesh Date: Wed, 19 Nov 2025 14:31:57 +0530 Subject: [PATCH] components/esp_matter: Add missing elements in data model --- .../data_model/esp_matter_attribute.cpp | 7 +++ .../data_model/esp_matter_attribute.h | 1 + .../data_model/esp_matter_cluster.cpp | 1 + .../data_model/esp_matter_command.cpp | 13 ++++ .../data_model/esp_matter_command.h | 3 + .../data_model/esp_matter_event.cpp | 60 +++++++++++++++++-- .../esp_matter/data_model/esp_matter_event.h | 28 ++++++--- .../data_model/esp_matter_feature.cpp | 55 ++++++++++++++++- .../data_model/esp_matter_feature.h | 18 ++++++ 9 files changed, 172 insertions(+), 14 deletions(-) diff --git a/components/esp_matter/data_model/esp_matter_attribute.cpp b/components/esp_matter/data_model/esp_matter_attribute.cpp index 51ee7d54f..3526d248d 100644 --- a/components/esp_matter/data_model/esp_matter_attribute.cpp +++ b/components/esp_matter/data_model/esp_matter_attribute.cpp @@ -3148,6 +3148,13 @@ attribute_t *create_max_measured_value(cluster_t *cluster, nullable val ATTRIBUTE_FLAG_NULLABLE, esp_matter_nullable_int16(value)); } +attribute_t *create_tolerance(cluster_t *cluster, uint16_t value) +{ + attribute_t *attribute = esp_matter::attribute::create(cluster, TemperatureMeasurement::Attributes::Tolerance::Id, ATTRIBUTE_FLAG_NONE, esp_matter_uint16(value)); + esp_matter::attribute::add_bounds(attribute, esp_matter_uint16(0), esp_matter_uint16(2048)); + return attribute; +} + } /* attribute */ } /* temperature_measurement */ diff --git a/components/esp_matter/data_model/esp_matter_attribute.h b/components/esp_matter/data_model/esp_matter_attribute.h index 7a838e326..c1ac0548c 100644 --- a/components/esp_matter/data_model/esp_matter_attribute.h +++ b/components/esp_matter/data_model/esp_matter_attribute.h @@ -772,6 +772,7 @@ namespace attribute { attribute_t *create_measured_value(cluster_t *cluster, nullable value); attribute_t *create_min_measured_value(cluster_t *cluster, nullable value); attribute_t *create_max_measured_value(cluster_t *cluster, nullable value); +attribute_t *create_tolerance(cluster_t *cluster, uint16_t value); } /* attribute */ } /* temperature_measurement */ diff --git a/components/esp_matter/data_model/esp_matter_cluster.cpp b/components/esp_matter/data_model/esp_matter_cluster.cpp index ec272d738..28df0b955 100644 --- a/components/esp_matter/data_model/esp_matter_cluster.cpp +++ b/components/esp_matter/data_model/esp_matter_cluster.cpp @@ -1098,6 +1098,7 @@ cluster_t *create(endpoint_t *endpoint, config_t *config, uint8_t flags) add_function_list(cluster, function_list, function_flags); /* Attributes managed internally */ + /* Setting feature here directly no need keep extra namespace for feature */ global::attribute::create_feature_map(cluster, static_cast(Groups::Feature::kGroupNames)); /* Attributes not managed internally */ diff --git a/components/esp_matter/data_model/esp_matter_command.cpp b/components/esp_matter/data_model/esp_matter_command.cpp index 7e0f9ad13..8ee3e0b40 100644 --- a/components/esp_matter/data_model/esp_matter_command.cpp +++ b/components/esp_matter/data_model/esp_matter_command.cpp @@ -1449,6 +1449,14 @@ command_t *create_time_snap_shot_response(cluster_t *cluster) return esp_matter::command::create(cluster, GeneralDiagnostics::Commands::TimeSnapshotResponse::Id, COMMAND_FLAG_GENERATED, NULL); } +command_t *create_payload_test_request(cluster_t *cluster) +{ + return esp_matter::command::create(cluster, GeneralDiagnostics::Commands::PayloadTestRequest::Id, COMMAND_FLAG_ACCEPTED, NULL); +} +command_t *create_payload_test_response(cluster_t *cluster) +{ + return esp_matter::command::create(cluster, GeneralDiagnostics::Commands::PayloadTestResponse::Id, COMMAND_FLAG_GENERATED, NULL); +} } /* command */ } /* general_diagnostics */ @@ -1896,6 +1904,11 @@ command_t *create_stay_active_request(cluster_t *cluster) return esp_matter::command::create(cluster, IcdManagement::Commands::StayActiveRequest::Id, COMMAND_FLAG_ACCEPTED, esp_matter_command_callback_stay_active_request); } +command_t *create_stay_active_response(cluster_t *cluster) +{ + return esp_matter::command::create(cluster, IcdManagement::Commands::StayActiveResponse::Id, + COMMAND_FLAG_GENERATED, NULL); +} } /* command */ } /* icd_management */ diff --git a/components/esp_matter/data_model/esp_matter_command.h b/components/esp_matter/data_model/esp_matter_command.h index c92b14e7c..9d149cbe2 100644 --- a/components/esp_matter/data_model/esp_matter_command.h +++ b/components/esp_matter/data_model/esp_matter_command.h @@ -85,6 +85,8 @@ namespace command { command_t *create_test_event_trigger(cluster_t *cluster); command_t *create_time_snap_shot(cluster_t *cluster); command_t *create_time_snap_shot_response(cluster_t *cluster); +command_t *create_payload_test_request(cluster_t *cluster); +command_t *create_payload_test_response(cluster_t *cluster); } /* command */ } /* general_diagnostics */ @@ -204,6 +206,7 @@ command_t *create_register_client(cluster_t *cluster); command_t *create_register_client_response(cluster_t *cluster); command_t *create_unregister_client(cluster_t *cluster); command_t *create_stay_active_request(cluster_t *cluster); +command_t *create_stay_active_response(cluster_t *cluster); } /* command */ } /* icd_management */ diff --git a/components/esp_matter/data_model/esp_matter_event.cpp b/components/esp_matter/data_model/esp_matter_event.cpp index 7385c94ae..687fe3d72 100644 --- a/components/esp_matter/data_model/esp_matter_event.cpp +++ b/components/esp_matter/data_model/esp_matter_event.cpp @@ -43,14 +43,24 @@ event_t *create_fabric_restriction_review_update(cluster_t *cluster) } // namespace event } // namespace access_control -namespace bridged_device_basic_information { +namespace power_source { namespace event { -event_t *create_active_changed(cluster_t *cluster) +event_t *create_wired_fault_change(cluster_t *cluster) { - return esp_matter::event::create(cluster, BridgedDeviceBasicInformation::Events::ActiveChanged::Id); + return esp_matter::event::create(cluster, PowerSource::Events::WiredFaultChange::Id); +} + +event_t *create_bat_fault_change(cluster_t *cluster) +{ + return esp_matter::event::create(cluster, PowerSource::Events::BatFaultChange::Id); +} + +event_t *create_bat_charge_fault_change(cluster_t *cluster) +{ + return esp_matter::event::create(cluster, PowerSource::Events::BatChargeFaultChange::Id); +} +} } -} // namespace event -} // namespace bridged_device_basic_information namespace actions { namespace event { @@ -247,6 +257,11 @@ event_t *create_reachable_changed(cluster_t *cluster) return esp_matter::event::create(cluster, BridgedDeviceBasicInformation::Events::ReachableChanged::Id); } +event_t *create_active_changed(cluster_t *cluster) +{ + return esp_matter::event::create(cluster, BridgedDeviceBasicInformation::Events::ActiveChanged::Id); +} + } // namespace event } // namespace bridged_device_basic_information @@ -718,6 +733,41 @@ event_t *create_periodic_energy_measured(cluster_t *cluster) } // namespace event } // namespace electrical_energy_measurement +namespace energy_evse { +namespace event { +event_t *create_ev_connected(cluster_t *cluster) +{ + return esp_matter::event::create(cluster, EnergyEvse::Events::EVConnected::Id); +} + +event_t *create_ev_not_detected(cluster_t *cluster) +{ + return esp_matter::event::create(cluster, EnergyEvse::Events::EVNotDetected::Id); +} + +event_t *create_energy_transfer_started(cluster_t *cluster) +{ + return esp_matter::event::create(cluster, EnergyEvse::Events::EnergyTransferStarted::Id); +} + +event_t *create_energy_transfer_stopped(cluster_t *cluster) +{ + return esp_matter::event::create(cluster, EnergyEvse::Events::EnergyTransferStopped::Id); +} + +event_t *create_fault(cluster_t *cluster) +{ + return esp_matter::event::create(cluster, EnergyEvse::Events::Fault::Id); +} + +event_t *create_rfid(cluster_t *cluster) +{ + return esp_matter::event::create(cluster, EnergyEvse::Events::Rfid::Id); +} + +} /* event */ +} /* energy_evse */ + namespace valve_configuration_and_control { namespace event { event_t *create_valve_state_changed(cluster_t *cluster) diff --git a/components/esp_matter/data_model/esp_matter_event.h b/components/esp_matter/data_model/esp_matter_event.h index 1fe8c6b2a..fe4a25116 100644 --- a/components/esp_matter/data_model/esp_matter_event.h +++ b/components/esp_matter/data_model/esp_matter_event.h @@ -40,13 +40,6 @@ event_t *create_state_changed(cluster_t *cluster); event_t *create_action_failed(cluster_t *cluster); } // namespace event } // namespace actions - -namespace bridged_device_basic_information { -namespace event { -event_t *create_active_changed(cluster_t *cluster); -} // namespace event -} // namespace bridged_device_basic_information - namespace basic_information { namespace event { event_t *create_start_up(cluster_t *cluster); @@ -106,6 +99,7 @@ event_t *create_missing_trusted_time_source(cluster_t *cluster); namespace bridged_device_basic_information { namespace event { +event_t *create_active_changed(cluster_t *cluster); event_t *create_start_up(cluster_t *cluster); event_t *create_shut_down(cluster_t *cluster); event_t *create_leave(cluster_t *cluster); @@ -113,6 +107,15 @@ event_t *create_reachable_changed(cluster_t *cluster); } // namespace event } // namespace bridged_device_basic_information + +namespace power_source { +namespace event { +event_t *create_wired_fault_change(cluster_t *cluster); +event_t *create_bat_fault_change(cluster_t *cluster); +event_t *create_bat_charge_fault_change(cluster_t *cluster); +} +} + namespace smoke_co_alarm { namespace event { event_t *create_smoke_alarm(cluster_t *cluster); @@ -214,6 +217,17 @@ event_t *create_periodic_energy_measured(cluster_t *cluster); } // namespace event } // namespace electrical_energy_measurement +namespace energy_evse { +namespace event { +event_t *create_ev_connected(cluster_t *cluster); +event_t *create_ev_not_detected(cluster_t *cluster); +event_t *create_energy_transfer_started(cluster_t *cluster); +event_t *create_energy_transfer_stopped(cluster_t *cluster); +event_t *create_fault(cluster_t *cluster); +event_t *create_rfid(cluster_t *cluster); +} /* event */ +} /* energy_evse */ + namespace valve_configuration_and_control { namespace event { event_t *create_valve_state_changed(cluster_t *cluster); diff --git a/components/esp_matter/data_model/esp_matter_feature.cpp b/components/esp_matter/data_model/esp_matter_feature.cpp index 58178272a..9858946bf 100644 --- a/components/esp_matter/data_model/esp_matter_feature.cpp +++ b/components/esp_matter/data_model/esp_matter_feature.cpp @@ -429,10 +429,31 @@ esp_err_t add(cluster_t *cluster) /* Attributes not managed internally */ attribute::create_operating_mode(cluster, 0); + + /* commands */ + command::create_stay_active_request(cluster); + command::create_stay_active_response(cluster); return ESP_OK; } } /* long_idle_time_support */ + +namespace dynamic_sit_lit_support { + +uint32_t get_id() +{ + return (uint32_t)IcdManagement::Feature::kDynamicSitLitSupport; +} + +esp_err_t add(cluster_t *cluster) +{ + VerifyOrReturnError(cluster, ESP_ERR_INVALID_ARG); + update_feature_map(cluster, get_id()); + + return ESP_OK; +} + +} /* dynamic_sit_lit_support */ } /* feature */ } /* icd_management */ @@ -1093,6 +1114,7 @@ esp_err_t add(cluster_t *cluster) } /* feature */ } /* ethernet_network_diagnostics */ + namespace air_quality { namespace feature { @@ -1894,6 +1916,27 @@ esp_err_t add(cluster_t *cluster, config_t *config) } /* feature */ } /* pressure_measurement */ +namespace general_diagnostics { +namespace feature { + +namespace data_model_test { + +uint32_t get_id() +{ + return (uint32_t)GeneralDiagnostics::Feature::kDataModelTest; +} + +esp_err_t add(cluster_t *cluster, config_t *config) +{ + VerifyOrReturnError(cluster, ESP_ERR_INVALID_ARG); + update_feature_map(cluster, get_id()); + command::create_payload_test_request(cluster); + command::create_payload_test_response(cluster); + return ESP_OK; +} +} /* data_model_test */ +} /* feature */ +} /* general diagnostics */ namespace software_diagnostics { namespace feature { @@ -2197,7 +2240,9 @@ esp_err_t add(cluster_t *cluster, config_t *config) attribute::create_alarms_active(cluster, config->alarms_active); attribute::create_alarms_supported(cluster, config->alarms_supported); - command::create_enable_disable_alarm(cluster);; + command::create_enable_disable_alarm(cluster); + + event::create_alarms_state_changed(cluster); return ESP_OK; } } /* visual */ @@ -2217,7 +2262,9 @@ esp_err_t add(cluster_t *cluster, config_t *config) attribute::create_alarms_active(cluster, config->alarms_active); attribute::create_alarms_supported(cluster, config->alarms_supported); - command::create_enable_disable_alarm(cluster);; + command::create_enable_disable_alarm(cluster); + + event::create_alarms_state_changed(cluster); return ESP_OK; } } /* audible */ @@ -3832,6 +3879,7 @@ esp_err_t add(cluster_t *cluster) return ESP_ERR_INVALID_ARG; } update_feature_map(cluster, get_id()); + return ESP_OK; } } /* automatic */ @@ -3967,6 +4015,9 @@ esp_err_t add(cluster_t *cluster) // Commands command::create_set_trusted_time_source(cluster); + // Events + event::create_missing_trusted_time_source(cluster); + return ESP_OK; } } /* time_sync_client */ diff --git a/components/esp_matter/data_model/esp_matter_feature.h b/components/esp_matter/data_model/esp_matter_feature.h index ea58153b5..b3cc0f4bd 100644 --- a/components/esp_matter/data_model/esp_matter_feature.h +++ b/components/esp_matter/data_model/esp_matter_feature.h @@ -196,6 +196,12 @@ esp_err_t add(cluster_t *cluster); } /* long_idle_time_support */ +namespace dynamic_sit_lit_support { + +uint32_t get_id(); +esp_err_t add(cluster_t *cluster); +} // namespace dynamic_sit_lit_support + } /* feature */ } /* icd_management */ @@ -956,6 +962,17 @@ esp_err_t add(cluster_t *cluster, config_t *config); } /* feature */ } /* mode_select */ +namespace general_diagnostics { +namespace feature { +namespace data_model_test { + +uint32_t get_id(); +esp_err_t add(cluster_t *cluster); + +} /* data_model_test */ +} /* feature */ +} /* general diagnostics */ + namespace software_diagnostics { namespace feature { @@ -1159,6 +1176,7 @@ esp_err_t add(cluster_t *cluster, config_t *config); } /* feature */ } /* boolean_state_configuration */ + namespace power_topology { namespace feature {