From f6311c38466025df93dfb2a6300f9b7a1435f71e Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Sat, 11 Apr 2026 00:07:22 -1000 Subject: [PATCH] [status_led] Use millis() to survive blocking waits via feed_wdt --- esphome/components/status_led/status_led.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/esphome/components/status_led/status_led.cpp b/esphome/components/status_led/status_led.cpp index 90216d244d..48762a7333 100644 --- a/esphome/components/status_led/status_led.cpp +++ b/esphome/components/status_led/status_led.cpp @@ -25,10 +25,14 @@ void StatusLED::dump_config() { } void StatusLED::loop() { const uint32_t app_state = App.get_app_state(); + // Use millis() rather than App.get_loop_component_start_time() because this loop is also + // dispatched from Application::feed_wdt() during long blocking operations, where the cached + // per-component timestamp doesn't advance and would freeze the blink pattern. + const uint32_t now = millis(); if ((app_state & STATUS_LED_ERROR) != 0u) { - this->pin_->digital_write(App.get_loop_component_start_time() % ERROR_PERIOD_MS < ERROR_ON_MS); + this->pin_->digital_write(now % ERROR_PERIOD_MS < ERROR_ON_MS); } else if ((app_state & STATUS_LED_WARNING) != 0u) { - this->pin_->digital_write(App.get_loop_component_start_time() % WARNING_PERIOD_MS < WARNING_ON_MS); + this->pin_->digital_write(now % WARNING_PERIOD_MS < WARNING_ON_MS); } else { this->pin_->digital_write(false); this->disable_loop();