把 Wi-Fi CSI 感知接进 Home Assistant:ESPHome、MQTT 与路由器 REST
作者 Wu Jun · 更新于 2026-10-29 · 约 6 分钟
Home Assistant 需要的是实体,不是原始 CSI 字节流。关键不是“把 256 个子载波塞进 HA”, 而是先确定谁负责采集、谁负责判决、实体代表什么。
截至 2026-10-29,实际有两条成熟路线:
- ESPectre + ESPHome:一块 ESP32 直接在设备端计算 motion/movement,HA 通过 ESPHome 发现实体;
- ESPectre Native + MQTT Discovery:不经过 ESPHome,由设备把实体发布到 MQTT;
本项目已有的 MT6000 platform/ 是第三条路线:它提供 REST/WebSocket,但当前源码没有内置 MQTT。
如果要把路由器平台接入 HA,应先用 REST;需要 MQTT 时必须另外实现 bridge,不能假设已有 topic。
0. 先选接入层
| 你的现状 | 推荐路线 | 主要代价 |
|---|---|---|
| 想最快得到“客厅有人活动”实体 | ESPectre + ESPHome | 一块受支持的 ESP32,单区域覆盖 |
| 不想维护 ESPHome 构建 | ESPectre Native + MQTT Discovery | 需要 Mosquitto broker |
| 已有 MT6000 和本项目 platform | HA REST 读 /api/stations |
需要维护平台与房间阈值 |
| 想全屋一个路由器覆盖 | MT6000 采集 + 自建分析服务 | 工程量最大,且当前没有现成 MQTT |
ESPectre 官方说明它支持 ESP32-C6 / C5 / C3 / S3 / S2 和经典 ESP32,使用普通 2.4GHz Wi-Fi 4 网络;一块板覆盖一个区域,不能识别身份、人数,也不能证明房间绝对无人 [1]。底层的 CSI 采集能力来自 ESP-IDF [2]。
1. 先统一实体语义
| 实体 | 含义 | 不要误解为 |
|---|---|---|
binary_sensor motion |
当前是否检测到运动边沿 | 已确认有人、未检测到运动不等于空房 |
| movement score | 0–1 的运动分数 | 人体位置、身份或医疗指标 |
| threshold | 判决阈值 | 跨房间通用的常数 |
| availability | 设备在线、数据新鲜 | 传感器一定准确 |
CSI 感知的能力边界可参考领域综述 [3]。在自动关灯、安防等动作前, 应加保持时间、人工确认或其他传感器,而不是把单条 CSI 当安全认证。
2. 路线 A:ESPectre + ESPHome(推荐先跑通)
官方 ESPHome 组件不是旧式 platform: espectre。当前仓库要求使用
external_components 指向组件目录,然后用顶层 espectre: 声明,
组件会生成 motion、movement、threshold 等实体。
在官方对应芯片的完整示例基础上,合并这个组件块;不要只复制片段而丢掉板级配置:
external_components:
- source:
type: git
url: https://github.com/francescopace/espectre
path: src/cpp/frontend/esphome/components
components: [espectre]
espectre:
detection_algorithm: lightweight
csi_capture_profile: lltf
csi_target_pps: 100
traffic_generator_mode: ping
motion_sensor:
name: "Living Room Motion"
movement_sensor:
name: "Living Room Movement"
internal: true
说明:
csi_capture_profile可选auto、lltf、ht-vht,修改后需要重新构建;csi_target_pps和流量模式可先用默认值,确认 HA 实体出现后再优化;internal: true可减少高频 movement score 写入 HA recorder;只保留 binary_sensor 给自动化使用;- 真实 SSID、密码和 BSSID 不要写进公开 YAML,使用官方 Improv Serial 或 captive portal 配置 Wi-Fi。
ESPHome 上线顺序
- 按官方支持的芯片示例选择完整 YAML,不要混用其他芯片的配置;
- 用 USB 首次烧录,配置 Wi-Fi;
- 在 HA 的 ESPHome 集成中确认设备被发现;
- 检查
binary_sensor.*_motion、threshold 和 diagnostics; - 先观察 24 小时,再接关灯或空调自动化;
- 更换位置、BSSID 或家具后重新标定。
3. 路线 B:ESPectre Native + MQTT Discovery
Native 前端可以通过 MQTT Discovery 自动创建实体。推荐在 HA 中使用官方 Mosquitto broker;HA 文档要求 broker 支持 MQTT 5,并默认启用 discovery [4]。
设备侧只需要在 Device settings 填写:
scheme: mqtt
host: homeassistant.local
port: 1883
然后确认设备能力接口返回 configured: true。TLS broker 使用 mqtts 和通常的
8883 端口;主机字段不要填写 mqtt://、账号、端口或路径。Native 的实体会自动出现,
不要为同一台设备再手工创建一套同名实体。
当 discovery 被关闭时,才需要手动配置。下面使用 ESPectre Native 的 motion topic:
mqtt:
binary_sensor:
- name: "Living Room CSI Motion"
unique_id: living_room_csi_motion
state_topic: "espectre/v1/devices/<device_id>/motion"
value_template: "{{ value_json.state }}"
payload_on: "motion"
payload_off: "idle"
availability_topic: "espectre/v1/devices/<device_id>/health"
availability_template: "{{ 'online' if value_json.online else 'offline' }}"
payload_available: "online"
payload_not_available: "offline"
motion 是边沿事件 topic,不保留;HA 重启后若没有新事件,实体可能暂时不可用。
真正长期运行时应优先让 MQTT Discovery 管理实体,并检查 health/availability。
4. 路线 C:本项目路由器平台 + REST
本项目的 platform/ 实际提供:
GET /api/health;GET /api/stations;GET /api/stats;- WebSocket
/ws; - 录制与会话 REST API。
它没有 /api/csi/status,也没有内置 MQTT。旧示例里的这两个接口不能照抄。
先在运行平台的机器上验证:
curl -fsS http://csi-platform.local:8080/api/health
curl -fsS http://csi-platform.local:8080/api/stations
/api/stations 返回 stations 数组;每项包含 alias、online、present、
motion_db、last_seen_ago 等字段。一个按 alias 提取客厅设备的 Home Assistant
REST 配置如下:
rest:
- resource: "http://csi-platform.local:8080/api/stations"
scan_interval: 2
timeout: 5
binary_sensor:
- name: "Living Room CSI Presence"
unique_id: living_room_csi_presence
value_template: >-
{% set s = value_json.stations
| selectattr("alias", "equalto", "living-room")
| list | first %}
{{ (s.online and s.present) if s else false }}
sensor:
- name: "Living Room CSI Motion dB"
unique_id: living_room_csi_motion_db
unit_of_measurement: "dB"
state_class: measurement
value_template: >-
{% set s = value_json.stations
| selectattr("alias", "equalto", "living-room")
| list | first %}
{{ s.motion_db if s else none }}
实际字段以平台当前响应为准;如果平台在 nginx 反向代理后,资源路径仍应是
/api/stations。REST 的 resource、scan_interval 和 binary_sensor 结构以
Home Assistant 官方文档为准 [5]。
REST 路线的标定和自动化
- 安静房间采集至少 10 分钟,记录
motion_db分布; - 正常走动 10 分钟,比较活动期分布;
- 取安静期高分位数作为进入参考,活动期低分位数作为释放参考;
- 使用滞回和保持时间,不要每条曲线抖动都触发;
- 连续观察 24 小时,统计误报、漏报和不可用时间;
- 换房间、路由器位置、BSSID 或家具后重新标定。
automation:
- alias: "Turn off living-room light after ten quiet minutes"
mode: single
trigger:
- platform: state
entity_id: binary_sensor.living_room_csi_presence
to: "off"
for: "00:10:00"
condition:
- condition: state
entity_id: binary_sensor.living_room_csi_presence
state: "off"
action:
- service: light.turn_off
target:
area_id: living_room
先不要直接控制门锁、安防或医疗报警。CSI 是低带宽、受环境和标定影响的传感器, 自动关门锁需要独立安全认证与失效策略。
5. MQTT 与 REST 怎么选
| 维度 | ESPectre ESPHome | Native MQTT Discovery | 路由器平台 REST |
|---|---|---|---|
| HA 发现 | 原生 | MQTT discovery | 手动模板 |
| 实时性 | 设备端事件 | MQTT 推送 | 轮询 |
| 覆盖 | 单房间 | 单房间 | 取决于路由器位置 |
| 维护 | ESPHome/组件版本 | broker、设备配置 | 服务、反向代理、阈值 |
| 失败恢复 | ESPHome reconnect | LWT/availability | REST 超时、模板空值 |
选择原则:先跑通 ESPHome 单房间;需要不依赖 ESPHome 构建时选 Native MQTT; 已经有路由器采集服务时才选 REST。不要同时开三套重复实体。
6. 常见问题
| 现象 | 先检查 |
|---|---|
| ESPHome 没有发现实体 | 完整芯片示例、external_components 路径、USB 首次烧录日志 |
| MQTT 实体不存在 | broker 版本是否支持 MQTT 5、discovery 是否开启、设备 configured 状态 |
| 实体一直 unavailable | health/availability topic、LWT、设备时间与 Wi-Fi 连接 |
| REST 超时 | 平台 health、nginx /api 反代、防火墙和 DNS 名称 |
| REST 模板报错 | 先用 curl 查看 stations 数组和 alias 是否完全匹配 |
| 频繁误报 | 阈值、进场/退场保持时间、窗帘/空调/宠物扰动 |
| 静止的人被漏检 | CSI 微动不足;增加其他传感器或延长释放时间,不能伪造准确率 |
7. 隐私与部署边界
- 只在自有或获授权的空间部署;
- 让同住者知情,不要把 CSI 变成隐蔽监控;
- MQTT 使用独立账号、局域网 broker,不把 1883 端口暴露到公网;
- REST/ESPHome API 不直接暴露到互联网,必要时用 VPN 或反向代理鉴权;
- 原始 CSI、motion score 和 HA 历史都按敏感数据管理,设置保留期限;
- 变更后重新标定,并记录模型、固件、阈值和位置。
继续阅读:ESP32 CSI 入门 · ESP32 人体检测 · 树莓派部署 · MT6000 复现
参考与数据来源
本文的每条外部结论都标注来源与证据等级(分级标准);标注 E 级的是本项目可复现的实测数据。
- C 级 · 官方资料
francescopace/espectre — Wi-Fi CSI motion sensing for ESP32 (ESPHome)
F. Pace
github.com/francescopace/espectre · 核实: GitHub API and official README fetched 2026-10-29 (stars 9,700; GPLv3; ESPHome source path, Direct API port 62587 and supported chips documented) · 官方项目提供 ESPHome、Native MQTT、Matter 与浏览器烧录路线;同一块 ESP32 覆盖一个区域,不识别身份或人数。 - C 级 · 官方资料
espressif/esp-csi — Applications based on Wi-Fi CSI
Espressif Systems
github.com/espressif/esp-csi · 核实: GitHub API 2026-10-29 (stars 1,723; README confirms the complete ESP32 series list and three sender/receiver routes) · 官方 README 原文:“All ESP32 series support CSI, including ESP32 / ESP32-S2 / ESP32-C3 / ESP32-S3 / ESP32-C5 / ESP32-C6 / ESP32-C61.” - A 级 · 标准/综述
WiFi Sensing with Channel State Information: A Survey
W. Ma, W. Zhou, X. Wang · ACM Computing Surveys · 2019
doi:10.1145/3310194 · 被引 857 · 核实: CrossRef API, 2026-10-11 · 领域内最常被引用的 CSI 感知综述(被引 857 次,核实于 CrossRef)。 - C 级 · 官方资料
Home Assistant — MQTT integration and discovery
Home Assistant
www.home-assistant.io/integrations/mqtt/ · 核实: Official documentation fetched 2026-10-29 (broker setup, MQTT discovery, availability and manual binary sensors) - C 级 · 官方资料
Home Assistant — RESTful integration
Home Assistant
www.home-assistant.io/integrations/rest/ · 核实: Official documentation fetched 2026-10-29 (resource, authentication, scan interval, sensor and binary_sensor schema)