From d2a1f7ee31ea1f51768ea02bd91e573ac0ff1b48 Mon Sep 17 00:00:00 2001 From: rwrozelle Date: Fri, 16 Oct 2026 23:02:54 -0400 Subject: [PATCH] [zephyr] Fix preference log levels and report settings read/save errors (#20810) Co-authored-by: Claude Opus 5.5 Co-authored-by: J. Nick Koston --- esphome/components/zephyr/preferences.cpp | 29 ++++++++++++++++++----- 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/esphome/components/zephyr/preferences.cpp b/esphome/components/zephyr/preferences.cpp index 6be5f1ce4a5..d5522da03aa 100644 --- a/esphome/components/zephyr/preferences.cpp +++ b/esphome/components/zephyr/preferences.cpp @@ -5,6 +5,7 @@ #include "preferences.h" #include "esphome/core/log.h" #include +#include #include #include @@ -23,7 +24,11 @@ bool ZephyrPreferenceBackend::load(uint8_t *data, size_t len) { if (len != this->data.size()) { char key_buf[KEY_BUFFER_SIZE]; this->format_key(key_buf, sizeof(key_buf)); - ESP_LOGE(TAG, "size of setting key %s changed, from: %zu, to: %zu", key_buf, this->data.size(), len); + if (this->data.empty()) { + ESP_LOGV(TAG, "setting key %s not found", key_buf); + } else { + ESP_LOGE(TAG, "size of setting key %s changed, from: %zu, to: %zu", key_buf, this->data.size(), len); + } return false; } std::memcpy(data, this->data.data(), len); @@ -87,7 +92,7 @@ bool ZephyrPreferences::load_from_key(uint32_t type, uint8_t *data, size_t len) } bool ZephyrPreferences::sync() { - ESP_LOGD(TAG, "Save settings"); + ESP_LOGV(TAG, "Save settings"); int err = settings_save(); if (err) { ESP_LOGE(TAG, "Cannot save settings, err: %d", err); @@ -117,22 +122,34 @@ int ZephyrPreferences::load_setting(const char *name, size_t len, settings_read_ return 1; } std::vector data(len); - int err = read_cb(cb_arg, data.data(), len); + ssize_t read_len = read_cb(cb_arg, data.data(), len); + if (read_len != static_cast(len)) { + ESP_LOGE(TAG, "Cannot read setting %s, got %d of %zu", name, static_cast(read_len), len); + return 0; + } - ESP_LOGD(TAG, "load setting, name: %s(%" PRIu32 "), len %zu, err %d", name, *type, len, err); + ESP_LOGD(TAG, "load setting, name: %s(%" PRIu32 "), len %zu", name, *type, len); auto *pref = new ZephyrPreferenceBackend(*type, std::move(data)); // NOLINT(cppcoreguidelines-owning-memory) get_preferences()->backends_.push_back(pref); return 0; } int ZephyrPreferences::export_settings(int (*cb)(const char *name, const void *value, size_t val_len)) { + int first_err = 0; for (auto *backend : get_preferences()->backends_) { char name[KEY_BUFFER_SIZE]; backend->format_key(name, sizeof(name)); int err = cb(name, backend->data.data(), backend->data.size()); - ESP_LOGD(TAG, "save in flash, name %s, len %zu, err %d", name, backend->data.size(), err); + if (err) { + ESP_LOGE(TAG, "Cannot save setting %s, err %d", name, err); + if (first_err == 0) { + first_err = err; + } + continue; + } + ESP_LOGV(TAG, "save in flash, name %s, len %zu", name, backend->data.size()); } - return 0; + return first_err; } static ZephyrPreferences s_preferences; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables)