1
0
mirror of https://github.com/esphome/esphome.git synced 2026-02-08 00:31:58 +00:00

[safe_mode] Conditionally compile callback when on_safe_mode is configured (#13136)

This commit is contained in:
J. Nick Koston
2026-01-11 17:18:24 -10:00
committed by GitHub
parent 26e90b4ca6
commit ace3ff2170
5 changed files with 23 additions and 15 deletions

View File

@@ -59,9 +59,11 @@ async def to_code(config):
var = cg.new_Pvariable(config[CONF_ID])
await cg.register_component(var, config)
for conf in config.get(CONF_ON_SAFE_MODE, []):
trigger = cg.new_Pvariable(conf[CONF_TRIGGER_ID], var)
await automation.build_automation(trigger, [], conf)
if on_safe_mode_config := config.get(CONF_ON_SAFE_MODE):
cg.add_define("USE_SAFE_MODE_CALLBACK")
for conf in on_safe_mode_config:
trigger = cg.new_Pvariable(conf[CONF_TRIGGER_ID], var)
await automation.build_automation(trigger, [], conf)
condition = var.should_enter_safe_mode(
config[CONF_NUM_ATTEMPTS],

View File

@@ -1,10 +1,12 @@
#pragma once
#include "esphome/core/defines.h"
#ifdef USE_SAFE_MODE_CALLBACK
#include "safe_mode.h"
#include "esphome/core/automation.h"
namespace esphome {
namespace safe_mode {
namespace esphome::safe_mode {
class SafeModeTrigger : public Trigger<> {
public:
@@ -13,5 +15,6 @@ class SafeModeTrigger : public Trigger<> {
}
};
} // namespace safe_mode
} // namespace esphome
} // namespace esphome::safe_mode
#endif // USE_SAFE_MODE_CALLBACK

View File

@@ -13,8 +13,7 @@
#include <esp_ota_ops.h>
#endif
namespace esphome {
namespace safe_mode {
namespace esphome::safe_mode {
static const char *const TAG = "safe_mode";
@@ -126,7 +125,9 @@ bool SafeModeComponent::should_enter_safe_mode(uint8_t num_attempts, uint32_t en
ESP_LOGW(TAG, "SAFE MODE IS ACTIVE");
#ifdef USE_SAFE_MODE_CALLBACK
this->safe_mode_callback_.call();
#endif
return true;
}
@@ -157,5 +158,4 @@ void SafeModeComponent::on_safe_shutdown() {
this->clean_rtc();
}
} // namespace safe_mode
} // namespace esphome
} // namespace esphome::safe_mode

View File

@@ -5,8 +5,7 @@
#include "esphome/core/helpers.h"
#include "esphome/core/preferences.h"
namespace esphome {
namespace safe_mode {
namespace esphome::safe_mode {
/// SafeModeComponent provides a safe way to recover from repeated boot failures
class SafeModeComponent : public Component {
@@ -25,9 +24,11 @@ class SafeModeComponent : public Component {
void on_safe_shutdown() override;
#ifdef USE_SAFE_MODE_CALLBACK
void add_on_safe_mode_callback(std::function<void()> &&callback) {
this->safe_mode_callback_.add(std::move(callback));
}
#endif
protected:
void write_rtc_(uint32_t val);
@@ -43,11 +44,12 @@ class SafeModeComponent : public Component {
uint8_t safe_mode_num_attempts_{0};
// Larger objects at the end
ESPPreferenceObject rtc_;
#ifdef USE_SAFE_MODE_CALLBACK
CallbackManager<void()> safe_mode_callback_{};
#endif
static const uint32_t ENTER_SAFE_MODE_MAGIC =
0x5afe5afe; ///< a magic number to indicate that safe mode should be entered on next boot
};
} // namespace safe_mode
} // namespace esphome
} // namespace esphome::safe_mode

View File

@@ -100,6 +100,7 @@
#define USE_OUTPUT
#define USE_POWER_SUPPLY
#define USE_QR_CODE
#define USE_SAFE_MODE_CALLBACK
#define USE_SELECT
#define USE_SENSOR
#define USE_STATUS_LED