← 返回教程库

Home Assistant + ESP32:做真正属于自己的智能家居

最后更新 2026-06-20
L3 · 联网与 IoT ⏱ 约 18 分钟 🟢 软件/低风险
你将学到
  • 搞懂 Home Assistant 是什么,以及它为什么是 DIY 智能家居的中枢
  • 用 ESPHome 写一份 YAML 配置,把 ESP32 的传感器和继电器接进 HA
  • 知道 MQTT discovery 路线怎么走,以及本地(HA)vs 云(巴法云)该怎么选

你的抽屉里大概已经有这么一堆东西了:一个米家的温湿度计、一两个小爱同学、几个 HomeKit 插座,可能还有上一节自己用 ESP32 焊的那块板子。问题是它们各管各的——米家在米家 App 里,HomeKit 在"家庭"里,你自己的板子只能用串口或者一个简陋的网页控制。想做一条"客厅温度超过 28℃ 就自动开风扇"的规则,跨品牌根本接不上。

这一节就是来拆掉这堵墙的。我们用 Home Assistant 当统一的"大脑",把你自制的 ESP32 设备和那些大牌设备拉到同一张桌子上联动。读完你会有一个出现在 HA 仪表盘里的自制设备,能看数据、能控开关、还能写自动化。

开始前你需要一块能联网的 ESP32(第 11.1 节 Wi-Fi 联网),并且对 MQTT 的发布/订阅有概念(上一节 MQTT 入门)——后面 MQTT 路线会用到。


Home Assistant 是什么

Home Assistant(下面简称 HA)是一套开源的智能家居中枢。它不卖硬件,它干的是"把各家设备整合到一起"这件事。它的几个特点,恰好是 DIY 玩家最在意的:

  • 本地优先:HA 跑在你自己家里的一台小机器上,设备状态、自动化判断都在本地完成。断网了,灯照样能开,规则照样能跑。
  • 隐私好:数据不强制上传到哪家云。你的作息、开关记录留在自己家。
  • 整合面广:米家、HomeKit、Zigbee、小米、Sonoff、绿米……上千个品牌都有现成集成。你自制的设备也能平等接进来,和大牌设备一起被一条规则调度。
  • 自动化强:这是 HA 真正的核心。条件可以叠得很复杂——"晚上 + 有人在家 + 客厅温度高于 28℃ → 开风扇并把灯调暗",这种跨设备、跨品牌的逻辑,HA 写起来很顺手。

HA 需要一台常开的机器来跑。常见的几种:树莓派(最经典,一块 Pi 4 足够带几十个设备)、家里的 NAS(群晖、威联通用 Docker 跑)、软路由(爱快、OpenWrt 旁路由的小主机)、或者一台闲置电脑开个虚拟机。任意一种都行,挑你手边现成的。HA 本身的安装这里不展开(官方有 Home Assistant OS 镜像,烧进 SD 卡开机就能用),我们假设你已经能打开 HA 的网页后台了。

接下来是本节重点:怎么把你自己的 ESP32 接进去。有两条路。


路线一(强烈推荐):ESPHome,写 YAML 不写 C

ESPHome 是 HA 官方的项目,专门解决"自制 ESP32/ESP8266 设备如何省心接入 HA"。它的思路很反直觉但极其好用:你不写 C 代码,只写一份 YAML 配置,描述这块板子上有什么传感器、什么开关,ESPHome 帮你编译成固件、刷进板子。刷完,HA 会自动发现这个设备,所有实体一个不少地出现在仪表盘里。

我个人做 DIY 智能家居,默认就用 ESPHome。原因很实在:你不用自己写 esp-mqtt、不用管重连、不用手写 JSON、不用管 discovery 主题——这些 ESPHome 全替你做了。维护一份可读的 YAML,比维护几百行 C 代码轻松太多。

下面是一份完整的 ESPHome 配置示例,定义了一个 DHT 温湿度传感器一个继电器开关

# living-room-node.yaml
esphome:
  name: living-room-node          # 设备在 HA 里的名字
  friendly_name: 客厅节点

