Home automation with high usefulness and low annoyance tends to rely on reliable person sensing, and [francescopace]’s ESPectre shows one way to do that cheaply and easily by leveraging hardware that’s already present on a common dev board.
ESPectre is an ESP32-based open source motion detector that detects movement without any cameras or microphones. It works similarly to millimeter-wave (mmWave) radar motion detectors in the sense that when a person moves, wireless signals are altered slightly as a result. ESPectre can detect this disturbance by watching and analyzing the Wi-Fi channel state information (CSI) and doing some very smart math and filtering. It’s cheap, easy to deploy and use, and even integrates with Home Assistant.
Combining a sensor like this with something else like a passive infrared (PIR) motion sensor is one way to get really robust results. But keep in mind that PIR only senses what it can see, whereas ESPectre works on WiFi, which can penetrate walls.
Since ESPectre supports low-cost ESP32 variants and is so simple to get up and running, it might be worth your time to give it a trial run. There’s even a browser-based ghost-dodging game [francescopace] put online that uses an ESPectre board plugged in over USB, which seems like a fun way to get a feel for what it can do.

Struggling to see the point of this. A mmwave sensor only adds about a fiver to the BOM.
Ask Fugen-Ferdl’s buddy Ignacio López about saving a cent every part you build…
I’m struggling to understand why these types of comments still exist on HAD.
The point, [Chris], is because they can. Because it is something interesting to explore. Because they don’t have or want to spend the additional fiver. Just… because.
I still don’t understand why James Maxwell was doing what he was doing instead of drinking beer and chasing lassies.
Couldn’t agree more. I mean why waste time developing the classical theory of electromagnetism, unifying electricity, magnetism, and light into a single framework described by his four famous equations, Maxwell’s Equations, which showed light is an electromagnetic wave when instead he could be out there banging the beers and lassies? Not even a contest.
Well said!
You should go ahead and send the fiver to me since you don’t need it.
I’m afraid you haven’t grasped the spirit of this site, despite what its name might suggest. Perhaps you’re just here looking for templates to develop your products.
Ask Fugen-Ferdl’s buddy Ignacio López about saving a cent every part you build…
I think its clever.
So it actually also requires a router to broadcast, and that router must be within a specific distance range to work — it’s not a standalone sensor. THAT would be a nice hack.
I didn’t look into the code, but what distinguishes this from a simple received signal strength measurement, RSSI? Just a bit of signal classification?
So, what, you want us to do your homework?
You should look into the code, or at least the writeup of how it’s done.
https://github.com/francescopace/espectre/blob/main/micro-espectre/ALGORITHMS.md
Also, the experimenter-friendly version, written in MicroPython so you can tweak the algorithms more easily:
https://github.com/francescopace/espectre/tree/main/micro-espectre
And I guess the “router” could be another ESP32 if you don’t already have WiFi in your home. But then, the whole premise here is kind of a home-automation, WiFi-based network… So it gets to take that part for granted, IMO.
RSSI is a single scalar value representing the aggregate received signal strength. It tells you “how strong is the signal?” – just one number.
CSI (Channel State Information) provides 64 complex values (for HT20 mode) – one amplitude and phase for each OFDM subcarrier. It’s essentially the frequency response of the wireless channel, showing how each frequency component is affected by the environment.
When someone moves in a room, they create small changes in multipath reflections. RSSI barely notices these changes (the total power is essentially constant). But CSI captures the spatial and frequency-selective effects of movement – some subcarriers see amplitude increases while others see decreases due to constructive/destructive interference patterns changing.
The algorithm then calculates spatial turbulence (standard deviation across subcarriers) and tracks its variance over time. Movement creates characteristic variance spikes that are much more detectable than any RSSI change.
It’s not “a bit of signal classification” – it’s exploiting the physics of multipath propagation that RSSI completely averages out :D
When someone moves in a room, they create small changes in multipath reflections. RSSI barely notices these changes (the total power is essentially constant). But CSI captures the spatial and frequency-selective effects of movement – some subcarriers see amplitude increases while others see decreases due to constructive/destructive interference patterns changing.
The algorithm then calculates spatial turbulence (standard deviation across subcarriers) and tracks its variance over time. Movement creates characteristic variance spikes that are much more detectable than any RSSI change.
It’s not “a bit of signal classification” – it’s exploiting the physics of multipath propagation that RSSI completely averages out :D
I appreciate that this has a “play with it yourself” aspect to it but from my perspective, it’s a repeat, and i can’t tell if it really added anything new. If it does add anything new, i’m sorry i didn’t click through to find out.
It seems to me like in the past these kind of things have had a very specific experimenal design: they make a measurement with the signal present (a person or motion or heartbeat within range) and then they make a measurement with the signal absent, and then they try to discern the difference between these two measurements.
That’s the same technique used for a lot of the spookier quantum mechanics demonstrations, and the thing is, it sucks. Once you know that there is a difference, and what that difference is, the fact that you can measure something you already knew isn’t subjectively impressive and it isn’t objectively meaningful. That’s why the spookier parts of quantum mechanics remain unproven, because no one has been able to invent an experiment that can measure the difference without deciding it before measuring it.
The physical world we know and love is constantly showing up as noise in electronic signals. I think it’s really neat that it’s vaguely possible to treat that noise as a signal and discern the physical world from it. But so far as i can tell, outside of very narrow and controlled situations, no one has been able to demonstrate that regular wifi chipsets can really help you with that goal.
” they make a measurement with the signal present (a person or motion or heartbeat within range) and then they make a measurement with the signal absent, and then they try to discern the difference between these two measurements.”
Except it doesn’t:
“No ML training required: Works out-of-the-box with mathematical algorithms”
I guess “movement or not” is a simpler question to answer than the last article (heartbeat iirc)
This is absolutely in line with the heartbeat detection one, but it’s also a completely
different, and simpler, implementation.
https://hackaday.com/2025/09/05/heart-rate-monitoring-via-wifi/
and a nice build on that one here:
https://hackaday.com/2025/09/23/heart-rate-measurement-via-wifi-the-diy-way/
This is so clever ! I will try to incorporate this to some of my existing ESPhome projects. I have a clock with an esp32 , if it can detect movements during the night and turn on for a minute it will be awesome, no hardware changes required and a great feature added ! Thank you for putting this together ! It will be a great addition to Home assistant enthusiasts with many ESPhome devices around the house for sure !
You can do that with Bluetooth, and it will cost you less, consume less, and…
Ok, the fun will be just the same. Go on and have fun, I like the fact itself that you made it and shared it. In my lab we used BT to count people in a room, but that required a bit of deep learning.
The deep-dive into the ESP32s signal strength stuff is brilliant. Short version: recent ESP32 apis give you much more fine-grained control over the WiFi radio than you might think. You can set the wifi gain amplifier, which means that you can hold it constant, which makes this whole project work, for instance. You can control with of the sub-carriers it’s using. Etc.
Very nice to have these low-level capabilities, at least for our crowd.
Thanks Elliot! I really appreciate your interest in the project.
I’ve been unironically working on a ESP32 ghost sensor, and I saw this and got worried for a moment someone had beat me to the punch.