ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

ESPHome 2026.10:用老ESP32靠Wi-Fi感知人体存在

ESPHome 2026.10:用老ESP32靠Wi-Fi感知人体存在

ESPHome 2026.10 的体验文章已经不少了,但这版更新里最让我兴奋的,是“单靠 Wi-Fi 测人体”这个能力。前几年做人体存在检测,大家第一反应是加毫米波雷达模块,或者用 PIR 那套老方案,装起来要走线、要供电、还要处理误报。2026.10 直接把这些绕开了:你只要有一块吃灰的老 ESP32 开发板,烧上最新固件,它就能通过分析周围 Wi-Fi 信号的微小扰动,告诉你房间里到底有没有人——关键是,人坐着不动也能测到。这篇文章我就围绕这个功能,从原理、选型、配置到实际踩坑,完整过一遍。

1. 这版更新到底解决了什么问题

1.1 PIR 和毫米波雷达的尴尬

老玩家应该都有这种经历:最早做人体感应用的是 PIR 红外模组,几块钱一个,确实便宜。但它有个致命短板——只能检测“运动”。你坐在工位上敲键盘没问题,一旦静下来看文档、刷手机,超过五分钟它就判定“无人”,灯灭了、空调关了,人还得站起来挥手。卧室场景更明显,晚上躺床上玩手机,过一会儿灯就自动熄了,体验非常割裂。

后来大家转向毫米波雷达,比如市面上最常见的 24GHz 雷达模块,确实能检测微动和静态人体,呼吸都能感知到。但问题也不少:模块要额外采购,接线要焊,供电要稳定,写配置还得对着数据手册找寄存器地址。对只想给家里装几个传感器的普通用户来说,门槛还是偏高了。而且这类模块在不同地区的认证和功率要求不一样,折腾起来心里总有点别扭。

1.2 “Wi-Fi 测人”是什么概念

这次 ESPHome 的做法完全不同。它不再依赖任何额外硬件,而是直接复用开发板上那颗 Wi-Fi 芯片自身的能力。原理说起来很直白:房间里的 Wi-Fi 信号在传播过程中会碰到墙壁、家具、人体,产生大量反射。人体是含水组织,对 2.4GHz 信号有比较明显的吸收和反射效果,所以只要有人出现在信号覆盖的范围内,接收端收到的信号就会发生变化。

以前这种技术大多停留在科研和专用设备层面,普通路由器、消费级芯片很难拿到足够精细的信号数据。但 ESP32 这个家族的低层驱动本来就开放了一部分信道状态信息接口,ESPHome 在 2026.10 里把它包装成了开箱即用的组件。也就是说,你不需要知道什么是多径效应,不需要写底层代码,只需要在 YAML 里声明一个传感器,它就开始干活了。

我自己的第一个测试环境特别朴素:一台旧路由器,一块 2017 年买的 ESP32 DevKit,一个 5V 手机充电头。没有增加任何元器件,烧完固件放桌上,人在门口一晃,手机上的状态就变了。那一刻确实有点“老设备原地起飞”的感觉。

2. 原理拆解:Wi-Fi 是怎么“看见”人的

2.1 RSSI 不够用,CSI 才是关键

很多人在此之前接触过的 Wi-Fi 信号指标只有 RSSI,就是“信号强度 -40dBm / -60dBm”那个数值。它是个标量,只反映整体接收功率,信息量非常有限。房间里有人走动,RSSI 确实会波动,但波动的幅度受温度、天线方向、周围干扰影响也很大,经常出现“灯闪一下又灭了”的毛刺状态。拿它做粗略接近检测还凑合,做稳定的人体存在判断基本不可靠。

真正有价值的是 CSI,全称 Channel State Information,信道状态信息。Wi-Fi 的 OFDM 调制方式会把一个信道切分成几十上百个子载波,每个子载波都有独立的幅度和相位数据。一次 CSI 快照,就是这些子载波对应的一组复数,相当于把“信号长什么样”看得清清楚楚。

形象点说,RSSI 只告诉你“水面上有多少水花”,CSI 则记录“每一道波纹是从哪个方向来的、幅度多大、相位差多少”。人体移动甚至呼吸,都会让微波反射路径发生变化,这种变化体现在多径叠加后的干涉结果里,CSI 能把这种细微差异捕捉下来。ESP32 的低层接口可以导出这些 CSI 数据,ESPHome 的组件负责周期性采样、计算特征、判断状态。

2.2 从 CSI 波动到存在判定

