mirror of
https://github.com/Hestia-Homes/Model.git
synced 2026-06-08 11:17:27 +00:00
The PE cascade was crediting the PV split at annual Table 12 factors (IMPORT 1.501 / EXPORT 0.501) instead of the spec-correct effective monthly Table 12e factors. Per Appendix M1 §8 (p.94): "For calculation of primary energy, for electricity used within the dwelling apply the normal import PE factors for the relevant tariff from Table 12e. For the electricity exported, apply the factors for 'electricity sold to grid, PV', also from table 12e." Cert 0380 worksheet (page 5) lodges 1.4960 / 0.4268 — the effective monthly values weighted by E_PV,dw,m / E_PV,ex,m. The cascade now computes the same via `_effective_monthly_pe_factor` (the helper already in place for secondary heating, pumps+fans, lighting, electric showers). Two new Optional fields on `CalculatorInputs`: - `pv_dwelling_primary_factor` — falls back to `other_primary_factor` - `pv_exported_primary_factor` — falls back to `pv_export_primary_factor` Both populated in `cert_to_inputs.py` via `_effective_monthly_pe_ factor(pv_split.epv_*_monthly_kwh, fuel_code)` — code 30 (standard electricity) for dwelling, code 60 (electricity sold to grid, PV) for exported. Mirrors the existing CO2 cascade shape exactly. Cohort PE residual closure (kWh/m²): | Cert | Post-S0380.48 | Post-S0380.49 | |---|---:|---:| | 0350 | -3.58 | **-2.96** | | 0380 | -4.01 | **-3.06** | | 2225 | -4.50 | **-3.73** | | 2636 | -4.14 | **-3.44** | | 3800 | -4.01 | **-3.25** | | 9285 | -3.46 | **-2.81** | | 9418 | -3.76 | **-3.01** | | 2130 (PV gas) | -9.70 | **-8.22** | 7-cert ASHP+battery cluster closed by 0.6-0.8 kWh/m² each (matches the +0.074 differential between annual 0.501 and worksheet 0.4268 applied to E_PV,ex ≈ 640 kWh/yr / TFA 60.43 = 0.78 kWh/m²). The remaining -3 kWh/m² residual is β fine-tuning (cascade 0.751 vs worksheet 0.7426 — small monthly D_PV distribution detail). Cert 9501 (PV no battery) drifted +0.25 → +0.65 PE — known shape change from the factor correction; β=0.498 matches worksheet exactly so the drift uncovers a different small gap previously masked by the wrong factors. Still well within tolerance. CO2 + SAP unchanged. Pyright net-zero on touched files (34 errors before, 34 after — all pre-existing). |
||
|---|---|---|
| .. | ||
| addresses | ||
| sap10_calculator | ||
| sap10_ml | ||
| tasks | ||
| postcode.py | ||