mirror of
https://github.com/Hestia-Homes/Model.git
synced 2026-06-08 11:17:27 +00:00
Closes the final §4 cascade fail. SAP10.2 Appendix J step 8 (p.82)
specifies the electric-shower kWh formula:
N_ES = N_shower / N_outlets (eq J16)
EES,j,m = N_ES × f_beh × P_ES,j × 0.1 × n_m (eq J17)
EES,m = Σ EES,j,m (eq J18)
where P_ES,j defaults to Table J4 (p.83) row "Instantaneous electric
shower" = 9.3 kW for assessments of existing dwellings, and 0.1 = the
6-minute shower duration in hours.
For 000487 (N=2.492, has_bath, 1 electric shower, 0 mixer outlets):
N_shower = 0.45 × 2.492 + 0.65 = 1.7714
N_outlets = 1 (just the electric)
N_ES = 1.7714 / 1 = 1.7714
Jan: 1.7714 × 1.035 × 9.3 × 0.1 × 31 = 52.86 kWh ≈ PDF LINE_64A[1] = 52.8566 ✓
LINE_65 (heat gains from water heating) was undercounting by 25% of
the missing LINE_64A (the recovery factor for instantaneous electric
showers per the heat-gains formula); deriving LINE_64A from cert
closes it.
Changes:
- water_heating.py: new `electric_shower_monthly_kwh` function +
`electric_shower_count` parameter to `water_heating_from_cert`.
When count > 0 and no override, derives LINE_64A from N_outlets +
Table J4 default P_ES.
- cert_to_inputs.py: `_electric_shower_count_from_cert` helper +
plumb through both the §4 section helper and internal cascade.
Per-fixture cluster status (was/now):
§3 24/24 → 24/24 ✓ all 6 fixtures
§4 53/54 → 54/54 ✓ all 6 fixtures
§5 52/54 → 54/54 ✓ all 6 fixtures
§6 11/12 → 12/12 ✓ all 6 fixtures
§7 45/60 → 52/60 (000487 cascade closed; LINE_92/93 marginal on
000474/477/480/490 remains)
Scoreboard:
section_cascade_pins: 293 → 304 PASS (+11; 97.4% closure)
e2e SapResult: 32 → 33 PASS (+1, water_heating closure cascades)
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
||
|---|---|---|
| .. | ||
| src/domain | ||
| pyproject.toml | ||
| README.md | ||
domna-domain
Shared domain types — Property, Properties, BaselinePerformance, Plan, PlanPhase, Scenario, ScenarioPhase, ScenarioSnapshot, Recommendation, OptimisedPackage, EpcPropertyData, etc.
Boundary: types only. No persistence, no IO, no business logic. Other packages and services depend on domna-domain; this package depends on nothing internal.
Domain definitions live in ../../CONTEXT.md. New types added here must match the glossary terms.
Layout
src/domain/
├── __init__.py
├── property.py # Property, Properties, PropertyIdentity
├── site_notes.py
├── landlord_overrides.py
├── baseline_performance.py # lodged + effective pair (ADR-0004)
├── plan.py # Plan, PlanPhase, OptimisedPackage
├── scenario.py # Scenario, ScenarioPhase, ScenarioSnapshot (ADR-0005)
├── recommendation.py
├── geospatial.py
├── solar.py
├── anomaly_flags.py
└── ml/
├── __init__.py
├── transform.py # EpcMlTransform (versioned per §8.3)
└── schema.py
When datatypes/epc/domain/ folds in, the EPC schema types move under src/domain/epc/.