跳转到内容

深度睡眠组件

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 entry
deep_sleep:
run_duration: 10s
sleep_duration: 10min

NOTE

有些 ESP8266 在连接 RST 引脚的芯片控制线上带有板载 USB 芯片(例如 D1 mini)。这使得烧录器可以在需要时重启 ESP。这可能会干扰某些设备的深度睡眠,并在设备通过 USB 接口供电时阻止 ESP 唤醒。将连接到 3.3V 引脚和 GND 的独立 3.3V 电源为 ESP 供电可解决此问题。在这些情况下,使用 USB 转 TTL 适配器可以记录 ESP 的活动。

  • run_duration (可选, Time):节点应保持活跃(即运行代码)的时长。

    仅在 ESP32 上,可以不使用时间,而是根据唤醒原因指定运行时长:

    • default (必选, Time):定时器唤醒以及任何未指定唤醒原因的默认运行时长。
    • gpio_wakeup_reason (可选, Time):由 GPIO 唤醒时的运行时长。
    • touch_wakeup_reason (可选, Time):由触摸唤醒时的运行时长。
  • 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)上,您可以选择在任意 RTC 引脚上唤醒。但是,有一种情况需要 您告诉 ESPHome 如何处理:如果唤醒引脚在深度睡眠应该开始时已经处于 会触发唤醒的状态怎么办?使用 wakeup_pin_mode 选项有三种处理方式:

  • IGNORE(默认):忽略我们会因为唤醒引脚已经处于活动状态而立即退出深度睡眠 这一事实。

  • KEEP_AWAKE :在唤醒引脚仍处于活动状态期间保持 ESP32 唤醒。换句话说:推迟 深度睡眠的激活,直到唤醒引脚不再处于活动状态。

  • INVERT_WAKEUP :当深度睡眠设置为在高电平信号上唤醒,但唤醒引脚已经为高电平时, 则重新配置深度睡眠为在低电平信号上唤醒,反之亦然。当您想要 使用深度睡眠观察引脚的状态变化且 ON/OFF 值持续时间较长时,此功能很有用。

# Example configuration with single pin wakeup on BK72xx
deep_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 BK72xx
deep_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 wake

在 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 会执行完全复位,而不是继续执行。

此动作使指定的深度睡眠组件立即进入深度睡眠。

on_...:
then:
- deep_sleep.enter:
id: deep_sleep_1
sleep_duration: 20min
# Sleep duration is also templatable
on_...:
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 可用。

此动作阻止指定的深度睡眠组件进入深度睡眠。 可用于在数据传输或 OTA 更新期间保持 ESP 处于活动状态(更多信息请参阅下面的说明)。

on_...:
then:
- deep_sleep.prevent: deep_sleep_1

NOTE

例如,如果您想在启用深度睡眠模式的情况下通过 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_1
mqtt:
# ...
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_1

此动作在之前被阻止后,允许指定的深度睡眠组件进入深度睡眠。

on_...:
then:
- deep_sleep.allow: deep_sleep_1