← KM7GAN homepage

APRS Weather Station

KM7GAN-13 · Home Assistant, rtl_433, MQTT, and APRS-IS

Station profile

A Home Assistant-based weather station that validates radio sensor observations, combines them with local barometric pressure, and publishes weather packets to APRS-IS. The station uses the APRS weather symbol /_ and identifies its equipment as w400 (AcuRite 5-in-1).

KM7GAN-13APRS station callsign
APRS-ISPacket transport
DN40Operating grid region

Measurement hardware

SourceRadio / connectionPublished measurements
Ecowitt WN31
rtl_433 identity: AmbientWeather-WH31B · ID 183 · channel 1
915 MHzOutdoor temperature (tNNN, °F)
Relative humidity (hNN, %)
AcuRite 5-in-1
rtl_433: Acurite-5n1 · ID 1680 · channel A
433 MHzWind direction (ddd, true degrees)
Wind speed (sss, knots)
Wind gust (gNNN, mph)
Rain totals (r, p, P, hundredths of an inch)
Adafruit BMP388Raspberry Pi 5 I²C
/dev/i2c-1 · 0x77
Sea-level-reduced pressure (bNNNNN, hPa/mbar)

The Ecowitt WN31 is the authoritative APRS temperature and humidity source. Its radio format is identified by rtl_433 as AmbientWeather-WH31B; these are equivalent sensor labels in this setup. The AcuRite temperature and humidity fields are not used. The BMP388 is sampled once per minute; its onboard temperature is diagnostic only.

Installation locations

  • AcuRite 5-in-1: mounted on the chimney for wind and rainfall exposure.
  • Ecowitt WN31: mounted in a tree in the shady backyard for outdoor temperature and humidity.
  • BMP388: installed indoors on the Raspberry Pi 5. Its pressure reading is suitable for the station’s barometric-pressure reporting; its temperature reading is not used for APRS.

Station photos

Select any photo to open the full-size image.

AcuRite 5-in-1 weather sensor mounted above the roofline
AcuRite 5-in-1 weather sensor above the roofline.
Antenna mast and roofline near the weather station
Antenna mast and roofline near the station.
Close view of the connected electronics assembly and wiring
Raspberry Pi in a case with GPIO header.
Close-up of a small sensor electronics board and its connector
BMP388 barometric sensor board and connector detail.
Close-up of the board label and regulatory marks
RTL-SDR Blog V3 dongle used for 915 MHz rtl_433 capture.
Close-up of additional circuit-board markings
Additional RTL-SDR Blog V3 for 433 MHz.

Reception and publishing pipeline

1. Radio receptionTwo RTL-SDR receivers listen for the 433 MHz AcuRite and 915 MHz Ecowitt WN31 transmissions.
2. Decode and transportrtl_433 verifies sensor packets and publishes atomic JSON observations to the Mosquitto MQTT broker.
3. Weather modelA custom Python Home Assistant add-on validates identities and integrity checks, deduplicates receptions, derives wind and rain values, and reads the BMP388 over I²C.
4. APRS encodingThe add-on converts measurements to APRS weather fields, omitting optional values that are stale or incomplete.
5. APRS-IS publicationEncoded weather packets are rate-limited and sent to APRS-IS as KM7GAN-13.

Processing and quality rules

  • Only the configured model, device ID, channel, and integrity-check type are accepted.
  • Repeated rtl_433 receptions are deduplicated before updating the weather model.
  • Temperature must be no more than 10 minutes old to produce a packet; stale humidity or pressure is omitted.
  • Wind uses a circular mean of valid directions and arithmetic mean of speeds from the previous minute; gust is the maximum valid speed from the previous five minutes.
  • Rain history is persisted in SQLite for 72 hours. Counter resets create a new baseline instead of negative rainfall.
  • Rain intervals are omitted when samples are missing, too sparse, or separated by more than 30 minutes.

APRS fields and timing

MeasurementAPRS representationSource / calculation
TemperaturetNNN, whole °FWN31 Celsius converted to Fahrenheit and rounded
HumidityhNN, %WN31 value validated from 0–100%
Windddd sss gNNNRecent direction/speed aggregation; speed in knots, gust in mph
RainrNNN pNNN PNNNPrevious hour, previous 24 hours, and local-midnight totals
PressurebNNNNN, tenths of hPaBMP388 station pressure reduced to sea level using 1,313.8 m elevation

The station waits 120 seconds for initial collection, then sends no more often than every 5 minutes when the encoded weather changes. It sends at least once every 30 minutes even when unchanged.

View station activity

View KM7GAN-13 weather on aprs.fi

View KM7GAN-13 on CWOP (FindU)

The station’s weather packets are published through APRS-IS; availability depends on the Home Assistant host, sensor reception, and APRS-IS connectivity.