资讯动态

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

发布时间:2026/10/20 1:00:58 来源:尧图企业网站定制
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 容量至少 4MBRAM 不用太大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 数据和“无人”基线做比较所以基线是否准确直接决定整个系统的正确率。首次部署时务必做一个干净校准。步骤如下把房间清理到目标状态——检测的是“无人”所以房间里不要有人、不要让窗帘飘动宠物也先带出去。在配置里临时打开calibration_mode: true或者通过 Home Assistant 调用组件提供的start_calibration服务。等待 30-60 秒。期间组件会持续采样 CSI计算均值、方差建立背景模型。校准结束后把模式关掉进入正常检测。人进入房间观察状态是否在几秒内翻转为“有人”。校准期间尽量少走动、少碰路由器。如果之后房间格局大改比如搬了柜子、换了床的位置建议重新校准一次。信号反射路径变了旧基线就不再适用。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 翻出吃灰板子后先做这几件事如果你和我一样从抽屉里翻出几块旧板子动手之前先做一遍体检检查 USB 口和串口芯片很多老板子用的是 CH340需要装驱动。检查供电。Wi-Fi 发射瞬间电流会冲到几百毫安劣质充电头会导致反复重启最好用 5V/1A 以上的正规电源。先烧一个最简单的 Blink 固件确认板子能正常跑再进行 ESPHome 烧录。如果板子年头太早可能存在固件分区表不匹配的问题优先用最新版 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 里用逻辑或把它们合成为一个传感器能有效减少漏报。如果两个节点偶尔互相冲突就改用“多数投票”的方式三个节点取两票以上稳定性提升非常明显。我实测下来多节点方案比单节点误报率至少降了一个数量级。如果你手头正好有几块吃灰的老开发板这个版本值得专门空出一个晚上来玩。就算最后不部署单是看着几年前的板子重新亮起来算出“房间里有人”的那一刻也够回本了。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