Calibrated Ideas
← All posts

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.

Home Assistant WSPR Station Monitor dashboard showing live RX spots from European stations on 40m, with distance records panel

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 received
  • sensor.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).

Home Assistant WSPR Station Monitor: live spot table on the left showing European stations on 40m with SNR and distance values; WSPR Distance Records panel on the right showing all-time records of 6946 km RX and 5247 km TX
WSPR Station Monitor · 19 April 2025, 40m propagation to Europe and North America

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.

WSPR Records card showing furthest received station KK4JI at 4316 miles and furthest transmitted station WA2TP at 3260 miles
Distance record card · furthest RX and TX all-time

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.