esp32:
  board: esp32dev                 # 用 ESP8266 则换成 esp8266: 段

# 连 Wi-Fi(建议把密码放进 secrets.yaml,别硬写在这里)
wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password

# 让 ESPHome 能 OTA 远程更新固件,以后改配置不用再插线
ota:
  - platform: esphome

logger:                            # 串口日志,方便排错
api:                               # 关键:开启 HA 原生 API,HA 据此自动发现本设备

# —— 传感器:DHT22 接在 GPIO4 ——
sensor:
  - platform: dht
    model: DHT22                   # 用 DHT11 就改成 DHT11
    pin: GPIO4
    temperature:
      name: "客厅温度"
    humidity:
      name: "客厅湿度"
    update_interval: 30s

# —— 开关:继电器接在 GPIO5 ——
switch:
  - platform: gpio
    pin: GPIO5
    name: "客厅风扇"
    id: fan_relay

ESPHome 的配置项以官方 schema 为准。它更新比较快,新版本可能调整字段(比如 ota 的写法近期就改成了带 platform 的列表形式),照搬旧示例报错很常见——以官网当前版本为准。DHT 的接法见 DHT22DHT11,继电器的接法见 继电器模块

烧录流程很简单:

  1. 在 HA 里装上 ESPHome 插件(Add-on Store 里搜 ESPHome,一键安装并启动)。
  2. 打开 ESPHome 面板,新建一个设备,把上面的 YAML 填进去(首次烧录需要用 USB 线连电脑,之后就能 OTA 无线更新)。
  3. 点 Install,选烧录方式。等它编译、上传完成。
  4. 板子重启联网后,回到 HA 主界面,通常会弹出"发现新设备:客厅节点"的提示。点确认添加即可。

就这么几步,你的自制板子就和米家温湿度计平起平坐地待在 HA 里了。


路线二:MQTT discovery(自己写代码的玩法)

如果你坚持自己写 C 代码(比如设备逻辑复杂、ESPHome 的现成组件覆盖不到),可以走 MQTT 路线。前提是 HA 里装好了 MQTT 集成,并接到一个 Broker(HA 自带的 Mosquitto 插件最省事)。

核心概念是 MQTT discovery:HA 会监听一个特殊前缀的 topic(默认 homeassistant/...)。你的 ESP32-S3 用 上一节 学的 esp-mqtt,往这个前缀下发一条配置消息(一段 JSON,说明"我是一个温度传感器,我的数据会发到哪个 topic"),HA 收到后就自动创建对应实体——之后你只管往数据 topic 发数值,HA 就持续显示。

这条路能跑通,但你要自己处理重连、JSON 拼装、discovery 格式、掉线后的状态。说白了就是把 ESPHome 替你做的事自己再做一遍。除非有特殊需求,否则没必要——这也是我推荐 ESPHome 的原因。


你应该看到什么

接入成功后,无论走哪条路,你都该看到这些现象,作为验证标准:

  • HA 仪表盘上出现你的设备,名字就是 YAML 里写的"客厅节点",下面挂着"客厅温度""客厅湿度""客厅风扇"几个实体。
  • 点开温度实体,能看到实时数值,还有一条历史曲线(HA 默认记录)。拿手捂一下 DHT,数字会变。
  • 点"客厅风扇"那个开关,能听到继电器咔哒一声,对应的设备真的被控制了。
  • 进"设置 → 自动化",新建一条规则试试:触发选"客厅温度高于 28℃",动作选"打开客厅风扇"。保存后用吹风机对着传感器吹一会儿,温度过线,风扇自动启动。

最后这条自动化,才是把自制设备接进 HA 的全部意义——你的板子不再是孤岛,而是能被一整套家庭逻辑调度的一员。


本地 vs 云:HA 和巴法云怎么选

你可能记得巴法云那一节,同样能远程控制设备。它和 HA 的区别值得说清楚,因为这是两种路线:

