ESPHome DIY 智能设备:ESP32-C6/H2 开发入门
家里传感器不够用?市售产品又贵又不透明。ESPHome 是 Home Assistant 官方推荐的 DIY 方案——用 YAML 写配置,一键编译,OTA 无线推送。我用了两年,从 LED 灯条做到温湿度站,踩过的坑比读过的文档多。
硬件选型:为什么是 ESP32-C6
| 型号 | 芯片 | WiFi | BLE | Thread | 价格 | 推荐场景 |
|---|---|---|---|---|---|---|
| ESP32-C6 | Wi-Fi 6 + BLE 5 + Thread | ✅ | ✅ | ✅ | ¥25-35 | 全能首选 |
| ESP32-H2 | BLE 5 + Thread | ❌ | ✅ | ✅ | ¥25-30 | 纯 Thread 设备 |
| ESP32-S3 | WiFi + BLE 5 | ❌ | ✅ | ❌ | ¥35-45 | 需要 AI/摄像头 |
| ESP8266 | WiFi only | ✅ | ❌ | ❌ | ¥10 | 老旧项目维护 |
决策原则:新项目一律 ESP32-C6。WiFi 6 在 2.4G 拥堵环境下表现更好,Thread 支持让设备未来可接入 Matter 网络。
环境搭建
# 安装 ESPHome CLI(需 Python 3.9+)
pip install esphome
# 验证
esphome --version
# ESPHome 2024.12.0
# 创建项目目录
mkdir -p ~/esphome/led-strip
cd ~/esphome/led-strip
# 初始化项目(生成 base.yaml)
esphome wizard led-strip.yaml
向导会让你选芯片型号和串口。选 ESP32-C6,串口选 /dev/ttyUSB0(Linux)或 COM3(Windows)。
项目一:WS2812B LED 灯条控制
最简单的入门项目——用 ESP32-C6 控制 RGB LED 灯条,接入 HA 后可以用颜色+亮度做任何自动化。
# led-strip.yaml
esphome:
name: living-room-led
platformio_options:
board_build.esp-idf.memory_type: qio_opi
upload_speed: 921600
esp32:
board: esp32-c6-devkitc-1
framework:
type: esp-idf
version: 5.1.0
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
ap:
ssid: "Living-Room-Fallback"
password: "fallback123"
# OTA 无线更新(必须设密码)
ota:
password: !secret ota_password
# HA 集成
homeassistant:
turn_on:
action: light.turn_on
turn_off:
action: light.turn_off
# LED 灯条定义
light:
- platform: neopixel
name: "Living Room LED"
id: led_strip
pin: GPIO8 # C6 的 GPIO8 是常用的数据引脚
num_leds: 60 # 灯珠数量
rgb_order: GRB # WS2812B 是 GRB 顺序
chipset: WS2812B
effect:
- pulse:
- scan:
- rainbow:
# 状态反馈(可选)
status_led:
pin: GPIO25
# 传感器用于监测电流/电压(进阶)
sensor:
- platform: adc
pin: GPIO3
name: "LED Power Voltage"
update_interval: 30s
filters:
- multiply: 3.0 # 分压比 1:3
# 编译并上传
esphome run led-strip.yaml
# 或只编译不上传
esphome compile led-strip.yaml
# 上传成功后,HA 会自动发现设备
# Settings → Devices → Living Room LED
引脚选择注意:ESP32-C6 的 GPIO8 是最稳定的 WS2812B 数据引脚。GPIO0 和 GPIO25 是 boot/flash 按钮,别用。GPIO3 是 ADC 输入,可用于电压监测但精度有限(12-bit,±50mV 误差)。
项目二:SHT30 温湿度站
SHT30 是 Sensirion 的 I2C 温湿度传感器,精度 ±0.3°C,适合家用。
# sht30-temp.yaml
esphome:
name: bedroom-sensor
esp32:
board: esp32-c6-devkitc-1
framework:
type: esp-idf
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
ota:
password: !secret ota_password
# I2C 总线定义
i2c:
sda: GPIO5
scl: GPIO6
scan: true # 启动时扫描 I2C 设备
frequency: 50kHz # SHT30 支持最高 400kHz,50kHz 更稳定
# 温湿度传感器
sensor:
- platform: sht3xd
address: 0x44 # SHT30 默认 I2C 地址,0x44 或 0x45
temperature:
name: "Bedroom Temperature"
id: temp_bedroom
filters:
- median: 5 # 中值滤波,去除瞬时跳变
- throttle_average: 60s
humidity:
name: "Bedroom Humidity"
id: hum_bedroom
filters:
- median: 5
- throttle_average: 60s
update_interval: 30s
# 关联计算:体感温度
- platform: template
name: "Bedroom Feels Like"
lambda: |-
float t = id(temp_bedroom).state;
float h = id(hum_bedroom).state;
if (t > 27 && h > 60) return (t * 1.05); // 简单体感估算
return t;
update_interval: 30s
unit_of_measurement: "°C"
# 警告:温度超 30°C 或湿度超 70%
binary_sensor:
- platform: template
name: "Bedroom Overheat"
lambda: |-
return id(temp_bedroom).state > 30.0;
on_press:
- homeassistant.service:
service: notify.mobile_app
data:
message: "卧室温度超过 30°C!"
on_release:
- homeassistant.service:
service: notify.mobile_app
data:
message: "卧室温度恢复正常"
I2C 地址冲突排查:如果传感器读不到,先扫描 I2C 总线:
常见地址:SHT30=0x44/0x45,BME280=0x76/0x77,AHT20=0x38。同一 I2C 总线上两个设备地址相同会冲突,用不同总线(ESP32 支持 II2C1/II2C2)解决。项目三:RCWL-0516 毫米波人体感应
RCWL-0516 是 3V-5V 供电的毫米波雷达传感器,比 PIR 热释电更灵敏,能检测静止人体。
# motion-sensor.yaml
esphome:
name: hallway-motion
esp32:
board: esp32-c6-devkitc-1
framework:
type: arduino
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
ota:
password: !secret ota_password
# 毫米波传感器(DIGITAL 输出,3.3V 兼容)
binary_sensor:
- platform: gpio
pin:
number: GPIO7
mode:
input: true
pullup: true # 内部上拉,RCWL-0516 输出开漏
inverted: false # 检测到有人输出 HIGH
name: "Hallway Motion"
device_class: motion
filters:
- delayed_on: 50ms # 防抖
- delayed_off: 2s # 2秒内无新触发不重复上报
on_multi_click:
- timing:
- ON for at most 1s
- OFF for at least 2s
then:
- homeassistant.service:
service: notify.mobile_app
data:
message: "走廊有人移动"
title: "移动侦测"
on_state:
then:
- light.toggle: hallway_led
light:
- platform: binary
name: "Hallway Status Light"
id: hallway_led
output: gpio_output
icon: "mdi:lightbulb"
output:
- platform: gpio
id: gpio_output
pin: GPIO9
RCWL-0516 vs PIR 对比: - PIR 检测的是红外辐射变化,要求人体移动,静止后会误报 - RCWL-0516 检测微动(呼吸、心跳),能发现静止人体,但范围更远(7 米 vs PIR 的 5 米) - RCWL-0516 功耗 2-5mA,PIR 约 50uA。电池供电场景还是 PIR 更合适
常见问题排查
问题一:编译时报 Unknown component 'neopixel'
根因:ESP-IDF 框架不支持 neopixel 库。
修复:改用 platform: esp-idf 并加上 lib_deps:
esphome:
platformio_options:
lib_deps:
- fastled/[email protected]
问题二:OTA 更新后设备失联
根因:新固件 WiFi 配置错误,或 OTA 密码不匹配。
修复:
# 查看最后成功上线的 IP
# HA → Settings → Devices → 找设备 → 点"在线"状态
# 然后串行重刷
esphome run --device /dev/ttyUSB0 led-strip.yaml
问题三:传感器读数跳变大
根因:I2C 噪声或采样间隔太短。
修复:
sensor:
- platform: sht3xd
temperature:
filters:
- median: 5 # 5 次中值滤波
- throttle: 10s # 至少 10 秒更新一次
- debounce: 2s # 2 秒去抖
总结
ESPHome 的核心优势是配置即代码——YAML 文件可以版本管理、review、回滚。三个项目覆盖了光、环境、感知三类基础设备,够入门了。
我的判断:ESP32-C6 是 2025-2026 年最值得买的开发板,WiFi 6 + Thread 双模,¥30 以内,配合 ESPHome 几乎零成本做出商用级传感器。唯一麻烦的是初次编译上传要接 USB,之后全部 OTA,日常维护很省心。