On Saturday night I plugged a cheap USB radio receiver into the AI server in my garage and asked a simple question: if the house’s AI agent could listen to the airwaves itself, what would it go looking for?
The receiver is an RTL-SDR Blog V4. It’s a USB stick that started life as a TV tuner and turns out to hear almost everything from 24 MHz to 1.7 GHz: FM radio, aircraft, weather broadcasts, ham operators, the little sensors and key fobs that chirp on the license-free bands, and the gas meter on the side of the house. The agent is Hermes, the assistant that already runs the house, using the local models on the old-GPU server. By morning the setup had worked, partly failed in useful ways, heard a dozen airliners and the gas meter, and Hermes had spent 55 minutes exploring on its own and written a field report.
Giving an AI a radio without giving it the keys
The obvious way to do this is the wrong one. Hermes can run shell commands, so I could have installed the radio software and told it to have fun. But the radio sits in the server that runs every AI model in the house, and a shell there is a lot more than a radio. One bad command, or one cleverly worded web page that talks the agent into running something, and the problem isn’t a radio any more.
So the radio got a small, deliberately dumb service in front of it, called sdr-scout. Hermes talks to it as a set of tools, and the tools are recipes, not commands:
- Scan a band. Pick one from a fixed list (FM radio, aircraft, marine, NOAA weather, two ham bands, walkie-talkies, three sensor bands, aircraft transponders, or the whole range) and a duration. You get back the noise floor and the 15 strongest signals, each tagged steady, intermittent or burst.
- Decode sensors on 315, 433 or 915 MHz, aircraft transponders, or the household gas meter.
- Listen to one frequency inside a voice band, then transcribe it with the same Whisper model the house uses for voice commands.
Whatever the agent asks for, the only things that reach the radio are band names from a list and numbers inside fixed ranges. It never supplies a command, a file path or an arbitrary frequency. The gas meter’s ID lives in the service’s own config, so the agent can read our meter and only ours. Radio is a shared medium and the neighbours’ meters broadcast too, so their readings are dropped before anyone sees them. There’s one receiver, so only one job runs at a time; a second request gets a polite “busy, try again in 40 seconds” instead of a queue. Every call is written to an append-only log, and that log turned out to matter later.
All of it uses about 60 MB of memory and is capped at 1 GB, because this box has frozen before when a service grew without limits.
First light
The first test was mine: a 30-second sweep of the FM band, then a 45-second listen on the local public-radio station. The transcript came back clean, a local weather forecast followed by the network handing over to the BBC World Service for its midnight news. That’s a USB stick, an open-source demodulator and a speech model on a 2016 GPU, and the result read like a broadcast log.
Then Hermes got the same job without any hand-holding: list the bands, scan FM, wait, read the result, pick the strongest station, listen, report back. It did all of it in one go. It found 30 signals, rounded the strongest peak to the nearest real channel, listened for 30 seconds and correctly worked out that the station was playing contemporary worship music. It also noted that Whisper had probably mangled a lyric.
One night of radio
Then I left the radio running overnight on a schedule: full-range sweeps from 24 MHz to 1.7 GHz, a long look at the FM band, half an hour on each sensor band, two tries at the gas meter, and aircraft and airband captures at dawn.

Read it like a weather radar turned on its side. Each row is one sweep of the whole range, about 45 seconds, and time runs downward. The bright vertical lines are transmitters that never switch off:
- FM radio, the dense cluster just under 108 MHz.
- A digital TV station near 470 MHz, the single strongest signal all night at 40 dB above the noise.
- Cellular downlinks around 600 and 700 MHz, the towers talking to phones. They flicker as the traffic changes, even at 3 a.m.
The things that don’t look like transmitters are just as interesting. There’s a strong cluster near 27 MHz and a broad hump from about 120 to 180 MHz that pulses on and off in blocks. Neither has the shape of a station. My best guess, and Hermes’s too as it turned out, is that this is the server itself. The antenna is the stock one, sitting next to a machine full of switching power supplies and two big GPUs, which is roughly like trying to hear birdsong next to an air conditioner.

Zooming in on the FM band shows how much is out there even with a bad antenna. Each stripe is one station’s carrier, steady as a rock for the whole fifteen minutes.
I also turned the night into sound. In the clip below, time runs through the night, frequency becomes pitch (low radio frequencies are low notes), and loudness follows signal strength. The steady drone is the stations that never stop. The shifting texture on top is the cellular towers and the noise from the server breathing in and out.
The night’s spectrum as sound
55 minutes alone with a radio
At 2:40 a.m. the scheduled captures paused and Hermes got the radio to itself for 45 minutes. The instructions were: be curious, pick what to look at, follow up on anything interesting, drop dead ends, and write a field log at the end. It was told what had already been found so it wouldn’t repeat it. Everything else was its choice.

