← 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.

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.