[mqtt] Eliminate per-entity loop overhead and heap churn (#13356)

This commit is contained in:
J. Nick Koston
2026-01-19 17:41:55 -10:00
committed by GitHub
parent aeea340bc6
commit 6cf320fd60
3 changed files with 13 additions and 10 deletions
+6
View File
@@ -403,6 +403,12 @@ void MQTTClientComponent::loop() {
this->last_connected_ = now; this->last_connected_ = now;
this->resubscribe_subscriptions_(); this->resubscribe_subscriptions_();
// Process pending resends for all MQTT components centrally
// This is more efficient than each component polling in its own loop
for (MQTTComponent *component : this->children_) {
component->process_resend();
}
} }
break; break;
} }
+4 -8
View File
@@ -308,16 +308,12 @@ void MQTTComponent::call_setup() {
} }
} }
void MQTTComponent::call_loop() { void MQTTComponent::process_resend() {
if (this->is_internal()) // Called by MQTTClientComponent when connected to process pending resends
// Note: is_internal() check not needed - internal components are never registered
if (!this->resend_state_)
return; return;
this->loop();
if (!this->resend_state_ || !this->is_connected_()) {
return;
}
this->resend_state_ = false; this->resend_state_ = false;
if (this->is_discovery_enabled()) { if (this->is_discovery_enabled()) {
if (!this->send_discovery_()) { if (!this->send_discovery_()) {
+3 -2
View File
@@ -81,8 +81,6 @@ class MQTTComponent : public Component {
/// Override setup_ so that we can call send_discovery() when needed. /// Override setup_ so that we can call send_discovery() when needed.
void call_setup() override; void call_setup() override;
void call_loop() override;
void call_dump_config() override; void call_dump_config() override;
/// Send discovery info the Home Assistant, override this. /// Send discovery info the Home Assistant, override this.
@@ -133,6 +131,9 @@ class MQTTComponent : public Component {
/// Internal method for the MQTT client base to schedule a resend of the state on reconnect. /// Internal method for the MQTT client base to schedule a resend of the state on reconnect.
void schedule_resend_state(); void schedule_resend_state();
/// Process pending resend if needed (called by MQTTClientComponent)
void process_resend();
/** Send a MQTT message. /** Send a MQTT message.
* *
* @param topic The topic. * @param topic The topic.