Skip to content

esp32-csi-node + sensing-server: surface the associated AP BSSID (and optionally pin it) — mesh roams silently swap the sensing link geometry #1542

Description

@jkuscevic

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: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)

  1. 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.
  2. 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.
  3. 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).

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions