Model/packages/domain
Khalim Conn-Kowlessar bfba610b70 §4 slice 7: combi loss (Table 3a time clock) + (62)m total demand
Two new public functions:

  combi_loss_monthly_kwh_table_3a_keep_hot_time_clock()
    Table 3a row "Instantaneous, with keep-hot facility controlled by
    time clock" → 600 × n_m / 365 kWh/month (flat 600 kWh/year prorated
    by month length, no fu adjustment).

  total_water_heating_demand_monthly_kwh(...)
    Spec formula (62)m = 0.85 × (45)m + (46)m + (57)m + (59)m + (61)m.
    (56)m storage loss is intentionally absent — folded into storage-
    system efficiency at the (64)m stage. (46)m distribution loss
    appears here AND in (65)m heat gains (weight 0.8), per spec.

000490 close end-to-end through (62)m: combi with time-clock keep-hot,
no storage, no solar, no primary loss → Jan = 0.85×187.86 + 28.18 + 0 +
0 + 50.96 = 238.82 matching the worksheet to 1e-3.

000474 deferred: its PCDF-listed Vaillant boiler uses Table 3b (tested
to EN 13203-2) which needs PCDB-backed r1 + F1 parameters. The (61)m
implementation for that branch lands in a future slice along with the
PCDB stub plumbing.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-20 16:06:05 +00:00
..
src/domain §4 slice 7: combi loss (Table 3a time clock) + (62)m total demand 2026-05-20 16:06:05 +00:00
pyproject.toml slice 13: to_rows(properties) returns pd.DataFrame 2026-05-16 16:43:28 +00:00
README.md added potential file scaffolding: 2026-05-15 10:56:53 +00:00

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/.