From 8e33a8de53c72acad237e13f70ebcb4aff4cdb05 Mon Sep 17 00:00:00 2001 From: Jun-te Kim Date: Thu, 2 Jul 2026 23:27:57 +0000 Subject: [PATCH] test(accuracy): ratchet 77.3% -> 77.7% via flat-roof insulation-thickness fix (Elmhurst-validated) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A FLAT roof lodges its insulation thickness in the DEDICATED gov-EPC API `flat_roof_insulation_thickness` field (e.g. "75mm"), leaving `roof_insulation_thickness` None (that field is for pitched-loft joists). `heat_transmission_from_cert` read only the latter, so a measured flat-roof thickness was ignored and the roof billed at the uninsulated age-band flat default (age E = 1.5) instead of its Table-16 insulated U. Fixed by preferring `flat_roof_insulation_thickness` when the part is a flat roof — the exact mirror of the existing rafter-thickness branch. An "AB"/"NI" (as-built/unknown) value parses to None and keeps the age-band default, unchanged; only measured thicknesses move. PER-CERT ELMHURST VALIDATION (cert 47084930, top-floor flat, flat roof 75 mm): built on the lodged inputs in accredited Elmhurst RdSAP10-Online (evidence saved: elmhurst_summary.pdf / elmhurst_worksheet.pdf). The worksheet bills "insulated flat roof" at U 0.5 (floor 0.70 + wall 0.25 also matching the engine). The fix takes the engine roof 96.4 -> 32.1 W/K (= 64.26 x 0.5, Elmhurst-exact), PE +47 -> +0.2, SAP 69.51 -> 74.34 = lodged 74. Gauge: within 77.3% -> 77.7%, SAP MAE 0.648 -> 0.641, CO2 0.074 -> 0.072, PE 3.1 -> 2.97. Unit-pinned in test_heat_transmission (flat_roof_insulation_thickness -> U 0.5); RealCertExpectation 47084930 = 74 (Elmhurst-validated). Also adds the build script build_47084930.py. Co-Authored-By: Claude Fable 5 --- .../uprn_47084930/elmhurst_summary.pdf | Bin 0 -> 77720 bytes .../uprn_47084930/elmhurst_worksheet.pdf | Bin 0 -> 43647 bytes .../uprn_47084930/epc.json | 324 ++++++++++++++ .../worksheet/heat_transmission.py | 16 + scripts/corpus_1000/worklist.md | 416 +++++++++--------- scripts/hyde/build_47084930.py | 299 +++++++++++++ .../test_real_cert_sap_accuracy.py | 18 + .../worksheet/test_heat_transmission.py | 40 ++ .../epc_client/test_sap_accuracy_corpus.py | 18 +- 9 files changed, 915 insertions(+), 216 deletions(-) create mode 100644 backend/epc_api/json_samples/real_life_examples/RdSAP-Schema-21.0.1/uprn_47084930/elmhurst_summary.pdf create mode 100644 backend/epc_api/json_samples/real_life_examples/RdSAP-Schema-21.0.1/uprn_47084930/elmhurst_worksheet.pdf create mode 100644 backend/epc_api/json_samples/real_life_examples/RdSAP-Schema-21.0.1/uprn_47084930/epc.json create mode 100644 scripts/hyde/build_47084930.py diff --git a/backend/epc_api/json_samples/real_life_examples/RdSAP-Schema-21.0.1/uprn_47084930/elmhurst_summary.pdf b/backend/epc_api/json_samples/real_life_examples/RdSAP-Schema-21.0.1/uprn_47084930/elmhurst_summary.pdf new file mode 100644 index 0000000000000000000000000000000000000000..80c83175cb665a85eba4de660b00945bd147ac13 GIT binary patch literal 77720 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 z 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 literal 0 HcmV?d00001 diff --git a/backend/epc_api/json_samples/real_life_examples/RdSAP-Schema-21.0.1/uprn_47084930/epc.json b/backend/epc_api/json_samples/real_life_examples/RdSAP-Schema-21.0.1/uprn_47084930/epc.json new file mode 100644 index 000000000..f268aac88 --- /dev/null +++ b/backend/epc_api/json_samples/real_life_examples/RdSAP-Schema-21.0.1/uprn_47084930/epc.json @@ -0,0 +1,324 @@ +{ + "uprn": 47084930, + "roofs": [ + { + "description": "Flat, insulated", + "energy_efficiency_rating": 3, + "environmental_efficiency_rating": 3 + } + ], + "walls": [ + { + "description": "Cavity wall, with internal insulation", + "energy_efficiency_rating": 4, + "environmental_efficiency_rating": 4 + } + ], + "floors": [ + { + "description": "(other premises below)", + "energy_efficiency_rating": 0, + "environmental_efficiency_rating": 0 + } + ], + "status": "entered", + "tenure": 3, + "window": { + "description": "Fully double glazed", + "energy_efficiency_rating": 3, + "environmental_efficiency_rating": 3 + }, + "lighting": { + "description": "Excellent lighting efficiency", + "energy_efficiency_rating": 5, + "environmental_efficiency_rating": 5 + }, + "postcode": "NE12 8AQ", + "hot_water": { + "description": "From main system", + "energy_efficiency_rating": 4, + "environmental_efficiency_rating": 4 + }, + "post_town": "NEWCASTLE UPON TYNE", + "built_form": "NR", + "created_at": "2026-05-06 10:59:38", + "door_count": 0, + "region_code": 1, + "report_type": 2, + "sap_heating": { + "number_baths": 1, + "cylinder_size": 1, + "shower_outlets": [ + { + "shower_wwhrs": 1, + "shower_outlet_type": 1 + } + ], + "number_baths_wwhrs": 0, + "water_heating_code": 901, + "water_heating_fuel": 26, + "main_heating_details": [ + { + "has_fghrs": "N", + "main_fuel_type": 26, + "boiler_flue_type": 2, + "fan_flue_present": "Y", + "heat_emitter_type": 1, + "emitter_temperature": 0, + "main_heating_number": 1, + "main_heating_control": 2106, + "main_heating_category": 2, + "main_heating_fraction": 1, + "central_heating_pump_age": 0, + "main_heating_data_source": 1, + "main_heating_index_number": 17815 + } + ], + "immersion_heating_type": "NA", + "has_fixed_air_conditioning": "false" + }, + "sap_version": 10.2, + "sap_windows": [ + { + "pvc_frame": "true", + "orientation": 3, + "window_type": 1, + "glazing_type": 2, + "window_width": 1.23, + "window_height": 1.61, + "draught_proofed": "true", + "window_location": 0, + "window_wall_type": 1, + "permanent_shutters_present": "N", + "permanent_shutters_insulated": "N" + }, + { + "pvc_frame": "true", + "orientation": 3, + "window_type": 1, + "glazing_type": 2, + "window_width": 1.23, + "window_height": 1.61, + "draught_proofed": "true", + "window_location": 0, + "window_wall_type": 1, + "permanent_shutters_present": "N", + "permanent_shutters_insulated": "N" + }, + { + "pvc_frame": "true", + "orientation": 3, + "window_type": 1, + "glazing_type": 2, + "window_width": 1.23, + "window_height": 1.61, + "draught_proofed": "true", + "window_location": 0, + "window_wall_type": 1, + "permanent_shutters_present": "N", + "permanent_shutters_insulated": "N" + }, + { + "pvc_frame": "true", + "orientation": 3, + "window_type": 1, + "glazing_type": 2, + "window_width": 1.23, + "window_height": 1.61, + "draught_proofed": "true", + "window_location": 0, + "window_wall_type": 1, + "permanent_shutters_present": "N", + "permanent_shutters_insulated": "N" + }, + { + "pvc_frame": "true", + "orientation": 3, + "window_type": 1, + "glazing_type": 2, + "window_width": 1.23, + "window_height": 1.61, + "draught_proofed": "true", + "window_location": 0, + "window_wall_type": 1, + "permanent_shutters_present": "N", + "permanent_shutters_insulated": "N" + } + ], + "schema_type": "RdSAP-Schema-21.0.1", + "uprn_source": "Energy Assessor", + "country_code": "ENG", + "main_heating": [ + { + "description": "Boiler and radiators, mains gas", + "energy_efficiency_rating": 4, + "environmental_efficiency_rating": 4 + } + ], + "air_tightness": { + "description": "(not tested)", + "energy_efficiency_rating": 0, + "environmental_efficiency_rating": 0 + }, + "dwelling_type": "Top-floor flat", + "language_code": 1, + "pressure_test": 4, + "property_type": 2, + "address_line_1": "83 Station Road", + "address_line_2": "Forest Hall", + "assessment_type": "RdSAP", + "completion_date": "2026-05-06", + "inspection_date": "2026-05-05", + "extensions_count": 0, + "measurement_type": 1, + "sap_flat_details": { + "level": 3, + "top_storey": "Y", + "storey_count": 2, + "flat_location": 1, + "heat_loss_corridor": 1 + }, + "total_floor_area": 64, + "transaction_type": 8, + "conservatory_type": 1, + "has_draught_lobby": "true", + "heated_room_count": 3, + "registration_date": "2026-05-06", + "sap_energy_source": { + "mains_gas": "Y", + "meter_type": 2, + "pv_connection": 0, + "photovoltaic_supply": { + "none_or_no_details": { + "percent_roof_area": 0 + } + }, + "wind_turbines_count": 0, + "gas_smart_meter_present": "true", + "is_dwelling_export_capable": "false", + "wind_turbines_terrain_type": 2, + "electricity_smart_meter_present": "true" + }, + "secondary_heating": { + "description": "None", + "energy_efficiency_rating": 0, + "environmental_efficiency_rating": 0 + }, + "sap_building_parts": [ + { + "identifier": "Main Dwelling", + "wall_dry_lined": "N", + "wall_thickness": 380, + "floor_heat_loss": 3, + "roof_construction": 1, + "wall_construction": 4, + "building_part_number": 1, + "sap_floor_dimensions": [ + { + "floor": 0, + "room_height": { + "value": 2.32, + "quantity": "metres" + }, + "total_floor_area": { + "value": 64.26, + "quantity": "square metres" + }, + "party_wall_length": { + "value": 18.15, + "quantity": "metres" + }, + "heat_loss_perimeter": { + "value": 18.15, + "quantity": "metres" + } + } + ], + "wall_insulation_type": 3, + "construction_age_band": "E", + "party_wall_construction": 0, + "wall_thickness_measured": "Y", + "roof_insulation_location": 6, + "wall_insulation_thickness": "100mm", + "flat_roof_insulation_thickness": "75mm" + } + ], + "solar_water_heating": "N", + "habitable_room_count": 3, + "heating_cost_current": { + "value": 623, + "currency": "GBP" + }, + "insulated_door_count": 0, + "co2_emissions_current": 2.0, + "energy_rating_average": 60, + "energy_rating_current": 74, + "lighting_cost_current": { + "value": 42, + "currency": "GBP" + }, + "main_heating_controls": [ + { + "description": "Programmer, room thermostat and TRVs", + "energy_efficiency_rating": 4, + "environmental_efficiency_rating": 4 + } + ], + "has_hot_water_cylinder": "false", + "heating_cost_potential": { + "value": 553, + "currency": "GBP" + }, + "hot_water_cost_current": { + "value": 207, + "currency": "GBP" + }, + "mechanical_ventilation": 0, + "percent_draughtproofed": 100, + "suggested_improvements": [ + { + "sequence": 1, + "typical_saving": { + "value": 69, + "currency": "GBP" + }, + "indicative_cost": "\u00a3900 - \u00a31,200", + "improvement_type": "A2", + "improvement_details": { + "improvement_number": 45 + }, + "improvement_category": 5, + "energy_performance_rating": 76, + "environmental_impact_rating": 78 + } + ], + "co2_emissions_potential": 1.8, + "energy_rating_potential": 76, + "lighting_cost_potential": { + "value": 42, + "currency": "GBP" + }, + "schema_version_original": "21.0.1", + "hot_water_cost_potential": { + "value": 208, + "currency": "GBP" + }, + "renewable_heat_incentive": { + "water_heating": 2384.75, + "space_heating_existing_dwelling": 5681.26 + }, + "draughtproofed_door_count": 0, + "energy_consumption_current": 170, + "has_fixed_air_conditioning": "false", + "multiple_glazed_proportion": 100, + "calculation_software_version": "5.02r0344", + "energy_consumption_potential": 154, + "environmental_impact_current": 76, + "current_energy_efficiency_band": "C", + "environmental_impact_potential": 78, + "led_fixed_lighting_bulbs_count": 9, + "has_heated_separate_conservatory": "false", + "potential_energy_efficiency_band": "C", + "co2_emissions_current_per_floor_area": 31, + "incandescent_fixed_lighting_bulbs_count": 0 +} \ No newline at end of file diff --git a/domain/sap10_calculator/worksheet/heat_transmission.py b/domain/sap10_calculator/worksheet/heat_transmission.py index 32ae5bf75..789483e6c 100644 --- a/domain/sap10_calculator/worksheet/heat_transmission.py +++ b/domain/sap10_calculator/worksheet/heat_transmission.py @@ -922,6 +922,22 @@ def heat_transmission_from_cert( raw_rafter_thickness = getattr(part, "rafter_insulation_thickness", None) if raw_rafter_thickness is not None: raw_roof_thickness = raw_rafter_thickness + elif "flat" in (part.roof_construction_type or "").lower(): + # RdSAP 10 §5.11 — a FLAT roof lodges its insulation thickness in + # the dedicated gov-API `flat_roof_insulation_thickness` field + # (e.g. "75mm"), NOT `roof_insulation_thickness` (which stays None + # for flat roofs). Prefer it so a measured flat-roof thickness + # bills at its Table-16 U instead of the uninsulated age-band flat + # default. Mirrors the rafter branch above. Cert 47084930: flat + # roof "75mm" -> U 0.5 (accredited Elmhurst worksheet, "insulated + # flat roof") vs the age-E default 1.5 (roof 96.4 -> 32.1 W/K). An + # "AB"/"NI" (as-built/unknown) value parses to None and keeps the + # age-band default, unchanged. + raw_flat_thickness = getattr( + part, "flat_roof_insulation_thickness", None + ) + if raw_flat_thickness is not None: + raw_roof_thickness = raw_flat_thickness roof_thickness = _parse_thickness_mm(raw_roof_thickness) floor_ins_thickness = _parse_thickness_mm(getattr(part, "floor_insulation_thickness", None)) diff --git a/scripts/corpus_1000/worklist.md b/scripts/corpus_1000/worklist.md index 7f57b370c..3cb6cbaf8 100644 --- a/scripts/corpus_1000/worklist.md +++ b/scripts/corpus_1000/worklist.md @@ -1,10 +1,10 @@ # RdSAP-21.0.1 corpus campaign ledger -**Gauge:** 1000 computed / 0 skipped · SAP within-0.5 = **77.3%** · MAE = **0.648** (floors in test_sap_accuracy_corpus.py) +**Gauge:** 1000 computed / 0 skipped · SAP within-0.5 = **77.7%** · MAE = **0.641** (floors in test_sap_accuracy_corpus.py) Statuses: `[ ]` todo · `[x]` resolved ≤0.5 · 🔧 fix landed · ⚠ xfail engine bug · ⛔ unbuildable. Line: `uprn · lodged L / eng E / Δ · signature`. Rebuild/re-rank: `PYTHONPATH=. python scripts/corpus_1000/build_worklist.py` (preserves statuses & `<-` notes). -## Clusters (certs with |Δ| ≥ 0.5, ranked by summed |Δ|) — 227 certs in 220 clusters +## Clusters (certs with |Δ| ≥ 0.5, ranked by summed |Δ|) — 223 certs in 216 clusters ### C001 · Σ|Δ| 23.9 · 1 certs · `hpcdb100053/elec | solid brick | (another dwelling | sec:room heaters` - ⚠ `4510053280` · L 51 / E 74.94 / Δ +23.94 <- lodged software billed out-of-range-PSR (2.031 > 2.0) PCDB 100053 as 100% direct electric; engine follows SAP10.2 N2 extension (305%), Elmhurst-validated on case 56. Pinned engine 75 in test_real_cert_sap_accuracy. @@ -69,611 +69,599 @@ Statuses: `[ ]` todo · `[x]` resolved ≤0.5 · 🔧 fix landed · ⚠ xfail en ### C020 · Σ|Δ| 4.5 · 1 certs · `hpcdb18786/fuel27 | solid brick | pitched 100 | RR,consv3` - [ ] `100071010014` · L 55 / E 50.47 / Δ -4.53 -### C021 · Σ|Δ| 4.5 · 1 certs · `hpcdb17815/gas | cavity wall | flat insulated` -- [ ] `47084930` · L 74 / E 69.51 / Δ -4.49 - -### C022 · Σ|Δ| 4.5 · 1 certs · `h301/coal-anth | system built | (another dwelling | mv4` +### C021 · Σ|Δ| 4.5 · 1 certs · `h301/coal-anth | system built | (another dwelling | mv4` - [ ] `10093342182` · L 82 / E 77.51 / Δ -4.49 -### C023 · Σ|Δ| 4.4 · 1 certs · `hpcdb17973/gas | solid brick | (another dwelling` +### C022 · Σ|Δ| 4.4 · 1 certs · `hpcdb17973/gas | solid brick | (another dwelling` - [ ] `5117280` · L 76 / E 71.56 / Δ -4.44 -### C024 · Σ|Δ| 4.4 · 1 certs · `h191/elec | solid brick | (another dwelling | ext2` +### C023 · Σ|Δ| 4.4 · 1 certs · `h191/elec | solid brick | (another dwelling | ext2` - [ ] `217060420` · L 42 / E 37.58 / Δ -4.42 -### C025 · Σ|Δ| 4.4 · 1 certs · `h402/elec | cavity wall | (another dwelling | sec:room heaters,whw903` +### C024 · Σ|Δ| 4.4 · 1 certs · `h402/elec | cavity wall | (another dwelling | sec:room heaters,whw903` - [ ] `72399971` · L 69 / E 64.60 / Δ -4.40 -### C026 · Σ|Δ| 4.4 · 1 certs · `hpcdb19258/fuel28 | granite or | pitched no | ext2,sec:room heaters` +### C025 · Σ|Δ| 4.4 · 1 certs · `hpcdb19258/fuel28 | granite or | pitched no | ext2,sec:room heaters` - [ ] `10007016314` · L 57 / E 52.64 / Δ -4.36 -### C027 · Σ|Δ| 4.1 · 1 certs · `h633/heatnet | sandstone with | pitched insulated | sec:room heaters,whw903` +### C026 · Σ|Δ| 4.1 · 1 certs · `h633/heatnet | sandstone with | pitched insulated | sec:room heaters,whw903` - [ ] `100052159386` · L 56 / E 51.92 / Δ -4.08 -### C028 · Σ|Δ| 4.0 · 1 certs · `h408/elec | cavity wall | pitched 100 | ext1,sec:room heaters,whw903` +### C027 · Σ|Δ| 4.0 · 1 certs · `h408/elec | cavity wall | pitched 100 | ext1,sec:room heaters,whw903` - [ ] `100040767294` · L 43 / E 47.04 / Δ +4.04 -### C029 · Σ|Δ| 3.6 · 1 certs · `hpcdb15445/gas | granite or | pitched no | RR,ext3,sec:room heaters` +### C028 · Σ|Δ| 3.6 · 1 certs · `hpcdb15445/gas | granite or | pitched no | RR,ext3,sec:room heaters` - [ ] `10002188054` · L 68 / E 64.42 / Δ -3.58 -### C030 · Σ|Δ| 3.5 · 1 certs · `hpcdb18234/gas | cavity wall | pitched insulated | PV,ext2,sec:room heaters` +### C029 · Σ|Δ| 3.5 · 1 certs · `hpcdb18234/gas | cavity wall | pitched insulated | PV,ext2,sec:room heaters` - [ ] `39066537` · L 78 / E 81.49 / Δ +3.49 -### C031 · Σ|Δ| 3.5 · 1 certs · `hpcdb8387/gas | cavity wall | pitched 150` +### C030 · Σ|Δ| 3.5 · 1 certs · `hpcdb8387/gas | cavity wall | pitched 150` - [ ] `100100137438` · L 69 / E 72.48 / Δ +3.48 -### C032 · Σ|Δ| 3.4 · 1 certs · `hpcdb17507/gas | cavity wall | pitched insulated | RR,sec:room heaters` +### C031 · Σ|Δ| 3.4 · 1 certs · `hpcdb17507/gas | cavity wall | pitched insulated | RR,sec:room heaters` - [ ] `100080122910` · L 60 / E 63.45 / Δ +3.45 -### C033 · Σ|Δ| 3.3 · 1 certs · `h691/elec | cavity wall | pitched 300 | mv5,sec:portable electric,whw903` +### C032 · Σ|Δ| 3.3 · 1 certs · `h691/elec | cavity wall | pitched 300 | mv5,sec:portable electric,whw903` - [ ] `452010022` · L 42 / E 38.67 / Δ -3.33 -### C034 · Σ|Δ| 3.3 · 1 certs · `h402/elec | cavity wall | pitched 150 | ext1,sec:room heaters,whw903` +### C033 · Σ|Δ| 3.3 · 1 certs · `h402/elec | cavity wall | pitched 150 | ext1,sec:room heaters,whw903` - [ ] `200004818752` · L 34 / E 30.73 / Δ -3.27 -### C035 · Σ|Δ| 3.2 · 1 certs · `hpcdb1770/fuel28 | solid brick | pitched no | ext3,sec:room heaters` +### C034 · Σ|Δ| 3.2 · 1 certs · `hpcdb1770/fuel28 | solid brick | pitched no | ext3,sec:room heaters` - [ ] `200004522639` · L 37 / E 33.77 / Δ -3.23 -### C036 · Σ|Δ| 3.2 · 1 certs · `hpcdb18759/gas | sandstone as | pitched insulated | RR,ext1,sec:room heaters` +### C035 · Σ|Δ| 3.2 · 1 certs · `hpcdb18759/gas | sandstone as | pitched insulated | RR,ext1,sec:room heaters` - [ ] `72351021` · L 64 / E 60.85 / Δ -3.15 -### C037 · Σ|Δ| 3.1 · 1 certs · `h633/heatnet | timber frame | roof room(s) | RR,ext1,sec:room heaters,whw909` +### C036 · Σ|Δ| 3.1 · 1 certs · `h633/heatnet | timber frame | roof room(s) | RR,ext1,sec:room heaters,whw909` - [ ] `22077224` · L 37 / E 33.90 / Δ -3.10 -### C038 · Σ|Δ| 3.0 · 1 certs · `hpcdb18498/gas | solid brick | pitched 250 | RR,ext2` +### C037 · Σ|Δ| 3.0 · 1 certs · `hpcdb18498/gas | solid brick | pitched 250 | RR,ext2` - [ ] `10011740578` · L 70 / E 67.00 / Δ -3.00 -### C039 · Σ|Δ| 2.9 · 1 certs · `h402/elec | cavity wall | pitched 250 | sec:portable electric,whw903` +### C038 · Σ|Δ| 2.9 · 1 certs · `h402/elec | cavity wall | pitched 250 | sec:portable electric,whw903` - [ ] `100110680822` · L 79 / E 76.07 / Δ -2.93 -### C040 · Σ|Δ| 2.9 · 1 certs · `h301/coal-anth | solid brick | pitched 250` +### C039 · Σ|Δ| 2.9 · 1 certs · `h301/coal-anth | solid brick | pitched 250` - [ ] `452032915` · L 75 / E 72.09 / Δ -2.91 -### C041 · Σ|Δ| 2.9 · 1 certs · `h301/coal-anth | cavity wall | (another dwelling | whw909` +### C040 · Σ|Δ| 2.9 · 1 certs · `h301/coal-anth | cavity wall | (another dwelling | whw909` - [ ] `100071306639` · L 73 / E 70.14 / Δ -2.86 -### C042 · Σ|Δ| 2.9 · 1 certs · `hpcdb18435/gas+2mains | cavity wall | pitched 100 | ext3,sec:room heaters,whw903` +### C041 · Σ|Δ| 2.9 · 1 certs · `hpcdb18435/gas+2mains | cavity wall | pitched 100 | ext3,sec:room heaters,whw903` - [ ] `100061346049` · L 55 / E 52.15 / Δ -2.85 -### C043 · Σ|Δ| 2.7 · 1 certs · `hpcdb8443/fuel28 | cavity wall | pitched 100 | RR,ext2,sec:room heaters` +### C042 · Σ|Δ| 2.7 · 1 certs · `hpcdb8443/fuel28 | cavity wall | pitched 100 | RR,ext2,sec:room heaters` - [ ] `10013008238` · L 41 / E 38.26 / Δ -2.74 -### C044 · Σ|Δ| 2.7 · 3 certs · `h691/elec | cavity wall | (another dwelling | whw903` +### C043 · Σ|Δ| 2.7 · 3 certs · `h691/elec | cavity wall | (another dwelling | whw903` - [ ] `10033187652` · L 70 / E 71.21 / Δ +1.21 - [ ] `200002730` · L 65 / E 64.13 / Δ -0.87 - [ ] `10023328117` · L 78 / E 78.64 / Δ +0.64 -### C045 · Σ|Δ| 2.7 · 1 certs · `h633/heatnet | cavity wall | pitched 200 | RR,sec:room heaters,whw903` +### C044 · Σ|Δ| 2.7 · 1 certs · `h633/heatnet | cavity wall | pitched 200 | RR,sec:room heaters,whw903` - [ ] `10004873253` · L 65 / E 62.29 / Δ -2.71 -### C046 · Σ|Δ| 2.7 · 1 certs · `h691/elec | cavity wall | (another dwelling | mv1,whw903` +### C045 · Σ|Δ| 2.7 · 1 certs · `h691/elec | cavity wall | (another dwelling | mv1,whw903` - [ ] `10090793715` · L 73 / E 75.71 / Δ +2.71 -### C047 · Σ|Δ| 2.7 · 1 certs · `hpcdb17964/gas+2mains | cavity wall | pitched 100 | ext1,sec:room heaters` +### C046 · Σ|Δ| 2.7 · 1 certs · `hpcdb17964/gas+2mains | cavity wall | pitched 100 | ext1,sec:room heaters` - [ ] `100120745600` · L 65 / E 67.69 / Δ +2.69 -### C048 · Σ|Δ| 2.7 · 1 certs · `hpcdb17757/gas | granite or | pitched no | RR,ext1` +### C047 · Σ|Δ| 2.7 · 1 certs · `hpcdb17757/gas | granite or | pitched no | RR,ext1` - [ ] `100051178830` · L 63 / E 65.66 / Δ +2.66 -### C049 · Σ|Δ| 2.6 · 1 certs · `hpcdb10321/gas | sandstone as | pitched 100 | ext2` +### C048 · Σ|Δ| 2.6 · 1 certs · `hpcdb10321/gas | sandstone as | pitched 100 | ext2` - [ ] `100120018282` · L 64 / E 61.36 / Δ -2.64 -### C050 · Σ|Δ| 2.6 · 1 certs · `hpcdb17968/gas | cavity wall | pitched 300 | ext2,sec:room heaters` +### C049 · Σ|Δ| 2.6 · 1 certs · `hpcdb17968/gas | cavity wall | pitched 300 | ext2,sec:room heaters` - [ ] `83035979` · L 65 / E 67.60 / Δ +2.60 -### C051 · Σ|Δ| 2.5 · 1 certs · `h524/elec | solid brick | (another dwelling | consv2,sec:room heaters,whw909` +### C050 · Σ|Δ| 2.5 · 1 certs · `h524/elec | solid brick | (another dwelling | consv2,sec:room heaters,whw909` - [ ] `10014073761` · L 75 / E 72.52 / Δ -2.48 -### C052 · Σ|Δ| 2.5 · 1 certs · `hpcdb10328/gas | solid brick | pitched insulated | RR` +### C051 · Σ|Δ| 2.5 · 1 certs · `hpcdb10328/gas | solid brick | pitched insulated | RR` - [ ] `100050964834` · L 60 / E 62.47 / Δ +2.47 -### C053 · Σ|Δ| 2.4 · 1 certs · `h694/elec | cavity wall | (another dwelling | whw941` +### C052 · Σ|Δ| 2.4 · 1 certs · `h694/elec | cavity wall | (another dwelling | whw941` - [ ] `100120752995` · L 71 / E 73.42 / Δ +2.42 -### C054 · Σ|Δ| 2.4 · 1 certs · `hpcdb1245/gas | solid brick | pitched insulated | ext1` -- [ ] `100032230128` · L 55 / E 52.60 / Δ -2.40 +### C053 · Σ|Δ| 2.4 · 1 certs · `h691/elec | solid brick | roof room(s) | RR,ext2,sec:room heaters,whw903` +- [ ] `100062174575` · L 46 / E 48.40 / Δ +2.40 -### C055 · Σ|Δ| 2.3 · 1 certs · `hpcdb15753/gas | solid brick | pitched 150 | RR` +### C054 · Σ|Δ| 2.3 · 1 certs · `hpcdb15753/gas | solid brick | pitched 150 | RR` - [ ] `100000034023` · L 73 / E 70.71 / Δ -2.29 -### C056 · Σ|Δ| 2.2 · 1 certs · `h506/gas | cavity wall | flat limited | sec:room heaters` +### C055 · Σ|Δ| 2.2 · 1 certs · `h506/gas | cavity wall | flat limited | sec:room heaters` - [ ] `100020377671` · L 62 / E 64.23 / Δ +2.23 -### C057 · Σ|Δ| 2.2 · 1 certs · `h104/gas | solid brick | pitched insulated | RR,ext1` +### C056 · Σ|Δ| 2.2 · 1 certs · `h104/gas | solid brick | pitched insulated | RR,ext1` - [ ] `22027335` · L 76 / E 73.77 / Δ -2.23 -### C058 · Σ|Δ| 2.1 · 1 certs · `hpcdb18833/gas | solid brick | pitched insulated | RR,ext1,sec:room heaters` +### C057 · Σ|Δ| 2.1 · 1 certs · `hpcdb18833/gas | solid brick | pitched insulated | RR,ext1,sec:room heaters` - [ ] `48056153` · L 65 / E 62.89 / Δ -2.11 -### C059 · Σ|Δ| 2.0 · 1 certs · `hpcdb19008/gas | solid brick | pitched insulated | sec:room heaters` +### C058 · Σ|Δ| 2.0 · 1 certs · `hpcdb19008/gas | solid brick | pitched insulated | sec:room heaters` - [ ] `100021924710` · L 63 / E 65.00 / Δ +2.00 -### C060 · Σ|Δ| 1.9 · 1 certs · `hpcdb18774/gas | solid brick | pitched 100 | RR,ext1` +### C059 · Σ|Δ| 1.9 · 1 certs · `hpcdb18774/gas | solid brick | pitched 100 | RR,ext1` - [ ] `100031270375` · L 69 / E 70.93 / Δ +1.93 -### C061 · Σ|Δ| 1.9 · 1 certs · `hpcdb106417/elec | cavity wall | pitched 250 | RR,ext2,sec:room heaters` +### C060 · Σ|Δ| 1.9 · 1 certs · `hpcdb106417/elec | cavity wall | pitched 250 | RR,ext2,sec:room heaters` - [ ] `10001118522` · L 80 / E 78.07 / Δ -1.93 -### C062 · Σ|Δ| 1.9 · 1 certs · `h192/elec | cavity wall | (another dwelling` +### C061 · Σ|Δ| 1.9 · 1 certs · `h192/elec | cavity wall | (another dwelling` - [ ] `10010234711` · L 81 / E 79.08 / Δ -1.92 -### C063 · Σ|Δ| 1.9 · 1 certs · `hpcdb18250/gas | solid brick | pitched 100 | consv2,sec:room heaters` +### C062 · Σ|Δ| 1.9 · 1 certs · `hpcdb18250/gas | solid brick | pitched 100 | consv2,sec:room heaters` - [ ] `100031768368` · L 61 / E 59.12 / Δ -1.88 -### C064 · Σ|Δ| 1.8 · 1 certs · `h301/elec10hr | cavity wall | (another dwelling` +### C063 · Σ|Δ| 1.8 · 1 certs · `h301/elec10hr | cavity wall | (another dwelling` - [ ] `4510729926` · L 73 / E 71.15 / Δ -1.85 -### C065 · Σ|Δ| 1.8 · 1 certs · `hpcdb17138/fuel28 | granite or | pitched 200 | ext1,sec:room heaters` +### C064 · Σ|Δ| 1.8 · 1 certs · `hpcdb17138/fuel28 | granite or | pitched 200 | ext1,sec:room heaters` - [ ] `100091329112` · L 49 / E 50.82 / Δ +1.82 -### C066 · Σ|Δ| 1.8 · 2 certs · `hpcdb18908/gas | solid brick | pitched 300` +### C065 · Σ|Δ| 1.8 · 2 certs · `hpcdb18908/gas | solid brick | pitched 300` - [ ] `100061275133` · L 76 / E 77.24 / Δ +1.24 - [ ] `207032630` · L 74 / E 73.47 / Δ -0.53 -### C067 · Σ|Δ| 1.8 · 1 certs · `h691/elec | timber frame | pitched insulated | RR,ext1,sec:portable electric,whw908` +### C066 · Σ|Δ| 1.8 · 1 certs · `h691/elec | timber frame | pitched insulated | RR,ext1,sec:portable electric,whw908` - [ ] `10011797347` · L 47 / E 48.77 / Δ +1.77 -### C068 · Σ|Δ| 1.8 · 1 certs · `hpcdb17570/gas+2mains | solid brick | (another dwelling | RR,ext3,sec:room heaters` +### C067 · Σ|Δ| 1.8 · 1 certs · `hpcdb17570/gas+2mains | solid brick | (another dwelling | RR,ext3,sec:room heaters` - [ ] `100022668387` · L 68 / E 66.25 / Δ -1.75 -### C069 · Σ|Δ| 1.7 · 1 certs · `hpcdb10354/gas+2mains | sandstone as | pitched 300 | ext1` +### C068 · Σ|Δ| 1.7 · 1 certs · `hpcdb10354/gas+2mains | sandstone as | pitched 300 | ext1` - [ ] `100100892216` · L 69 / E 67.28 / Δ -1.72 -### C070 · Σ|Δ| 1.7 · 1 certs · `hpcdb8119/gas | cavity wall | pitched insulated | RR,ext1` +### C069 · Σ|Δ| 1.7 · 1 certs · `hpcdb8119/gas | cavity wall | pitched insulated | RR,ext1` - [ ] `100060878876` · L 49 / E 50.71 / Δ +1.71 -### C071 · Σ|Δ| 1.7 · 1 certs · `h402/elec | solid brick | (another dwelling | sec:portable electric,whw903` +### C070 · Σ|Δ| 1.7 · 1 certs · `h402/elec | solid brick | (another dwelling | sec:portable electric,whw903` - [ ] `12126160` · L 69 / E 70.71 / Δ +1.71 -### C072 · Σ|Δ| 1.7 · 1 certs · `h401/elec | solid brick | (another dwelling | sec:portable electric,whw950` +### C071 · Σ|Δ| 1.7 · 1 certs · `h401/elec | solid brick | (another dwelling | sec:portable electric,whw950` - [ ] `22032926` · L 61 / E 62.71 / Δ +1.71 -### C073 · Σ|Δ| 1.7 · 1 certs · `hpcdb18560/gas | cavity wall | pitched insulated | RR,ext1` +### C072 · Σ|Δ| 1.7 · 1 certs · `hpcdb18560/gas | cavity wall | pitched insulated | RR,ext1` - [ ] `100010942905` · L 72 / E 73.70 / Δ +1.70 -### C074 · Σ|Δ| 1.6 · 1 certs · `hpcdb18119/gas | solid brick | pitched 100 | ext1` +### C073 · Σ|Δ| 1.6 · 1 certs · `hpcdb18119/gas | solid brick | pitched 100 | ext1` - [ ] `100030307976` · L 71 / E 69.37 / Δ -1.63 -### C075 · Σ|Δ| 1.6 · 1 certs · `hpcdb18909/gas | cavity wall | pitched 100 | whw903` +### C074 · Σ|Δ| 1.6 · 1 certs · `hpcdb18909/gas | cavity wall | pitched 100 | whw903` - [ ] `100061404488` · L 70 / E 68.38 / Δ -1.62 -### C076 · Σ|Δ| 1.6 · 1 certs · `h402/elec | system built | (another dwelling | sec:room heaters,whw903` +### C075 · Σ|Δ| 1.6 · 1 certs · `h402/elec | system built | (another dwelling | sec:room heaters,whw903` - [ ] `21067296` · L 67 / E 68.60 / Δ +1.60 -### C077 · Σ|Δ| 1.6 · 1 certs · `hpcdb10164/gas | solid brick | pitched insulated | sec:room heaters` +### C076 · Σ|Δ| 1.6 · 1 certs · `hpcdb10164/gas | solid brick | pitched insulated | sec:room heaters` - [ ] `5870047440` · L 58 / E 59.58 / Δ +1.58 -### C078 · Σ|Δ| 1.6 · 1 certs · `hpcdb8051/gas | cavity wall | (same dwelling | ext2` +### C077 · Σ|Δ| 1.6 · 1 certs · `hpcdb8051/gas | cavity wall | (same dwelling | ext2` - [ ] `100070450818` · L 65 / E 63.43 / Δ -1.57 -### C079 · Σ|Δ| 1.6 · 1 certs · `hpcdb17741/gas | cavity wall | pitched 225` +### C078 · Σ|Δ| 1.6 · 1 certs · `hpcdb17741/gas | cavity wall | pitched 225` - [ ] `100050881708` · L 70 / E 71.55 / Δ +1.55 -### C080 · Σ|Δ| 1.5 · 1 certs · `h301/elec | system built | (another dwelling | whw950` +### C079 · Σ|Δ| 1.5 · 1 certs · `h301/elec | system built | (another dwelling | whw950` - [ ] `10010254955` · L 79 / E 77.46 / Δ -1.54 -### C081 · Σ|Δ| 1.5 · 1 certs · `hpcdb16839/gas | cavity wall | pitched 400+ | ext1,mv2,sec:room heaters` +### C080 · Σ|Δ| 1.5 · 1 certs · `hpcdb16839/gas | cavity wall | pitched 400+ | ext1,mv2,sec:room heaters` - [ ] `3455011834` · L 69 / E 67.48 / Δ -1.52 -### C082 · Σ|Δ| 1.5 · 1 certs · `hpcdb15502/gas | granite or | pitched 150 | RR,ext1,sec:room heaters` +### C081 · Σ|Δ| 1.5 · 1 certs · `hpcdb15502/gas | granite or | pitched 150 | RR,ext1,sec:room heaters` - [ ] `100100274789` · L 60 / E 61.51 / Δ +1.51 -### C083 · Σ|Δ| 1.5 · 1 certs · `hpcdb16453/gas | cavity wall | pitched 300 | consv2,ext1` +### C082 · Σ|Δ| 1.5 · 1 certs · `hpcdb16453/gas | cavity wall | pitched 300 | consv2,ext1` - [ ] `100050852755` · L 65 / E 66.49 / Δ +1.49 -### C084 · Σ|Δ| 1.5 · 1 certs · `hpcdb17679/gas | solid brick | pitched 125 | ext1` +### C083 · Σ|Δ| 1.5 · 1 certs · `hpcdb17679/gas | solid brick | pitched 125 | ext1` - [ ] `100021326422` · L 70 / E 68.51 / Δ -1.49 -### C085 · Σ|Δ| 1.5 · 1 certs · `hpcdb15029/gas | solid brick | pitched insulated | RR,ext1` +### C084 · Σ|Δ| 1.5 · 1 certs · `hpcdb15029/gas | solid brick | pitched insulated | RR,ext1` - [ ] `100050988345` · L 61 / E 59.51 / Δ -1.49 -### C086 · Σ|Δ| 1.5 · 1 certs · `hpcdb17998/gas | solid brick | pitched insulated | RR,consv2` +### C085 · Σ|Δ| 1.5 · 1 certs · `hpcdb17998/gas | solid brick | pitched insulated | RR,consv2` - [ ] `100030285758` · L 54 / E 55.48 / Δ +1.48 -### C087 · Σ|Δ| 1.5 · 1 certs · `hpcdb17974/gas | cavity wall | pitched 175 | PV,ext1` -- [ ] `100090536443` · L 86 / E 84.52 / Δ -1.48 - -### C088 · Σ|Δ| 1.4 · 1 certs · `hpcdb17978/gas | solid brick | flat no | RR,ext1` +### C086 · Σ|Δ| 1.4 · 1 certs · `hpcdb17978/gas | solid brick | flat no | RR,ext1` - [ ] `line80` · L 72 / E 70.56 / Δ -1.44 -### C089 · Σ|Δ| 1.4 · 1 certs · `hpcdb10356/gas | solid brick | pitched 150 | RR,ext1,sec:room heaters` +### C087 · Σ|Δ| 1.4 · 1 certs · `hpcdb10356/gas | solid brick | pitched 150 | RR,ext1,sec:room heaters` - [ ] `100080518673` · L 57 / E 58.42 / Δ +1.42 -### C090 · Σ|Δ| 1.4 · 1 certs · `hpcdb18561/gas | solid brick | pitched 250 | ext2` +### C088 · Σ|Δ| 1.4 · 1 certs · `hpcdb18561/gas | solid brick | pitched 250 | ext2` - [ ] `235025284` · L 69 / E 67.59 / Δ -1.41 -### C091 · Σ|Δ| 1.4 · 1 certs · `hpcdb18767/gas | sandstone as | (another dwelling` +### C089 · Σ|Δ| 1.4 · 1 certs · `hpcdb18767/gas | sandstone as | (another dwelling` - [ ] `250063088` · L 73 / E 71.60 / Δ -1.40 -### C092 · Σ|Δ| 1.4 · 1 certs · `hpcdb16210/gas | cavity wall | pitched 300 | sec:room heaters` +### C090 · Σ|Δ| 1.4 · 1 certs · `hpcdb16210/gas | cavity wall | pitched 300 | sec:room heaters` - [ ] `100110097281` · L 64 / E 65.37 / Δ +1.37 -### C093 · Σ|Δ| 1.4 · 1 certs · `h691/elec | solid brick | (another dwelling | whw903` +### C091 · Σ|Δ| 1.4 · 1 certs · `h691/elec | solid brick | (another dwelling | whw903` - [ ] `10091630692` · L 58 / E 56.63 / Δ -1.37 -### C094 · Σ|Δ| 1.4 · 1 certs · `hpcdb19094/gas | cavity wall | (another dwelling | ext1,sec:room heaters` -- [ ] `100031433810` · L 70 / E 68.63 / Δ -1.37 - -### C095 · Σ|Δ| 1.3 · 1 certs · `hpcdb19227/fuel28 | solid brick | pitched 100 | RR,ext3,sec:room heaters` +### C092 · Σ|Δ| 1.3 · 1 certs · `hpcdb19227/fuel28 | solid brick | pitched 100 | RR,ext3,sec:room heaters` - [ ] `100012368622` · L 39 / E 40.32 / Δ +1.32 -### C096 · Σ|Δ| 1.3 · 1 certs · `hpcdb19007/gas | solid brick | pitched insulated | RR,ext2,sec:room heaters` +### C093 · Σ|Δ| 1.3 · 1 certs · `hpcdb19007/gas | solid brick | pitched insulated | RR,ext2,sec:room heaters` - [ ] `90077194` · L 65 / E 63.69 / Δ -1.31 -### C097 · Σ|Δ| 1.3 · 1 certs · `hpcdb19083/gas | cavity wall | pitched 75 | RR,consv2` +### C094 · Σ|Δ| 1.3 · 1 certs · `hpcdb19083/gas | cavity wall | pitched 75 | RR,consv2` - [ ] `100031461986` · L 70 / E 71.29 / Δ +1.29 -### C098 · Σ|Δ| 1.3 · 1 certs · `h691/elec | granite or | pitched insulated | PV,ext3,whw903` +### C095 · Σ|Δ| 1.3 · 1 certs · `h691/elec | granite or | pitched insulated | PV,ext3,whw903` - [ ] `30095054` · L 46 / E 44.74 / Δ -1.26 -### C099 · Σ|Δ| 1.3 · 1 certs · `hpcdb18335/gas | cavity wall | pitched 100 | RR,ext1,sec:room heaters` +### C096 · Σ|Δ| 1.3 · 1 certs · `hpcdb18335/gas | cavity wall | pitched 100 | RR,ext1,sec:room heaters` - [ ] `100100055589` · L 58 / E 59.26 / Δ +1.26 -### C100 · Σ|Δ| 1.2 · 1 certs · `h409/elec | solid brick | (another dwelling | consv2,sec:portable electric,whw909` +### C097 · Σ|Δ| 1.2 · 1 certs · `h409/elec | solid brick | (another dwelling | consv2,sec:portable electric,whw909` - [ ] `74061136` · L 73 / E 71.75 / Δ -1.25 <- electric storage cat7 E7: over-rate = off-peak rate/fraction too generous; needs Elmhurst tariff arbitration -### C101 · Σ|Δ| 1.2 · 1 certs · `hpcdb15101/gas | cavity wall | pitched 270 | consv3,sec:room heaters` +### C098 · Σ|Δ| 1.2 · 1 certs · `hpcdb15101/gas | cavity wall | pitched 270 | consv3,sec:room heaters` - [ ] `100091435353` · L 65 / E 66.23 / Δ +1.23 -### C102 · Σ|Δ| 1.2 · 2 certs · `h301/coal-anth | system built | (another dwelling` +### C099 · Σ|Δ| 1.2 · 2 certs · `h301/coal-anth | system built | (another dwelling` - [ ] `10091070164` · L 69 / E 69.60 / Δ +0.60 - [ ] `10090927185` · L 79 / E 79.60 / Δ +0.60 -### C103 · Σ|Δ| 1.2 · 1 certs · `hpcdb19110/gas | cavity wall | pitched no | ext3` +### C100 · Σ|Δ| 1.2 · 1 certs · `hpcdb19110/gas | cavity wall | pitched no | ext3` - [ ] `100100614412` · L 53 / E 51.81 / Δ -1.19 -### C104 · Σ|Δ| 1.2 · 1 certs · `hpcdb18658/gas | solid brick | flat no` +### C101 · Σ|Δ| 1.2 · 1 certs · `hpcdb18658/gas | solid brick | flat no` - [ ] `217091901` · L 62 / E 60.82 / Δ -1.18 -### C105 · Σ|Δ| 1.2 · 1 certs · `hpcdb17115/gas | sandstone as | (another dwelling | ext2,sec:room heaters` +### C102 · Σ|Δ| 1.2 · 1 certs · `hpcdb17115/gas | sandstone as | (another dwelling | ext2,sec:room heaters` - [x] `line768` · L 57 / E 55.84 / Δ -1.16 -### C106 · Σ|Δ| 1.2 · 1 certs · `h102/gas | solid brick | (same dwelling | ext1,sec:portable electric` +### C103 · Σ|Δ| 1.2 · 1 certs · `h102/gas | solid brick | (same dwelling | ext1,sec:portable electric` - [ ] `217061895` · L 61 / E 59.84 / Δ -1.16 -### C107 · Σ|Δ| 1.1 · 1 certs · `hpcdb15708/gas | cavity wall | pitched insulated | RR,sec:room heaters` +### C104 · Σ|Δ| 1.1 · 1 certs · `hpcdb15708/gas | cavity wall | pitched insulated | RR,sec:room heaters` - [ ] `10002349227` · L 76 / E 77.14 / Δ +1.14 -### C108 · Σ|Δ| 1.1 · 1 certs · `hpcdb15451/gas | timber frame | pitched insulated | RR,ext1,sec:room heaters` +### C105 · Σ|Δ| 1.1 · 1 certs · `hpcdb15451/gas | timber frame | pitched insulated | RR,ext1,sec:room heaters` - [ ] `200001634005` · L 66 / E 67.11 / Δ +1.11 -### C109 · Σ|Δ| 1.1 · 1 certs · `hpcdb16407/gas | cavity wall | pitched 250 | ext1,sec:room heaters` +### C106 · Σ|Δ| 1.1 · 1 certs · `hpcdb16407/gas | cavity wall | pitched 250 | ext1,sec:room heaters` - [ ] `100071059081` · L 63 / E 64.09 / Δ +1.09 -### C110 · Σ|Δ| 1.1 · 1 certs · `hpcdb19007/gas+2mains | cavity wall | pitched 350 | ext2,mv5,sec:room heaters,whw914` +### C107 · Σ|Δ| 1.1 · 1 certs · `hpcdb19007/gas+2mains | cavity wall | pitched 350 | ext2,mv5,sec:room heaters,whw914` - [ ] `100011820199` · L 55 / E 56.06 / Δ +1.06 -### C111 · Σ|Δ| 1.1 · 1 certs · `h691/elec | system built | (another dwelling | whw903` +### C108 · Σ|Δ| 1.1 · 1 certs · `h691/elec | system built | (another dwelling | whw903` - [ ] `90214753` · L 83 / E 81.95 / Δ -1.05 -### C112 · Σ|Δ| 1.0 · 1 certs · `h102/gas | cavity wall | pitched insulated | consv2` +### C109 · Σ|Δ| 1.0 · 1 certs · `h102/gas | cavity wall | pitched insulated | consv2` - [ ] `100051051866` · L 70 / E 71.04 / Δ +1.04 -### C113 · Σ|Δ| 1.0 · 1 certs · `hpcdb18737/gas | cavity wall | pitched insulated | PV,sec:room heaters` +### C110 · Σ|Δ| 1.0 · 1 certs · `hpcdb18737/gas | cavity wall | pitched insulated | PV,sec:room heaters` - [ ] `10013836852` · L 100 / E 98.97 / Δ -1.03 -### C114 · Σ|Δ| 1.0 · 1 certs · `hpcdb17985/gas | solid brick | (another dwelling` +### C111 · Σ|Δ| 1.0 · 1 certs · `hpcdb17985/gas | solid brick | (another dwelling` - [ ] `line899` · L 73 / E 71.97 / Δ -1.03 -### C115 · Σ|Δ| 1.0 · 1 certs · `hpcdb18524/gas+2mains | cavity wall | pitched 400+ | ext4` +### C112 · Σ|Δ| 1.0 · 1 certs · `hpcdb18524/gas+2mains | cavity wall | pitched 400+ | ext4` - [ ] `40037847` · L 81 / E 79.98 / Δ -1.02 -### C116 · Σ|Δ| 1.0 · 1 certs · `hpcdb19012/gas | cavity wall | pitched insulated` +### C113 · Σ|Δ| 1.0 · 1 certs · `hpcdb19012/gas | cavity wall | pitched insulated` - [ ] `10070056075` · L 80 / E 78.99 / Δ -1.01 -### C117 · Σ|Δ| 1.0 · 1 certs · `hpcdb16843/gas+2mains | cavity wall | pitched insulated | PV,RR,ext2` +### C114 · Σ|Δ| 1.0 · 1 certs · `hpcdb16843/gas+2mains | cavity wall | pitched insulated | PV,RR,ext2` - [ ] `200131078` · L 86 / E 85.00 / Δ -1.00 -### C118 · Σ|Δ| 1.0 · 1 certs · `hpcdb17489/gas | cavity wall | pitched 270 | PV,consv2,ext1,sec:room heaters` +### C115 · Σ|Δ| 1.0 · 1 certs · `hpcdb17489/gas | cavity wall | pitched 270 | PV,consv2,ext1,sec:room heaters` - [ ] `10000245212` · L 101 / E 100.00 / Δ -1.00 -### C119 · Σ|Δ| 1.0 · 1 certs · `h191/elec | solid brick | (another dwelling | ext2,whw909` +### C116 · Σ|Δ| 1.0 · 1 certs · `h191/elec | solid brick | (another dwelling | ext2,whw909` - [ ] `15129162` · L 62 / E 61.00 / Δ -1.00 -### C120 · Σ|Δ| 1.0 · 1 certs · `h301/coal-anth | cavity wall | pitched 270` +### C117 · Σ|Δ| 1.0 · 1 certs · `h301/coal-anth | cavity wall | pitched 270` - [ ] `23032873` · L 73 / E 72.00 / Δ -1.00 -### C121 · Σ|Δ| 1.0 · 1 certs · `hpcdb16930/gas | cavity wall | pitched unknown | RR,ext1,sec:room heaters` +### C118 · Σ|Δ| 1.0 · 1 certs · `hpcdb16930/gas | cavity wall | pitched unknown | RR,ext1,sec:room heaters` - [ ] `45019020` · L 62 / E 61.01 / Δ -0.99 -### C122 · Σ|Δ| 1.0 · 1 certs · `hpcdb17939/gas | solid brick | (another dwelling` +### C119 · Σ|Δ| 1.0 · 1 certs · `hpcdb17939/gas | solid brick | (another dwelling` - [ ] `42065028` · L 59 / E 58.02 / Δ -0.98 -### C123 · Σ|Δ| 1.0 · 1 certs · `hpcdb10071/gas | cavity wall | pitched 150 | RR` +### C120 · Σ|Δ| 1.0 · 1 certs · `hpcdb10071/gas | cavity wall | pitched 150 | RR` - [ ] `10032928147` · L 77 / E 76.04 / Δ -0.96 -### C124 · Σ|Δ| 1.0 · 1 certs · `hpcdb17045/gas | cavity wall | pitched 300` +### C121 · Σ|Δ| 1.0 · 1 certs · `hpcdb17045/gas | cavity wall | pitched 300` - [ ] `10010678937` · L 78 / E 77.04 / Δ -0.96 -### C125 · Σ|Δ| 1.0 · 1 certs · `hpcdb15247/gas | cavity wall | pitched insulated | RR` +### C122 · Σ|Δ| 1.0 · 1 certs · `hpcdb15247/gas | cavity wall | pitched insulated | RR` - [ ] `100011010151` · L 62 / E 62.96 / Δ +0.96 -### C126 · Σ|Δ| 1.0 · 1 certs · `hpcdb16406/gas | solid brick | pitched insulated | RR,consv2,ext2,sec:room heaters` +### C123 · Σ|Δ| 1.0 · 1 certs · `hpcdb16406/gas | solid brick | pitched insulated | RR,consv2,ext2,sec:room heaters` - [ ] `100050477371` · L 65 / E 64.04 / Δ -0.96 -### C127 · Σ|Δ| 0.9 · 1 certs · `hpcdb17529/fuel28 | cavity wall | pitched insulated | RR,ext2,sec:room heaters` +### C124 · Σ|Δ| 0.9 · 1 certs · `hpcdb17529/fuel28 | cavity wall | pitched insulated | RR,ext2,sec:room heaters` - [ ] `10002945522` · L 61 / E 61.94 / Δ +0.94 -### C128 · Σ|Δ| 0.9 · 1 certs · `h691/elec+2mains | cob as | pitched 300 | whw903` +### C125 · Σ|Δ| 0.9 · 1 certs · `h691/elec+2mains | cob as | pitched 300 | whw903` - [ ] `10032957680` · L 45 / E 45.94 / Δ +0.94 -### C129 · Σ|Δ| 0.9 · 1 certs · `hpcdb18204/gas | solid brick | pitched 400+ | PV,ext2` +### C126 · Σ|Δ| 0.9 · 1 certs · `hpcdb18204/gas | solid brick | pitched 400+ | PV,ext2` - [ ] `2465057465` · L 81 / E 81.93 / Δ +0.93 -### C130 · Σ|Δ| 0.9 · 1 certs · `hpcdb19019/gas | solid brick | pitched 100 | ext3,sec:room heaters` +### C127 · Σ|Δ| 0.9 · 1 certs · `hpcdb19019/gas | solid brick | pitched 100 | ext3,sec:room heaters` - [ ] `100090616327` · L 63 / E 63.93 / Δ +0.93 -### C131 · Σ|Δ| 0.9 · 1 certs · `hpcdb17612/gas | cavity wall | pitched 270 | ext1` +### C128 · Σ|Δ| 0.9 · 1 certs · `hpcdb17612/gas | cavity wall | pitched 270 | ext1` - [ ] `100012753833` · L 74 / E 73.07 / Δ -0.93 -### C132 · Σ|Δ| 0.9 · 1 certs · `hpcdb19006/gas | solid brick | pitched 75 | ext1,sec:room heaters` +### C129 · Σ|Δ| 0.9 · 1 certs · `hpcdb19006/gas | solid brick | pitched 75 | ext1,sec:room heaters` - [ ] `100031269525` · L 53 / E 53.91 / Δ +0.91 -### C133 · Σ|Δ| 0.9 · 1 certs · `hpcdb17964/gas | cavity wall | pitched insulated | consv3` +### C130 · Σ|Δ| 0.9 · 1 certs · `hpcdb17964/gas | cavity wall | pitched insulated | consv3` - [ ] `200003725358` · L 75 / E 74.09 / Δ -0.91 -### C134 · Σ|Δ| 0.9 · 1 certs · `hpcdb17507/gas | solid brick | pitched insulated | RR,ext3` +### C131 · Σ|Δ| 0.9 · 1 certs · `hpcdb17507/gas | solid brick | pitched insulated | RR,ext3` - [ ] `100050986162` · L 62 / E 61.10 / Δ -0.90 -### C135 · Σ|Δ| 0.9 · 1 certs · `hpcdb17985/gas | cavity wall | (another dwelling | mv2` +### C132 · Σ|Δ| 0.9 · 1 certs · `hpcdb17985/gas | cavity wall | (another dwelling | mv2` - [ ] `5300000141` · L 78 / E 77.10 / Δ -0.90 -### C136 · Σ|Δ| 0.9 · 1 certs · `hpcdb18616/gas | cavity wall | pitched 250 | sec:room heaters` +### C133 · Σ|Δ| 0.9 · 1 certs · `hpcdb18616/gas | cavity wall | pitched 250 | sec:room heaters` - [ ] `100050618404` · L 73 / E 73.89 / Δ +0.89 -### C137 · Σ|Δ| 0.9 · 1 certs · `hpcdb17507/gas | cavity wall | pitched 250 | PV,ext1` +### C134 · Σ|Δ| 0.9 · 1 certs · `hpcdb17507/gas | cavity wall | pitched 250 | PV,ext1` - [ ] `100090476016` · L 81 / E 81.89 / Δ +0.89 -### C138 · Σ|Δ| 0.9 · 1 certs · `h691/elec | timber frame | pitched 200 | RR,ext3,whw903` +### C135 · Σ|Δ| 0.9 · 1 certs · `h691/elec | timber frame | pitched 200 | RR,ext3,whw903` - [ ] `10012119141` · L 45 / E 45.89 / Δ +0.89 -### C139 · Σ|Δ| 0.9 · 1 certs · `h524/elec | cavity wall | pitched 300 | PV` +### C136 · Σ|Δ| 0.9 · 1 certs · `h524/elec | cavity wall | pitched 300 | PV` - [ ] `100040938206` · L 75 / E 75.89 / Δ +0.89 -### C140 · Σ|Δ| 0.9 · 1 certs · `hpcdb18234/gas | cavity wall | pitched insulated | RR,consv2` +### C137 · Σ|Δ| 0.9 · 1 certs · `hpcdb18234/gas | cavity wall | pitched insulated | RR,consv2` - [ ] `38188474` · L 76 / E 76.87 / Δ +0.87 -### C141 · Σ|Δ| 0.9 · 1 certs · `hpcdb16777/gas | cavity wall | pitched 100 | ext1,sec:room heaters` +### C138 · Σ|Δ| 0.9 · 1 certs · `hpcdb16777/gas | cavity wall | pitched 100 | ext1,sec:room heaters` - [ ] `100061194957` · L 69 / E 69.87 / Δ +0.87 -### C142 · Σ|Δ| 0.9 · 1 certs · `hpcdb18559/gas+2mains | solid brick | pitched 200 | whw914` +### C139 · Σ|Δ| 0.9 · 1 certs · `hpcdb18559/gas+2mains | solid brick | pitched 200 | whw914` - [ ] `100021236527` · L 72 / E 71.13 / Δ -0.87 -### C143 · Σ|Δ| 0.9 · 1 certs · `hpcdb18907/gas | cavity wall | pitched 270 | consv2` +### C140 · Σ|Δ| 0.9 · 1 certs · `hpcdb18907/gas | cavity wall | pitched 270 | consv2` - [ ] `100040193752` · L 71 / E 71.86 / Δ +0.86 -### C144 · Σ|Δ| 0.9 · 1 certs · `hpcdb10327/gas | cavity wall | (another dwelling` +### C141 · Σ|Δ| 0.9 · 1 certs · `hpcdb10327/gas | cavity wall | (another dwelling` - [ ] `100060701552` · L 74 / E 74.86 / Δ +0.86 -### C145 · Σ|Δ| 0.9 · 1 certs · `h691/elec | system built | flat insulated | whw903` +### C142 · Σ|Δ| 0.9 · 1 certs · `h691/elec | system built | flat insulated | whw903` - [ ] `10070396146` · L 61 / E 60.14 / Δ -0.86 -### C146 · Σ|Δ| 0.8 · 1 certs · `hpcdb8587/gas | cavity wall | (another dwelling` +### C143 · Σ|Δ| 0.8 · 1 certs · `hpcdb8587/gas | cavity wall | (another dwelling` - [ ] `100030528930` · L 74 / E 73.16 / Δ -0.84 -### C147 · Σ|Δ| 0.8 · 1 certs · `hpcdb18212/gas | solid brick | (another dwelling` +### C144 · Σ|Δ| 0.8 · 1 certs · `hpcdb18212/gas | solid brick | (another dwelling` - [ ] `100020982570` · L 72 / E 71.17 / Δ -0.83 -### C148 · Σ|Δ| 0.8 · 1 certs · `hpcdb16888/gas | cavity wall | pitched 350 | consv2` +### C145 · Σ|Δ| 0.8 · 1 certs · `hpcdb16888/gas | cavity wall | pitched 350 | consv2` - [ ] `394024487` · L 75 / E 74.17 / Δ -0.83 -### C149 · Σ|Δ| 0.8 · 1 certs · `hpcdb17503/gas | solid brick | pitched insulated | RR,ext1,mv4` +### C146 · Σ|Δ| 0.8 · 1 certs · `hpcdb17503/gas | solid brick | pitched insulated | RR,ext1,mv4` - [ ] `217070698` · L 78 / E 78.83 / Δ +0.83 -### C150 · Σ|Δ| 0.8 · 1 certs · `hpcdb15709/gas | cavity wall | (another dwelling | ext1` +### C147 · Σ|Δ| 0.8 · 1 certs · `hpcdb15709/gas | cavity wall | (another dwelling | ext1` - [ ] `77022508` · L 69 / E 68.18 / Δ -0.82 -### C151 · Σ|Δ| 0.8 · 1 certs · `hpcdb18496/gas | cavity wall | pitched 250 | RR,consv4` +### C148 · Σ|Δ| 0.8 · 1 certs · `hpcdb18496/gas | cavity wall | pitched 250 | RR,consv4` - [ ] `100040259104` · L 68 / E 68.82 / Δ +0.82 -### C152 · Σ|Δ| 0.8 · 1 certs · `hpcdb18559/gas | solid brick | pitched 270 | ext1` +### C149 · Σ|Δ| 0.8 · 1 certs · `hpcdb18559/gas | solid brick | pitched 270 | ext1` - [ ] `100031399026` · L 70 / E 70.81 / Δ +0.81 -### C153 · Σ|Δ| 0.8 · 1 certs · `hpcdb16374/gas | cavity wall | pitched unknown` +### C150 · Σ|Δ| 0.8 · 1 certs · `hpcdb16374/gas | cavity wall | pitched unknown` - [ ] `10009645698` · L 67 / E 67.81 / Δ +0.81 -### C154 · Σ|Δ| 0.8 · 1 certs · `hpcdb16395/gas | timber frame | thatched with | ext1,sec:room heaters` +### C151 · Σ|Δ| 0.8 · 1 certs · `hpcdb16395/gas | timber frame | thatched with | ext1,sec:room heaters` - [ ] `100080818887` · L 56 / E 55.19 / Δ -0.81 -### C155 · Σ|Δ| 0.8 · 1 certs · `hpcdb16835/gas | solid brick | pitched insulated | RR,ext1` +### C152 · Σ|Δ| 0.8 · 1 certs · `hpcdb16835/gas | solid brick | pitched insulated | RR,ext1` - [ ] `100012374381` · L 69 / E 69.80 / Δ +0.80 -### C156 · Σ|Δ| 0.8 · 1 certs · `hpcdb17560/gas | cavity wall | pitched 250 | ext2` +### C153 · Σ|Δ| 0.8 · 1 certs · `hpcdb17560/gas | cavity wall | pitched 250 | ext2` - [ ] `100012350270` · L 78 / E 77.20 / Δ -0.80 -### C157 · Σ|Δ| 0.8 · 1 certs · `hpcdb15166/gas+2mains | sandstone as | pitched no | PV,ext4,sec:room heaters,whw914` +### C154 · Σ|Δ| 0.8 · 1 certs · `hpcdb15166/gas+2mains | sandstone as | pitched no | PV,ext4,sec:room heaters,whw914` - [ ] `100051109723` · L 60 / E 60.78 / Δ +0.78 -### C158 · Σ|Δ| 0.8 · 1 certs · `hpcdb18911/gas | cavity wall | pitched 50 | consv4` +### C155 · Σ|Δ| 0.8 · 1 certs · `hpcdb18911/gas | cavity wall | pitched 50 | consv4` - [ ] `100061616915` · L 63 / E 62.22 / Δ -0.78 -### C159 · Σ|Δ| 0.8 · 1 certs · `h691/elec | cavity wall | pitched 200 | whw903` +### C156 · Σ|Δ| 0.8 · 1 certs · `h691/elec | cavity wall | pitched 200 | whw903` - [ ] `line71` · L 74 / E 74.77 / Δ +0.77 -### C160 · Σ|Δ| 0.8 · 1 certs · `hpcdb17986/gas | cavity wall | (another dwelling` +### C157 · Σ|Δ| 0.8 · 1 certs · `hpcdb17986/gas | cavity wall | (another dwelling` - [ ] `100011603934` · L 72 / E 71.23 / Δ -0.77 -### C161 · Σ|Δ| 0.8 · 1 certs · `hpcdb10244/gas | cavity wall | pitched 100` +### C158 · Σ|Δ| 0.8 · 1 certs · `hpcdb10244/gas | cavity wall | pitched 100` - [ ] `24030987` · L 73 / E 73.76 / Δ +0.76 -### C162 · Σ|Δ| 0.8 · 1 certs · `h193/elec | solid brick | (another dwelling | whw909` +### C159 · Σ|Δ| 0.8 · 1 certs · `h193/elec | solid brick | (another dwelling | whw909` - [ ] `100032043038` · L 74 / E 73.24 / Δ -0.76 -### C163 · Σ|Δ| 0.8 · 1 certs · `hpcdb17513/gas | cavity wall | pitched unknown` +### C160 · Σ|Δ| 0.8 · 1 certs · `hpcdb17513/gas | cavity wall | pitched unknown` - [ ] `100010866608` · L 71 / E 70.24 / Δ -0.76 -### C164 · Σ|Δ| 0.7 · 1 certs · `hpcdb17965/gas | cavity wall | pitched insulated | RR,ext1,sec:room heaters` +### C161 · Σ|Δ| 0.7 · 1 certs · `hpcdb17965/gas | cavity wall | pitched insulated | RR,ext1,sec:room heaters` - [ ] `100090399615` · L 67 / E 67.75 / Δ +0.75 -### C165 · Σ|Δ| 0.7 · 1 certs · `h691/elec | solid brick | roof room(s) | RR,ext2,sec:room heaters,whw903` -- [ ] `100062174575` · L 46 / E 46.75 / Δ +0.75 - -### C166 · Σ|Δ| 0.7 · 1 certs · `hpcdb16137/gas | solid brick | pitched 150` +### C162 · Σ|Δ| 0.7 · 1 certs · `hpcdb16137/gas | solid brick | pitched 150` - [ ] `200004296092` · L 71 / E 71.74 / Δ +0.74 -### C167 · Σ|Δ| 0.7 · 1 certs · `hpcdb17576/gas | cavity wall | pitched insulated | RR,consv2` +### C163 · Σ|Δ| 0.7 · 1 certs · `hpcdb17576/gas | cavity wall | pitched insulated | RR,consv2` - [ ] `10012341135` · L 79 / E 79.73 / Δ +0.73 -### C168 · Σ|Δ| 0.7 · 1 certs · `h409/elec | cavity wall | (another dwelling | sec:portable electric,whw903` +### C164 · Σ|Δ| 0.7 · 1 certs · `h409/elec | cavity wall | (another dwelling | sec:portable electric,whw903` - [ ] `100091005853` · L 70 / E 69.27 / Δ -0.73 -### C169 · Σ|Δ| 0.7 · 1 certs · `hpcdb18908/gas | cavity wall | pitched 175` +### C165 · Σ|Δ| 0.7 · 1 certs · `hpcdb18908/gas | cavity wall | pitched 175` - [ ] `100021533514` · L 71 / E 71.73 / Δ +0.73 -### C170 · Σ|Δ| 0.7 · 1 certs · `h301/coal-anth | solid brick | (another dwelling` +### C166 · Σ|Δ| 0.7 · 1 certs · `h301/coal-anth | solid brick | (another dwelling` - [ ] `5062075` · L 69 / E 69.72 / Δ +0.72 -### C171 · Σ|Δ| 0.7 · 1 certs · `hpcdb18112/gas | cavity wall | pitched 100 | RR,ext1` +### C167 · Σ|Δ| 0.7 · 1 certs · `hpcdb18112/gas | cavity wall | pitched 100 | RR,ext1` - [ ] `100040813308` · L 62 / E 62.72 / Δ +0.72 -### C172 · Σ|Δ| 0.7 · 1 certs · `h104/gas | solid brick | pitched unknown | ext2` +### C168 · Σ|Δ| 0.7 · 1 certs · `h104/gas | solid brick | pitched unknown | ext2` - [ ] `38105600` · L 68 / E 67.28 / Δ -0.72 -### C173 · Σ|Δ| 0.7 · 1 certs · `h104/gas | solid brick | pitched 200` +### C169 · Σ|Δ| 0.7 · 1 certs · `h104/gas | solid brick | pitched 200` - [ ] `line255` · L 72 / E 71.29 / Δ -0.71 -### C174 · Σ|Δ| 0.7 · 1 certs · `h304/elec | cavity wall | (another dwelling | whw950` +### C170 · Σ|Δ| 0.7 · 1 certs · `h304/elec | cavity wall | (another dwelling | whw950` - [ ] `5300047580` · L 69 / E 68.30 / Δ -0.70 -### C175 · Σ|Δ| 0.7 · 1 certs · `h104/gas | cavity wall | pitched 250 | ext1` +### C171 · Σ|Δ| 0.7 · 1 certs · `h104/gas | cavity wall | pitched 250 | ext1` - [ ] `100110433403` · L 69 / E 68.32 / Δ -0.68 -### C176 · Σ|Δ| 0.7 · 1 certs · `hpcdb16835/gas | cavity wall | pitched insulated` +### C172 · Σ|Δ| 0.7 · 1 certs · `hpcdb16835/gas | cavity wall | pitched insulated` - [ ] `10093416558` · L 79 / E 78.32 / Δ -0.68 -### C177 · Σ|Δ| 0.7 · 1 certs · `hpcdb18251/gas | solid brick | pitched 100` +### C173 · Σ|Δ| 0.7 · 1 certs · `hpcdb18251/gas | solid brick | pitched 100` - [ ] `100050958217` · L 68 / E 68.68 / Δ +0.68 -### C178 · Σ|Δ| 0.7 · 1 certs · `hpcdb18224/gas | solid brick | pitched 225 | ext1` +### C174 · Σ|Δ| 0.7 · 1 certs · `hpcdb18224/gas | solid brick | pitched 225 | ext1` - [ ] `100022667797` · L 68 / E 67.32 / Δ -0.68 -### C179 · Σ|Δ| 0.7 · 1 certs · `hpcdb10243/gas | cavity wall | pitched insulated | RR,sec:room heaters` +### C175 · Σ|Δ| 0.7 · 1 certs · `hpcdb10243/gas | cavity wall | pitched insulated | RR,sec:room heaters` - [ ] `100030528925` · L 78 / E 78.65 / Δ +0.65 -### C180 · Σ|Δ| 0.6 · 1 certs · `hpcdb17657/gas | cavity wall | (another dwelling` +### C176 · Σ|Δ| 0.6 · 1 certs · `hpcdb17657/gas | cavity wall | (another dwelling` - [ ] `100110300037` · L 74 / E 73.35 / Δ -0.65 -### C181 · Σ|Δ| 0.6 · 1 certs · `hpcdb2044/gas | solid brick | (another dwelling | ext1` +### C177 · Σ|Δ| 0.6 · 1 certs · `hpcdb2044/gas | solid brick | (another dwelling | ext1` - [ ] `217092450` · L 52 / E 52.64 / Δ +0.64 -### C182 · Σ|Δ| 0.6 · 1 certs · `hpcdb15101/gas | solid brick | pitched 300` +### C178 · Σ|Δ| 0.6 · 1 certs · `hpcdb15101/gas | solid brick | pitched 300` - [ ] `100061164545` · L 72 / E 71.36 / Δ -0.64 -### C183 · Σ|Δ| 0.6 · 1 certs · `hpcdb10328/gas | cavity wall | pitched unknown` +### C179 · Σ|Δ| 0.6 · 1 certs · `hpcdb10328/gas | cavity wall | pitched unknown` - [ ] `100051075936` · L 71 / E 70.36 / Δ -0.64 -### C184 · Σ|Δ| 0.6 · 1 certs · `hpcdb17507/gas | cavity wall | roof room(s) | RR,sec:room heaters` +### C180 · Σ|Δ| 0.6 · 1 certs · `hpcdb17507/gas | cavity wall | roof room(s) | RR,sec:room heaters` - [ ] `100011565830` · L 72 / E 72.64 / Δ +0.64 -### C185 · Σ|Δ| 0.6 · 1 certs · `hpcdb15700/gas | sandstone with | pitched 100 | RR,sec:room heaters` +### C181 · Σ|Δ| 0.6 · 1 certs · `hpcdb15700/gas | sandstone with | pitched 100 | RR,sec:room heaters` - [ ] `61010956` · L 75 / E 74.37 / Δ -0.63 -### C186 · Σ|Δ| 0.6 · 1 certs · `hpcdb17115/gas+2mains | cavity wall | pitched insulated | RR,ext4,sec:room heaters` +### C182 · Σ|Δ| 0.6 · 1 certs · `hpcdb17115/gas+2mains | cavity wall | pitched insulated | RR,ext4,sec:room heaters` - [ ] `100110752514` · L 67 / E 67.62 / Δ +0.62 -### C187 · Σ|Δ| 0.6 · 1 certs · `h404/elec | cavity wall | pitched 175 | sec:room heaters,whw909` +### C183 · Σ|Δ| 0.6 · 1 certs · `h404/elec | cavity wall | pitched 175 | sec:room heaters,whw909` - [ ] `100070295212` · L 75 / E 74.38 / Δ -0.62 -### C188 · Σ|Δ| 0.6 · 1 certs · `hpcdb18766/gas+2mains | sandstone as | pitched 100 | RR` +### C184 · Σ|Δ| 0.6 · 1 certs · `hpcdb18766/gas+2mains | sandstone as | pitched 100 | RR` - [ ] `100012534027` · L 65 / E 64.38 / Δ -0.62 -### C189 · Σ|Δ| 0.6 · 1 certs · `hpcdb9058/fuel28 | solid brick | pitched 100 | RR,ext2,sec:room heaters` +### C185 · Σ|Δ| 0.6 · 1 certs · `hpcdb9058/fuel28 | solid brick | pitched 100 | RR,ext2,sec:room heaters` - [x] `10009812472` · L 40 / E 39.40 / Δ -0.60 -### C190 · Σ|Δ| 0.6 · 1 certs · `hpcdb18218/gas | solid brick | (another dwelling` +### C186 · Σ|Δ| 0.6 · 1 certs · `hpcdb18218/gas | solid brick | (another dwelling` - [ ] `34080035` · L 77 / E 76.41 / Δ -0.59 -### C191 · Σ|Δ| 0.6 · 1 certs · `hpcdb16137/gas | cavity wall | pitched 150 | RR,ext1` +### C187 · Σ|Δ| 0.6 · 1 certs · `hpcdb16137/gas | cavity wall | pitched 150 | RR,ext1` - [ ] `21032732` · L 69 / E 69.59 / Δ +0.59 -### C192 · Σ|Δ| 0.6 · 1 certs · `h101/gas | cavity wall | pitched 100 | RR,ext1` +### C188 · Σ|Δ| 0.6 · 1 certs · `h101/gas | cavity wall | pitched 100 | RR,ext1` - [ ] `100060562056` · L 66 / E 65.41 / Δ -0.59 -### C193 · Σ|Δ| 0.6 · 1 certs · `hpcdb17514/fuel27 | cavity wall | pitched 400+ | PV,ext2` +### C189 · Σ|Δ| 0.6 · 1 certs · `hpcdb17514/fuel27 | cavity wall | pitched 400+ | PV,ext2` - [ ] `100091086558` · L 79 / E 79.58 / Δ +0.58 -### C194 · Σ|Δ| 0.6 · 1 certs · `hpcdb18908/gas | solid brick | (another dwelling` +### C190 · Σ|Δ| 0.6 · 1 certs · `hpcdb18908/gas | solid brick | (another dwelling` - [ ] `line599` · L 74 / E 73.42 / Δ -0.58 -### C195 · Σ|Δ| 0.6 · 1 certs · `hpcdb17973/gas | cavity wall | pitched insulated` +### C191 · Σ|Δ| 0.6 · 1 certs · `hpcdb17973/gas | cavity wall | pitched insulated` - [ ] `100020407741` · L 72 / E 71.42 / Δ -0.58 -### C196 · Σ|Δ| 0.6 · 1 certs · `hpcdb19007/gas | cavity wall | pitched 200 | consv2,ext1,sec:room heaters` +### C192 · Σ|Δ| 0.6 · 1 certs · `hpcdb19007/gas | cavity wall | pitched 200 | consv2,ext1,sec:room heaters` - [ ] `100050839457` · L 70 / E 70.57 / Δ +0.57 -### C197 · Σ|Δ| 0.6 · 1 certs · `hpcdb19007/gas | solid brick | pitched insulated | RR,sec:room heaters` +### C193 · Σ|Δ| 0.6 · 1 certs · `hpcdb19007/gas | solid brick | pitched insulated | RR,sec:room heaters` - [ ] `42105250` · L 59 / E 59.57 / Δ +0.57 -### C198 · Σ|Δ| 0.6 · 1 certs · `hpcdb1917/gas | timber frame | pitched insulated` +### C194 · Σ|Δ| 0.6 · 1 certs · `hpcdb1917/gas | timber frame | pitched insulated` - [ ] `77200509` · L 69 / E 69.57 / Δ +0.57 -### C199 · Σ|Δ| 0.6 · 1 certs · `hpcdb10356/gas | cavity wall | pitched insulated | ext2` +### C195 · Σ|Δ| 0.6 · 1 certs · `hpcdb10356/gas | cavity wall | pitched insulated | ext2` - [ ] `200040534` · L 65 / E 65.56 / Δ +0.56 -### C200 · Σ|Δ| 0.6 · 1 certs · `hpcdb17507/gas | solid brick | pitched 150 | ext1,mv2` +### C196 · Σ|Δ| 0.6 · 1 certs · `hpcdb17507/gas | solid brick | pitched 150 | ext1,mv2` - [ ] `200049463` · L 69 / E 69.56 / Δ +0.56 -### C201 · Σ|Δ| 0.6 · 1 certs · `h126/fuel28+2mains | cavity wall | pitched 300 | RR,consv2,ext3,sec:room heaters` +### C197 · Σ|Δ| 0.6 · 1 certs · `h126/fuel28+2mains | cavity wall | pitched 300 | RR,consv2,ext3,sec:room heaters` - [ ] `100062527568` · L 61 / E 61.56 / Δ +0.56 -### C202 · Σ|Δ| 0.6 · 1 certs · `hpcdb15700/gas | cavity wall | pitched limited | RR,ext1` +### C198 · Σ|Δ| 0.6 · 1 certs · `hpcdb15700/gas | cavity wall | pitched limited | RR,ext1` - [ ] `100100268900` · L 69 / E 69.56 / Δ +0.56 -### C203 · Σ|Δ| 0.6 · 1 certs · `hpcdb17004/fuel27+2mains | sandstone as | pitched no | ext3,sec:room heaters` +### C199 · Σ|Δ| 0.6 · 1 certs · `hpcdb17004/fuel27+2mains | sandstone as | pitched no | ext3,sec:room heaters` - [x] `200003110548` · L 29 / E 28.45 / Δ -0.55 -### C204 · Σ|Δ| 0.5 · 1 certs · `hpcdb9464/gas | cavity wall | pitched 150 | ext1` +### C200 · Σ|Δ| 0.5 · 1 certs · `hpcdb9464/gas | cavity wall | pitched 150 | ext1` - [ ] `90036914` · L 60 / E 60.55 / Δ +0.55 -### C205 · Σ|Δ| 0.5 · 1 certs · `h409/elec | cavity wall | pitched 250 | mv5,sec:room heaters,whw903` +### C201 · Σ|Δ| 0.5 · 1 certs · `h409/elec | cavity wall | pitched 250 | mv5,sec:room heaters,whw903` - [ ] `10004742671` · L 70 / E 69.46 / Δ -0.54 -### C206 · Σ|Δ| 0.5 · 1 certs · `hpcdb18251/gas | cavity wall | roof room(s) | RR` +### C202 · Σ|Δ| 0.5 · 1 certs · `hpcdb18251/gas | cavity wall | roof room(s) | RR` - [ ] `100010657450` · L 75 / E 75.54 / Δ +0.54 -### C207 · Σ|Δ| 0.5 · 1 certs · `hpcdb17507/gas | cavity wall | pitched 150 | ext1` +### C203 · Σ|Δ| 0.5 · 1 certs · `hpcdb17507/gas | cavity wall | pitched 150 | ext1` - [ ] `100061834344` · L 71 / E 70.46 / Δ -0.54 -### C208 · Σ|Δ| 0.5 · 1 certs · `h113/gas | cavity wall | pitched 200` +### C204 · Σ|Δ| 0.5 · 1 certs · `h113/gas | cavity wall | pitched 200` - [ ] `4510097194` · L 70 / E 70.53 / Δ +0.53 -### C209 · Σ|Δ| 0.5 · 1 certs · `hpcdb18907/gas | cavity wall | pitched 125 | ext1` +### C205 · Σ|Δ| 0.5 · 1 certs · `hpcdb18907/gas | cavity wall | pitched 125 | ext1` - [ ] `100010913220` · L 72 / E 72.53 / Δ +0.53 -### C210 · Σ|Δ| 0.5 · 1 certs · `hpcdb18242/gas | sandstone as | pitched 150 | ext2,sec:room heaters` +### C206 · Σ|Δ| 0.5 · 1 certs · `hpcdb18242/gas | sandstone as | pitched 150 | ext2,sec:room heaters` - [ ] `43074051` · L 63 / E 62.48 / Δ -0.52 -### C211 · Σ|Δ| 0.5 · 1 certs · `h104/gas | cavity wall | pitched 300` +### C207 · Σ|Δ| 0.5 · 1 certs · `h104/gas | cavity wall | pitched 300` - [ ] `100010723814` · L 69 / E 69.52 / Δ +0.52 -### C212 · Σ|Δ| 0.5 · 1 certs · `hpcdb16137/gas | cavity wall | (another dwelling` +### C208 · Σ|Δ| 0.5 · 1 certs · `hpcdb16137/gas | cavity wall | (another dwelling` - [ ] `100020955792` · L 77 / E 77.52 / Δ +0.52 -### C213 · Σ|Δ| 0.5 · 1 certs · `hpcdb19079/gas | cavity wall | pitched 200 | ext1,sec:room heaters` +### C209 · Σ|Δ| 0.5 · 1 certs · `hpcdb19079/gas | cavity wall | pitched 200 | ext1,sec:room heaters` - [ ] `77172223` · L 65 / E 65.52 / Δ +0.52 -### C214 · Σ|Δ| 0.5 · 1 certs · `hpcdb10242/gas | granite or | pitched insulated | RR,sec:room heaters` +### C210 · Σ|Δ| 0.5 · 1 certs · `hpcdb10242/gas | granite or | pitched insulated | RR,sec:room heaters` - [ ] `100051245439` · L 62 / E 61.48 / Δ -0.52 -### C215 · Σ|Δ| 0.5 · 1 certs · `hpcdb10328/gas | cavity wall | (another dwelling` +### C211 · Σ|Δ| 0.5 · 1 certs · `hpcdb10328/gas | cavity wall | (another dwelling` - [ ] `100012553958` · L 67 / E 66.48 / Δ -0.52 -### C216 · Σ|Δ| 0.5 · 1 certs · `hpcdb10033/gas | cavity wall | pitched 200 | ext2,sec:room heaters` +### C212 · Σ|Δ| 0.5 · 1 certs · `hpcdb10033/gas | cavity wall | pitched 200 | ext2,sec:room heaters` - [ ] `100110108632` · L 63 / E 63.51 / Δ +0.51 -### C217 · Σ|Δ| 0.5 · 1 certs · `h109/gas | cavity wall | pitched 270 | consv2,ext1,sec:room heaters` +### C213 · Σ|Δ| 0.5 · 1 certs · `h109/gas | cavity wall | pitched 270 | consv2,ext1,sec:room heaters` - [ ] `100091102581` · L 65 / E 65.51 / Δ +0.51 -### C218 · Σ|Δ| 0.5 · 1 certs · `hpcdb19008/gas | cavity wall | pitched 150 | ext1,sec:room heaters` +### C214 · Σ|Δ| 0.5 · 1 certs · `hpcdb19008/gas | cavity wall | pitched 150 | ext1,sec:room heaters` - [ ] `10002326688` · L 69 / E 68.50 / Δ -0.50 -### C219 · Σ|Δ| 0.5 · 1 certs · `h129/fuel28 | granite or | pitched 200 | ext2,sec:room heaters` +### C215 · Σ|Δ| 0.5 · 1 certs · `h129/fuel28 | granite or | pitched 200 | ext2,sec:room heaters` - [ ] `10023132869` · L 46 / E 45.50 / Δ -0.50 -### C220 · Σ|Δ| 0.5 · 1 certs · `hpcdb9007/fuel28 | sandstone as | pitched insulated | RR,ext4,sec:room heaters` +### C216 · Σ|Δ| 0.5 · 1 certs · `hpcdb9007/fuel28 | sandstone as | pitched insulated | RR,ext4,sec:room heaters` - [ ] `10091707271` · L 41 / E 41.50 / Δ +0.50 -## Resolved ≤0.5 (773 certs — no action) +## Resolved ≤0.5 (777 certs — no action)

expand @@ -926,6 +914,7 @@ Statuses: `[ ]` todo · `[x]` resolved ≤0.5 · 🔧 fix landed · ⚠ xfail en - [x] `100010779964` · L 72 / E 72.34 / Δ +0.34 · `hpcdb17683/gas | sandstone as | pitched 75` - [x] `64106486` · L 72 / E 71.66 / Δ -0.34 · `hpcdb17926/fuel27 | timber frame | pitched 270 | ext1` - [x] `100060109253` · L 62 / E 62.34 / Δ +0.34 · `hpcdb18435/gas | solid brick | pitched insulated | RR,ext2,sec:room heaters` +- [x] `47084930` · L 74 / E 74.34 / Δ +0.34 · `hpcdb17815/gas | cavity wall | flat insulated` - [x] `200002819281` · L 72 / E 71.66 / Δ -0.34 · `h104/gas | solid brick | pitched insulated | RR,ext1` - [x] `100051237659` · L 65 / E 64.67 / Δ -0.33 · `hpcdb18560/gas | sandstone as | pitched insulated | sec:room heaters` - [x] `12027355` · L 70 / E 70.33 / Δ +0.33 · `hpcdb1838/gas | solid brick | pitched insulated | ext1` @@ -999,6 +988,7 @@ Statuses: `[ ]` todo · `[x]` resolved ≤0.5 · 🔧 fix landed · ⚠ xfail en - [x] `32049938` · L 63 / E 62.71 / Δ -0.29 · `hpcdb17983/gas | solid brick | pitched 350 | sec:room heaters` - [x] `100110433442` · L 70 / E 69.71 / Δ -0.29 · `hpcdb16839/gas | cavity wall | pitched 400+ | ext1` - [x] `100070532674` · L 76 / E 76.29 / Δ +0.29 · `hpcdb17983/gas | cavity wall | pitched insulated` +- [x] `100032230128` · L 55 / E 54.71 / Δ -0.29 · `hpcdb1245/gas | solid brick | pitched insulated | ext1` - [x] `10024298029` · L 72 / E 72.29 / Δ +0.29 · `hpcdb17503/gas | solid brick | pitched 270 | ext1,sec:room heaters` - [x] `5079850` · L 39 / E 39.29 / Δ +0.29 · `h301/coal-anth | system built | (another dwelling | ext1,whw903` - [x] `10001235167` · L 74 / E 73.71 / Δ -0.29 · `hpcdb17645/gas | solid brick | pitched 225` @@ -1054,6 +1044,7 @@ Statuses: `[ ]` todo · `[x]` resolved ≤0.5 · 🔧 fix landed · ⚠ xfail en - [x] `83147775` · L 71 / E 71.25 / Δ +0.25 · `hpcdb16839/gas | cavity wall | pitched insulated` - [x] `72303880` · L 63 / E 62.75 / Δ -0.25 · `hpcdb17507/gas | cavity wall | pitched 150 | sec:room heaters` - [x] `100022711136` · L 72 / E 71.75 / Δ -0.25 · `hpcdb16495/gas | cavity wall | (another dwelling` +- [x] `100090536443` · L 86 / E 86.25 / Δ +0.25 · `hpcdb17974/gas | cavity wall | pitched 175 | PV,ext1` - [x] `83147745` · L 75 / E 75.25 / Δ +0.25 · `hpcdb16839/gas | cavity wall | (another dwelling | sec:room heaters` - [x] `200002598542` · L 61 / E 61.25 / Δ +0.25 · `h402/elec | cavity wall | pitched 175 | ext1,sec:room heaters,whw903` - [x] `100010572385` · L 62 / E 62.25 / Δ +0.25 · `hpcdb18817/gas | cavity wall | pitched 250 | ext2,sec:room heaters` @@ -1328,6 +1319,7 @@ Statuses: `[ ]` todo · `[x]` resolved ≤0.5 · 🔧 fix landed · ⚠ xfail en - [x] `5870046999` · L 73 / E 73.09 / Δ +0.09 · `hpcdb17973/gas | cavity wall | (another dwelling` - [x] `100010384681` · L 75 / E 74.91 / Δ -0.09 · `hpcdb19080/gas | cavity wall | pitched 400+ | PV,ext1,sec:room heaters` - [x] `100022536385` · L 71 / E 70.92 / Δ -0.08 · `hpcdb17505/gas | solid brick | pitched 300` +- [x] `100031433810` · L 70 / E 70.08 / Δ +0.08 · `hpcdb19094/gas | cavity wall | (another dwelling | ext1,sec:room heaters` - [x] `1710029098` · L 69 / E 69.08 / Δ +0.08 · `hpcdb17958/gas | cavity wall | pitched 270 | sec:room heaters` - [x] `100040884417` · L 70 / E 70.08 / Δ +0.08 · `hpcdb10328/gas | cavity wall | (another dwelling` - [x] `100080706339` · L 65 / E 65.08 / Δ +0.08 · `hpcdb16396/gas | system built | pitched 250` diff --git a/scripts/hyde/build_47084930.py b/scripts/hyde/build_47084930.py new file mode 100644 index 000000000..679a9e56e --- /dev/null +++ b/scripts/hyde/build_47084930.py @@ -0,0 +1,299 @@ +"""Elmhurst build for UPRN 47084930 (RdSAP-21.0.1, TOP-FLOOR FLAT, band E, +CAVITY wall with INTERNAL insulation (100 mm), FLAT ROOF insulated 75 mm, floor +over OTHER PREMISES below, mains-gas COMBI (PCDB 17815), 5 DG windows ~9.9 m², +no doors, TFA 64. Lodged SAP 74; engine 69.51 (Δ −4.49, PE +47 over-count). + +Per-cert worksheet validation. Suspected engine gap: the flat-roof insulation +thickness is lodged in `flat_roof_insulation_thickness` (75 mm) but the U-value +calc reads `roof_insulation_thickness` (None) → bills the roof at the age-E flat +default 1.5 (96 W/K) instead of the 75 mm insulated ~0.5 (~30 W/K). This build +gets the accredited flat-roof + floor U. Run: + DISPLAY=:99 python scripts/hyde/build_47084930.py +""" +from __future__ import annotations +import sys +from pathlib import Path +import elmhurst_lib as E + +DIM = "TabContainer_TabPanelMain_WebUserControlDimensionsMain_" +WALL = ("TabContainer_TabPanelMain_InnerTabContainerMain_" + "TabPanelExternalWallMain_WebUserControlWallMain_") +ROOF = "TabContainer_TabPanelMain_WebUserControlRoofMain_" +FLOOR = "TabContainer_TabPanelMain_WebUserControlFloorsMain_" +WP = "TabContainer_TabPanelWindowsPanel_" +DP = "TabContainer_TabPanelDoorsPanel_" +VP = "TabContainer_TabPanelVentilationPanel_" +APT = "TabContainer_TabPanelAirPressureTest_" +LP = "TabContainer_TabPanelLighting_" +MV = "TabContainer_TabPanelMechVent_" +WH = "TabContainer_TabPanelWaterHeating_" +MH1B = "TabContainer_TabPanelMainHeating1_WebUserControlMainHeating1_" +_SAMPLE_DIR = (Path(__file__).parent.parent.parent + / "backend/epc_api/json_samples/real_life_examples" + / "RdSAP-Schema-21.0.1/uprn_47084930") + + +def _pick(page, suffix, contains): + val = page.evaluate( + """(a)=>{const s=document.getElementById(a[0]);if(!s)return null; + for(const o of s.options){if(o.text.toLowerCase().includes(a[1].toLowerCase()))return o.value;}return null;}""", + [f"{E.FP}{suffix}", contains]) + if val is not None: + E.set_select(page, suffix, val) + return val + + +def _options(page, suffix): + return page.evaluate( + """(id)=>{const s=document.getElementById(id);if(!s)return []; + return Array.from(s.options).map(o=>o.text);}""", f"{E.FP}{suffix}") + + +def property_description(page): + E.goto(page, "PropertyDescription", "WebFormPropertyDescription.aspx") + _pick(page, "DropDownListPropertyType1", "flat") or \ + E.set_select(page, "DropDownListPropertyType1", "F Flat") + E.set_text(page, "TextBoxStoreys", "1") + E.set_text(page, "TextBoxHabitableRooms", "3") + E.set_text(page, "TextBoxHeatedHabitableRooms", "3") + print("date ->", _pick(page, "DropDownListDateBuiltMain", "1967-1975")) + E.set_select(page, "DropDownListDateBuiltFirst", "") + E.save_close(page) + + +def flats(page): + E.goto(page, "Flats", "WebFormFlats.aspx") + print("flat positions:", _options(page, "" if False else "DropDownListPositionOfFlat")) + _pick(page, "DropDownListPositionOfFlat", "top") or \ + E.set_select(page, "DropDownListPositionOfFlat", "Top Floor") + E.set_text(page, "TextBoxFloor", "3") + E.set_select(page, "RadioButtonListFlatCoridor", "None") + E.save_close(page) + + +def dimensions(page): + E.goto(page, "Dimensions", "WebFormDimensions.aspx") + E.set_text(page, f"{DIM}TextBoxFloorAreaLowestFloor", "64.26") + E.set_text(page, f"{DIM}TextBoxRoomHeightLowestFloor", "2.32") + E.set_text(page, f"{DIM}TextBoxWallPerimeterLowestFloor", "18.15") + E.set_text(page, f"{DIM}TextBoxPartyWallLengthLowestFloor", "18.15") + E.save_close(page) + + +def walls(page): + E.goto(page, "Walls", "WebFormWalls.aspx") + E.set_select(page, f"{WALL}DropDownListType", "CA Cavity") + page.wait_for_timeout(500) + print("insulation opts:", _options(page, f"{WALL}DropDownListInsulation")) + _pick(page, f"{WALL}DropDownListInsulation", "internal") + page.wait_for_timeout(500) + for suf in (f"{WALL}DropDownListInsulationThickness",): + if page.locator(f"#{E.FP}{suf}").count(): + print("wall ins thickness opts:", _options(page, suf)) + _pick(page, suf, "100") + E.save_close(page) + + +def roofs(page): + E.goto(page, "Roofs", "WebFormRoofs.aspx") + print("ROOF TYPE opts:", _options(page, f"{ROOF}DropDownListType")) + _pick(page, f"{ROOF}DropDownListType", "flat") + page.wait_for_timeout(600) + # discover flat-roof insulation fields + for suf in (f"{ROOF}DropDownListInsulationAt", f"{ROOF}DropDownListThickness", + f"{ROOF}DropDownListInsulation"): + if page.locator(f"#{E.FP}{suf}").count(): + print(f" {suf.split('_')[-1]} opts:", _options(page, suf)) + # flat roof insulated 75 mm + if page.locator(f"#{E.FP}{ROOF}DropDownListThickness").count(): + _pick(page, f"{ROOF}DropDownListThickness", "75") + E.save_close(page) + + +def floors(page): + E.goto(page, "Floors", "WebFormFloors.aspx") + print("FLOOR LOCATION opts:", _options(page, f"{FLOOR}DropDownListLocation")) + # "(other premises below)" = above a partially-heated space + (_pick(page, f"{FLOOR}DropDownListLocation", "partially heated") + or _pick(page, f"{FLOOR}DropDownListLocation", "other premises") + or _pick(page, f"{FLOOR}DropDownListLocation", "unheated")) + page.wait_for_timeout(400) + tsel = page.locator(f"#{E.FP}{FLOOR}DropDownListType") + if tsel.count(): + _pick(page, f"{FLOOR}DropDownListType", "solid") + E.save_close(page) + + +def openings(page): + E.goto(page, "Openings", "WebFormOpenings.aspx") + E.click_tab(page, "TabContainer_TabPanelWindowsPanel") + _add_window(page, 9.9, "North", _glazing(page)) + _delete_zero_rows(page) + E.click_tab(page, "TabContainer_TabPanelDoorsPanel") + E.set_text(page, f"{DP}TextBoxDoors", "0") + E.set_text(page, f"{DP}TextBoxDoorsInsulated", "0") + E.set_text(page, f"{DP}TextBoxDraughtProofedDoors", "0") + E.save_close(page) + + +def _glazing(page): + for needle in ("unknown install date", "before 2002", "pre 2002"): + for opt in _options(page, f"{WP}DropDownListExtGlazing"): + low = opt.lower() + if needle in low and "triple" not in low and "single" not in low and "known data" not in low: + return opt + return "Double post or during 2022" + + +def _add_window(page, area, orientation, glazing): + print("glazing ->", glazing) + E.set_select(page, f"{WP}DropDownListExtGlazing", glazing) + page.wait_for_timeout(400) + ft = page.locator(f"#{E.FP}{WP}DropDownListExtFrameType") + if ft.count(): + ft.select_option("PVC") + gg = page.locator(f"#{E.FP}{WP}DropDownListExtGlazingGap") + if gg.count(): + gg.select_option("12 mm") + wid = f"{E.FP}{WP}TextBoxExtWidth" + page.evaluate( + """(a)=>{const e=document.getElementById(a[0]);if(e){e.value=a[1]; + e.dispatchEvent(new Event('input',{bubbles:true})); + e.dispatchEvent(new Event('change',{bubbles:true})); + e.dispatchEvent(new Event('blur',{bubbles:true}));}}""", [wid, str(area)]) + page.locator(f"#{E.FP}{WP}TextBoxExtHeight").fill("1.00") + page.locator(f"#{E.FP}{WP}DropDownListExtOrientation").select_option(orientation) + page.locator(f"#{E.FP}{WP}DropDownListExtBuildingPartId").select_option("Main") + page.locator(f"#{E.FP}{WP}DropDownListExtLocation").select_option("External wall") + page.wait_for_timeout(300) + before = E.window_row_count(page) + page.evaluate("(id)=>{const e=document.getElementById(id); if(e)e.click();}", f"{E.FP}{WP}ButtonAddWindow") + for _ in range(25): + page.wait_for_timeout(200) + if E.window_row_count(page) > before: + break + + +def _grid_rows(page): + return page.evaluate( + """()=>{const t=document.querySelector("[id*=GridViewExtendedWidows]"); + if(!t)return[];return Array.from(t.querySelectorAll('tr')).slice(1) + .map(r=>Array.from(r.querySelectorAll('td')).map(c=>c.innerText.trim()));}""") + + +def _delete_zero_rows(page): + g = 0 + while g < 6 and E.window_row_count(page) > 1: + g += 1 + rows = _grid_rows(page) + bad = next((i for i, c in enumerate(rows) if len(c) > 1 and c[1] in ("0.00", "0", "0.0")), None) + if bad is None: + break + _delete_row(page, bad) + page.wait_for_timeout(400) + + +def _delete_row(page, idx): + before = E.window_row_count(page) + btn = page.evaluate( + """(i)=>{const b=document.querySelectorAll("[id*='GridViewExtendedWidows_DeleteButton_']");return b[i]?b[i].id:null;}""", idx) + if not btn: + return + page.evaluate("(id)=>{const e=document.getElementById(id); if(e)e.click();}", btn) + page.wait_for_selector(f"#{E.FP}DeleteWindowDialog_LinkButtonYes", state="visible", timeout=5000) + page.evaluate("(id)=>{const e=document.getElementById(id); if(e)e.click();}", f"{E.FP}DeleteWindowDialog_LinkButtonYes") + for _ in range(20): + page.wait_for_timeout(200) + if E.window_row_count(page) < before: + break + + +def ventilation(page): + E.goto(page, "VentilationAndCooling", "WebFormVentilationAndCooling.aspx") + E.click_tab(page, "TabContainer_TabPanelVentilationPanel") + E.set_text(page, f"{VP}TextBoxIntermittentFans", "0") + cool = page.locator(f"#{E.FP}{VP}CheckBoxFixedSpaceCooling") + if cool.count() and cool.is_checked(): + E.commit(page, cool.uncheck) + E.click_tab(page, "TabContainer_TabPanelMechVent") + mv = page.locator(f"#{E.FP}{MV}CheckBoxMechanicalVentilation") + if mv.count() and mv.is_checked(): + E.commit(page, mv.uncheck) + E.click_tab(page, "TabContainer_TabPanelAirPressureTest") + E.set_select(page, f"{APT}DropDownListTestMethod", "Not available") + E.click_tab(page, "TabContainer_TabPanelLighting") + E.set_text(page, f"{LP}TextBoxLightsTotal", "6") + E.set_text(page, f"{LP}TextBoxLedLightsTotal", "0") + E.set_text(page, f"{LP}TextBoxCflLightsTotal", "0") + E.save_close(page) + + +def space_heating(page): + E.goto(page, "SpaceHeating", "WebFormSpaceHeating.aspx") + page.wait_for_timeout(1000) + mhc = page.locator(f"#{E.MH1}TextBoxMainHeatingCode") + code = mhc.input_value() if mhc.count() else "" + if code and code not in ("0",): + print(f"clearing leftover MainHeatingCode {code}") + page.evaluate("""(id)=>{const e=document.getElementById(id);if(e){e.value=''; + e.dispatchEvent(new Event('change',{bubbles:true}));}}""", f"{E.MH1}TextBoxMainHeatingCode") + page.wait_for_timeout(400) + E.save_close(page) + return + E.set_heating_dialog(page, f"{MH1B}ButtonMainHeatingCode", + "^Gas", "Mains gas", "Boilers", "Post 1998", "Condensing", + "Combi condens") + print("code:", page.locator(f"#{E.MH1}TextBoxMainHeatingCode").input_value()) + E.set_heating_dialog(page, f"{MH1B}ButtonMainHeatingControls", + "^Boilers", "^Standard", "CBE Programmer, room thermostat and TRVs") + print("control:", page.locator(f"#{E.MH1}TextBoxMainHeatingControls").input_value()) + E.set_select(page, "DropDownListSecondaryHeatingPresent", "No") + E.save_close(page) + + +def water_heating(page): + E.goto(page, "WaterHeating", "WebFormWaterHeating.aspx") + E.click_tab(page, "TabContainer_TabPanelWaterHeating") + page.wait_for_timeout(400) + E.clear_hot_water_cylinder(page) + E.set_heating_dialog(page, f"{WH}ButtonWaterHeatingCode", + "From Space Heating", "From the primary heating system") + print("water code:", page.locator(f"#{E.FP}{WH}TextBoxWaterHeatingCode").input_value()) + E.save_close(page) + + +def download(page): + _SAMPLE_DIR.mkdir(parents=True, exist_ok=True) + E.goto(page, "Recommendations", "WebFormRecommendations.aspx") + page.wait_for_timeout(1500) + with page.expect_navigation(wait_until="networkidle", timeout=40000): + page.click("#ContentBody_buttonActionSummary_Link", timeout=15000) + page.wait_for_timeout(2000) + for btn, fname in (("ContentBody_ContentPlaceHolder1_LinkButtonSummary", "elmhurst_summary.pdf"), + ("ContentBody_ContentPlaceHolder1_ButtonDebugInforPdf", "elmhurst_worksheet.pdf")): + try: + with page.expect_download(timeout=60000) as dl: + page.click(f"#{btn}", timeout=15000) + dl.value.save_as(str(_SAMPLE_DIR / fname)) + print("saved", fname) + except Exception as e: + print("!! download failed", fname, type(e).__name__, str(e)[:120]) + + +_ORDER = ["property_description", "flats", "dimensions", "walls", "roofs", + "floors", "openings", "ventilation", "space_heating", "water_heating", + "download"] + + +def main(): + if len(sys.argv) < 2 or sys.argv[1] not in _ORDER: + print("usage: build_47084930.py <" + "|".join(_ORDER) + ">") + return 2 + with E.session() as (ctx, page): + globals()[sys.argv[1]](page) + print("done:", sys.argv[1], "->", page.url) + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/tests/domain/sap10_calculator/test_real_cert_sap_accuracy.py b/tests/domain/sap10_calculator/test_real_cert_sap_accuracy.py index e63d946bf..9f3bce1b2 100644 --- a/tests/domain/sap10_calculator/test_real_cert_sap_accuracy.py +++ b/tests/domain/sap10_calculator/test_real_cert_sap_accuracy.py @@ -805,6 +805,24 @@ _EXPECTATIONS: Final[tuple[RealCertExpectation, ...]] = ( cert_num="uprn-200004017091", sap_score=71, ), + # UPRN 47084930 (corpus; no cert number lodged). RdSAP-21.0.1 native — + # TOP-FLOOR FLAT, band E, cavity wall + 100 mm internal insulation, FLAT + # ROOF insulated 75 mm, floor over other premises, mains-gas combi. The + # flat-roof insulation-thickness cert: the 75 mm is lodged in + # `flat_roof_insulation_thickness`, but heat_transmission read + # `roof_insulation_thickness` (None) → billed the flat roof at the + # uninsulated age-E default 1.5 (roof 96.4 W/K) → PE +47, engine 69.51 + # (Δ −4.49 vs lodged 74). Preferring the flat field → U 0.5 (roof 32.1 + # W/K), engine 74.34 = lodged 74. VALIDATED against the accredited + # Elmhurst worksheet (built on the lodged inputs, evidence saved: + # elmhurst_summary.pdf / elmhurst_worksheet.pdf): "insulated flat roof" + # U 0.5, floor 0.70 and wall 0.25 both matching the engine. PINNED 74. + RealCertExpectation( + schema="RdSAP-Schema-21.0.1", + sample="uprn_47084930", + cert_num="uprn-47084930", + sap_score=74, + ), ) diff --git a/tests/domain/sap10_calculator/worksheet/test_heat_transmission.py b/tests/domain/sap10_calculator/worksheet/test_heat_transmission.py index d0bb7bacc..2df247a2d 100644 --- a/tests/domain/sap10_calculator/worksheet/test_heat_transmission.py +++ b/tests/domain/sap10_calculator/worksheet/test_heat_transmission.py @@ -370,6 +370,46 @@ def test_rafter_insulation_thickness_field_drives_table16_column_2() -> None: assert abs(result.roof_w_per_k - 25.0) <= 1e-4 +def test_flat_roof_insulation_thickness_field_drives_insulated_u() -> None: + # Arrange — a FLAT roof lodges its insulation thickness in the DEDICATED + # gov-EPC API `flat_roof_insulation_thickness` field (e.g. "75mm"), + # leaving `roof_insulation_thickness` None (that field is for pitched-loft + # joists). heat_transmission must prefer the flat field when the part is a + # flat roof so the measured thickness bills at its RdSAP 10 §5.11 Table-16 + # U (75 mm → 0.5) instead of the uninsulated age-band flat default (age E + # → 1.5). Cert 47084930 (top-floor flat, flat roof "75mm"): roof 96.4 -> + # 32.1 W/K, engine 69.51 -> 74.34 = lodged 74, matching the accredited + # Elmhurst worksheet ("insulated flat roof", U 0.5). Mirrors the rafter + # field. Geometry: 100 m² plan → roof 100 m². 0.5 × 100 = 50 W/K. + main = make_building_part( + construction_age_band="E", + wall_construction=4, + wall_insulation_type=4, + party_wall_construction=1, + roof_construction=1, # flat + floor_dimensions=[ + make_floor_dimension( + total_floor_area_m2=100.0, room_height_m=2.5, + party_wall_length_m=0.0, heat_loss_perimeter_m=40.0, floor=0, + ), + ], + ) + main.roof_construction_type = "Flat" + main.roof_insulation_thickness = None # gov leaves this None for flat roofs + main.flat_roof_insulation_thickness = "75mm" # the thickness lives here + epc = make_minimal_sap10_epc( + total_floor_area_m2=100.0, + country_code="ENG", + sap_building_parts=[main], + ) + + # Act + result = heat_transmission_from_cert(epc) + + # Assert — 75 mm insulated flat roof at U 0.5, not the age-E default 1.5. + assert abs(result.roof_w_per_k - 50.0) <= 1e-4 + + def test_lodged_roof_u_value_overrides_construction_default() -> None: # Arrange — RdSAP 10 §5.1: where an element's U-value is known from the # assessment (documentary evidence / the lodged RdSAP output) it is used diff --git a/tests/infrastructure/epc_client/test_sap_accuracy_corpus.py b/tests/infrastructure/epc_client/test_sap_accuracy_corpus.py index 197e6f7e0..345f426e5 100644 --- a/tests/infrastructure/epc_client/test_sap_accuracy_corpus.py +++ b/tests/infrastructure/epc_client/test_sap_accuracy_corpus.py @@ -227,7 +227,17 @@ _CORPUS = Path( # Table-13 fraction path already used). Gated on the explicit 0 so a # full-SAP unlodged size (None) keeps its own handling. 7 corpus certs; # within 77.0% -> 77.3%, PE 3.2 -> 3.05, CO2 0.074 -> 0.073. -_MIN_WITHIN_HALF_SAP = 0.773 +# 0.773 -> 0.777 via the flat-roof insulation-thickness fix: a FLAT roof +# lodges its thickness in the dedicated `flat_roof_insulation_thickness` +# field (e.g. "75mm"), but heat_transmission read `roof_insulation_thickness` +# (None for flat roofs) -> billed the roof at the uninsulated age-band flat +# default (age E 1.5) instead of the insulated Table-16 U. Prefer the flat +# field when the part is flat (mirrors the rafter-thickness branch). Cert +# 47084930 (top-floor flat, flat roof 75mm): roof 96.4 -> 32.1 W/K, engine +# 69.51 -> 74.34 = lodged 74, VALIDATED against the accredited Elmhurst +# worksheet ("insulated flat roof" U 0.5). within 77.3% -> 77.7%, PE 3.1 -> +# 2.97, CO2 0.074 -> 0.072. +_MIN_WITHIN_HALF_SAP = 0.777 # 0.793 -> 0.789 via the §12 Unknown-meter + dual-electric-immersion off-peak # trigger (RdSAP 10 PDF p.62): Apartment 241 (main 691 + 903 dual immersion) # -5.38 -> -1.05. Worksheet-validated on "simulated case 48" (Elmhurst SAP 57, @@ -313,9 +323,9 @@ _MIN_WITHIN_HALF_SAP = 0.773 # (U~1.4) -> ~0.29, PE +59.6 -> ~0, SAP 64.35 -> 71.74 (lodged 71). Scoped to # brick/stone (the only §5.8 R-value path); within-0.5 held at 77.0%, MAE # 0.658 -> 0.647, PE 3.2 -> 3.1. Unit-pinned in test_rdsap_uvalues. -_MAX_SAP_MAE = 0.648 -_MAX_CO2_MAE_TONNES = 0.074 # t CO2 / yr vs co2_emissions_current -_MAX_PE_PER_M2_MAE = 3.1 # kWh / m2 / yr vs energy_consumption_current +_MAX_SAP_MAE = 0.641 +_MAX_CO2_MAE_TONNES = 0.072 # t CO2 / yr vs co2_emissions_current +_MAX_PE_PER_M2_MAE = 3.0 # kWh / m2 / yr vs energy_consumption_current def _load_corpus() -> list[dict[str, Any]]: