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).
Measurement hardware
| Source | Radio / connection | Published measurements |
|---|---|---|
| Ecowitt WN31 rtl_433 identity: AmbientWeather-WH31B · ID 183 · channel 1 | 915 MHz | Outdoor temperature (tNNN, °F)Relative humidity ( hNN, %) |
| AcuRite 5-in-1 rtl_433: Acurite-5n1 · ID 1680 · channel A | 433 MHz | Wind direction (ddd, true degrees)Wind speed ( sss, knots)Wind gust ( gNNN, mph)Rain totals ( r, p, P, hundredths of an inch) |
| Adafruit BMP388 | Raspberry 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
rtl_433 verifies sensor packets and publishes atomic JSON observations to the Mosquitto MQTT broker.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
| Measurement | APRS representation | Source / calculation |
|---|---|---|
| Temperature | tNNN, whole °F | WN31 Celsius converted to Fahrenheit and rounded |
| Humidity | hNN, % | WN31 value validated from 0–100% |
| Wind | ddd sss gNNN | Recent direction/speed aggregation; speed in knots, gust in mph |
| Rain | rNNN pNNN PNNN | Previous hour, previous 24 hours, and local-midnight totals |
| Pressure | bNNNNN, tenths of hPa | BMP388 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.