diff --git a/domain/epc/property_overlays/main_heating_system_overlay.py b/domain/epc/property_overlays/main_heating_system_overlay.py index 295a7e18f..2053423b9 100644 --- a/domain/epc/property_overlays/main_heating_system_overlay.py +++ b/domain/epc/property_overlays/main_heating_system_overlay.py @@ -137,6 +137,15 @@ _ELECTRIC_BOILER_CODES = frozenset({191, 192}) # HHRSH pathway, and an inherited 7 (storage) made the Table 12a resolver bill # direct-acting heat wholly at the off-peak low rate (ADR-0052, #1444). _ELECTRIC_BOILER_CATEGORY = 2 +# SAP Table 4e Group 1 boiler control: 2101 ("no time or thermostatic control +# of room temperature", +0.6 C) is the conservative default when the landlord +# named only the system — the largest Group 1 mean-internal-temperature +# adjustment, so an unobserved control is never over-credited (the boiler +# mirror of storage 2401 / room-heater 2601 / underfloor 2701). Deliberately +# NOT the gas boilers' modern 2106: the gas archetypes assume a whole modern +# condensing install; the electric-boiler archetypes describe an existing +# system of unknown vintage (ADR-0052). +_CONSERVATIVE_BOILER_CONTROL = 2101 # Electric underfloor — SAP Table 4a 421/422 (off-peak) and 424 (screed) — also # unambiguously electric (ADR-0046). _ELECTRIC_UNDERFLOOR_CODES = frozenset({421, 422, 424}) @@ -281,8 +290,9 @@ def _meter_for(code: int) -> Optional[str]: def _control_for(code: int) -> Optional[int]: """The control to assume when the landlord named only the system: a conservative manual charge control for storage heaters, full modern controls - for a gas boiler, None for systems that take neither (direct-acting electric). - Overwrites a stale control inherited from the system being replaced.""" + for a gas boiler, the conservative in-group default for the other mapped + families (room heaters, underfloor, electric boilers). Overwrites a stale + control inherited from the system being replaced.""" if code == _HHR_STORAGE_CODE: return _HHR_CHARGE_CONTROL if code in _STORAGE_HEATER_CODES: @@ -293,6 +303,8 @@ def _control_for(code: int) -> Optional[int]: return _ROOM_HEATER_CONTROL if code in _ELECTRIC_UNDERFLOOR_CODES: return _UNDERFLOOR_CONTROL + if code in _ELECTRIC_BOILER_CODES: + return _CONSERVATIVE_BOILER_CONTROL return None