15分钟实战:用WiFi信号搭建运动检测系统
无需摄像头与麦克风,仅靠一块支持CSI的ESP32开发板,即可搭建隐私友好的运动检测系统。本文手把手演示如何通过ESPHome刷入固件、接入Home Assistant,并编写“人来灯亮”自动化脚本。附传感器摆放指南与调优技巧,快速跑通智能联动。

15分钟实战:用WiFi信号搭建运动检测系统
想用人体感应控制灯光,传统 PIR 传感器存在死角,摄像头侵犯隐私,毫米波雷达又价格昂贵。借助开源方案,我们可以利用 WiFi 信道状态信息(CSI)实现无感运动检测。无需任何摄像头或麦克风,硬件成本仅需十元左右。学完本教程,你将用一块 ESP32 开发板搭建独立运动传感器,并接入 Home Assistant 实现人来灯亮、离家报警等自动化场景。
环境与物料准备
硬件清单:
- 支持 CSI 的 ESP32 开发板(推荐 ESP32-S3 或 ESP32-C6,淘宝渠道易购)
- 2.4GHz 无线路由器(家庭日常使用即可,无需调整底层配置)
软件环境:
- Home Assistant(运行于树莓派、NAS、旧电脑或 Docker 均可)
- 已安装 ESPHome 官方集成插件
知识储备:
- 能够编写基础 YAML 配置(注意缩进对齐,避免空格混用 Tab)
- 熟悉 Home Assistant 界面基本操作
- 全程零代码,无需侵入路由器后台
核心配置:刷入 ESPHome 固件
ESPectre 的核心原理在于分析路由器与 ESP32 之间 2.4GHz 信号的多径传播。人体穿过空间时会扰动电磁波路径,ESP32 捕获信道状态信息的幅度变化即可判定运动状态。
在 Home Assistant 侧边栏打开 ESPHome,点击新建节点并填入以下完整配置。注意替换 WiFi 凭据:
yaml
esphome:
name: espectre-sensor
platformio_options:
lib_deps:
- https://github.com/francescopace/espectre
esp32:
board: esp32-s3-devkitc-1
framework:
type: esp-idf
wifi:
ssid: "你的WiFi名称"
password: "你的WiFi密码"
espectre:
detection_algorithm: mvs # 经典算法稳定可靠;实验性神经网络填 ml
segmentation_threshold: auto # auto 自适应环境,也可手动填入固定数值
auto_calibration_time: 10s # 启动后保持房间静止的校准时间
binary_sensor:
- platform: espectre
name: "Room Motion"
device_class: motion
sensor:
- platform: espectre
type: movement_score
name: "Movement Score"
关键参数解读:
detection_algorithm:推荐新手使用mvs算法,逻辑成熟且抗干扰能力强。ml为实验性神经网络,免校准但仍在持续迭代,生产环境建议优先用 MVS。segmentation_threshold:决定多大扰动才触发状态翻转。设置为auto时系统会自动适配环境底噪;若发现误报频繁或漏报,可改为手动数值(如 3500)。auto_calibration_time:设备上电后需要建立静止环境基线。校准期间请勿在监测区域内走动,否则基准线偏移会导致后续误判。
配置完成后点击 INSTALL。首次刷入建议使用 USB 数据线直连电脑,选择对应串口即可。固件编译烧录成功后,开发板会自动连接局域网并注册到本地网络。
接入 Home Assistant 与自动化编排
ESPHome 设备上线后会自动被 Home Assistant 发现并添加至设备列表。实体面板中将直接生成:
- 一个 Binary Sensor(实时上报运动状态,响应毫秒级)
- 一个 Sensor(周期性上报运动分数,用于量化分析)
- 一个 Number Entity(支持在线动态调节阈值,修改立即生效,无需重新烧录)
硬件就绪后,验证基础功能:打开 binary_sensor.room_motion 的状态面板,在房间内正常走动,观察状态是否从 off 跳变为 on。
接下来配置自动化逻辑。切换至 YAML 编辑模式,输入以下配置实现“人来开灯、人走关灯”:
yaml
alias: "书房人来灯亮"
description: "检测到运动自动开灯,30 秒无运动后关灯"
trigger:
- platform: state
entity_id: binary_sensor.room_motion
to: "on"
id: motion_on
- platform: state
entity_id: binary_sensor.room_motion
to: "off"
for:
seconds: 30
id: motion_off
action:
- choose:
- conditions:
- condition: trigger
id: motion_on
sequence:
- service: light.turn_on
target:
entity_id: light.study_desk
- conditions:
- condition: trigger
id: motion_off
sequence:
- service: light.turn_off
target:
entity_id: light.study_desk
mode: single
保存并启用自动化。进出房间即可验证灯具是否按预期响应。for: seconds: 30 的设置可有效避免因短暂转身导致的频繁开关灯。
部署调优与避坑指南
传感器物理摆放直接决定检测精度。遵循以下原则可避开绝大多数干扰:
距离控制: 最佳工作区间为路由器 3 ~ 8 米。距离小于 2 米信号过强,多径反射效应减弱导致灵敏度下降;超过 10 米信号衰减严重,底噪升高易引发随机误报。
位置选择: 放置在需要监控的区域内部,无需与路由器保持直线可视。高度建议 1 ~ 1.5 米(桌面高度最佳),贴合人体活动平面。
环境避开: 远离冰箱、金属文件柜等强反射物,避开死角或密闭小空间,确保电磁波具备足够的多径反射路径。若开发板带有 IPEX 接口,外接全向天线可显著提升覆盖率。
常见问题排查:
- 启动初期检测失灵:自动校准尚未完成或校准期间有人走动。保持环境静止 10 秒即可恢复。若启用
ml算法则跳过此步骤。 - 误报频繁(如窗帘摆动触发):调高 Number 实体的阈值,或在 YAML 中将
segmentation_threshold设为固定高值,抬高触发门槛。 - 检测迟钝:核对设备与路由器间距是否在有效区间。缩短距离或移除中间金属遮挡物。
- 断网运行状态:检测算法完全在 ESP32 本地执行,离线不影响底层判断。网络恢复后,Home Assistant 会自动同步最新状态队列。
场景延伸
单节点设备可覆盖约 50 平方米空间。大户型部署多块开发板即可实现全屋分区监测。基于此基础,可进一步拓展节能控制(无人自动切断非必要电器)、长辈看护(长时间静止触发关怀提醒)或安防布防(离家模式入侵推送告警)。
完整算法文档与高级调优参数详见项目仓库。动手搭建过程中遇到边界场景或独创玩法,欢迎交流分享。