维度 Home Assistant(本地) 巴法云(云端)
部署 要自己搭一台常开机器跑 HA 注册账号就能用,零部署
数据 全在自己家,隐私好 走第三方云服务器
断网 本地照常工作 断网即失联
整合 上千品牌,跨设备联动强 主要管自家接入的设备
上手 门槛较高,要折腾 几分钟跑通
适合 想认真搭一套自己的智能家居 单个设备远程控制、快速验证

我的建议很直接:只是想让一两个设备能在外网控制一下,用巴法云,省心;想把家里七零八落的设备整合成一套真正能联动、不依赖别人服务器的系统,上 Home Assistant,值得那份折腾。两者不冲突,很多人是先用巴法云入门,玩深了再迁到 HA。


故障排查

现象 可能原因 怎么查
HA 发现不了设备 YAML 里漏了 api: 段,或设备没连上同一网段 确认 api: 存在;确认 ESP32 和 HA 在同一局域网(别一个连了 2.4G 一个连了访客网络)
ESPHome 编译/YAML 报错 字段写法跟当前版本对不上、缩进错了 YAML 对缩进极敏感,全用空格别用 Tab;报错信息会指出第几行;拿官网当前示例核对字段名
设备频繁掉线 Wi-Fi 信号弱、供电不稳 看 ESPHome 日志的信号强度;换个稳定的 5V 电源,别用电脑 USB 口长供
走 MQTT 路线连不上 Broker Broker 地址/端口/账号密码错,或 HA 的 MQTT 集成没配 先用电脑上的 MQTT 客户端(如 MQTTX)拿同样的参数连一遍,确认 Broker 本身没问题,再回头查代码
实体显示"不可用" 设备离线,或 update_interval 太长还没上报 等一个上报周期;ping 一下设备 IP 看在不在线

几个变体

接通之后,可以往这几个方向加:

  • 加自动化规则:除了"温度高就开风扇",还能玩"日落时自动开灯""检测到无人 30 分钟关掉所有插座""门磁打开时推送手机通知"。自动化是 HA 最有意思的部分,规则越叠越像在编程。
  • 接入语音:把你的自制设备暴露给小爱、Siri 或 Google Assistant。HA 有对应集成,配好之后一句"打开客厅风扇"就能控制你焊的那块板子——这一步会让家里人第一次觉得你折腾的东西"有用"。
  • 加更多传感器:同一份 YAML 里继续追加,光照、人体红外、水浸、CO₂……一块 ESP32 能挂好几个传感器,组成一个多功能节点。

动手挑战

用 ESPHome 把一个传感器接进 Home Assistant,并做一条自动化

具体目标:照本节的 YAML,给你的 ESP32 接一个 DHT 温湿度传感器,刷进固件,确认温度实体出现在 HA 仪表盘并能看到实时数值;然后写一条自动化——"温度高于某个值就打开一个开关(继电器或一个虚拟开关都行)",用吹风机或手捂让温度过线,亲眼看到它自动触发。能跑通这一条,你就掌握了"自制设备 → 接入中枢 → 参与联动"的完整闭环。


小结与下一步

这一节你把自制的 ESP32 从"孤岛设备"变成了智能家居的一员:理解了 HA 这个本地优先的开源中枢,用 ESPHome 几行 YAML 完成了接入(也知道了 MQTT discovery 这条自己写代码的备选路),还在本地 vs 云之间想清楚了 HA 和巴法云各自适合什么。

到这里你的设备能在家里被联动了,但还有一个问题没解决:人在外面的时候怎么控制它。下一节就讲远程控制——把局域网里的设备安全地暴露到外网,第 11.3 节 远程控制。如果你想先把 MQTT 的底子打更扎实,也可以回头复习 MQTT 入门

更多动手项目和路线安排,见 新手路线图全部教程

📄 来源 / 自校链接

本文为公开资料整理,非亲测。关键参数与代码请结合实物与下列官方来源验证。

内容有错、看不懂、或想看下一期?告诉我们 →

本文为公开资料的学习整理,非亲测。涉接线/花钱/合规的步骤请结合实物与官方最新资料验证,风险自负。见免责声明