← Back to blog

Initial Commit

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.

Weather Archive — SQLite + LitestreamDavis to Raspberry Pi via weewx standard library, into local SQLite, streamed up to DigitalOcean Spaces with Litestream, restored to a droplet, served by FastAPI, and displayed on shanejarman.com.Davis Vantage ProRooftop sensorsRaspberry Pi (weewx)standard lib → SQLiteSQLite (Local)Litestream (up)DigitalOcean Spacesobject storagerestoreDigitalOcean DropletSQLite copyFastAPIshanejarman.comconsumes API

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.

Realtime Data — Influx PathDavis Vantage Pro to Raspberry Pi (weewx) through custom code into InfluxDB on the Pi, replicated to InfluxDB on DigitalOcean, served by FastAPI, then visualised on shanejarman.com.Davis Vantage ProRooftop sensorsRaspberry Pi (weewx)Normalizeweewx.wxstreamingStdWxStreamingcustom Influx clientInfluxDB v2 (Local)time-series storereplication streamInfluxDB v2 (DO)replication targetFastAPI (Droplet)shanejarman.comvisualisation

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.