组件内部的工作流程大致是:先让 Wi-Fi 芯片进入可以抓包导 CSI 的模式,每收到一个信标帧或者数据帧就提取一次 CSI 快照;然后对连续多个快照做统计,计算幅度方差、相位变化率这类特征;最后跟背景基线做比较,偏差超过阈值就判定“有人”,持续低于阈值则判定“无人”。

这里有个容易误会的点:CSI 数据并不是只有这个 ESP32 自己发射信号才会产生。实际上,周围路由器定时发送的信标帧,以及其他设备的数据包,都会被它接收,接收过程就能拿到 CSI。也就是说,哪怕房间里没有其他 Wi-Fi 设备,只要路由器在正常工作,ESP32 就能持续“嗅探”到可用于分析的数据流。这就是标题里“单靠 Wi-Fi 测人体”的真正含义——依赖的是已有的 Wi-Fi 环境,而不是额外部署专用硬件。

我家里的路由器不是新款,Wi-Fi 5 时代的产品,信标间隔大约 100ms。我实际测试时,把扫描间隔设成 500ms 左右,完全够用。如果你用更新的 Wi-Fi 6 路由器,数据帧更密集,CSI 样本刷新频率还能更高。

2.3 静态人体为什么也能测到

这是 Wi-Fi sensing 和 PIR 最大的区别。人虽然静止不动,但呼吸时胸腔会规律起伏,幅度只有几毫米到一两厘米,这种微小的机械运动会产生微多普勒效应,让反射信号产生周期性的相位变化。CSI 对相位是敏感的,所以哪怕一个人坐着打游戏两小时没动,组件依然能判定他在场。

另外一个更基础的机制是:即使一个人屏住呼吸一动不动,人体本身也是一个“信号吸收体”。空房间的 CSI 基线和有人时的 CSI 基线,在统计特征上本来就有差异。所以只要基线模型建立得够准,静止人体也能被识别出来。

我在实测时专门做过一个测试:进入房间后静坐,一动不动保持三分钟。手机上的传感器状态从头到尾没有掉线。这个表现已经接近中端毫米波雷达的水平了,考虑到成本是零,确实让人惊喜。

3. 硬件选型与部署准备

3.1 哪些老设备能跑

先说结论:ESP32 家族的绝大多数板子都能跑,ESP8266 不太建议。下面的表是我整理的实际测试参考,不是官方文档,但按这个标准挑选基本不会走弯路。

芯片/板卡能否使用表现与说明
ESP32 DevKit / NodeMCU-32S推荐CSI 支持完整,双核跑得动,价格便宜,翻出旧板直接上
ESP32-S2 / S3推荐单核但频率高,采样和运算没问题,S3 性能更宽裕
ESP32-C3可用低功耗 RISC-V,功能正常,但特征计算稍慢,建议降低采样率
ESP8266 NodeMCU / Wemos D1不推荐内存和射频能力有限,官方组件大概率不支持 CSI 完整模式
各类带外置天线模组推荐天线增益和方向控制更好,适合安装在角落

老设备翻出来之后,先确认几个事情:Flash 容量至少 4MB,RAM 不用太大,320KB 级别就够;板子上的稳压芯片尽量是原装的,劣质充电头会影响 Wi-Fi 稳定性;如果有板载天线和 IPEX 座子两种版本,优先选 IPEX,可以外接延长天线,部署位置更灵活。另外,最好避开那些带金属外壳的开发板,金属屏蔽层会削弱感应距离。

3.2 摆放位置和天线方向

Wi-Fi sensing 的效果,七八成取决于摆放。我踩过不少坑,总结下来有这几个原则:

  • 不要贴墙、不要放进金属柜,离墙壁至少 30-50cm。
  • 高度在 1-1.5 米左右最合适,相当于桌面或床头柜高度,人能遮挡更多反射路径。
  • 尽量放在房间中部偏边角的位置,让它“看”到房间的主要活动区域。
  • 板载 PCB 天线的方向性比较强,测试时把板子转 90 度或 180 度,看哪个角度检测最灵敏。
  • 两个 ESP32 若在同一个房间测试,距离拉开 2 米以上,避免互相干扰。

我一开始图省事,把板子直接塞在电视柜底下,结果人走到客厅中央都没反应。后来把它挪到电视柜侧面、天线朝外,瞬间就正常了。这个问题在文档里很少写,但实际部署特别关键。

3.3 对路由器和网络环境的要求

