PHPackages                             davecook/solar-panel-yield-2026 - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. davecook/solar-panel-yield-2026

ActiveLibrary[Utility &amp; Helpers](/categories/utility)

davecook/solar-panel-yield-2026
===============================

Reference calculator for PV soiling loss and water-fed pole cleaning ROI in Canada.

v0.1.0(3mo ago)00MITPythonPHP &gt;=8.0

Since Apr 12Pushed 3mo agoCompare

[ Source](https://github.com/DaveCookVectorLabs/solar_panel_yield_2026)[ Packagist](https://packagist.org/packages/davecook/solar-panel-yield-2026)[ RSS](/packages/davecook-solar-panel-yield-2026/feed)WikiDiscussions main Synced 3w ago

READMEChangelogDependenciesVersions (2)Used By (0)

Solar Panel Cleaning Yield Recovery
===================================

[](#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://camo.githubusercontent.com/51b7abc9c7738f4b80456c79f25b9c2ff0184481a25031c80f8cff1ba2bf5934/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f736f6c61722d70616e656c2d7969656c642d323032362e737667)](https://pypi.org/project/solar-panel-yield-2026/)[![npm](https://camo.githubusercontent.com/0431296dca8c8a84ab63e5eb0534585f5564d8c875c1265e72c796aecf2be744/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f762f4064617665636f6f6b2f736f6c61722d70616e656c2d7969656c642d323032362e737667)](https://www.npmjs.com/package/@davecook/solar-panel-yield-2026)[![Crates.io](https://camo.githubusercontent.com/0310647d29308d0247929657758e55d8d7fd8068cd36e1d77f934143669ca5de/68747470733a2f2f696d672e736869656c64732e696f2f6372617465732f762f736f6c61722d70616e656c2d7969656c642d323032362e737667)](https://crates.io/crates/solar-panel-yield-2026)[![License: MIT](https://camo.githubusercontent.com/fdf2982b9f5d7489dcf44570e714e3a15fce6253e0cc6b5aa61a075aac2ff71b/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6963656e73652d4d49542d79656c6c6f772e737667)](LICENSE)[![Docs: CC BY 4.0](https://camo.githubusercontent.com/d74ebbf1b50d20f6f76e340df511b0d11e045be86a5ae8d0c5e532bfafc5b069/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f446f63732d43432532304259253230342e302d626c75652e737667)](https://creativecommons.org/licenses/by/4.0/)

What this is
------------

[](#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
-----------------

[](#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)
--------------------

[](#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
---------------------

[](#cross-language-parity)

All eight engines produce identical output for the canonical test vector:

InputValuesystem\_capacity\_kwp5.0ghi\_annual\_avg3.54 (Sudbury)days\_since\_cleaning30soil\_classmediumclimate\_zonetemperatepanel\_tilt\_deg15electricity\_price\_cad\_per\_kwh0.14cleaning\_visit\_cost\_cad120.00tap\_water\_tds\_ppm180panel\_height\_ft12OutputValuecurrent\_loss\_pct.expected4.3485 %lost\_cad\_per\_day.expected0.0862 CADclean\_annual\_kwh5,168.4never\_clean\_annual\_loss\_cad86.83wfp\_pole\_ft10wfp\_cartridge1L\_cartridgewater\_per\_cleaning\_l15.2ro\_prestage\_recommendedfalseDatasets
--------

[](#datasets)

Seven CSVs published under CC BY 4.0; see `datasets/README.md`.

Working paper
-------------

[](#working-paper)

31-page working paper, CC BY 4.0. Build from source:

```
pip install reportlab
python pdfs/generate_pdfs.py
```

License
-------

[](#license)

- **Code:** MIT (see `LICENSE`)
- **Datasets, PDF, dataset card:** CC BY 4.0

Maintainer
----------

[](#maintainer)

Dave Cook, Binx Professional Cleaning, North Bay, Ontario, Canada. Contact: .

###  Health Score

29

—

LowBetter than 57% of packages

Maintenance80

Actively maintained with recent releases

Popularity0

Limited adoption so far

Community2

Small or concentrated contributor base

Maturity29

Early-stage or recently created project

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Unknown

Total

1

Last Release

103d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/dd835051bc63bd26f7ce0558ef339a45045e09d8306b7c6ca7d53a4ccd5828e0?d=identicon)[Dave Cook](/maintainers/Dave%20Cook)

### Embed Badge

![Health badge](/badges/davecook-solar-panel-yield-2026/health.svg)

```
[![Health](https://phpackages.com/badges/davecook-solar-panel-yield-2026/health.svg)](https://phpackages.com/packages/davecook-solar-panel-yield-2026)
```

###  Alternatives

[yiidoc/yii2-timeago

Timeago is a jQuery plugin that makes it easy to support automatically updating fuzzy timestamps. Forked from @rmm5t for Yii2 framework.

12108.0k5](/packages/yiidoc-yii2-timeago)[phpcfdi/xml-cancelacion

Genera documentos de cancelación de CFDI firmados (XMLSEC)

1154.9k5](/packages/phpcfdi-xml-cancelacion)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
