diff --git a/domain/sap10_calculator/rdsap/cert_to_inputs.py b/domain/sap10_calculator/rdsap/cert_to_inputs.py index 21b05af9b..a1a8af635 100644 --- a/domain/sap10_calculator/rdsap/cert_to_inputs.py +++ b/domain/sap10_calculator/rdsap/cert_to_inputs.py @@ -7108,13 +7108,21 @@ def _primary_loss_override( water_heating_code=epc.sap_heating.water_heating_code, ): return None + # Heat-network DHW: either the space main is a network (WHC 901/902/914 + # inherit its DHW) or the DHW is its own water-only community scheme + # (WHC 950/951/952). SAP 10.2 §4.3 (PDF p.24) and Table 3's heat-network + # row both scope on the DHW source — "Where hot water is provided by a + # heat network" — not on the space main. + heat_network_dhw = is_heat_network_main(main) or ( + epc.sap_heating.water_heating_code in _WATER_HEAT_NETWORK_ONLY_CODES + ) # SAP 10.2 §4 "Heat networks" (PDF p.17 line 1482) pins community- # heating primary pipework to "insulated" (p=1.0), overriding the # RdSAP §3 age-band default which would otherwise return 0 for # pre-2007 stock. See `_HEAT_NETWORK_PIPEWORK_INSULATION_FRACTION`. pipework_p = ( _HEAT_NETWORK_PIPEWORK_INSULATION_FRACTION - if is_heat_network_main(main) + if heat_network_dhw else _pipework_insulation_fraction_table_3(primary_age) ) base = primary_loss_monthly_kwh( @@ -7126,7 +7134,7 @@ def _primary_loss_override( # row applies regardless of the thermostat / separate-timing # lodgement (and so is robust to the community-fuel-as-electric # collision that would otherwise route DHW to the h=5 row). - heat_network=is_heat_network_main(main), + heat_network=heat_network_dhw, ) # SAP 10.2 §12.4.4 (PDF p.36-37): for back-boiler combos summer DHW # comes from an electric immersion, not from the boiler — the boiler