这个功能对路由器没有特殊要求,只要是稳定的 2.4GHz 网络就行。几点注意事项:

  • 2.4GHz 信号穿透性好,是感应检测的默认频段;5GHz 频率更高、波长更短,反射和穿透特性反而不好判断,暂时不用考虑。
  • 路由器重启会导致信道变化,CSI 基线需要重新适应。实测中 ESPHome 会自动重新校准,但需要几十秒的收敛时间,不要一看重启后状态不对就着急。
  • 建议开启路由器最低速率或者关闭 Wi-Fi 省电模式,保证环境中始终有可被抓取的信标帧和数据帧。
  • 如果家里是多个 AP 组网,ESP32 会跟着信号强度自动漫游,漫游瞬间可能出现一次状态抖动,应用层做好防抖即可。

我家里路由器放在客厅角落,卧室的 ESP32 和它隔了一堵轻质隔墙,实测依旧能稳定感知,穿墙性能超出预期。

4. 实操配置:从刷固件到稳定运行

4.1 烧录前的基础准备

如果你是第一次用 ESPHome,流程很简单:在电脑上安装 ESPHome 工具,或者直接跑 ESPHome 仪表盘的 Docker 容器;然后准备一个 YAML 配置文件;编译生成固件后用 USB 线连接开发板烧录。老设备只要 USB 口能正常识别,基本没有障碍。

烧录完第一次启动,设备会自动连接你填的 Wi-Fi。这时候先用手机或电脑 ping 一下它的 IP,确认网络通,再继续做配置。我习惯把api、ota和logger三个基础组件都打开,这样后面调整参数不用反复插线,OTA 就能完成更新。

4.2 ESPHome 配置示例

下面是一份能直接参考的配置文件框架。注意wifi_presence这个平台名在 2026.10 里已经能用,但参数命名可能随小版本微调,以你本地版本的提示为准。

esphome: name: bedroom-presence friendly_name: 卧室人体存在 esp32: board: esp32dev framework: type: arduino # 接入家庭自动化平台 api: encryption: key: "你的加密密钥" ota: - platform: esphome wifi: ssid: "你的WiFi名称" password: "你的WiFi密码" # 核心:Wi-Fi 人体存在检测 binary_sensor: - platform: wifi_presence name: "卧室人体存在" scan_interval: 500ms sensitivity: 70 # 特征灵敏度,越大越敏感 threshold: 25 # 判定阈值,越小越容易判有人 background_adaptation: 0.01 hold_time: 30s calibration_mode: false

几个参数的用途我后面细说。先按默认值跑起来,观察状态切换是否合理,再根据自己的房间调整。这里hold_time的防抖很重要,可以避免人走出房间瞬间的误判,我建议 30 秒起步。

4.3 首次校准怎么做

Wi-Fi sensing 判断“有人/没人”,本质上是拿实时 CSI 数据和“无人”基线做比较,所以基线是否准确直接决定整个系统的正确率。首次部署时,务必做一个干净校准。

步骤如下:

  1. 把房间清理到目标状态——检测的是“无人”,所以房间里不要有人、不要让窗帘飘动,宠物也先带出去。
  2. 在配置里临时打开calibration_mode: true,或者通过 Home Assistant 调用组件提供的start_calibration服务。
  3. 等待 30-60 秒。期间组件会持续采样 CSI,计算均值、方差,建立背景模型。
  4. 校准结束后把模式关掉,进入正常检测。
  5. 人进入房间,观察状态是否在几秒内翻转为“有人”。

校准期间尽量少走动、少碰路由器。如果之后房间格局大改,比如搬了柜子、换了床的位置,建议重新校准一次。信号反射路径变了,旧基线就不再适用。

4.4 接入 Home Assistant 的自动化玩法

设备接入后,Home Assistant 会自动发现这个实体,类型是binary_sensor,状态on表示有人。有了这个实体,玩法就多了。我举两个最常用的自动化。

第一个是“人进灯亮、静坐不灭”:

alias: 卧室灯跟随 trigger: - platform: state entity_id: binary_sensor.wo_shi_ren_ti_cun_zai to: "on" condition: - condition: state entity_id: light.wo_shi_ding_deng state: "off" action: - service: light.turn_on entity_id: light.wo_shi_ding_deng

第二个是“无人在房间超过 10 分钟,自动关空调关灯”:

alias: 房间无人在线节能 trigger: - platform: state entity_id: binary_sensor.wo_shi_ren_ti_cun_zai to: "off" for: "00:10:00" action: - service: climate.turn_off target: entity_id: climate.wo_shi_kong_tiao - service: light.turn_off target: entity_id: light.wo_shi_ding_deng

这两个场景是我实际在用的,尤其是第二个,夏天省电效果明显,而且不用人反复去按开关。

