深度睡眠组件
deep_sleep 组件可用于让 ESP8266/ESP32/BK72xx/nRF52
在经过一定时间后自动进入深度睡眠模式。这对于使用
电池供电、因此需要尽可能节省能量的节点尤其有用。
要使用 deep_sleep,首先使用 run_duration 选项指定节点应保持活跃的时间,即
应检查传感器值并上报这些值的时间。
接下来,告诉节点应如何唤醒。在 ESP8266 上,您只能通过 sleep_duration 让节点
睡眠指定时长,请注意在 ESP8266 上,GPIO16 必须连接到 RST 引脚,
否则节点无法再次唤醒。在 ESP32 上,您还可以选择
通过任意 RTC 引脚(GPIO0、GPIO2、GPIO4、GPIO12、GPIO13、GPIO14、
GPIO15、GPIO25、GPIO26、GPIO27、GPIO32、GPIO39)唤醒。BK72xx 可以使用定时器(最大值为 36 小时)和/或一个或多个非 strapping 引脚唤醒。
在深度睡眠模式下,节点不会执行任何工作,也不会响应任何网络流量, 即使是无线更新(OTA)也不例外。如果在设备处于活动睡眠状态时设备的实体显示为 不可用,则说明此组件很可能是在设备被添加到 Home Assistant 之后才添加的。为避免此行为, 您可以在 Home Assistant 中删除并重新添加该设备。
# Example configuration entrydeep_sleep: run_duration: 10s sleep_duration: 10minNOTE
有些 ESP8266 在连接 RST 引脚的芯片控制线上带有板载 USB 芯片(例如 D1 mini)。这使得烧录器可以在需要时重启 ESP。这可能会干扰某些设备的深度睡眠,并在设备通过 USB 接口供电时阻止 ESP 唤醒。将连接到 3.3V 引脚和 GND 的独立 3.3V 电源为 ESP 供电可解决此问题。在这些情况下,使用 USB 转 TTL 适配器可以记录 ESP 的活动。
-
run_duration (可选, Time):节点应保持活跃(即运行代码)的时长。
仅在 ESP32 上,可以不使用时间,而是根据唤醒原因指定运行时长:
-
sleep_duration (可选, Time):在深度睡眠模式中保持的时间。在 BK72xx 上,最大值为 36 小时。在 Zephyr 上,最大值为 49 天。
-
touch_wakeup (可选, boolean):仅 ESP32 可用。使用触摸事件从深度睡眠中唤醒。要能够 通过触摸事件唤醒,需要正确配置二进制传感器。
-
wakeup_pin (可选, Pin Schema / list):仅 ESP32/BK72xx 可用。在深度睡眠模式中用于唤醒的 单个引脚。使用
inverted属性以在低电平信号时唤醒。 如果想指定多个唤醒引脚(仅 BK72xx),请在wakeup_pin下用列表指定,条目由以下组成:- pin (必选, Pin Schema)
- wakeup_pin_mode (可选) 见下文
-
wakeup_pin_mode (可选):仅 ESP32/BK72xx 可用。指定当尝试进入深度睡眠时 唤醒引脚已经处于会触发唤醒的状态,应如何处理通过
wakeup_pin唤醒。 参见唤醒引脚模式。默认为IGNORE -
id (可选, ID):手动指定用于代码生成的 ID。
高级功能:
-
esp32_ext1_wakeup (可选):使用 ESP32 的 EXT1 唤醒源,从深度睡眠中 通过多个引脚唤醒。此功能不能与 wakeup_pin 一起使用。
- pins (必选, 引脚编号列表):用于唤醒的引脚。
- mode (必选):用于唤醒源的模式。必须为以下之一:
ANY_LOW:任一选定的引脚为低电平时唤醒(仅限 ESP32‑C5/C6/C61/H2/P4/S2/S3)ALL_LOW:所有选定的引脚都处于低电平时唤醒(仅限 ESP32)ANY_HIGH:任一选定的引脚为高电平时唤醒
NOTE
只能配置一个深度睡眠组件。
ESP32/BK72xx 唤醒引脚模式
Section titled “ESP32/BK72xx 唤醒引脚模式”在 ESP32(以及 BK72xx)上,您可以选择在任意 RTC 引脚上唤醒。但是,有一种情况需要
您告诉 ESPHome 如何处理:如果唤醒引脚在深度睡眠应该开始时已经处于
会触发唤醒的状态怎么办?使用 wakeup_pin_mode 选项有三种处理方式:
-
IGNORE(默认):忽略我们会因为唤醒引脚已经处于活动状态而立即退出深度睡眠 这一事实。 -
KEEP_AWAKE:在唤醒引脚仍处于活动状态期间保持 ESP32 唤醒。换句话说:推迟 深度睡眠的激活,直到唤醒引脚不再处于活动状态。 -
INVERT_WAKEUP:当深度睡眠设置为在高电平信号上唤醒,但唤醒引脚已经为高电平时, 则重新配置深度睡眠为在低电平信号上唤醒,反之亦然。当您想要 使用深度睡眠观察引脚的状态变化且 ON/OFF 值持续时间较长时,此功能很有用。
# Example configuration with single pin wakeup on BK72xxdeep_sleep: wakeup_pin: P8 # will wakeup when P8 is high wakeup_pin_mode: IGNORE # state of P8 at the moment of going to sleep does not influence the wakeup scenario# Example configuration with multi-pin wakeup on BK72xxdeep_sleep: wakeup_pin: - pin: number: P8 inverted: True # will wake up when P8 is low wakeup_pin_mode: KEEP_AWAKE # will prevent sleep as long as P8 is low - pin: P24 # will wake up when P24 goes high wakeup_pin_mode: INVERT_WAKEUP # flips the trigger level after each wakeESP32 唤醒原因
Section titled “ESP32 唤醒原因”在 ESP32 上,可以使用 esp_sleep_get_wakeup_cause() 函数检查哪个唤醒源
触发了从睡眠模式唤醒。
sensor: - platform: template name: "Wakeup Cause" accuracy_decimals: 0 lambda: return esp_sleep_get_wakeup_cause();唤醒原因对应的整数值如下:
- 0 -
ESP_SLEEP_WAKEUP_UNDEFINED:在深度睡眠的情况下,复位不是由退出深度睡眠引起的 - 1 -
ESP_SLEEP_WAKEUP_ALL:不是唤醒原因,用于通过 esp_sleep_disable_wakeup_source 禁用所有唤醒源 - 2 -
ESP_SLEEP_WAKEUP_EXT0:由使用 RTC_IO 的外部信号唤醒 - 3 -
ESP_SLEEP_WAKEUP_EXT1:由使用 RTC_CNTL 的外部信号唤醒 - 4 -
ESP_SLEEP_WAKEUP_TIMER:由定时器唤醒 - 5 -
ESP_SLEEP_WAKEUP_TOUCHPAD:由触摸板唤醒 - 6 -
ESP_SLEEP_WAKEUP_ULP:由 ULP 程序唤醒 - 7 -
ESP_SLEEP_WAKEUP_GPIO:由 GPIO 唤醒(仅在 ESP32、S2 和 S3 上支持浅睡眠) - 8 -
ESP_SLEEP_WAKEUP_UART:由 UART 唤醒(仅限浅睡眠) - 9 -
ESP_SLEEP_WAKEUP_WIFI:由 WIFI 唤醒(仅限浅睡眠) - 10 -
ESP_SLEEP_WAKEUP_COCPU:由 COCPU 中断唤醒 - 11 -
ESP_SLEEP_WAKEUP_COCPU_TRAP_TRIG:由 COCPU 崩溃唤醒 - 12 -
ESP_SLEEP_WAKEUP_BT:由 BT 唤醒(仅限浅睡眠)
当配置了 sleep_duration 或使用了 Zigbee 时,nRF52 在唤醒后恢复正常运行。
否则,nRF52 会执行完全复位,而不是继续执行。
deep_sleep.enter 动作
Section titled “deep_sleep.enter 动作”此动作使指定的深度睡眠组件立即进入深度睡眠。
on_...: then: - deep_sleep.enter: id: deep_sleep_1 sleep_duration: 20min
# Sleep duration is also templatableon_...: then: - deep_sleep.enter: id: deep_sleep_1 sleep_duration: !lambda "return 20 * 60 * 1000;"
# ESP32 can sleep until a specific time of day.on_...: then: - deep_sleep.enter: id: deep_sleep_1 until: "16:00:00" time_id: sntp_id配置选项:
- sleep_duration (可选, 可模板化, Time):在深度睡眠模式中保持的时间。如果使用模板,应返回毫秒单位的值。
- until (可选, string):要唤醒的一天中的时间。仅 ESP32 可用。
- time_id (可选, ID):用于
until选项的 time 组件的 ID。仅 ESP32 可用。
deep_sleep.prevent 动作
Section titled “deep_sleep.prevent 动作”此动作阻止指定的深度睡眠组件进入深度睡眠。 可用于在数据传输或 OTA 更新期间保持 ESP 处于活动状态(更多信息请参阅下面的说明)。
on_...: then: - deep_sleep.prevent: deep_sleep_1NOTE
例如,如果您想在启用深度睡眠模式的情况下通过 OTA 上传固件,可能很难 捕捉到 ESP 处于活动状态的时机。
您可以使用此自动化,在收到主题为 livingroom/ota_mode 的 MQTT 消息时自动阻止深度睡眠。然后,要进行 OTA 更新,只需
使用 MQTT 客户端发布下面描述的一条 retained MQTT 消息即可。当节点再次唤醒时
它便不会再进入深度睡眠模式,您就可以上传 OTA 更新。
记得在 OTA 更新之后,通过发送 payload 为 OFF 的 MQTT 消息再次关闭”OTA 模式”。要在 OTA 更新后再次进入深度睡眠,请在主题 livingroom/sleep_mode
上发送 payload 为 ON 的消息。深度睡眠会立即开始。别忘了在节点
再次唤醒之前删除 payload。
deep_sleep: # ... id: deep_sleep_1mqtt: # ... on_message: - topic: livingroom/ota_mode payload: 'ON' then: - deep_sleep.prevent: deep_sleep_1 - topic: livingroom/sleep_mode payload: 'ON' then: - deep_sleep.enter: deep_sleep_1deep_sleep.allow 动作
Section titled “deep_sleep.allow 动作”此动作在之前被阻止后,允许指定的深度睡眠组件进入深度睡眠。
on_...: then: - deep_sleep.allow: deep_sleep_1