Home Assistant: building a WSPR radio integration with AI assistance
WSPR signals tell you how radio propagation is behaving on any given day. I wanted that data inside Home Assistant, so I built an integration to bring it there.
WSPR (Weak Signal Propagation Reporter) is an amateur radio mode designed for one narrow purpose: finding out how well signals are travelling. Transmissions are very low power, typically a watt or less, and very short. Each transmission encodes a callsign, grid locator and power level, then gets decoded and logged by receivers worldwide. The data ends up at wspr.live, a public database of reception reports updated continuously. It is an efficient way to read the ionosphere.
I run WSPR from my station (G5OHM), using WSJT-X software alongside an HF transceiver. The data is there on WSPRnet and PSKReporter, available to look at any time. What I wanted was to see it inside Home Assistant alongside everything else on my dashboard, without switching between applications.
There was no existing integration. I built one.
What the integration does
Two sensors are created:
sensor.wspr_live_rx_spots: stations I have receivedsensor.wspr_live_tx_spots: stations that have received me
Every 30 to 60 minutes the integration queries the WSPR.live API, processes the returned JSON and updates both sensors. Each spot entry includes the callsign, signal-to-noise ratio, frequency band (mapped from raw frequency to the standard amateur bands: 40m, 20m, 30m, and so on), distance in kilometres, and country, resolved from the callsign prefix using a lookup table.
Home Assistant input helpers track the furthest received and transmitted distances, updating automatically whenever a new record is set. On 19 April 2025, a particularly good morning on 40m, the dashboard was showing 100 received spots and 50 transmitted, with the furthest RX at 6,946 km (KK4JI, USA) and the furthest TX at 5,247 km (WA2TP, USA).

The dashboard shows a table of current spots with callsign, band, SNR and distance; a running count per band; and the all-time and current-session distance records for each direction.

Everything runs locally. The only external call is to the WSPR.live API.
How it was built
The architecture is straightforward: a polling coordinator fetches fresh data at the configured interval, processes it into sensor attributes and makes it available through the standard Home Assistant entity model. Country lookup runs from a callsign prefix table; band mapping is a static dictionary keyed on frequency ranges.
I am not a software developer. My background is in electronics and instrumentation. Getting the Home Assistant integration architecture right (config entries, coordinators, entity registration) takes longer to understand from scratch than the core data logic. What changed is that AI tools (I used Claude and ChatGPT across different stages) can generate structural scaffolding and explain what error messages mean. The decisions about what to display, how to structure the data, and when something was working correctly were mine. The AI kept me moving through the parts I would otherwise have got stuck on.
The code is on GitHub: Dtwo-sys/wspr_live.
If you run WSPR and use Home Assistant, it should work as a custom component. If you find problems or have suggestions, raise an issue on the repository.