ESPHome ESP32 YAML 配置实战:一块门磁到全屋自动化只要 5 段代码
【免费下载链接】esphomeESPHome is a system to control your ESP32, ESP8266, BK72xx, RP2040 by simple yet powerful configuration files and control them remotely through Home Automation systems.项目地址: https://gitcode.com/GitHub_Trending/es/esphome
拿一块 ESP32 开发板,接上一个门磁,在 ESPHome 里只需要写十几行 YAML 配置:门一开,Home Assistant 面板立刻出现状态变化。不用手写 C++ 驱动,也不用自己搭交叉编译工具链。这篇文章先给出一份能直接跑通的最小配置,然后讲清"配置如何变成固件"的生成链路,再依次覆盖传感器接入、MQTT 联动、避坑清单和自定义组件。
门磁为例:一份最小可用配置
完整文件只需要四个段落:基础信息、网络、API、一个二进制传感器。
esphome: name: door-sensor wifi: ssid: !secret wifi_ssid password: !secret wifi_password api: encryption: key: !secret api_key ota: binary_sensor: - platform: gpio pin: GPIO14 name: 门磁 device_class: door filters: - delayed_on: 250ms # 滤掉机械触点抖动!secret这个标签在esphome/yaml_util.py里注册,取值从独立的 secrets 文件读取,这样密码不会被带进要提交到版本库的配置里:
# secrets.yaml(与主配置同目录,不纳入版本控制) wifi_ssid: HomeWifi wifi_password: 12345678 api_key: 32位十六进制密钥 mqtt_user: admin mqtt_password: 你的密码记住这套写法之后,加组件就是继续写列表项:加温湿度传感器补一段sensor: - platform: dht,加一颗 LED 补一段light:,语法规律始终一致。
一图看懂:YAML 如何变成可烧录固件
写完配置执行esphome run,背后是一条固定的管线:
各环节分工明确:
- 解析与校验(
esphome/config.py):读入 YAML 后按每个组件的 schema 逐项检查,引脚写错、key 拼错都会直接给出报错位置。 - 代码生成(
esphome/codegen.py):把配置项逐个翻译成 C++ 语句,最终由esphome/writer.py把main.cpp落到构建目录。 - 编译与写入:交给 PlatformIO 或 ESP-IDF 完成,产出 bin 文件后写进设备。
对日常使用有两个关键含义。其一,构建目录里的 C++ 全是机器写的,你不需要读它——配置合法,编译就能过。其二是增量编译:改一个传感器的引脚再重跑,只重新生成并编译受影响的部分,通常十几秒出结果。
环境搭建与首台设备联网
准备环境就是三条命令的事:
git clone https://gitcode.com/GitHub_Trending/es/esphome cd esphome ./script/setup # 自动建虚拟环境并装依赖 source .esphome-venv/bin/activate esphome run door-sensor.yaml第一次编译会明显变慢,因为要为目标芯片下载工具链和框架,ESP32 系列大约几百 MB;之后全部走缓存。esphome run编完会直接经串口写入,设备启动后向路由器申请 IP,Home Assistant 的 ESPHome 集成通过 mDNS 自动发现它。
此后可以不再插串口:配置里的ota:段让设备常驻一个更新通道,再次esphome run时固件走远程下发,设备自己拉取、校验并重启。家里几十台设备时,这就是批量维护能成立的原因——逐台刷新,不用拆机。
如果首次配网失败,设备会回退成以自己的名字命名的热点,通过浏览器跳转的引导页补上 WiFi 账号即可,这是忘了密码时的兜底路径。
传感器接入与 MQTT、Home Assistant 联动
接入 DHT 温湿度传感器,顺手把脏数据挡在面板之前:
sensor: - platform: dht pin: GPIO4 model: AM2302 update_interval: 15s temperature: name: 室内温度 filters: - sliding_window_moving_average: # 滑动窗口平均 window_size: 5 send_every: 3 - delta: 0.5 # 变化不足 0.5 不上报 - lambda: >- if (x < -10 || x > 60) return NaN; return x; humidity: name: 室内湿度过滤链每一环职责单一:滑动平均抹掉毛刺,delta压掉小幅抖动,lambda丢弃物理上不可能的读数(返回 NaN 表示本次不更新)。三层叠加后,曲线在面板上会稳很多。
与 Home Assistant 打通走 MQTT:
mqtt: broker: 192.168.1.100 username: !secret mqtt_user password: !secret mqtt_password discovery: true binary_sensor: - platform: gpio pin: GPIO14 name: 门磁 on_press: - mqtt.publish: topic: home/living_room/door payload: "OPEN"discovery: true让设备上线时向 broker 自动上报实体描述,Home Assistant 里不用手工建条目。on_press是一个动作钩子,同一位置还能写if、delay、light.turn_on等动作,把事件串成链,全程不碰回调函数。
避坑清单:三个高频问题
WiFi 掉线的三种解法
wifi: networks: - ssid: "Office-5G" password: !secret wifi_password priority: 10 - ssid: "Office-Guest" password: !secret wifi_password manual_ip: static_ip: 192.168.1.100 gateway: 192.168.1.1 subnet: 255.255.255.0 power_save_mode: none reboot_timeout: 5min三个抓手按顺序试:用networks列多个候选并按priority排序,让设备在两个 AP 之间自己选路;DHCP 不稳就换manual_ip固定地址;ESP32 频繁断流时把power_save_mode设为none,代价是待机功耗略升。
传感器偶尔吐脏数据
上面那组 filters 是标准解法。再补一层思路:对确实滤不掉的传感器,在自动化条件里加threshold判断,让异常值根本不进面板,而不是事后去清洗历史曲线。
固件超出分区上限
esphome: name: optimized_device build_flags: - -ffunction-sections - -fdata-sections - -Wl,--gc-sections platformio_options: board_build.partitions: min_spiffs.csv logger: level: WARN三条build_flags让链接器剔除没被引用的代码段,min_spiffs.csv把文件系统分区缩到最小,给程序腾出空间;日志级别降到WARN还能省运行时内存。再挤就回头砍功能:Web 服务器、用不上的 BLE 服务都是大块头。
进阶:自定义组件怎么写、多设备怎么联动
esphome/components/下有四百多个内置组件,遇到没有现成驱动的硬件,自定义组件就是两个文件:一个声明配置 schema 的__init__.py,一对做硬件交互的.h/.cpp。
# custom_components/my_led/__init__.py import esphome.codegen as cg import esphome.config_validation as cv from esphome.components import output from esphome.const import CONF_ID my_led_ns = cg.esphome_ns.namespace("my_led") MyLED = my_led_ns.class_("MyLEDOutput", output.FloatOutput) CONFIG_SCHEMA = output.FLOAT_OUTPUT_SCHEMA.extend( {cv.Required(CONF_ID): cv.declare_id(MyLED)} )把目录放进custom_components/,配置里写platform:即可,注册和校验由框架接管,风格与内置组件完全一致。
多设备联动有一条省事的路:让 MQTT 充当消息总线。运动传感器触发时mqtt.publish一条事件,灯光设备用mqtt_subscribe订阅同一 topic,收到就执行light.turn_on。两台设备互不知道对方存在,只认 topic——将来再扩一台订阅者,现有配置一行不用动。
收尾
ESPHome 的定位一句话就能说清:它架在硬件与家庭自动化之间的一层统一抽象,用一套 YAML 抹平 ESP32、ESP8266、RP2040 的行为差异;对想深入的人,自定义组件层又留足了向下写 C++ 的空间。从一台门磁到全屋十几台设备,变的只有那份 YAML。🏠
【免费下载链接】esphomeESPHome is a system to control your ESP32, ESP8266, BK72xx, RP2040 by simple yet powerful configuration files and control them remotely through Home Automation systems.项目地址: https://gitcode.com/GitHub_Trending/es/esphome
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考