Standing up the weather pipeline that powers shanejarman.com.
I revived my 2006 weather station to see if I could get it running again. With the original receiver and USB adapter (plus a new sensor suite), I plugged it into a Raspberry Pi, installed weewx, and it came to life. The standard HTML export generated cleanly I started with the SQLite path first—since HTML generated by weewx comes straight from SQLite—and put that database online while I explored faster syncs to expose more data.
Weather Archive
The archive captures 5-minute increments for long-term trends. SQLite snapshots are mirrored to DigitalOcean Spaces and restored to the droplet as needed.
Archive Trade-offs
SQLite fit: One writer, many readers; tiny footprint on the Pi and simple to operate.
Postgres considered: WAL + logical replication would work, but felt like overkill and too memory hungry for the Pi.
Litestream replication: Spaces as durable storage, with a stable 10‑minute restore interval on the droplet.
Realtime Data
This path prioritizes immediacy: ~2‑second sampling intervals with roughly 1 hour retained locally, replicated to the cloud for availability. It took a while to decide which Influx to use, and a couple late evenings with Claude Code to write and re‑write a hook into the packet loop via weewx.wxstreaming.StdWxStreaming plus a custom InfluxDB client.
[[Services]]
# Standard WeeWX services
prep_services = weewx.engine.StdTimeSynch
data_services = ,
# Process services - Added StdWxStreaming to the end of the process services
process_services = weewx.engine.StdConvert, weewx.engine.StdCalibrate, weewx.engine.StdQC, weewx.wxservices.StdWXCalculate, weewx.wxstreaming.StdWxStreaming
xtype_services = weewx.wxxtypes.StdWXXTypes, weewx.wxxtypes.StdPressureCooker, weewx.wxxtypes.StdRainRater, weewx.wxxtypes.StdDelta
# Use the standard archive service with SQLite binding
archive_services = weewx.engine.StdArchive
restful_services =
report_services = weewx.engine.StdPrint
It is still a bit fragile—occasional corrupt series can crash the process—so I am hardening the adapter and retention policies as I go.
Weather System Components
Davis Vantage Pro Station: Collects rooftop telemetry that weewx ingests every few seconds.
Raspberry Pi running weewx: Normalizes packets; the processing loop runs wxstreaming.StdWxStreaming to handle outbound streaming.
weewx.wxstreaming.StdWxStreaming + Influx client: Module + custom client that forwards each packet to InfluxDB v2.
InfluxDB v2 (Local → DigitalOcean): Realtime path keeps ~1 hour of data at ~2‑second intervals; replicates upstream to InfluxDB on DigitalOcean to power cloud dashboards.
SSH tunnel to DigitalOcean: Keeps the droplet reachable despite residential networking and transports rendered HTML plus SQLite snapshots.
SQLite (Local): Archive path captures durable snapshots at 5-minute increments via the weewx standard library.
DigitalOcean Spaces (via Litestream): Litestream continuously uploads the SQLite database to Spaces object storage for durable, off-device backups.
Litestream restore → Droplet: Spaces is the source of truth; Litestream restores a fresh copy down to the droplet as needed.
FastAPI on the droplet: Serves endpoints backed by Influx (realtime) and SQLite (archive) to shanejarman.com over HTTPS.
Why It Matters
The intent is to keep realtime weather and the archive available in a readable online store at the same cadence as my local Davis receiver. Influx covers the fast path; SQLite + Spaces covers the long tail.