From 6bad3a216a6a92ee2641b2685e4a3304e19a9e17 Mon Sep 17 00:00:00 2001 From: Khalim Conn-Kowlessar Date: Fri, 3 Jul 2026 14:19:20 +0000 Subject: [PATCH] =?UTF-8?q?Air-source=20heat-pump=20overrides=20drag=20the?= =?UTF-8?q?=20conservative=20Group=202=20control=20(2201)=20=F0=9F=9F=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.8 --- .../main_heating_system_overlay.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/domain/epc/property_overlays/main_heating_system_overlay.py b/domain/epc/property_overlays/main_heating_system_overlay.py index 2053423b9..af334f41c 100644 --- a/domain/epc/property_overlays/main_heating_system_overlay.py +++ b/domain/epc/property_overlays/main_heating_system_overlay.py @@ -168,6 +168,17 @@ _UNDERFLOOR_CONTROL = 2701 # without a PCDB index (ADR-0041). _HEAT_PUMP_CATEGORY = 4 _HEAT_PUMP_CODES = frozenset(range(211, 225)) | frozenset(range(521, 528)) +# SAP Table 4e Group 2 heat-pump control: 2201 ("no time or thermostatic +# control of room temperature", +0.3 C) is the conservative default when the +# landlord named only the system — the largest Group 2 adjustment, so an +# unobserved control is never over-credited. Deliberately NOT the ASHP +# Measure's 2210 zone control: a measure designs a modern end-state +# (ADR-0024); an override describes an existing pump (ADR-0053). Scoped to the +# WET heat pumps (211-224) — warm-air pumps (521-527) take Table 4e Group 5 +# and stay unmapped (no archetype maps to them; the incomplete-companion raise +# guards that a future one cannot land without choosing its Group 5 control). +_WET_HEAT_PUMP_CODES = frozenset(range(211, 225)) +_CONSERVATIVE_HEAT_PUMP_CONTROL = 2201 # Community / heat-network heating (SAP Table 4a 301-304) is category 6; the # calculator's `_is_heat_network` keys off code OR category 6. The boiler-driven @@ -305,6 +316,8 @@ def _control_for(code: int) -> Optional[int]: return _UNDERFLOOR_CONTROL if code in _ELECTRIC_BOILER_CODES: return _CONSERVATIVE_BOILER_CONTROL + if code in _WET_HEAT_PUMP_CODES: + return _CONSERVATIVE_HEAT_PUMP_CONTROL return None