Metadata-Version: 2.4
Name: solar-panel-yield-2026
Version: 0.1.0
Summary: Reference calculator for PV soiling loss and water-fed pole cleaning ROI in Canada.
Author-email: Dave Cook <dave@binx.ca>
License: MIT
Project-URL: Homepage, https://github.com/DaveCookVectorLabs/solar_panel_yield_2026
Project-URL: Documentation, https://solar-panel-yield-2026.readthedocs.io/
Project-URL: Repository, https://github.com/DaveCookVectorLabs/solar_panel_yield_2026
Project-URL: Bug Tracker, https://github.com/DaveCookVectorLabs/solar_panel_yield_2026/issues
Project-URL: Working Paper (PDF), https://www.binx.ca/guides/solar-panel-cleaning-yield-recovery-guide.pdf
Keywords: solar,photovoltaic,cleaning,soiling,water-fed-pole,wfp,tds,deionization,canada,ontario,iec-61724,pv-operations
Classifier: Development Status :: 3 - Alpha
Classifier: Intended Audience :: Science/Research
Classifier: License :: OSI Approved :: MIT License
Classifier: Programming Language :: Python :: 3
Classifier: Topic :: Scientific/Engineering
Requires-Python: >=3.9
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: fastapi>=0.100.0
Requires-Dist: uvicorn>=0.23.0
Requires-Dist: pydantic>=2.0.0
Dynamic: license-file

# Solar Panel Cleaning Yield Recovery

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.

[![PyPI](https://img.shields.io/pypi/v/solar-panel-yield-2026.svg)](https://pypi.org/project/solar-panel-yield-2026/)
[![npm](https://img.shields.io/npm/v/@davecook/solar-panel-yield-2026.svg)](https://www.npmjs.com/package/@davecook/solar-panel-yield-2026)
[![Crates.io](https://img.shields.io/crates/v/solar-panel-yield-2026.svg)](https://crates.io/crates/solar-panel-yield-2026)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
[![Docs: CC BY 4.0](https://img.shields.io/badge/Docs-CC%20BY%204.0-blue.svg)](https://creativecommons.org/licenses/by/4.0/)

## 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)

```bash
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:

```bash
python engines/python/engine.py sample
```

Or start the HTTP server:

```bash
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:

```bash
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.
