We left a node logging in one apartment for a month and then read the whole series by hand. The failure that mattered was not a missed detection. It was a confident wrong answer.
The baseline drifts
WiFi sensing works by comparing the current channel signature against an "empty room" reference. Our first implementation captured that reference once, at install, and trusted it forever.
It was wrong within days. Furniture moved. A router was repositioned. Someone left a bag against the wall between the two nodes. The reference slowly became a picture of a room that no longer existed, and the display drifted toward "present" while nobody was there.
The fix was to stop treating the baseline as a constant: re-derive it from the quietest window of the last few hours, and say so. Which leads to the second lesson.
"No one" and "I do not know" are different answers
The product originally had three states. After a month of data we added a fourth, and then made the fourth the loudest.
- No one: signature matches the current empty baseline.
- No signal: the node itself stopped reporting.
That second one is not an error condition to be hidden in a toast. When the uplink dies, a screen that keeps showing the last known state is manufacturing reassurance. Our rule now: any reading older than its max age collapses to no signal with a visible age, computed on the client so a frozen tab degrades honestly too.
Short absences dominate
Looking at the histogram of "quiet" durations, the interesting band is not hours — it is 3 to 15 minutes. Someone is in the bathroom, or downstairs collecting a parcel. A product that pings on every quiet stretch becomes noise within a day, and a noisy product gets unplugged.
We kept notifications out of v1 entirely. The dashboard shows state; the reader decides when to look. It demos worse and works better.
Privacy was a data-design decision, not a policy
There is no camera and no microphone, so there is no frame to leak. But we also chose not to store raw channel state on the server: the node reduces to a small feature vector at about 1 Hz and ships tens of kilobytes per day. The raw series never leaves the flat.
That has a cost — we cannot retroactively re-analyze a month of raw data — and we accepted it deliberately. A pipeline you cannot abuse is worth more than a dataset you might mine later.
Limits belong on the screen
Same room, line of sight, roughly 10 metres. Through one ordinary interior wall, about 5 metres. Beyond that: no signal. Two brick walls and the honest answer is that this device cannot see that room, and it should say so rather than extrapolate.
Live dashboard (a real device in a real apartment, updating about once per second): https://annest.cn/live/
AnNest is a consumer safety display, not a medical device. It does not detect falls, does not measure vitals, and does not call for help. If something is an emergency, call your local emergency number.

