System for managing and monitoring a small water system.
Gateway (linux.local) Cloud (Linode / casparwater.us)
┌───────────────────────┐ ┌──────────────────────────────┐
│ OTel Collector │ │ nginx (casparwater.us) │
│ → /home/data/*.json │ │ │
│ │ │ Duckpond (sitegen-only) │
│ Duckpond: water pond │──R2──▶│ ├─ import water from R2 │
│ ├─ logfile-ingest │ │ ├─ import noyo from R2 │
│ ├─ temporal-reduce │ │ ├─ combined sitegen │
│ ├─ pump cycle analysis │ │ └─ atomic deploy → nginx │
│ └─ push to R2 │ │ │
│ │ │ Site: / (water) │
│ Duckpond: noyo pond │──R2──▶│ Site: /noyo-harbor/ (noyo) │
│ ├─ HydroVu collection │ └──────────────────────────────┘
│ └─ push to R2 │
└───────────────────────┘
| Directory | Description |
|---|---|
site/ |
Caspar Water website: content pages, blog, templates, images, duckpond configs |
local/ |
Local site generation for content/style development |
cmd/ |
OpenTelemetry collector custom components |
collector/ |
Compiled collector binary |
terraform/station/gateway/ |
Gateway provisioning (collector + duckpond water/noyo) |
terraform/station/cloud/ |
Cloud provisioning (cross-pond sitegen + nginx) |
terraform/station/staging/ |
Pre-release staging on watershop |
sparkplug/, measure/, otlp/, model/, storage/, display/ |
Go packages |
- MQTT Sparkplug-B receiver
- Modbus receiver
- BME280 receiver
- Atlas Scientific EZO pH receiver
- Tiny LCD exporters
- Data recording tools
- Modified InfluxDB exporter
- Public data portal: well depth, tank level, system pressure, chlorine, pH
- Pump cycle analysis with drawdown/recovery charts
- Blog and community information pages
- Generated by DuckPond sitegen
- Custom billing program (
cmd/)
| I want to... | Do this |
|---|---|
| Iterate on content/style locally | cd local && ./setup.sh && ./sync.sh && ./generate.sh && ./serve.sh |
| Refresh after editing site content | cd local && ./refresh.sh |
| Re-sync data from staging | cd local && ./sync.sh && ./generate.sh |
| Test full pipeline before prod | cd terraform/station/staging && ./setup-all.sh && ./run-all.sh |
| Deploy to gateway | cd terraform/station/gateway && terraform apply |
| Deploy to cloud | cd terraform/station/cloud && terraform apply |
| Reset one pond on gateway | SSH in, ./duckpond/water/teardown.sh && ./duckpond/water/setup.sh |
| Reset site pond on cloud | SSH in, ./duckpond/teardown.sh && ./duckpond/setup.sh |
- UI1203 receiver (a.k.a. Sensus protocol), see https://github.com/jmacd/supruglue