5. 调参实测:那些文档里不会写的事

5.1 三个关键参数怎么调

threshold、sensitivity、background_adaptation,这三个参数共同决定检测行为。

threshold是判定阈值。实时 CSI 特征值与基线的偏差超过它,就认为有人。数值调小一些会更灵敏,但误报率同步上升。我自己的经验是:先设成 30,然后一次一次往下调,每次观察半天,直到找到一个“人进来秒判、无人误报少于每周一次”的值。卧室我最终用了 25,客厅用了 35。

sensitivity控制特征计算的灵敏度窗口,可以理解为“多细小的波动会被计入”。数值大,微小动作、呼吸起伏都算数;数值小,只有大幅度运动能触发。如果你发现人在房间但状态不稳定,优先加大这个值。

background_adaptation是背景自适应速率,决定了基线跟随环境慢变的程度。窗帘被风吹动、太阳晒到板子导致温度漂移,这类缓慢变化会被它消化掉一部分。速率调太高会把“有人”的基线也吃掉,导致状态慢慢变回无人;我建议保持在 0.005-0.02 之间,具体看误报情况。

5.2 误报和漏报的现场排查

我第一次部署时,有两天一直在误报,后来才发现是空调出风口正对着窗帘,风一吹窗帘就在 ESP32 前方晃动。把窗帘收拢后立刻正常。这个案例提醒我:先排除物理层面的运动源,再去调参数。

下面这张表是我整理出来的排查思路,基本上按表操作就能覆盖八成问题。

现象常见原因排查与建议
无人却频繁翻转窗帘/植物被风吹动,飞虫经过固定窗帘,调整板子朝向,调低 sensitivity
无人却偶尔触发一次路由器重启后信道变化等 1 分钟让基线收敛;不要立刻调参
人在房间却报无人人被大金属柜、厚承重墙遮挡改变板子位置,或加装外置天线
状态翻转延迟明显scan_interval 太长,数据包太少缩短 scan_interval 到 300-500ms
两个板子互相干扰距离太近,信道重叠拉开 2 米以上,或把板子固定到不同信道
一直保持有人状态background_adaptation 过小,基线不更新适当调大 adaptation,重新校准

5.3 不同户型和摆放的实测结果

我在几个典型空间里分别做了测试,结果供你参考:

  • 卧室(3×4 米,一张床、一个衣柜):表现最稳定,静坐、睡眠都能感知,状态几乎没有抖动。
  • 客厅(开放空间,连接餐厅):单块板子覆盖不全,人坐在沙发上靠近阳台一侧时偶尔漏报。后来我在沙发侧方加了一块 ESP32,两个信号取“或”逻辑,问题解决。
  • 卫生间(2×2 米):小空间反而好办,板子放在洗手台下方,人进去就能触发,淋浴时水汽也不影响判断。
  • 书房工位(对面就是电脑屏幕):静坐办公场景效果最好,因为人长时间不动,系统足够稳定,这也是我最满意的场景。

需要注意的是,开放厨房的微波炉开启瞬间会干扰 2.4GHz 信号,可能导致一次误报。我家微波炉在厨房,距离书房板子约 5 米,实测误报频率很低,但确实存在,应用层加个延时就能滤掉。

5.4 常见问题速查表

整理一份速查表,方便你直接收藏:

问题快速处理
传感器实体没出现检查api组件和加密密钥,重启设备
编译时报wifi_presence不存在确认 ESPHome 版本已更新到 2026.10 以上
ESP8266 板子编译通过但状态乱跳换 ESP32 系列,别在 ESP8266 上浪费时间
发现人后状态太灵敏来回闪加大hold_time到 30-60 秒
功耗偏高属于正常,Wi-Fi 芯片需要常开,建议用插电而非电池
设备重启后需要重新校准吗一般不需要,基线会自动重建,但重建期间可能有 1 分钟不稳定

6. 与主流方案对比,选谁更合适

6.1 一张表看懂三种方案

很多人纠结要不要为 Wi-Fi sensing 淘汰 PIR 或毫米波雷达,其实三个方案各有适用场景。我把它们放在一起对比。

维度Wi-Fi sensing(本方案)PIR 红外毫米波雷达
额外硬件成本0(复用开发板)5-20 元40-200 元
静止人体检测支持不支持支持
安装复杂度零接线,插电即用需要布置安装需要接线和供电
可否穿墙部分轻质墙体不行有限,穿透性一般
功耗较高(约 80-160mA)极低(µA 级)中等(约 70-90mA)
多人/人数统计不支持不支持部分高端模块支持
抗环境干扰中低(高温易误报)较高
实测稳定性中上低高

