跳到主要内容

第3节 第一个 ESPHome 设备

重要提示:关于开发板的兼容性

本教程的核心逻辑适用于所有 ESP32 开发板,但所有操作步骤均以 微雪 ESP32-S3-Zero 迷你开发板 为例进行讲解。如果您使用其他型号的开发板,请根据实际情况修改芯片类型、板型与引脚配置。

本节以 微雪 ESP32-S3-Zero 为例,使用 ESPHome 向导生成最小配置、添加板载 RGB LED 组件、首次通过 USB 烧录,并在 Home Assistant 中控制 LED;最后演示后续如何通过 OTA 升级固件。

1. 准备工作

  • 硬件微雪 ESP32-S3-Zero 一块、USB-C 数据线一根。
  • 网络:可用的 2.4 GHz Wi-Fi(ESP32-S3 不支持 5 GHz)。HA 主机与 ESP32-S3-Zero 必须在同一子网。
  • 前置:已完成第 1、2 节,HA 与 ESPHome 应用已可访问。
  • 浏览器:ESPHome Web 烧录工具需 Chrome 或 Edge(Firefox、Safari 不支持 Web Serial API);虚拟机直通方式无此限制。

ESP32-S3-Zero 的板载资源中,唯一的可控元件是接在 GPIO21 上的一颗 WS2812 RGB LED。本节将以这颗 LED 作为示例,完整走一遍从空白配置到在 HA 中拖动色板控制板载 LED 的全过程。

2. 用向导创建配置

ESPHome 应用提供新设备向导,自动生成一份可直接烧录的最小 YAML。

  1. 打开 ESPHome 应用 Web 界面,点击右下角 NEW DEVICE

    新建设备
  2. 在欢迎弹窗中点击 CONTINUE

    新建设备
  3. 选择 New Device Setup

    选择新设备
  4. 为设备命名,再填写 Wi-Fi 名称(SSID)与密码。本教程示例设备名用 esp32-s3-zero——设备名只能包含小写字母、数字和连字符,同时也是设备的 mDNS 主机名(<name>.local)。

    备注
    • Wi-Fi 仅支持 2.4 GHz,ESP32-S3 不支持 5 GHz。
    • 账号密码会自动写入 ESPHome 应用的 secrets.yaml,供本设备与后续设备共享,不会硬编码到设备 YAML 中(如何修改见 3.2 节)。
    设置设备名称
  5. 选择设备芯片类型。ESP32-S3-Zero 使用 ESP32-S3 芯片,选 ESP32-S3

    设置设备名称
  6. 向导完成后会弹出 INSTALL 选项。点击 SKIP——我们要先添加板载 LED 配置再烧录。

    跳过首次烧录
  7. 返回设备列表,会看到一张名为 esp32-s3-zero 的设备卡片。点击卡片上的 EDIT 打开 YAML 编辑器,查看向导生成的初始配置:

    编辑 YAML
    esphome:
    name: esp32-s3-zero
    friendly_name: esp32-s3-zero

    esp32:
    board: esp32-s3-devkitc-1
    framework:
    type: esp-idf

    # Enable logging
    logger:

    # Enable Home Assistant API
    api:
    encryption:
    key: "...."

    ota:
    - platform: esphome
    password: "...."

    wifi:
    ssid: !secret wifi_ssid
    password: !secret wifi_password

    # Enable fallback hotspot (captive portal) in case wifi connection fails
    ap:
    ssid: "Esp32-S3-Zero Fallback Hotspot"
    password: "...."

    captive_portal:

    各主要段落作用:

    • esphome: — 设备元信息。name 是 mDNS 主机名,friendly_name 是在 HA 中显示的名字。
    • esp32: — 芯片配置。board 指定开发板型号,framework.type: esp-idf 选择编译框架(另一选项是 arduino)。
    • logger: — 启用日志输出。可在 ESPHome 的 LOGS 中查看。
    • api: — 启用与 HA 通信的原生 API。加密密钥由向导自动生成,HA 接入时通过 mDNS 自动获取。
    • ota: — 开启空中升级(Over-The-Air)支持,是后续无需 USB 烧录的关键。
    • wifi: — Wi-Fi 配置。账号密码通过 !secretsecrets.yaml 读取。ap: 配置在 Wi-Fi 连接失败时启用 AP 备用热点,方便用手机连接重新配置。
    • captive_portal: — 配合 wifi.ap 提供网页配网界面。
    备注

    ESPHome 向导输出的具体字段与默认值会随版本变化,你看到的与本教程可能略有差异。

3. 必备的最小 YAML 概念

在动手添加 LED 配置之前,先了解两个本节会用到的 YAML 基础概念。更进阶的组织手段(substitutions!includepackagesexternal_components 等)在 第 4 节 扩展 ESPHome 配置 介绍。

3.1 YAML 缩进与列表

YAML 用缩进表达层级,只能用空格,不能用 Tab,统一 2 空格一级。同一级的键对齐要严格,错一个空格就会导致解析失败。

