diff --git a/domain/sap10_ml/sap_efficiencies.py b/domain/sap10_ml/sap_efficiencies.py index 59ce819c..29550950 100644 --- a/domain/sap10_ml/sap_efficiencies.py +++ b/domain/sap10_ml/sap_efficiencies.py @@ -62,7 +62,13 @@ _SPACE_EFF_BY_CODE: Final[dict[int, float]] = { 607: 0.45, 609: 0.58, 610: 0.72, 611: 0.85, 612: 0.20, 613: 0.90, # Room heaters — liquid. 621: 0.55, 622: 0.65, 623: 0.60, 624: 0.70, 625: 0.94, - # Room heaters — solid (column B non-HETAS). + # Room heaters — solid. SAP 10.2 Table 4a (p.167): column (A) is the + # minimum for HETAS-approved appliances, column (B) for other + # appliances. RdSAP defaults to column (B) when approval is not + # lodged (Elmhurst worksheet "solid fuel 9" code 636 → (206)=70 = B), + # so these are the column-(B) space efficiencies: 631 open fire 32, + # 632 +back boiler 50, 633 closed room heater 60, 634 +boiler 65, + # 635 pellet stove 65, 636 +boiler 70. 631: 0.32, 632: 0.50, 633: 0.60, 634: 0.65, 635: 0.65, 636: 0.70, # Room heaters — electric. 691: 1.00, 692: 1.00, 693: 1.00, 694: 1.00, diff --git a/domain/sap10_ml/tests/test_sap_efficiencies.py b/domain/sap10_ml/tests/test_sap_efficiencies.py index 435fae6c..b8245d6c 100644 --- a/domain/sap10_ml/tests/test_sap_efficiencies.py +++ b/domain/sap10_ml/tests/test_sap_efficiencies.py @@ -51,6 +51,22 @@ def test_seasonal_efficiency_ground_source_heat_pump_returns_table4a_value() -> assert result == pytest.approx(2.30, abs=0.005) +def test_seasonal_efficiency_solid_fuel_room_heaters_use_table4a_column_b() -> None: + # Arrange — SAP 10.2 Table 4a (p.167) solid-fuel room heaters give + # column (A) for HETAS-approved appliances and column (B) for other + # appliances. RdSAP defaults to column (B) when HETAS approval is not + # lodged (Elmhurst worksheet "solid fuel 9" code 636 → (206)=70 = B): + # 631 open fire 32, 633 closed room heater 60, 634 with boiler 65, + # 635 pellet stove 65, 636 with boiler 70. + + # Act / Assert + assert seasonal_efficiency(sap_main_heating_code=631) == 0.32 + assert seasonal_efficiency(sap_main_heating_code=633) == 0.60 + assert seasonal_efficiency(sap_main_heating_code=634) == 0.65 + assert seasonal_efficiency(sap_main_heating_code=635) == 0.65 + assert seasonal_efficiency(sap_main_heating_code=636) == 0.70 + + def test_seasonal_efficiency_oil_boiler_returns_table4b_value() -> None: # Arrange — Table 4b, code 126 standard oil 1998+ -> 80% winter.