From 4d8f58db94caff2087c96688be72a053b1dccd07 Mon Sep 17 00:00:00 2001
From: Clyde Stubbs <2366188+clydebarrow@users.noreply.github.com>
Date: Wed, 5 Feb 2025 13:34:30 +1100
Subject: [PATCH] [preferences] Better handling of flash_write_interval (#8199)

---
 esphome/components/preferences/__init__.py       |  6 ++----
 esphome/components/preferences/syncer.h          | 13 ++++++++++---
 tests/components/preferences/test.esp32-idf.yaml |  2 ++
 3 files changed, 14 insertions(+), 7 deletions(-)
 create mode 100644 tests/components/preferences/test.esp32-idf.yaml

diff --git a/esphome/components/preferences/__init__.py b/esphome/components/preferences/__init__.py
index 4844ad6c02..1da6d02045 100644
--- a/esphome/components/preferences/__init__.py
+++ b/esphome/components/preferences/__init__.py
@@ -1,6 +1,6 @@
-from esphome.const import CONF_ID
 import esphome.codegen as cg
 import esphome.config_validation as cv
+from esphome.const import CONF_ID
 
 CODEOWNERS = ["@esphome/core"]
 
@@ -11,9 +11,7 @@ CONF_FLASH_WRITE_INTERVAL = "flash_write_interval"
 CONFIG_SCHEMA = cv.Schema(
     {
         cv.GenerateID(): cv.declare_id(IntervalSyncer),
-        cv.Optional(
-            CONF_FLASH_WRITE_INTERVAL, default="60s"
-        ): cv.positive_time_period_milliseconds,
+        cv.Optional(CONF_FLASH_WRITE_INTERVAL, default="60s"): cv.update_interval,
     }
 ).extend(cv.COMPONENT_SCHEMA)
 
diff --git a/esphome/components/preferences/syncer.h b/esphome/components/preferences/syncer.h
index af1fe9ba4a..8976a1fe15 100644
--- a/esphome/components/preferences/syncer.h
+++ b/esphome/components/preferences/syncer.h
@@ -8,15 +8,22 @@ namespace preferences {
 
 class IntervalSyncer : public Component {
  public:
-  void set_write_interval(uint32_t write_interval) { write_interval_ = write_interval; }
+  void set_write_interval(uint32_t write_interval) { this->write_interval_ = write_interval; }
   void setup() override {
-    set_interval(write_interval_, []() { global_preferences->sync(); });
+    if (this->write_interval_ != 0) {
+      set_interval(this->write_interval_, []() { global_preferences->sync(); });
+    }
+  }
+  void loop() override {
+    if (this->write_interval_ == 0) {
+      global_preferences->sync();
+    }
   }
   void on_shutdown() override { global_preferences->sync(); }
   float get_setup_priority() const override { return setup_priority::BUS; }
 
  protected:
-  uint32_t write_interval_;
+  uint32_t write_interval_{60000};
 };
 
 }  // namespace preferences
diff --git a/tests/components/preferences/test.esp32-idf.yaml b/tests/components/preferences/test.esp32-idf.yaml
new file mode 100644
index 0000000000..4c7c176fdc
--- /dev/null
+++ b/tests/components/preferences/test.esp32-idf.yaml
@@ -0,0 +1,2 @@
+preferences:
+  flash_write_interval: 20s