家庭自动化 / 家庭设备发布 内容更新

ESPHome 第一个设备:不写 C++,把一个按钮接进 Home Assistant

固定ESPHome2026.9.1与IDF5.5.5,完成按钮状态、外接LED开关、首次USB写入、HA加密API集成和可识别的OTA验收。

读完能做什么
用一份完整YAML生成固件:按钮可本地切灯,HA可看按钮/控制LED,再用A/B启动标记检查OTA。
开始之前
会按F07核对模块,已有可登录的HA实例和局域网;本篇不要求先学Arduino或C++。
所需器材
官方DevKitC-1 v1.1 N8R8、WP7113ID红LED、330Ω±5% 0.25W电阻、常开按钮、面包板、万用表、USB数据线、2.4GHz Wi-Fi与已有Home Assistant实例
版本组合
参考板:ESP32-S3-DevKitC-1 v1.1 / WROOM-1-N8R8ESPHome / Python:2026.9.1 / 3.12.13;实际macOS arm64设备框架:原生ESP-IDF toolchain / 5.5.5HA资料范围:Core2026.10.2源码;未在真实HA执行
适用范围

仅官方DevKitC-1 v1.1 N8R8、GPIO4外接LED/GPIO5常开按钮;ESPHome2026.9.1/原生IDF5.5.5,不涉及继电器或市电。

这篇验证到了哪一步

资料核对已通过
docs/esp32-evidence/home-assistant.md验证日期:
构建 / 配置已通过
docs/esp32-evidence/esphome-builds.json;config与固件compile均Exit 0;不含HA配置运行、USB首刷或实板验证对象:esp32-s3-devkitc-1 / ESP32S3 / 8MB Flash + 8MB OPI PSRAM版本:ESPHome 2026.9.1 / Python 3.12.13 / ESP-IDF 5.5.5验证日期:
仿真不适用
未使用硬件或HA仿真
本站实板待验证
未有本站实板或真实Home Assistant运行;首刷/实体/OTA/模块行为仍待验证

构建通过只说明指定环境中的代码或配置通过检查;实物功能、功耗和稳定性以对应的实板记录为准。

01 / 家庭设备

先做本地闭环,再检查HA实体

本篇把物理按钮状态发布给Home Assistant,同时让按钮在ESP32本地切换一盏外接LED。HA还能通过同一个开关实体控制LED;断开HA时本地按钮仍有可观察的任务,不需要先建立自动化规则。

按钮在HA中是binary_sensor,表示按下/释放;External LED是switch,表示输出开关;Restart是可选的软件按钮实体。实体出现与物理动作正确是不同检查点,后面分别验证。本文的实板与HA流程尚未在本站执行,不把软件构建成功写成已接入。

参考:[1] ESPHome2026.9.1固定发布与源码[3] ESPHome2026.9.1:GPIO按钮与触发初态规则[4] ESPHome2026.9.1:GPIO开关

02 / 家庭设备

断电接GPIO4和GPIO5,板载RGB留给另一任务

只用USB-to-UART接口给参考板供电。GPIO4(J1-4)串330Ω电阻接WP7113ID阳极,阴极接GND;GPIO5(J1-5)经常开按钮接GND,软件内部上拉。四脚按钮要先用断电通断档确认按下才导通的两组,不按外形猜。

外接LED与v1.1板载GPIO38可寻址RGB不是同一种器件,本例不控制板载RGB。330Ω为本例固定限流值;若沿用基础课的1kΩ,亮度可能较低,应在记录中说明,不能省掉电阻或把GPIO接5V。

主控端器件端检查
GPIO4/J1-4330Ω→LED阳极LED阴极到GND
GPIO5/J1-5按钮一组另一组到GND;不接5V
USB-to-UART电脑USB数据线本例唯一供电来源

参考:[2] DevKitC-1 v1.1固定文档提交927ed7e:排针、电源与USB[9] Kingbright WP7113ID V.14A

03 / 家庭设备

用Python3.12.13建立独立环境并锁2026.9.1

该ESPHome版本要求Python至少3.12,系统自带3.9不能直接运行。本轮实际使用macOS arm64的Python3.12.13;下载包含顶层requirements.txt与该环境完整pip锁。其他系统按上游安装,不能把含macOS专用包的锁文件直接装到Linux。

在本例目录创建虚拟环境,安装esphome==2026.9.1。第一次编译下载IDF5.5.5与工具,需要数GB空间;保留失败日志,优先解决版本、路径或网络原因。默认不需要安装Arduino core。

复制secrets.example.yaml为私有secrets.yaml,填真实2.4GHz Wi-Fi、随机恢复热点密码和新生成的32字节Base64 API密钥。公开包只保留REPLACE占位符;全零密钥会被该版拒绝。API与本例加密OTA使用同一个密钥,不能公开提交。

代码 / 配置
python3.12 -m venv .venv
.venv/bin/python -m pip install -r requirements.txt
cp secrets.example.yaml secrets.yaml
.venv/bin/python -c "import secrets,base64; print(base64.b64encode(secrets.token_bytes(32)).decode())"
.venv/bin/esphome version

参考:[1] ESPHome2026.9.1固定发布与源码[5] ESPHome2026.9.1:加密OTA schema与密钥继承[6] ESPHome官方安装与首个设备(页面核查2026.10.18)

04 / 家庭设备

完整YAML:本地切灯、加密API与恢复入口

下载中的同名YAML是完整设备配置。flash_size、QIO80MHz与Octal PSRAM对应N8R8;UART0日志固定115200,先插桥接口。开关ALWAYS_OFF让初始化从关开始,按钮不在初始状态触发自动动作,30ms双边滤波是可调整初值。

