BREOS 0.3.2
[0.3.2] - 2026-06-26
Upgrading: config validation is now strict — a config with an unknown
top-level key (e.g. a typo likebatery_kwh) that silently defaulted in
0.3.1 now raises listing the offending key(s). Fix or remove stray keys
before upgrading. All other changes preserve prior behaviour by default.
Removed
- The
nrel-pysamruntime dependency. It was only ever reached transitively,
through pvlib'sfit_cec_sam, to fit the CEC single-diode parameters on the
default PV path.nrel-pysampublishes no Python 3.14 wheel or sdist and was
the sole blocker to running BREOS on 3.14.
Added
breos.cec_fit.fit_cec_params: a pure-scipy/pvlibimplementation of the
CEC 6-parameter coefficient calculator (Dobos 2012, DOI:10.1115/1.4005759),
a drop-in forpvlib.ivtools.sdm.fit_cec_sam. Across every bundled module it
reproduces the SAM fit to within 0.03% on maximum power over a
temperature x irradiance grid and 0.004% on annual energy, so model results
are unchanged. Validated against thenrel-pysamoracle by
tools/validate_cec_fit.py.- Python 3.14 support: the
3.14classifier and CI matrix entry, now that the
nrel-pysamblocker is gone. - Config validation now rejects unknown top-level keys. A typo such as
batery_kwhpreviously slipped throughmerge_defaultsand silently
defaulted (e.g. the battery to0), producing plausible-but-wrong results;
it now raises listing the offending key(s). The optionalmontecarlo
section is recognised so Monte Carlo configs still validate. - Configurable sky-diffusion (transposition) model via a
transposition_model
config key and--transposition-model/--sky-modelCLI flag, threaded
throughcalculate_pv_production_dc, the tracking and multi-array variants,
and theAppconfig surface. Supportsisotropic(default),klucher,
haydavies,reindl,king,perez, andperez-driessevia pvlib's
get_total_irradiance; the extra inputs the anisotropic models need
(extraterrestrial DNI, relative airmass) are derived internally. The default
isotropicreproduces prior results bit-for-bit. Per-array overrides are
supported inpv_arrays. - Configurable ground reflectance and Perez coefficients to drive those models
with real site information:albedo(0-1) or a namedsurface_type
("snow","sea","grass", ...) sets the ground-diffuse reflectance for
every model (previously fixed at pvlib's 0.25), andmodel_perezselects
the Perez coefficient set. All three are App config keys with matching
--albedo/--surface-type/--perez-modelCLI flags and per-array
overrides; not setting them leaves the previous defaults unchanged.
Changed
- The default PV path fits CEC parameters via
breos.cec_fit.fit_cec_params
instead ofpvlib.ivtools.sdm.fit_cec_sam;breos/solar.pyand the public
API are otherwise unchanged. - The two placeholder
Generic_400WandGeneric_600W_Bifacialcatalog
modules now carry realistic mono-PERC datasheet specifications (their
previous made-up values fit cleanly under SAM only via an internal
short-circuit-current heuristic); their nameplate power and keys are
unchanged. resolve_pv_systemno longer mutates the merged config in place to record
the derivedn_modules; the resolved count is materialised into a fresh
dict byresolve_app_config, so the dict wrapped by the frozen
ResolvedAppConfigis built once and the caller's input dict is left
untouched.