SAP 10.2 Table 2b note b) (PDF p.159) — verbatim: Multiply Temperature Factor by 0.9 if there is separate time control of domestic hot water (boiler systems, warm air systems and heat pump systems). The parenthetical list restricts the rule to systems where the heat generator (boiler / warm-air / HP) is the device heating the cylinder. Electric immersion is NOT in that list because the immersion isn't a heat-generator system feeding DHW — it sits inside the cylinder. The ×0.9 multiplier reflects shorter cylinder-heating periods when a boiler / HP / warm-air operates on a separate timer for DHW vs SH; if the heat generator doesn't feed the cylinder at all (because the immersion does), there's no such timing effect. Pre-slice `_separately_timed_dhw` returned True for any Cat 4 HP main BEFORE consulting WHC (line 3872 `if main.main_heating_category == 4: return True`). For electric 2 (sap_main_heating_code=524 Cat 5 warm-air ASHP, main_heating_category=4 per Elmhurst mapper, WHC=903 electric immersion + cylinder + cylinder thermostat lodged), the cat-4 branch fired before the existing `_is_electric_water` check could route the cert to False. The cascade applied ×0.9 to the Temperature Factor (53), pulling (55) from 1.2294 → 1.1064 → cascade annual (56) = 403.87 vs worksheet (56) annual = 448.73. Same WHC=903 principle as the prior slice S0380.156 (Table 3 zero- loss list for electric immersion): when HW is independent of the main heating, main-heating-specific DHW rules don't apply — even when the main happens to be a HP / boiler / warm-air system. Fix: new top-of-function `if epc.sap_heating.water_heating_code == _WHC_ELECTRIC_IMMERSION: return False` guard in `_separately_timed_dhw`. Reuses the constant introduced in S0380.156. Closures electric 2: Cylinder (56) storage loss annual 403.87 → 448.73 (matches worksheet 1.2294 × 365 = 448.73 EXACT within rounding) HW kWh demand 2339.24 → 2384.12 (matches worksheet (62)/(64) = 2384.116 EXACT) ΔSAP +0.8118 → +0.7002 Δcost −£18.71 → −£16.14 ΔCO2 −7.21 → −2.37 kg ΔPE −161.68 → −108.58 kWh The remaining +0.70 SAP residual is a separate upstream gap (likely warm-air-HP SH cascade or Table 4a SH efficiency for code 524) — follow-up slice. No regressions on the other 24 cohort variants. Cohort-1 ASHP certs (Cat 4 HP + WHC=901 = HW from HP + cylinder) keep ×0.9 as before because their WHC=901 doesn't trigger the new guard. Extended handover suite: 901 pass / 0 fail (was 900 — +1 from the new AAA test). Pyright net-zero (43 → 43). Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> |
||
|---|---|---|
| .devcontainer | ||
| .github/workflows | ||
| .idea | ||
| .vscode | ||
| applications | ||
| asset_list | ||
| backend | ||
| backlog | ||
| datatypes | ||
| deployment/terraform | ||
| docs | ||
| domain | ||
| epr_data_exports | ||
| etl | ||
| infrastructure | ||
| model_data/requirements | ||
| orchestration | ||
| recommendations | ||
| repositories | ||
| scripts | ||
| sfr/principal_pitch | ||
| survey_report | ||
| tests | ||
| utilities | ||
| utils | ||
| .coveragerc | ||
| .dockerignore | ||
| .gitignore | ||
| __init__.py | ||
| ara_backend_design.md | ||
| BaseUtility.py | ||
| CLAUDE.md | ||
| conftest.py | ||
| CONTEXT.md | ||
| devcontainer.sh | ||
| Dockerfile.test | ||
| Dockerfile.test.dockerignore | ||
| Makefile | ||
| MEMORY.md | ||
| package-lock.json | ||
| package.json | ||
| pyproject.toml | ||
| pyrightconfig.json | ||
| pytest.ini | ||
| README.md | ||
| run_lambda_local.sh | ||
| serverless.yml | ||
| test.requirements.txt | ||
| tox.ini | ||
| UBIQUITOUS_LANGUAGE.md | ||
Model Repository
This repository contains the code pertaining to the development of the data science and machine learning products being utilised by Hestia.
The different folders in this repository relate to services that can be used independently, or can be imported and used as part of a larger application
Getting Started
Prerequisites
Dev Container Setup
This repo uses a Docker Compose-based dev container. The model-backend service joins a shared-dev Docker network so it can communicate with other local services (e.g. a frontend container) running on your machine.
VS Code users: The initializeCommand in devcontainer.json creates the shared-dev network automatically before the container starts. No manual step required — just open the repo and select Reopen in Container.
Non-VS Code / CI workflows: Run the following once before starting the container:
make dev-setup
This is idempotent and safe to re-run if the network already exists.
Folders
backend/
This folder contains the code for the fastapi backend service, which provides an interface to much of the functionality in this repository, for the frontend
model_data/
This folder contains related to the reading and preparation of assessment model data, including pulling out epc attributes
Testing
All tests can be run, against the configuration in pytest.ini running
pytest
This will run the complete panel of tests and report on coverage in the locations specified by the pytest.ini file.
To run tests in a specific service, e.g. inside of model_data, simply run
pytest --cov-config=model_data/.coveragerc --cov=model_data
This will produce the test results and coverage reports