Summary
On multi-AP (mesh) WiFi, a CSI node's association can roam between APs at any time — and when it does, the sensing link geometry silently changes while nothing in the node's published telemetry reveals it. Request: surface the associated AP BSSID in node telemetry (and ideally allow pinning it at provisioning), plus a roam event on change.
Field report
- 5×
esp32-csi-node (Atom S3 Lite) on a residential eero mesh (router + extender), one node per room, ruvnet/wifi-densepose:v2051 server.
- One node was confirmed (vendor app) associated to the far mesh router — a ~5.5 m diagonal link crossing two rooms, which defined what that node sensed.
- Two days later, with the node physically untouched, the vendor app showed it associated to the other AP (short through-wall link to an adjacent room): a completely different sensing geometry.
- The roam is invisible in everything the node publishes. Reported RSSI sat at −45..−52 dBm on both links (levels overlap at this position), so there is no way to detect the swap — or even to date it — from captures or Home Assistant. Only the vendor's app showed it.
Why this matters for CSI sensing specifically
The associated AP is the TX side of the sensing link: it determines the Fresnel volume and therefore which space the node actually senses. Any calibration tied to link geometry — empty-room baselines (ADR-135), per-room enrollment/specialists (ADR-151 / wifi-densepose-calibration) — is silently invalidated by a roam, with no signal that re-baselining is needed. Mesh WiFi is the default in exactly the homes this hardware targets, so this is the common case, not an edge case.
Asks (independent, in increasing order of effort)
- BSSID in telemetry: include the associated BSSID (and primary channel) in the node's reporting alongside
rssi, and surface it through the server (/ws/sensing node_features[] and an MQTT attribute/entity per node). Firmware side is cheap: esp_wifi_sta_get_ap_info() → wifi_ap_record_t.bssid/primary.
- Roam event: have the server emit an event when a node's reported BSSID changes, so downstream consumers (baselines, calibration banks, HA automations) can trigger re-baseline.
- Optional BSSID pinning at provisioning: a provisioning flag to lock the station to a chosen AP (
wifi_config_t.sta.bssid + bssid_set = true) for installations that prefer a stable sensing link over roaming resilience.
Relation to existing work
This is distinct from the ADR-022 multi-BSSID scanning pipeline (#46): that scans other BSSIDs for sensing input; this is about knowing/controlling which AP the CSI capture link itself is riding on.
Related deployment context: #1540, #1541 (same 5-node mesh).
Summary
On multi-AP (mesh) WiFi, a CSI node's association can roam between APs at any time — and when it does, the sensing link geometry silently changes while nothing in the node's published telemetry reveals it. Request: surface the associated AP BSSID in node telemetry (and ideally allow pinning it at provisioning), plus a roam event on change.
Field report
esp32-csi-node(Atom S3 Lite) on a residential eero mesh (router + extender), one node per room,ruvnet/wifi-densepose:v2051server.Why this matters for CSI sensing specifically
The associated AP is the TX side of the sensing link: it determines the Fresnel volume and therefore which space the node actually senses. Any calibration tied to link geometry — empty-room baselines (ADR-135), per-room enrollment/specialists (ADR-151 /
wifi-densepose-calibration) — is silently invalidated by a roam, with no signal that re-baselining is needed. Mesh WiFi is the default in exactly the homes this hardware targets, so this is the common case, not an edge case.Asks (independent, in increasing order of effort)
rssi, and surface it through the server (/ws/sensingnode_features[]and an MQTT attribute/entity per node). Firmware side is cheap:esp_wifi_sta_get_ap_info()→wifi_ap_record_t.bssid/primary.wifi_config_t.sta.bssid+bssid_set = true) for installations that prefer a stable sensing link over roaming resilience.Relation to existing work
This is distinct from the ADR-022 multi-BSSID scanning pipeline (#46): that scans other BSSIDs for sensing input; this is about knowing/controlling which AP the CSI capture link itself is riding on.
Related deployment context: #1540, #1541 (same 5-node mesh).