Rooms have fingerprints
An empty room produces a stable CSI signature — not constant (radio always flickers), but statistically steady. Detection is therefore a two-step dance:
- Learn the empty room (the baseline).
- Measure distance from it (the anomaly score).
Step 1: the baseline
Capture minutes-to-days of empty-room CSI and store, per subcarrier, its mean and spread (standard deviation). Production fleets keep baselines fresh with an exponential moving average — old data fades, slow environmental drift (temperature, a moved chair) gets absorbed instead of alarming forever.
Step 2: the score
For each new frame, compute a z-score per subcarrier: how many standard deviations from baseline? Combine across subcarriers (mean of absolute z-scores is a fine start). Then:
- Score persistently high → something changed in the space.
- Score oscillating at 0.2–0.5 Hz → breathing.
- Large rhythmic swings → walking.
The false-alarm war
Every real deployment fights the same three enemies:
- WiFi channel switches — your router hops channels and the whole signature shifts. Detect the cliff-edge jump and re-baseline instead of alarming.
- Rain, fans, HVAC — periodic mechanical motion looks alive. Multi-node meshes disambiguate: a fan bends one path, a walking person bends paths in sequence.
- Stuck baselines — if a device rebooted into a changed room, its baseline lies. Our production sentinels auto-re-baseline when scores stay pegged for 10 minutes; steal that idea.
Honest limits
CSI tells you presence, motion, rhythm, roughly where (with a mesh). It does not tell you who, and cross-wall performance depends on construction. Design your product promises around what the physics actually delivers.