The Roomba vacuum cleaning robot has been in the news a lot recently with claims that it is “spying” on its owners. Well, there is no reason then to not spy back. What is Roomba actually doing while you’re away?

We have an iRobot Roomba 980 that is connected to the Wi-Fi and that we can control through the iRobot app. It also generates a map of the cleaning area (thus the controversy), and we get notifications when the cleaning job is completed or when it gets stuck. And the more obstacles there are in cleaning area, the more Roomba is likely to get stuck. We get the “Roomba is stuck and needs assistance” error message maybe 1-2 times in 10 cleaning jobs.


Notice however the time difference between the two messages. Does this mean that during the 1h 30min from when Roomba says that the wheel is stuck and when it says it ended the job, it will still try to move and run its motors and keep alerting (through beeps or voice) that it needs assistance? That would be a waste of energy and potentially annoying for neighbours.

In order to find out what is happening, we have set out to spy on our Roomba with a sound sensor.


Materials and Assembly

Here’s the bill of materials (BOM) for the hardware:

Item Est. Price Description
1 x MAX4466 7.9$ This is the sound sensor (microphone). A product description is available at Adafruit.
1 x WeMos D1 mini (or WeMos D1 mini PRO) 3.5-5$ This is the brain of the project, a small board with Wi-Fi connectivity. See our blog post on these boards.

And here’s the hardware setup: noise_roomba_02

Detecting Noise Level

To get started with programming a WeMos, check out our other post. Then we can simply read the value from the Analog pin.

The MAX4466 mic has an adjustable gain, and we have tested the output of the sound level on different sounds (quiet room, music at an acceptable level, loud music etc.) to set the gain so that we capture the difference between a quiet environment and a loud one. This was done by having different sounds, looking at a plot of the output sound level, and adjusting the screw on the back of the mic accordingly.

The final code is on GitHub: WemosD1mini_Sound.

As we are only interested in the noise level, we sample the sounds from the mic and average them over a number of samples. This processing is done on the Wemos, and each 3-4 minutes we send an average of the sound level to the Adafruit IO service through MQTT.


We don’t record the sounds or voices, so there is no privacy implication. It’s just the sound level (or noise) that we are interested in.


The noise level data (recorded through Adafruit IO and seen below in our free DataFeeds app) can clearly identify when Roomba’s job started: 9 AM. The level goes up and down a bit and corresponds to Roomba probably going from one room to another. Then the noise level goes down 9:45 AM. That corresponds to when the notification “Roomba’s right wheel is stuck” is sent out.


The “Roomba ended the job stuck” notification is sent later, at 11:15, but we can now clearly see from the data that Roomba actually suffers quietly during this time period.

Mystery solved!