结论很明显:如果手头有现成的 ESP32 开发板,Wi-Fi sensing 是零成本升级,适合“家里到处放几个”这种玩法;如果追求极端可靠、愿意花点钱,毫米波雷达依然是性能天花板;PIR 则适合电池供电的贴片式应用,比如门磁联动。

6.2 Wi-Fi sensing 的边界在哪里

作为一个刚落地到开源生态的功能,它还不完美,有几点必须清楚:

  • 不能精确统计人数,只能判断“有没有人”。多人房间里,它只能给出一个二值结果。
  • 不能给出空间坐标,无法定位人站在哪个具体位置。
  • 对完全静止且呼吸非常微弱的人,偶尔会出现漏报,特别是人裹着厚被子睡觉时。
  • 对环境的依赖高于雷达,路由器换信道、AP 漫游、微波炉干扰都会影响。
  • 穿承重墙基本没戏,厚墙会衰减太多反射路径。

所以我的定位是:它适合做“几分钟内判断房间是否有人”的存在检测,配合场景自动化非常合适;但不适合做安防级别的入侵检测,那种场景还是老老实实上毫米波雷达加摄像头逻辑更靠谱。

7. 老设备焕新的几条实战建议

7.1 翻出吃灰板子后先做这几件事

如果你和我一样,从抽屉里翻出几块旧板子,动手之前先做一遍体检:

  1. 检查 USB 口和串口芯片,很多老板子用的是 CH340,需要装驱动。
  2. 检查供电。Wi-Fi 发射瞬间电流会冲到几百毫安,劣质充电头会导致反复重启,最好用 5V/1A 以上的正规电源。
  3. 先烧一个最简单的 Blink 固件,确认板子能正常跑,再进行 ESPHome 烧录。
  4. 如果板子年头太早,可能存在固件分区表不匹配的问题,优先用最新版 ESPHome 生成的默认分区。

体检完成后再上 Wi-Fi sensing,能避免把“硬件毛病”误判成“功能问题”。我就曾经因为一个接触不良的 Micro-USB 线,白白折腾了一晚上参数。

7.2 一板多用的资源分配

老 ESP32 翻新后,一块板子同时干几件事完全可行。我现在的书房板子就同时跑了 Wi-Fi 人体存在、一个温湿度传感器、一个红外控制发射器,三件事互不干扰。但要注意资源分配:

  • 优先选择双核型号,比如经典 ESP32 或 S3,把 CSI 采集和业务逻辑分在不同核上。
  • scan_interval不要设得太激进,100ms 级别的高频采样会明显占 CPU,影响其他组件。
  • 如果板子同时要驱动继电器或大电流 LED,建议独立供电,避免与 Wi-Fi 射频抢电。
  • OTA 更新时状态会中断一会儿,自动化层要做好“断线不算无人”的保护。

一板多用时,Wi-Fi sensing 的稳定性会略微下降,毕竟射频资源是共享的。实测下来,只要不是同时跑大量高速 I/O,影响很小。

7.3 后续还能怎么扩展

这个功能的玩法远不止开关灯。我看到社区里已经有开发者拿它做睡眠监测——在床边放一块 ESP32,通过呼吸引起的微多普勒特征估算睡眠状态;也有人用多块板子组合,实现“人在哪个区域”的粗略判断,比单板覆盖更立体。

我个人的下一步计划是把书房、卧室、客厅各放一块板子,通过 Home Assistant 的模板传感器做“整屋是否有人”的汇总状态,再把离家模式联动到所有插座。按我的估算,用三块老开发板就能覆盖全屋存在检测,总成本几乎为零,这个性价比在以前想都不敢想。

另外,如果你有多个节点的 CSI 数据,还可以通过 ESPHome 的全局变量在设备间共享状态,让靠近人的那块板子决定最终结果。这个稍微有点进阶,但效果很值得试。

最后分享一个小技巧:同一个房间里放两块 ESP32,分别靠近两个角落,在 Home Assistant 里用逻辑或把它们合成为一个传感器,能有效减少漏报。如果两个节点偶尔互相冲突,就改用“多数投票”的方式,三个节点取两票以上,稳定性提升非常明显。我实测下来,多节点方案比单节点误报率至少降了一个数量级。

如果你手头正好有几块吃灰的老开发板,这个版本值得专门空出一个晚上来玩。就算最后不部署,单是看着几年前的板子重新亮起来,算出“房间里有人”的那一刻,也够回本了。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进