跳转到内容

空中更新

ESPHome 支持”空中”(OTA)远程更新设备。每个更新机制都是基本 ota 组件的一个平台,并将有自己的配置变量。

在 2024.6.0 版本中,ota 组件从独立组件转变为平台组件。此更改是为了便于使用多种更新机制,实现更大的灵活性。

可用平台:

  • esphome:使用 ESPHome 原生协议的默认 OTA 方法(由仪表板和 CLI 使用)
  • http_request:从远程 Web 服务器拉取固件更新
  • web_server:通过设备的 Web 界面启用固件上传
# 示例配置条目
ota:
- platform: ...
  • on_begin (可选, 自动化):OTA 更新开始时要执行的动作。请参阅 on_begin

  • on_progress (可选, 自动化):OTA 更新进行期间(大约每秒)要执行的动作。请参阅 on_progress

  • on_end (可选, 自动化):OTA 更新成功后要执行的动作。请参阅 on_end

  • on_error (可选, 自动化):OTA 更新失败后要执行的动作。请参阅 on_error

  • on_state_change (可选, 自动化):OTA 更新状态更改时要执行的动作。请参阅 on_state_change

OTA 组件提供各种 自动化,可用于在 OTA 更新过程中提供反馈。使用这些自动化触发器时,请注意:

  • OTA 更新在进行时会阻塞主应用程序循环。您将无法使用仅在其 loop() 方法中更新输出的组件来表示状态变化。换句话说:如果您尝试使用组件 X 显示 OTA 进度,但更新仅在 OTA 更新完成后才出现,则组件 X 不能用于提供 OTA 更新反馈。

  • 您的自动化动作不得消耗任何大量时间;否则,OTA 更新可能会失败。

当 OTA 更新开始时将触发此自动化。

ota:
- platform: ...
on_begin:
then:
- logger.log: "OTA 开始"

使用此自动化,可以报告 OTA 更新进度。它将在 OTA 更新期间重复触发。您可以从触发器的变量 x 获取实际进度百分比(0 到 100 之间的值)。

ota:
- platform: ...
on_progress:
then:
- logger.log:
format: "OTA 进度 %0.1f%%"
args: ["x"]

当 OTA 更新成功完成时,在设备重启之前立即触发此自动化。

由于更新已完成,您可以安全地使用需要一些时间完成的自动化动作。例如,如果您想让 LED 闪烁,在重启前需要多次暂停/延迟。此时 OTA 更新不会失败,因为已经完成。

ota:
- platform: ...
on_end:
then:
- logger.log: "OTA 结束"

当 OTA 更新失败时将触发此自动化。您可以从变量 x 获取内部错误代码。

就像 on_end 一样,您可以安全地使用需要一些时间完成的自动化,因为 OTA 更新过程已经完成。

ota:
- platform: ...
on_error:
then:
- logger.log:
format: "OTA 更新错误 %d"
args: ["x"]

每次状态更改时都会触发此自动化。您可以从变量 state 获取实际状态,它将包含 OTAState 枚举的值之一。这些值是:

  • ota::OTA_STARTED
  • ota::OTA_IN_PROGRESS将在更新期间重复调用
  • ota::OTA_COMPLETED
  • ota::OTA_ERROR
ota:
- platform: ...
on_state_change:
then:
- if:
condition:
lambda: return state == ota::OTA_STARTED;
then:
- logger.log: "OTA 开始"

除了 OTA 更新外,ESPHome 还支持”安全模式”以帮助在更新不如预期时进行恢复。这由 ota 组件自动启用,但如果需要可以禁用。有关详细信息,请参阅 安全模式