davecook / solar-panel-yield-2026
Reference calculator for PV soiling loss and water-fed pole cleaning ROI in Canada.
Package info
github.com/DaveCookVectorLabs/solar_panel_yield_2026
Language:Python
pkg:composer/davecook/solar-panel-yield-2026
Requires
- php: >=8.0
This package is not auto-updated.
Last update: 2026-04-13 02:25:47 UTC
README
Reference calculator, datasets, and working paper on photovoltaic (PV) soiling loss, water-fed pole (WFP) cleaning engineering, and cleaning ROI for PV systems in Canada.
What this is
A companion toolkit to the working paper Solar Panel Cleaning Yield Recovery: Soiling Loss, Water-Fed Pole Engineering, and Cleaning ROI for Photovoltaic Systems in Canada (v0.1.0, April 2026). The paper and this repository cover:
- Soiling physics: how fast transmittance drops as dust accumulates, by climate zone and panel tilt
- Water-fed pole engineering: deionized resin capacity as a function of inlet TDS, PV geometry to pole-length mapping, brush technique, and the fall-protection argument for grade-based operation
- Regional solar resource: monthly irradiance for six Ontario cities
- Cleaning economics: annual yield recovered vs cleaning interval for residential, commercial, and utility-scale systems
- Regulatory crosswalk: OSHA, CSA, IEC, ASTM, Health Canada, NRCan, ECCC
Repository layout
datasets/ 7 CSVs + generator + HF dataset card
pdfs/ Working paper (31 pages) + generator
docs/ Sphinx documentation (ReadTheDocs)
engines/ 8 language implementations:
python/ FastAPI + CLI reference engine (PyPI)
rust/ Actix-web server (Crates.io)
java/ Maven-packaged JAR (Maven Central)
ruby/ Gem (RubyGems)
elixir/ Mix package (Hex.pm)
php/ Composer library (Packagist)
go/ Go module (pkg.go.dev)
nostr/ Long-form article publisher (6 relays)
notebooks/ Jupyter notebook (GitHub browse)
kaggle/ Same notebook + Kaggle metadata
observable/ ObservableHQ notebook markdown
public/ PHP form + JS calculator
SOURCES.md Bibliography
Quick start (Python)
pip install solar-panel-yield-2026
python -c "from engine import calculate, _canonical_vector; print(calculate(_canonical_vector()))"
Or run the reference engine against the canonical test vector from the source tree:
python engines/python/engine.py sample
Or start the HTTP server:
python engines/python/engine.py serve --port 8000 curl -X POST http://127.0.0.1:8000/calculate -H 'Content-Type: application/json' -d '{ "system_capacity_kwp": 5.0, "ghi_annual_avg": 3.54, "days_since_cleaning": 30 }'
Cross-language parity
All eight engines produce identical output for the canonical test vector:
| Input | Value |
|---|---|
| system_capacity_kwp | 5.0 |
| ghi_annual_avg | 3.54 (Sudbury) |
| days_since_cleaning | 30 |
| soil_class | medium |
| climate_zone | temperate |
| panel_tilt_deg | 15 |
| electricity_price_cad_per_kwh | 0.14 |
| cleaning_visit_cost_cad | 120.00 |
| tap_water_tds_ppm | 180 |
| panel_height_ft | 12 |
| Output | Value |
|---|---|
| current_loss_pct.expected | 4.3485 % |
| lost_cad_per_day.expected | 0.0862 CAD |
| clean_annual_kwh | 5,168.4 |
| never_clean_annual_loss_cad | 86.83 |
| wfp_pole_ft | 10 |
| wfp_cartridge | 1L_cartridge |
| water_per_cleaning_l | 15.2 |
| ro_prestage_recommended | false |
Datasets
Seven CSVs published under CC BY 4.0; see datasets/README.md.
Working paper
31-page working paper, CC BY 4.0. Build from source:
pip install reportlab python pdfs/generate_pdfs.py
License
- Code: MIT (see
LICENSE) - Datasets, PDF, dataset card: CC BY 4.0
Maintainer
Dave Cook, Binx Professional Cleaning, North Bay, Ontario, Canada. Contact: dave@binx.ca.