api.reboot_timeout=0s使HA客户端离线时不因API超时重启;Wi-Fi断线也不以超时重启作为默认恢复。恢复热点与USB是明确的维护入口。本例没有C++ lambda;动作由ESPHome已有组件生成。

代码 / 配置
esphome:
  name: esp32-h01
  friendly_name: ESP32 H01
  min_version: 2026.9.1
  on_boot:
    priority: -100
    then:
      - logger.log: "H01-A booted; inspect real device logs"

esp32:
  board: esp32-s3-devkitc-1
  variant: ESP32S3
  flash_size: 8MB
  flash_mode: qio
  flash_frequency: 80MHz
  toolchain: esp-idf
  framework:
    type: esp-idf
    version: 5.5.5

psram:
  mode: octal
  speed: 80MHz

logger:
  baud_rate: 115200
  hardware_uart: UART0
  level: DEBUG

api:
  encryption:
    key: !secret api_key
  reboot_timeout: 0s

ota:
  - platform: esphome
    encryption:
      key: !secret api_key

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password
  reboot_timeout: 0s
  ap:
    ssid: "esp32-h01 Recovery"
    password: !secret fallback_password
    ap_timeout: 90s

captive_portal:

switch:
  - platform: gpio
    id: external_led
    name: "External LED"
    pin: GPIO4
    restore_mode: ALWAYS_OFF

binary_sensor:
  - platform: gpio
    id: physical_button
    name: "Physical button"
    trigger_on_initial_state: false
    pin:
      number: GPIO5
      inverted: true
      mode:
        input: true
        pullup: true
    filters:
      - delayed_on_off: 30ms
    on_press:
      then:
        - switch.toggle: external_led

button:
  - platform: restart
    name: "Restart"

text_sensor:
  - platform: version
    name: "ESPHome version"

参考:[1] ESPHome2026.9.1固定发布与源码[3] ESPHome2026.9.1:GPIO按钮与触发初态规则[4] ESPHome2026.9.1:GPIO开关[5] ESPHome2026.9.1:加密OTA schema与密钥继承

05 / 家庭设备

首次USB写入后,拿真实IP加入HA

先运行config,再compile;两者通过后才使用run并指定随插拔变化的实际串口。首次上传关闭其他串口工具;自动连接超时时按住BOOT、短按RESET、释放BOOT再试,完成后松开BOOT并RESET。

在UART日志确认H01-A、Wi-Fi与实际IP,再到HA设置→设备与服务→添加集成选择ESPHome。输入IP或主机名、默认端口6053及同一API密钥。mDNS跨网段不可达时手动输入IP;不为本教程开放公网端口。

到开发者工具→状态记录真实entity_id。做10次约0.2秒按下/释放,按钮状态应对应,LED每次切一次;长按2秒应只切一次。再从HA操作External LED,分别观察实体与实物;断开HA后检查本地按钮,再重连检查状态恢复。

代码 / 配置
.venv/bin/esphome config esp32-esphome-first-device.yaml
.venv/bin/esphome compile esp32-esphome-first-device.yaml
.venv/bin/esphome run esp32-esphome-first-device.yaml --device PORT
.venv/bin/esphome logs esp32-esphome-first-device.yaml --device PORT
做到这里,你应该看到
校验/构建、USB首刷、Wi-Fi、API、实体、物理按钮与HA控制均分别留记录;没有实板时保持待验证。

参考:[2] DevKitC-1 v1.1固定文档提交927ed7e:排针、电源与USB[6] ESPHome官方安装与首个设备(页面核查2026.10.18)[7] Home Assistant:ESPHome集成、手动加入与Noise密钥[8] HA Core2026.10.2:ESPHome集成源码

06 / 家庭设备

用A改B证明OTA,再保留USB恢复办法

保留设备名称与密钥,把启动日志的H01-A改H01-B,执行run并将--device换成设备真实IP。该版显式ota.encryption要求加密上传;上传后观察新日志B、RESET后仍B,随后再确认HA实体重连。只看到Successfully compiled不能证明OTA完成。

Wi-Fi填错时,本例约90秒未连接后提供有密码的恢复热点,可按门户流程重新配置;仍无法恢复就改本地secrets并重新USB写入。API密钥不一致先核对集成与本地配置,不因此更换LED或传感器库。

改密钥之前保留旧的可用配置和密钥;网络升级路径失效时以USB恢复。LED无响应先回到已发布的P01排查极性与孔组。本站尚无USB首刷、HA实体或OTA实测结果,本文提供可执行的验收,不伪造日志。

参考:[2] DevKitC-1 v1.1固定文档提交927ed7e:排针、电源与USB[5] ESPHome2026.9.1:加密OTA schema与密钥继承[6] ESPHome官方安装与首个设备(页面核查2026.10.18)[7] Home Assistant:ESPHome集成、手动加入与Noise密钥[8] HA Core2026.10.2:ESPHome集成源码

BACK TO THE SOURCE

资料来源与版本说明

本文依据下列官方文档与上游资料独立整理,适用范围与版本以本文所列组合为准。资料核对日期:。资料核对、程序构建与实板测试分别记录,不互相替代。

  1. ESPHome2026.9.1固定发布与源码
  2. DevKitC-1 v1.1固定文档提交927ed7e:排针、电源与USB
  3. ESPHome2026.9.1:GPIO按钮与触发初态规则
  4. ESPHome2026.9.1:GPIO开关
  5. ESPHome2026.9.1:加密OTA schema与密钥继承
  6. ESPHome官方安装与首个设备(页面核查2026.10.18)
  7. Home Assistant:ESPHome集成、手动加入与Noise密钥
  8. HA Core2026.10.2:ESPHome集成源码
  9. Kingbright WP7113ID V.14A