Guides & articles
Reproduce Wi-Fi CSI on a router: build, flash, capture, analyse, troubleshoot.
- CSI dataset: 10-second sample (256 subcarriers) + the full 10-minute capture
A real home-environment router CSI dataset: a 10-second sample (312 chain records, 256 subcarriers, 8 chains), a parser, the format spec and CC BY 4.0 licensing.
- Live demo: playback of a real 256-subcarrier CSI heatmap
No install required: watch real router CSI in the browser — a 256-subcarrier amplitude heatmap, a Doppler/time-frequency view, and a motion metric curve, with view switching, play/pause and speed controls. Captured on a GL-MT6000.
- ESP32 CSI human detection: a practical, calibrated setup
How to detect humans with ESP32 CSI: capture, amplitude-variance features, threshold calibration with hysteresis, and the mistakes that make demos fail in real rooms.
- ESP32 CSI getting started — and how it differs from router CSI
ESP32 is the cheapest CSI platform (20 MHz / 30–64 subcarriers). Here is the fastest path in, what it can do, and when a router (80 MHz / 256 subcarriers) is the better choice.
- Get 256-subcarrier Wi-Fi CSI from a GL-MT6000 router (no extra hardware)
A reproducible guide: build OpenWrt with the mt76 CSI patch, flash the router, enable CSI with frame-type and MAC filters, and validate the UDP stream.
- mt76 rate control: why a client gets pinned at MCS0 (and how to prove it)
A measured investigation into mt76 firmware rate adaptation: which counters matter, why last-tx-bitrate misleads, the vow_atf bug that prevents recovery, and the A/B test that proves it.
- Nexmon CSI guide: 80 MHz / 256 subcarriers on a Raspberry Pi
Nexmon CSI patches Broadcom Wi-Fi firmware to expose channel state information. Supported chips, steps on a Raspberry Pi, output parsing, and how it compares to router-based CSI.
- OpenWrt Wi-Fi slow after idle: a 10-minute diagnostic
One client slow while others are fine? Run this checklist: direction test, rate sampling, byte accounting, then the two known mt76 root causes (firmware ATF, 40 MHz client in an 80 MHz BSS).
- Tools, scripts and datasets
Capture scripts, Python analysis tooling, the UDP data format, the 10-minute raw I/Q dataset, and the open-source projects this project builds on.
- Wi-Fi CSI explained: from channel state information to human sensing
What CSI is, how it differs from RSSI, what it can and cannot do, five hardware routes compared, and how to get 256-subcarrier CSI from a home router.
- 2.4 GHz vs 5 GHz for Wi-Fi CSI: coverage, subcarriers, and interference
Band choice decides coverage and resolution: 20 MHz/64 subcarriers with better penetration versus 80 MHz/256 subcarriers with clean spectrum. Includes what we measured and the fallback rules.
- 80 MHz vs 40 MHz for Wi-Fi CSI: resolution, subcarriers, and a real-world trap
Bandwidth decides CSI resolution. Here is the physics (range bins, subcarrier count), what we measured on an MT7986 router, and the 40 MHz client inside an 80 MHz BSS bug that makes one client unusable.
- ESP32-S3 CSI: yes it works — and when you need a 5 GHz chip instead
Does the ESP32-S3 support Wi-Fi CSI? Yes, and Espressif documents the exact payload. Here is what you get (2.4 GHz, 20/40 MHz), the S3-specific gotcha, and when to move to an ESP32-C5 or a router.
- Wi-Fi CSI fall detection: features that work, and the false alarms you must handle
Fall detection with CSI is a doppler problem, not a presence problem. Here are the features, the window sizes, the calibration that kills false positives, and why you must not market it as a medical device.
- Wi-Fi CSI in Python: parsing, phase sanitising, heatmaps and motion metrics
A minimal, runnable pipeline from raw I/Q to useful features: parse the binary container, remove CFO/SFO drift, build amplitude heatmaps and a 1-second motion metric.
- Wi-Fi CSI radar: what it really measures (and where the marketing stops)
People call CSI-based sensing 'Wi-Fi radar'. Here is what it actually measures — motion, presence, coarse range via time-of-flight, Doppler — and which radar claims are overstated.
- Wi-Fi CSI on a Raspberry Pi: two very different jobs
A Raspberry Pi can be either the CSI capture device (Nexmon) or the analysis host for router CSI. Here is what each role needs, with bandwidth and storage budgets.
- Respiration and heart rate from Wi-Fi CSI: what works, what does not
A runnable phase-processing and spectral-estimation pipeline for breathing/heart rate, the sampling and window requirements, and the failure conditions you must accept.
- Wi-Fi sensing in Home Assistant: ESP32 vs a router CSI platform
Two practical routes to presence/motion entities in Home Assistant — ESPHome/ESP32 components, or a router CSI service with MQTT/REST — with config sketches and reliability tips.
- Wi-Fi sensing through walls: what is physically real, and what is not
Can Wi-Fi see through walls? Physically, motion behind drywall can change multipath. Practically, claims of imaging or identity are overstated. Here is the honest picture — plus the privacy countermeasures.
- Wi-Fi sensing vs mmWave radar for the home
How Wi-Fi CSI and mmWave radar really differ in accuracy, privacy, cost and deployment — plus a practical hybrid setup for Home Assistant.
- Exclusive: why Wi-Fi collapses after you enable CSI (firmware ATF and the 40 MHz client trap)
A reproducible investigation: one Mac's downlink fell from ~400 Mbps to 6 Mbps after CSI was enabled. Root cause was a firmware VoW ATF setting that pins the rate, plus a 40 MHz client inside an 80 MHz BSS.