From 5373393714275981634d22b5eb527c841f6c1881 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Mon, 22 Dec 2025 10:39:30 -1000 Subject: [PATCH 1/2] [safe_mode] Remove unnecessary blocking sync from successful boot reset --- esphome/components/safe_mode/safe_mode.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/esphome/components/safe_mode/safe_mode.cpp b/esphome/components/safe_mode/safe_mode.cpp index f8e5d7d8e5..9d65f30058 100644 --- a/esphome/components/safe_mode/safe_mode.cpp +++ b/esphome/components/safe_mode/safe_mode.cpp @@ -69,6 +69,7 @@ void SafeModeComponent::set_safe_mode_pending(const bool &pending) { if (pending && current_rtc != SafeModeComponent::ENTER_SAFE_MODE_MAGIC) { ESP_LOGI(TAG, "Device will enter on next boot"); this->write_rtc_(SafeModeComponent::ENTER_SAFE_MODE_MAGIC); + global_preferences->sync(); // Must persist before potential reboot } if (!pending && current_rtc == SafeModeComponent::ENTER_SAFE_MODE_MAGIC) { @@ -103,6 +104,7 @@ bool SafeModeComponent::should_enter_safe_mode(uint8_t num_attempts, uint32_t en if (rtc_val < num_attempts && !is_manual) { // increment counter this->write_rtc_(rtc_val + 1); + global_preferences->sync(); // Must persist before potential crash return false; } @@ -129,10 +131,7 @@ bool SafeModeComponent::should_enter_safe_mode(uint8_t num_attempts, uint32_t en return true; } -void SafeModeComponent::write_rtc_(uint32_t val) { - this->rtc_.save(&val); - global_preferences->sync(); -} +void SafeModeComponent::write_rtc_(uint32_t val) { this->rtc_.save(&val); } uint32_t SafeModeComponent::read_rtc_() { uint32_t val; From 145d09c8ddafd6d08791aca96ae9bcee20f2b152 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Mon, 22 Dec 2025 10:41:47 -1000 Subject: [PATCH 2/2] [safe_mode] Remove unnecessary blocking sync from successful boot reset --- esphome/components/safe_mode/safe_mode.cpp | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/esphome/components/safe_mode/safe_mode.cpp b/esphome/components/safe_mode/safe_mode.cpp index 9d65f30058..7dbbda12c9 100644 --- a/esphome/components/safe_mode/safe_mode.cpp +++ b/esphome/components/safe_mode/safe_mode.cpp @@ -69,7 +69,6 @@ void SafeModeComponent::set_safe_mode_pending(const bool &pending) { if (pending && current_rtc != SafeModeComponent::ENTER_SAFE_MODE_MAGIC) { ESP_LOGI(TAG, "Device will enter on next boot"); this->write_rtc_(SafeModeComponent::ENTER_SAFE_MODE_MAGIC); - global_preferences->sync(); // Must persist before potential reboot } if (!pending && current_rtc == SafeModeComponent::ENTER_SAFE_MODE_MAGIC) { @@ -104,7 +103,6 @@ bool SafeModeComponent::should_enter_safe_mode(uint8_t num_attempts, uint32_t en if (rtc_val < num_attempts && !is_manual) { // increment counter this->write_rtc_(rtc_val + 1); - global_preferences->sync(); // Must persist before potential crash return false; } @@ -131,7 +129,10 @@ bool SafeModeComponent::should_enter_safe_mode(uint8_t num_attempts, uint32_t en return true; } -void SafeModeComponent::write_rtc_(uint32_t val) { this->rtc_.save(&val); } +void SafeModeComponent::write_rtc_(uint32_t val) { + this->rtc_.save(&val); + global_preferences->sync(); +} uint32_t SafeModeComponent::read_rtc_() { uint32_t val; @@ -140,7 +141,12 @@ uint32_t SafeModeComponent::read_rtc_() { return val; } -void SafeModeComponent::clean_rtc() { this->write_rtc_(0); } +void SafeModeComponent::clean_rtc() { + // Save without sync - preferences will be written at shutdown or by IntervalSyncer + // This avoids blocking the loop for 50+ ms on flash write + uint32_t val = 0; + this->rtc_.save(&val); +} void SafeModeComponent::on_safe_shutdown() { if (this->read_rtc_() != SafeModeComponent::ENTER_SAFE_MODE_MAGIC)