Hybrid BLE+CSI Occupancy Estimation
Current assessment (2026-09-15)
Superseded design retained for provenance, reviewed September 15, 2026. No primary data are attributed to this card. Fusion is conditional on reference quality and device carriage. It has not been shown to beat both inputs in every field regime, especially when no participant phone is observed.
Fusion is conditional on reference quality and device carriage. It has not been shown to beat both inputs in every field regime, especially when no participant phone is observed.
Next evidence needed: Use EXP-F3 for the current protocol and evidence. The earlier plan below is not an instruction to reopen this experiment.
Basis: Thesis Narrative, the September 10 synthesis, and the September 15 register review. See the review record for evidence sources and outstanding checks.
Earlier protocol and dated results
The methods and observations below retain their original scope. Read their readiness statements and proposed next steps as historical. The current assessment above records what has changed; frozen thresholds have not been retrospectively revised.
The problem, in plain words
Picture a doorway counter that works by how much a Bluetooth beacon's signal gets blocked. One person steps into the beam and the signal drops a bit — great, you can tell "someone is here." Now a second person steps in, and a third. Does the signal keep dropping in neat, equal steps you could count backwards from? Or does it saturate — drop once and then barely move no matter how many more people crowd in, because the first body already blocked the important path?
That saturation question is the crux. Device-based counting (BLE) is precise about phones, but a phone is a proxy for a person, and not everyone carries one that is discoverable. Device-free counting (CSI) sees everyone but is coarse. The fusion idea needs the BLE side to contribute graded information — otherwise BLE is just a presence switch and the "fusion" is really CSI doing all the counting. A well-known way to fight saturation is where you put the anchors: concentrate them where people actually cluster and transit, so successive occupants keep blocking fresh signal paths. That is exactly the lever these two campaigns pulled.
What we are trying to prove
- Umbrella hypothesis (falsifiable, not yet tested on hardware): a model that fuses BLE advertisement counting with CSI features beats either modality alone across phone-penetration rates from 0 % to 100 %, degrading gracefully to CSI-only at 0 %. A null here means BLE adds nothing beyond what CSI already provides — the "fusion" is redundant.
- The sub-hypothesis we actually tested (in silico): the BLE anchor's aggregate signal drop is a monotone, graded function of headcount — steeper and cleaner when anchors are placed on the building's high-traffic hub than when dispersed one-per-room. If it only distinguishes empty from occupied, BLE is a presence sensor, and the fusion must lean entirely on CSI for counting.
- What a null means here (and it is what we got): if topology-informed placement does not produce a resolvably steeper graded slope than dispersed placement, then anchor relocation cannot buy graded BLE counting — the saturation is intrinsic to single-Tx narrowband blockage at this density. That narrows the BLE arm's claim from "graded counter" to "reliable presence + a consistent-but-shallow response."
How the experiment works (plain method)
- The full umbrella design (planned, hardware): collect five phone-penetration scenarios (100 %, 75 %, 50 %, 25 %, 0 % of 8 people carrying the app), measure BLE-only, CSI-only, and three fusion models (linear correction, learned penetration rate, feature-level gradient boosting), and plot MAE vs penetration rate. This is the IP-106 testbed work — not yet run.
- The sub-question we ran (simulation): on a real multi-room floor plan (
resplan-12439), ray-trace the BLE + CSI channel under a sweep of occupancy N ∈ {0, 2, 4, 6, 8, 12}, and fit the BLE anchor's mean ΔRSSI (baseline-normalised) against N. The slope in dB/person is the "graded count" signal. - The placement contrast: compare dispersed anchors (one per peripheral bedroom) against topology-informed anchors (concentrated on the high-betweenness
living-0corridor hub plus the largebedroom-1), paired by seed so each crowd trajectory runs through both layouts. - The powering: the pilot used 3 random seeds; the audited re-run used 8 seeds — the number the observed variance says you need for ~90 % power against the pilot's effect. The unit of replication is the seed, not the ~11,520 individual frame×link events (treating those as independent is the classic way to fake significance).
What we've found so far (honest)
Neither campaign is a phantom — the pilot attached 18 real runs + one figure; the powered re-run attached 96 gate-passed runs with a seed-clustered bootstrap. What changed between them is the whole point.
| Claim | Pilot (c-ble-anchor-placement, n = 3) | Powered re-run (c-ble-graded-count-powered, n = 8, 96 runs) |
|---|---|---|
| Topology graded slope | −0.48 dB/person (monotone) | mean −0.353 (8/8 seeds negative, but the sign test's p = 0.0078 is just the attainable floor at n = 8, not a margin) |
| Dispersed graded slope | +0.08 dB/person (flat — "saturates") | mean −0.227 (7/8 negative — does not actually saturate) |
| Topology − dispersed difference | claimed a real gap | −0.126 dB/person, 95% CI [−0.412, +0.113], exact sign-flip p = 0.461, d = −0.32 |
| Fine graded count (per ΔN=2 step) | coarse ΔN≥4 "recovered" | 0 / 20 cells survive BH-FDR(0.05); ΔN=2 topology 0/3 |
| Presence (empty vs occupied) | d 2.32 → 2.56 | preserved (well-separated) |
Read plainly:
- The pilot's graded-recovery headline was an n = 3 seed-variance artifact. The powered interval [−0.412, +0.113] excludes the pilot's own −0.498 point — the design that could detect a −0.498 effect looked and did not find it. The per-seed differences straddle zero (−0.92, −0.39, −0.18, −0.15, −0.02, +0.08, +0.24, +0.33): a couple of favourable seeds, not a mechanism.
- The pilot's story was also wrong. It claimed dispersed placement saturates flat; at power, dispersed carries a negative response too. So the "saturation the good placement rescues" was itself a small-sample mirage.
- What survives is narrow and honest: BLE resolves occupancy presence robustly (large effect sizes), and a hub+large-room layout gives a more consistent (8/8 negative) but shallow response — good for a reliable presence/response sensor, not for reading off a headcount. The deliverable for IP-106 flips from "place anchors to get a graded count" to "place anchors for response consistency; do not budget for fine BLE headcount off placement alone."
- This is a powered negative for the pilot-sized effect, not proof the true difference is zero. The interval still admits differences out to −0.412 dB/person; a genuinely tiny ~0.13 dB/person effect would need ~75 seeds to resolve and is below the 0.30 dB/person the brief pre-declared as practically meaningful anyway. A sentinel check confirmed the null is not a degenerate-data artifact (all 96 cells carry 120 events, no NaN, N=12 spans −0.99 to −9.26 dB).
How to read the figures
fig_csi_ble_anchor_placement(pilot session, the one rendered figure): two panels. Left — mean ΔRSSI vs occupancy N, one line per placement; the dispersed line dips at N=2 then bounces back toward zero (the saturation signature the pilot leaned on), the topology line keeps sliding down. Right — a resolvable-ΔN effect-size grid. Caveat when you look at it: this is n = 3 seeds; the powered re-run below overturns the between-placement gap this figure suggests. Trust the presence separation, distrust the graded gap.- Powered session (
c-ble-graded-count-powered): the synthesis narrates three figures —seed_trace(RSSI vs N, every seed a faint trace, mean bold, one panel per layout),paired_diff(per-seed dispersed−hub slope-difference dots with the CI on the difference), andperm_null(paired-permutation null histogram with the observed statistic marked). Provenance flag: the session's machine-readablefigures[]list is empty even though the prose claims these three were rendered — treat the figures as unverified until the artefact prefix is confirmed (see the Software Engineer's note).
Key references
- longo2019_b72f ↗ — the closest real prior on combining Wi-Fi and BLE for occupancy; the fusion premise this umbrella tests.
- depatla2018_97a9 ↗, zou2018_1590 ↗ — device-free CSI counting; where the graded burden actually lives.
- iannizzotto2025_b55c ↗ — graded BLE counting does exist, but via deep features, not a raw RSSI slope.
- demrozi2021_bf55 ↗, koksal2025_426c ↗ — real BLE occupancy/presence, the deployable floor.
- zhen2022_bb0b ↗, afghantoloee2021_8628 ↗ — anchor-placement optimization, the campaign's motivation.
- zhang2026_ccac ↗, guarino2026_e72c ↗ — the reproducibility/evaluation bar the SWE and Statistician invoke.
- wang2026_2758 ↗, huang2025_060d ↗ — the sim-to-real gap and a real multi-user anchor the Red-Team demands.
- zhang2024_1d32 ↗, simoni2023_f197 ↗ — the privacy design the Ethics voice requires.