esphome:
name: esp32-s3-zero # 2 空格缩进
friendly_name: My First ESPHome # 与上一行 name 对齐

短横线 - 开头表示列表项:

ota:
- platform: esphome # ota 是列表,包含一个映射元素
password: "..." # 该元素的 password 与 platform 对齐

编辑完成后,可以点击 Validate 按钮验证 YAML 格式是否正确。

YAML 验证

3.2 !secretsecrets.yaml

!secret xxx 是 ESPHome 的特殊语法,表示“从 secrets.yaml 读取键 xxx 的值”。

ESPHome 向导第 4 步填写的 Wi-Fi 账号密码会自动写入 secrets.yaml

# secrets.yaml
wifi_ssid: MyHomeWiFi
wifi_password: my-wifi-password

设备 YAML 中引用:

wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password

要修改 Wi-Fi 账号密码,可直接在 secrets.yaml 中修改:

修改 Wi-Fi 账号密码

把敏感信息集中放在 secrets.yaml 后,多个设备可以共用同一份凭据;导出或分享设备配置时也不会泄漏密码。

4. 添加板载 RGB LED

ESP32-S3-Zero 的板载 RGB LED 接在 GPIO21,类型为 WS2812(单颗 NeoPixel)。ESPHome 中通过 light 平台的 esp32_rmt_led_strip 驱动。

在向导生成的 YAML 末尾追加以下段落:

light:
- platform: esp32_rmt_led_strip
chipset: WS2812
rgb_order: RGB
pin: GPIO21
num_leds: 1
name: "RGB LED"

各字段含义:

  • platform: esp32_rmt_led_strip — 使用 ESP32 的 RMT 外设驱动 WS2812 兼容灯带(单颗灯也用同样的驱动)。
  • chipset: WS2812 — 灯珠协议类型。
  • rgb_order: RGB — ESP32-S3-Zero 板载 RGB LED 数据顺序固定为红、绿、蓝。
  • pin: GPIO21 — ESP32-S3-Zero 上 RGB LED 的数据引脚。
  • num_leds: 1 — 板载只有一颗。
  • name: "RGB LED" — 在 HA 中显示的实体名字。

完整字段说明请查阅 ESPHome esp32_rmt_led_strip 文档

添加完成后,点击编辑器右上角 SAVE 保存,再点击右上角 INSTALL 进入烧录流程。

完整 YAML 与 SAVE/INSTALL 按钮

5. 编译与首次烧录

首次烧录必须通过 USB——Wirelessly(OTA)要等设备烧录过一次固件并连上 Wi-Fi 后才可用。

点击 INSTALL 后,弹窗会列出几种烧录方式:

选择烧录方式
  • Wirelessly — 通过 Wi-Fi 的 OTA 升级,要求设备已在线。首次烧录设备还没有固件,此项不可用
  • Plug into this computer — 设备 USB 插在「正在操作浏览器的这台电脑」上,由浏览器通过 Web Serial 烧录。
  • Plug into the computer running ESPHome Device Builder — 设备 USB 插在「运行 ESPHome 的那台主机/服务器」上,由服务器端直接烧录。
  • Manual download — 下载固件二进制文件,自行用 ESPHome Web 工具esptool 烧录。

其中 Plug into this computer 依赖浏览器的 Web Serial API,而该 API 仅在 HTTPS(安全上下文)下可用;自建 Home Assistant 的页面通常通过 HTTP 访问,因此这种方式在多数自建环境下不可用。

无论用哪种方式,首次编译都会比较久(视网络与主机性能,约数分钟到十几分钟)。ESPHome 需要下载工具链、编译框架与依赖组件,之后重新编译会快很多;编译过程中进度可能暂时不动,属于正常现象,并非卡死。

下面给出两种可行方式,根据你的情况选择其一:

ESPHome Web 是官方提供的浏览器烧录工具,本身运行在 HTTPS 站点上,可直接通过 USB 给设备烧录。需 Chrome 或 Edge 浏览器。

  1. 在弹窗中选择 Manual download,窗口中会显示构建日志,耐心等待固件编译完成。

    编译完成后,选择 Factory format 下载,得到一个 .bin 固件文件,然后关闭窗口。

    选择固件版本
  2. 打开 ESPHome Web,点击 Connect

    ESPHome Web 连接
  3. 浏览器弹出“选择串口”对话框,找到 ESP32-S3-Zero 对应的端口(通常显示为 USB JTAG/serial debug unit 或带 ESP32-S3 字样),点击连接。

    烧录失败或看不到端口时

    大多数情况下插入 USB 即可直接烧录。如果失败或看不到端口,先拔掉 USB,然后按住 BOOT 键不放再插入 USB,识别到设备后松开 BOOT,重新烧录。

    ESPHome Web 选择设备
  4. 点击 Install,选择第 1 步下载的 .bin 文件,即开始烧录。

    ESPHome Web 烧录 1
    ESPHome Web 烧录 2
  5. 烧录成功。

    ESPHome Web 烧录成功

