ESPHome 2026.11.0-dev
Loading...
Searching...
No Matches
deep_sleep_component.cpp
Go to the documentation of this file.
3#include "esphome/core/log.h"
4
5namespace esphome::deep_sleep {
6
7ESPHOME_LOG_TAG(TAG, "deep_sleep");
8// 5 seconds for deep sleep to ensure clean disconnect from Home Assistant
9static const uint32_t TEARDOWN_TIMEOUT_DEEP_SLEEP_MS = 5000;
10
11bool global_has_deep_sleep = false; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables)
12
17
19 this->next_enter_deep_sleep_ = false;
20 this->disable_loop();
21 const optional<uint32_t> run_duration = get_run_duration_();
22 if (run_duration.has_value()) {
23 ESP_LOGI(TAG, "Scheduling in %" PRIu32 " ms", *run_duration);
24 this->set_timeout(*run_duration, [this]() { this->begin_sleep(); });
25 } else {
26 ESP_LOGD(TAG, "Not scheduling; no run duration configured");
27 }
28}
29
31 ESP_LOGCONFIG(TAG, "Deep sleep:");
32 if (this->sleep_duration_.has_value()) {
33 uint32_t duration = *this->sleep_duration_ / 1000;
34 ESP_LOGCONFIG(TAG, " Sleep Duration: %" PRIu32 " ms", duration);
35 }
36 if (this->run_duration_.has_value()) {
37 ESP_LOGCONFIG(TAG, " Run Duration: %" PRIu32 " ms", *this->run_duration_);
38 }
40}
41
43 if (this->next_enter_deep_sleep_)
44 this->begin_sleep();
45}
46
48 if (this->prevent_ && !manual) {
49 this->defer_sleep_();
50 return;
51 }
52
53 if (!this->prepare_to_sleep_()) {
54 return;
55 }
56
57 ESP_LOGI(TAG, "Beginning sleep");
58 if (this->sleep_duration_.has_value()) {
59 ESP_LOGI(TAG, "Sleeping for %" PRId64 "us", *this->sleep_duration_);
60 }
61
62 if (this->should_teardown_()) {
64 // It's critical to teardown components cleanly for deep sleep to ensure
65 // Home Assistant sees a clean disconnect instead of marking the device unavailable
66 App.teardown_components(TEARDOWN_TIMEOUT_DEEP_SLEEP_MS);
68 }
69
70 this->deep_sleep_();
71 this->schedule_sleep_();
72}
73
75
76} // namespace esphome::deep_sleep
void teardown_components(uint32_t timeout_ms)
Teardown all components with a timeout.
void set_timeout(const char *name, uint32_t timeout, std::function< void()> &&f)
Set a timeout function with a const char* name.
Definition component.cpp:96
void disable_loop()
Disable this component's loop.
optional< uint32_t > get_run_duration_() const
void begin_sleep(bool manual=false)
Helper to enter deep sleep mode.
uint8_t duration
Definition msa3xx.h:0
ESPHOME_LOG_TAG(TAG, "deep_sleep")
constexpr float LATE
For components that should be initialized at the very end of the setup process.
Definition component.h:59
Application App
Global storage of Application pointer - only one Application can exist.
static void uint32_t