diff --git a/components/esp_matter/data_model/esp_matter_data_model.cpp b/components/esp_matter/data_model/esp_matter_data_model.cpp index a03dfda61..21047b0ba 100644 --- a/components/esp_matter/data_model/esp_matter_data_model.cpp +++ b/components/esp_matter/data_model/esp_matter_data_model.cpp @@ -266,7 +266,7 @@ static esp_err_t init_identification(endpoint_t *endpoint) return ESP_OK; } -static void invoke_init_callbacks_internal(endpoint_t *endpoint) +void invoke_init_callbacks_internal(endpoint_t *endpoint) { cluster_t *cluster = cluster::get_first(endpoint); while (cluster) { @@ -314,7 +314,8 @@ esp_err_t enable(endpoint_t *endpoint) _endpoint_t *current_endpoint = (_endpoint_t *)endpoint; current_endpoint->enabled = true; init_identification(endpoint); - { + /* Call the init callbacks for the endpoints which are created after esp_matter::start(). (e.g. for bridged endpoints) */ + if (esp_matter::is_started()) { // Use the lock instead of schedule lambda to ensure the callbacks are invoked before esp_matter::start() returns. esp_matter::lock::ScopedChipStackLock lock(portMAX_DELAY); invoke_init_callbacks_internal(endpoint); diff --git a/components/esp_matter/data_model/private/esp_matter_data_model_priv.h b/components/esp_matter/data_model/private/esp_matter_data_model_priv.h index 6cd49d66f..48a2f3bb6 100644 --- a/components/esp_matter/data_model/private/esp_matter_data_model_priv.h +++ b/components/esp_matter/data_model/private/esp_matter_data_model_priv.h @@ -38,6 +38,11 @@ namespace endpoint { esp_err_t enable_all(); +/** Invoke the init callbacks for the clusters on the endpoint + * + * @param[in] endpoint Endpoint handle. + */ +void invoke_init_callbacks_internal(endpoint_t *endpoint); } namespace attribute { diff --git a/components/esp_matter/data_model_provider/esp_matter_data_model_provider.cpp b/components/esp_matter/data_model_provider/esp_matter_data_model_provider.cpp index 4f54a9a8b..c3973722d 100644 --- a/components/esp_matter/data_model_provider/esp_matter_data_model_provider.cpp +++ b/components/esp_matter/data_model_provider/esp_matter_data_model_provider.cpp @@ -466,6 +466,12 @@ CHIP_ERROR provider::Startup(InteractionModelContext context) ReturnErrorOnFailure(gDefaultAttributePersistence.Init(&Server::GetInstance().GetPersistentStorage())); SetAttributePersistenceProvider(&gDefaultAttributePersistence); } + /* Call the init callbacks for the endpoints which are created before esp_matter::start() */ + endpoint_t *ep = endpoint::get_first(node::get()); + while (ep) { + endpoint::invoke_init_callbacks_internal(ep); + ep = endpoint::get_next(ep); + } return mRegistry.SetContext(ServerClusterContext{ .provider = *this, .storage = Server::GetInstance().GetPersistentStorage(),