Citizen weather stations
weather.cwop reads Personal Weather Station reports from the Citizen Weather Observer Program. Use these rows as separately sourced weather inputs, never as an official settlement value.
Install the Python extra
Section titled “Install the Python extra”pip install "mostlyrightmd-weather[cwop]"CWOP is currently a Python-only surface. Live reports arrive through the APRS-IS TCP network; there is no official REST archive to query later.
Find stations near an official station
Section titled “Find stations near an official station”from mostlyright.weather import cwop
stations = cwop.nearby( "KNYC", radius_km=25, listen_seconds=60,)
for station in stations: print( station.id, station.distance_km, station.last_temp_f, station.qc_status, )Use scan(latitude, longitude) when you already have coordinates.
Collect current reports
Section titled “Collect current reports”from mostlyright.weather import cwop
frame = cwop.snapshot( "CW0875", duration_seconds=120, quality_control=True, persist=True,)
print(frame[[ "station_id", "observed_at", "knowledge_time", "temp_f", "qc_score", "qc_status", "source",]])snapshot() waits for a fixed collection window and returns a
schema.cwop.v1 frame. With persist=True, it also writes the collected rows
to the local monthly cache.
Use latest() for one blocking observation or stream() for an asynchronous
sequence:
async for observation in cwop.stream("CW0875"): print( observation.observed_at, observation.temp_f, observation.qc_status, )Replay only what you collected
Section titled “Replay only what you collected”from datetime import datefrom mostlyright.weather import cwop
history = cwop.history( "CW0875", date(2026, 1, 1), date(2026, 6, 30), qc_status="clean",)The APRS-IS stream cannot backfill dates before your collector started.
history() reads only rows previously written by snapshot(persist=True) or
persist_observations().
Live rows use source="cwop.live". Replayed rows use
source="cwop.cache".
Keep CWOP separate from official observations
Section titled “Keep CWOP separate from official observations”Personal stations can be indoors, mounted over hot roofs, or poorly calibrated. Mostly Right keeps CWOP out of the official observation merge and out of weather-market settlement labels.
The QC pipeline scores range, temporal consistency, indoor behavior, nearby
official stations, solar bias, and reporting reliability. Keep qc_status
visible when you join these rows into your own analysis.
Errors and limits
Section titled “Errors and limits”NoCWOPDataErroris raised when no station or report arrives in the requested window.- Live calls may wait for the configured listen or timeout period.
- No browser client is provided because APRS-IS requires a TCP connection.
- Move CWOP state with
MOSTLYRIGHT_CWOP_DIR; move the shared cache root withMOSTLYRIGHT_CACHE_DIR.
See also
Section titled “See also”- Quality control: QC vocabularies
- Cache: persistence paths and invalidation
- Sources & provenance: why CWOP remains a separate source
- Python reference