6. 在 Home Assistant 中接入设备

设备烧录成功并连上 Wi-Fi 后,ESPHome 通过 mDNS 广播自身,HA 会自动发现该设备。

  1. 切换到 HA 主界面,点击 设置 → 设备与服务。在「已发现」一栏中,可以看到 “esp32-s3-zero ESPHome”。

    点击 添加,HA 会通过 mDNS 自动获取加密密钥,直接提交即可。

    HA 发现新设备
    已发现中没有 ESPHome 设备?
    • 确认设备与 HA 主机处于同一子网。
    • 手动添加:设置 → 设备与服务 → 添加集成 → ESPHome,输入主机名 esp32-s3-zero.local 或设备 IP 地址。设备 IP 可在 ESPHome 应用的 LOGS 中查到。
  2. 提交后,HA 会要求为设备分配一个区域(如“客厅”),选择一个区域后点击 完成

    选择区域
  3. 接入成功后,HA 会自动跳转到设备页面。也可以进入 设置 → 设备与服务 → ESPHome,找到 esp32-s3-zero,其中有一个名为 RGB LED 的灯光实体。点击开关打开灯光,板载 LED 会亮起。

    HA 中的设备页面
  4. 点击 RGB LED 实体打开控制面板,拖动颜色选择器或亮度滑条,板载 LED 会即时变化。

    HA 中控制 LED
  5. 概览 → 客厅 → 灯光 中也能找到 RGB LED 实体,拖动色板同样可以控制 LED。

    现在这块 ESP32 就成了 HA 里的一个智能灯。

    HA 概览页面控制 LED

至此,“YAML 编辑 → 烧录 → HA 接入 → 远程控制”的完整流程就完成了。

7. 后续修改:OTA 更新

设备已经联网且包含 OTA 模块,之后修改 YAML 无需再插 USB。

  1. 在 ESPHome 应用中编辑设备配置,例如把 LED 名字从 "RGB LED" 改为 "Status Light",保存。

  2. 点击 INSTALL → 选择 Wirelessly

    OTA 升级
    OTA 后 1 分钟内不要重启设备

    ota: 组件会自动启用 safe mode,新固件启动后运行 1 分钟的 boot_is_good_after 计时器。计时到点前若发生任何形式的重启(手动按 RESET、断电、崩溃),下次启动会被 ESP-IDF bootloader 回滚到上一版固件;到点后固件会把自己标记为“已确认可用”,此后重启不再回滚。LOGS 中出现 Boot seems successful 即表示新固件已确认。

    OTA 成功

    此回滚机制依赖 esp-idf 框架(本节 YAML 即为 framework: esp-idf),arduino 框架下行为不同。机制详见 ESPHome Safe Mode 文档

  3. ESPHome 会编译新固件,通过 Wi-Fi 推送到设备并自动重启。HA 中的实体名也会随之更新。

    OTA 成功

OTA 失败的常见原因:

  • 设备离线:在 ESPHome 应用主界面查看设备状态,灰色表示离线。先解决 Wi-Fi 问题再 OTA。
  • OTA 密码不匹配:向导生成的密码写在 YAML 的 ota.password。若手动改过该字段但没烧录新固件,OTA 会被设备拒绝。

如果 OTA 失败导致设备无法启动或连不上 Wi-Fi,可以用 USB 重新烧录恢复。

8. 本节常见问题

  • 编译报错 YAML syntax error:缩进出错。检查是否混用了 Tab 与空格、对齐是否一致。
  • 编译报错 Unable to find component xxx:组件名拼写错,或当前 ESPHome 版本不包含该组件。在 ESPHome 组件目录 查证准确名字。
  • 烧录时看不到设备端口:未进入下载模式(见第 5 节“烧录失败或看不到端口时”),或主机识别不到 USB 设备(换数据线、换 USB 口)。用虚拟机烧录时还要确认 USB 设备已在 VMware 中分配给虚拟机。
  • 烧录后 LED 不亮:检查 rgb_order 是否为 RGB;用 HA 拖动色板而不是仅亮度滑条(亮度 100% 但颜色为黑时 LED 仍不亮)。
  • HA 没有自动发现设备:见第 6 节第 1 步的提示。也可在 ESPHome 设备 LOGS 中确认是否成功连上 Wi-Fi 与 API。
  • OTA 失败 Connection refused:设备运行的固件 OTA 密码与当前 YAML 不一致,用 USB 重新烧录即可同步。
  • HA 显示实体“不再可用”,但 ESPHome 中设备 ONLINE:触发了 OTA 安全回滚——新固件 1 分钟内重启会被 bootloader 回滚到上一版。在 LOGS 中搜索 OTA rollback detected 确认,USB 重新烧录恢复。详见第 7 节的警告说明。

9. 参考链接