From 1d0633f4a5dfe7e07f5f2d75250dd3248a5f4631 Mon Sep 17 00:00:00 2001 From: Khalim Conn-Kowlessar Date: Tue, 30 Jun 2026 17:57:04 +0000 Subject: [PATCH] =?UTF-8?q?Drag=20an=20oil=20room=20heater's=20coherent=20?= =?UTF-8?q?companions=20=F0=9F=9F=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Generalise the room-heater category-10 + conservative-control drag to cover both solid and oil families; oil's natural fuel is heating oil (28). Co-Authored-By: Claude Opus 4.8 (1M context) --- .../main_heating_system_overlay.py | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/domain/epc/property_overlays/main_heating_system_overlay.py b/domain/epc/property_overlays/main_heating_system_overlay.py index 5fb199407..f9b004cfc 100644 --- a/domain/epc/property_overlays/main_heating_system_overlay.py +++ b/domain/epc/property_overlays/main_heating_system_overlay.py @@ -78,6 +78,14 @@ _STORAGE_HEATER_CODES = frozenset(range(401, 410)) _ROOM_HEATER_CATEGORY = 10 _ROOM_HEATER_CONTROL = 2601 _SOLID_FUEL_ROOM_HEATER_CODES = frozenset(range(631, 637)) +# Oil room heaters (SAP Table 4a 621-625) — category 10, conservative room-heater +# control, natural fuel heating oil (RdSAP main_fuel 28). +_OIL_ROOM_HEATER_CODES = frozenset(range(621, 626)) +_OIL_FUEL = 28 +# Fuel-burning room heaters (solid + oil) share category 10 + the conservative +# room-heater control; only the natural fuel differs by family. (Distinct from +# `_ROOM_HEATER_CODES` above, which is the electric-room-heater dual-meter set.) +_CATEGORY_10_ROOM_HEATER_CODES = _SOLID_FUEL_ROOM_HEATER_CODES | _OIL_ROOM_HEATER_CODES # Natural-fuel coherence (ADR-0041): where an archetype unambiguously implies a # fuel, the overlay drags it so a system-only override is self-coherent on a cert @@ -182,7 +190,7 @@ def _control_for(code: int) -> Optional[int]: return _MANUAL_CHARGE_CONTROL if code in _GAS_BOILER_CODES: return _FULL_BOILER_CONTROL - if code in _SOLID_FUEL_ROOM_HEATER_CODES: + if code in _CATEGORY_10_ROOM_HEATER_CODES: return _ROOM_HEATER_CONTROL return None @@ -191,7 +199,7 @@ def _category_for(code: int) -> Optional[int]: """The SAP Table 4a heating category a code implies, where the archetype fixes it. Room heaters are category 10 — set so a system-only override reads as a room-heater system, not whatever category the replaced system carried.""" - if code in _SOLID_FUEL_ROOM_HEATER_CODES: + if code in _CATEGORY_10_ROOM_HEATER_CODES: return _ROOM_HEATER_CATEGORY if code in _HEAT_PUMP_CODES: return _HEAT_PUMP_CATEGORY @@ -208,6 +216,8 @@ def _natural_fuel_for(code: int) -> Optional[int]: return _ELECTRICITY_FUEL if code in _SOLID_FUEL_ROOM_HEATER_CODES: return _HOUSE_COAL_FUEL + if code in _OIL_ROOM_HEATER_CODES: + return _OIL_FUEL if code in _COMMUNITY_BOILER_CODES: return _COMMUNITY_GAS_FUEL return None