Motion detection system based on Wi-Fi spectre analysis (CSI), with native Home Assistant integration via ESPHome.
[!TIP] New ML Detector: Neural network-based motion detection. No calibration required, runs on-device. This is an experimental feature, and feedback is welcome in the dedicated ML detector discussion. A snapshot build with the latest changes is also available (use
-mlassets for the machine learning based detector), or follow Setup guide for custom configuration.
ESP32-S3 DevKit with external antennas
Setup time: ~10-15 minutes
Difficulty: Easy (YAML configuration only)
Home Assistant dashboard with real-time motion detection, threshold control, and debug sensors
When someone moves in a room, they "disturb" the Wi-Fi waves traveling between the router and the sensor. It's like when you move your hand in front of a flashlight and see the shadow change.
The ESP32 device "listens" to these changes and understands if there's movement.
Want to understand the technical details? See ALGORITHMS.md for CSI explanation and signal processing documentation.
Optimal sensor placement is crucial for reliable movement detection.
Optimal range: 3-8 meters
| Distance | Signal | Multipath | Sensitivity | Noise | Recommendation |
|---|---|---|---|---|---|
| < 2m | Too strong | Minimal | Low | Low | ❌ Too close |
| 3-8m | Strong | Good | High | Low | ✅ Optimal |
| > 10-15m | Weak | Variable | Low | High | ❌ Too far |
Do: - Position sensor in the area to monitor (not necessarily in direct line with router) - Height: 1-1.5 meters from ground (desk/table height) - External antenna: Use IPEX connector for better reception
Don't: - Avoid metal obstacles between router and sensor (refrigerators, metal cabinets) - Avoid corners or enclosed spaces (reduces multipath diversity)
ESPectre uses a focused processing pipeline for motion detection:
┌─────────────┐
│ CSI Data │ Raw Wi-Fi Channel State Information
└──────┬──────┘
│
▼
┌─────────────┐
│ Gain Lock │ AGC/FFT stabilization (~3 seconds)
│ │ Locks hardware gain for stable measurements
└──────┬──────┘
│
▼
┌─────────────┐
│ Auto │ Automatic subcarrier selection (once at boot)
│ Calibration │ Selects optimal 12 subcarriers (NBVI)
└──────┬──────┘
│
▼
┌─────────────┐
│ Adaptive │ auto: P95 × 1.1 | min: P100
│ Threshold │ or fixed manual value
└──────┬──────┘
│
▼
┌─────────────┐
│ Hampel │ Turbulence outlier removal
│ Filter │ (enabled by default)
└──────┬──────┘
│
▼
┌─────────────┐
│ Low-pass │ Noise reduction (smoothing)
│ Filter │ (optional, disabled by default)
└──────┬──────┘
│
▼
┌─────────────┐
│ Detection │ MVS or ML score
│ Evaluation │ every evaluation_interval packets
└──────┬──────┘
│
▼
┌─────────────┐
│ Hit Filter │ motion_on_hits / motion_off_hits
│ │ edge-driven IDLE ↔ MOTION
└──────┬──────┘
│
▼
┌─────────────┐
│ Home │ Edge-driven motion binary +
│ Assistant │ periodic Movement Score / Threshold
└─────────────┘
┌─────────┐ ┌─────────┐ ┌─────────┐
│ ESP32 │ │ ESP32 │ │ ESP32 │
│ Room 1 │ │ Room 2 │ │ Room 3 │
└────┬────┘ └────┬────┘ └────┬────┘
│ │ │
└────────────┴────────────┘
│
│ ESPHome Native API
▼
┌────────────────────┐
│ Home Assistant │
│ (Auto-discovery) │
└────────────────────┘
Each sensor is automatically discovered by Home Assistant with: - Binary sensor for motion detection, published immediately on state edges - Movement score sensor, published on the periodic cadence - Adjustable threshold (number entity)
ESPectre implements NBVI (Normalized Band Variance Index) for automatic subcarrier selection, achieving near-optimal performance (F1>96%) with zero manual configuration. The algorithm selects 12 non-consecutive subcarriers based on stability metrics and spectral diversity.
⚠️ IMPORTANT (MVS mode): Keep the room quiet and still for 10 seconds after device boot. The auto-calibration runs during this time and movement will affect detection accuracy. ML mode skips calibration.
For algorithm details, see ALGORITHMS.md.
Click to expand FAQ
Q: Do I need programming knowledge to use it?
A: No! ESPectre uses YAML configuration files. Just download the example, flash it, and configure WiFi via the ESPHome app or web interface.
Q: Does it work with my router?
A: Yes, if your router has 2.4GHz Wi-Fi (virtually all modern routers have it).
Q: How much does it cost in total?
A: Hardware: ~€10 for an ESP32 device (S3/C6 recommended, other variants also work). Software: All free and open source. You'll also need Home Assistant running somewhere (Raspberry Pi ~€35-50, or any existing PC/NAS).
Q: Do I need to modify anything on the router?
A: No! The router works normally. The sensor "listens" to Wi-Fi signals without modifying anything.
Q: Does it work through walls?
A: Yes, the 2.4GHz Wi-Fi signal penetrates drywall. Reinforced concrete walls reduce sensitivity but detection remains possible at reduced distances.
Q: How many sensors are needed for a house?
A: It depends on size. One sensor can monitor ~50 m². For larger homes, use multiple sensors (1 sensor every 50-70 m² for optimal coverage).
Q: Can it distinguish between people and pets?
A: The system uses a 2-state segmentation model (IDLE/MOTION) that identifies generic movement without distinguishing between people, pets, or other moving objects. For more sophisticated classification (people vs pets, activity recognition, gesture detection), trained AI/ML models would be required (see Future Evolution section).
Q: Does it work with mesh Wi-Fi networks?
A: Yes, it works normally. Make sure the ESP32 connects to the 2.4 GHz band.
Q: How accurate is the detection?
A: Detection accuracy is highly environment-dependent and requires proper tuning. Factors affecting performance include: room layout, wall materials, furniture placement, distance from router (optimal: 3-8m), and interference levels. In optimal conditions with proper tuning, the system provides reliable movement detection. Adjust the segmentation_threshold parameter to tune sensitivity for your specific environment.
Q: What's the power consumption?
A: ~500mW typical during continuous operation. The firmware includes support for power optimization, and deep sleep modes can be implemented for battery-powered deployments, though this would require custom modifications to the code.
Q: If it doesn't work, can I get help?
A: Yes, open an Issue on GitHub or contact me via email.
Privacy, Security & Ethical Considerations (click to expand)
The system collects anonymous data related to the physical characteristics of the Wi-Fi radio channel: - Amplitudes and phases of OFDM subcarriers - Statistical signal variances - NOT collected: personal identities, communication contents, images, audio
CSI data represents only the properties of the transmission medium and does not contain direct identifying information.
WARNING: Despite the intrinsic anonymity of CSI data, this system can be used for:
The user is solely responsible for using this system and must:
For algorithm details (MVS, NBVI calibration, Hampel filter), see ALGORITHMS.md.
For performance metrics (confusion matrix, F1-score, benchmarks), see PERFORMANCE.md.
This project follows a dual-platform approach to balance innovation speed with production stability:
Target: End users, smart home enthusiasts, Home Assistant users
Target: Researchers, developers, academic/industrial applications
Micro-ESPectre gives you the fundamentals for: - People counting - Activity recognition (walking, falling, sitting
$ claude mcp add espectre \
-- python -m otcore.mcp_server <graph>