What it did was methodical, and a little poignant. It started with aircraft transponders, because that’s a fixed decode rather than a hunt, and heard nothing. It swept marine, NOAA weather and the 2-metre ham band and found them empty. The 70-centimetre ham band finally had something: seven signals, including one steady carrier, which it immediately listened to. It got silence. It moved to the aircraft band, found eight carriers, and listened to the three most promising one after another. Silence again. It tried the 315 MHz band where tyre-pressure sensors and garage remotes live, then gave aircraft a second, longer try, then went back to check two NOAA weather channels by ear, “scan said empty, but I wanted to hear it.” It finished on the walkie-talkie band and found five more signals.
Its field log was better than I expected. The most interesting part was its explanation for the empty results. It had noticed that the weather channels carried strong, continuous energy that transcribed as nothing at all, and that the noise floor there was “abnormally high for that band.” It concluded:
Likely a strong local interferer (the stock antenna is right next to a server, and 162.4-162.6 is a common crystal-harmonic landing spot…).
That is the same conclusion I’d come to from the waterfall, reached independently from its own measurements. Its summary of what limited it was blunt: the two bands most likely to carry human voices that night “came back as ‘power present, no speech.’”
It also got one thing wrong, and that matters. The log says three runs of aircraft listening added up to “three total hours.” The audit log says 2 + 5 + 10 minutes, about 17 minutes in all. Nothing bad came of it, but it’s exactly why the dumb service keeps its own record of every call. When an agent narrates its own work, you check the narration against the log.
Dawn
The aircraft transponder band was silent all night, for me and for Hermes. Then the sky woke up.

Two half-hour captures after 5:40 a.m. picked up twelve aircraft. Most were airliners between 10,000 and 28,000 feet, with American, Delta, WestJet, Alaska and SkyWest callsigns, and two jets holding 35,000 and 36,000 feet, one of them All Nippon Airways. The busiest sent 951 position messages to a stick on a shelf in a garage. So the antenna wasn’t deaf at 1090 MHz after all. At 3 a.m. there just wasn’t much to hear, and an agent can’t tell “nothing there” from “can’t hear it” without a second try at a better time. Hermes said exactly that in its log.
The aircraft voice band looked busier at dawn too: a 15-minute scan found 42 signals, against 8 in Hermes’s 2-minute look at three o’clock (a longer scan always catches more, so that’s not a fair race). But none of the eight one-minute listens caught a controller or a pilot talking. Short frequency hops are a lottery for voice. What it did catch was a lesson about speech models. On 131.550 MHz, a frequency aircraft use for short data bursts rather than voice, Whisper transcribed the noise as “Thank you. Thank you.” Speech models invent polite filler when they’re fed sound that isn’t speech. The service had flagged that one before I saw it: the audio had almost no activity, so the result came back marked “treat as possible hallucination.” That flag exists because Whisper is known for doing this, and it’s the kind of check I’d rather build into the tool than trust the agent to remember.
The gas meter came through a second time at 6:30, three more readings, which makes it repeatable rather than lucky.
What didn’t work, and one thing that finally did
Mostly reception, and the night was useful mainly for showing exactly where:
- Voices: none. Every listen on the aircraft, weather and ham bands came back as “power present, no speech,” and Hermes and the waterfall both point to the server itself as a big part of why.
- Sensors: nothing on 315, 433 or 915 MHz in about an hour and a half of listening. To rule out a software problem I ran the decoder’s raw pulse detector: about one pulse a minute at most. The bands really were quiet from where the antenna sits.
- The gas meter, at first: a five-minute try in the evening heard nothing, and a survey caught only a handful of packets from other meters.
That last one has a happy ending. At 4:30 a.m. the schedule gave the meter a fifteen-minute window, and three readings came through, all from our meter, decoded and checked against its ID. The meter only speaks up every few minutes, and with this antenna most of those transmissions get lost, so the trick was simply listening for longer. It’s the first reading off that meter since the old Home Assistant setup described here went quiet in August.
The failures point the same way. The receiver and the software are fine; the antenna is in the worst place in the house. That’s the next job: get it outside, or at least into a window, with a USB extension to put some distance between it and the server. With a better antenna the meter should come through every time, and its readings can go back into Home Assistant to replace the gas-usage feed that’s been dead since August.
What I took away
The interesting part wasn’t the radio. It was watching an AI agent work a problem with real instruments, where most of the answers are “nothing there.” It didn’t make things up to fill the silence. It changed course when a band was empty, went back to check a result by ear when the numbers looked odd, and worked out from its own measurements why it was struggling. Its one mistake was about its own work, not the world, and the plain log caught it.
The design choice I’d repeat is the boring one. The agent gets curiosity and a menu; the service between it and the hardware gets the judgement about what’s allowed. That’s why I could leave it alone with the radio at 3 a.m. without worrying about it.
