From 1032a4f128dbcd2e10d2e31804e0c92650b20c40 Mon Sep 17 00:00:00 2001 From: Jun-te Kim Date: Fri, 3 Jul 2026 04:28:25 +0000 Subject: [PATCH] test(accuracy): validate + pin 100061275133 (slice-5 external-insulation U confirmed) 2-storey semi, solid brick 400mm with EXTERNAL insulation, 300mm loft, suspended uninsulated ground floor, gas combi, double glazing (glazed_type 13). Built in accredited Elmhurst RdSAP10: roof (U 0.14, 5.459 W/K) and windows (15.32 x eff U 1.3258 = 20.311 W/K) match the engine EXACTLY; the externally-insulated wall is engine U 0.29 vs Elmhurst 0.30, validating the slice-5 external-insulation default (100mm added over solid brick); suspended ground floor engine 0.68 vs Elmhurst 0.70. Elmhurst's overall SAP 67 is not comparable (reused-assessment Standard-Combi keep-hot loss, a build artifact). Engine 77 vs lodged 76 (within 1.24). Pinned to the observed 77. Co-Authored-By: Claude Opus 4.8 --- .../uprn_100061275133/elmhurst_summary.pdf | Bin 0 -> 79070 bytes .../uprn_100061275133/elmhurst_worksheet.pdf | Bin 0 -> 44121 bytes .../uprn_100061275133/epc.json | 410 ++++++++++++++++++ scripts/hyde/build_100061275133.py | 224 ++++++++++ .../test_real_cert_sap_accuracy.py | 22 + 5 files changed, 656 insertions(+) create mode 100644 backend/epc_api/json_samples/real_life_examples/RdSAP-Schema-21.0.1/uprn_100061275133/elmhurst_summary.pdf create mode 100644 backend/epc_api/json_samples/real_life_examples/RdSAP-Schema-21.0.1/uprn_100061275133/elmhurst_worksheet.pdf create mode 100644 backend/epc_api/json_samples/real_life_examples/RdSAP-Schema-21.0.1/uprn_100061275133/epc.json create mode 100644 scripts/hyde/build_100061275133.py diff --git a/backend/epc_api/json_samples/real_life_examples/RdSAP-Schema-21.0.1/uprn_100061275133/elmhurst_summary.pdf b/backend/epc_api/json_samples/real_life_examples/RdSAP-Schema-21.0.1/uprn_100061275133/elmhurst_summary.pdf new file mode 100644 index 0000000000000000000000000000000000000000..7e17907d954d755eb7f43d62abfdeb2cbf634bf8 GIT binary patch literal 79070 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 CW9e`J literal 0 HcmV?d00001 diff --git a/backend/epc_api/json_samples/real_life_examples/RdSAP-Schema-21.0.1/uprn_100061275133/elmhurst_worksheet.pdf b/backend/epc_api/json_samples/real_life_examples/RdSAP-Schema-21.0.1/uprn_100061275133/elmhurst_worksheet.pdf new file mode 100644 index 0000000000000000000000000000000000000000..da423eee1188bd92e5477ff5cb0a4f9eca9c86aa GIT binary patch literal 44121 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 +""" +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_") +PWALL = ("TabContainer_TabPanelMain_InnerTabContainerMain_" + "TabPanelPartyWallMain_WebUserControlPartyWallMain_") +ROOF = "TabContainer_TabPanelMain_WebUserControlRoofMain_" +FLOOR = "TabContainer_TabPanelMain_WebUserControlFloorsMain_" +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_100061275133") + + +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 property_description(page): + E.goto(page, "PropertyDescription", "WebFormPropertyDescription.aspx") + E.set_select(page, "DropDownListPropertyType1", "H House") + _pick(page, "DropDownListPropertyType2", "semi") + E.set_text(page, "TextBoxStoreys", "2") + E.set_text(page, "TextBoxHabitableRooms", "3") + E.set_text(page, "TextBoxHeatedHabitableRooms", "3") + print("date ->", _pick(page, "DropDownListDateBuiltMain", "1900-1929")) + E.set_select(page, "DropDownListDateBuiltFirst", "") + E.set_select(page, "DropDownListRoomInRoofMain", "") + E.save_close(page) + + +def dimensions(page): + E.goto(page, "Dimensions", "WebFormDimensions.aspx") + E.set_text(page, f"{DIM}TextBoxFloorAreaLowestFloor", "38.99") + E.set_text(page, f"{DIM}TextBoxRoomHeightLowestFloor", "2.40") + E.set_text(page, f"{DIM}TextBoxWallPerimeterLowestFloor", "17.92") + E.set_text(page, f"{DIM}TextBoxPartyWallLengthLowestFloor", "5.09") + E.set_text(page, f"{DIM}TextBoxFloorArea1stFloor", "38.99") + E.set_text(page, f"{DIM}TextBoxRoomHeight1stFloor", "2.40") + E.set_text(page, f"{DIM}TextBoxWallPerimeter1stFloor", "17.92") + E.set_text(page, f"{DIM}TextBoxPartyWallLength1stFloor", "5.09") + E.save_close(page) + + +def walls(page): + E.goto(page, "Walls", "WebFormWalls.aspx") + _pick(page, f"{WALL}DropDownListType", "solid brick") + page.wait_for_timeout(500) + print("insulation ->", _pick(page, f"{WALL}DropDownListInsulation", "external")) + print("party ->", _pick(page, f"{PWALL}DropDownListPartyWallType", "determine") + or _pick(page, f"{PWALL}DropDownListPartyWallType", "masonry")) + E.save_close(page) + + +def roofs(page): + E.goto(page, "Roofs", "WebFormRoofs.aspx") + _pick(page, f"{ROOF}DropDownListType", "access to loft") or \ + _pick(page, f"{ROOF}DropDownListType", "loft") + _pick(page, f"{ROOF}DropDownListInsulationAt", "joists") + _pick(page, f"{ROOF}DropDownListThickness", "300") + E.save_close(page) + + +def floors(page): + E.goto(page, "Floors", "WebFormFloors.aspx") + _pick(page, f"{FLOOR}DropDownListLocation", "ground floor") + page.wait_for_timeout(400) + _pick(page, f"{FLOOR}DropDownListType", "suspended") + ins = page.locator(f"#{E.FP}{FLOOR}DropDownListInsulation") + if ins.count(): + E.set_select(page, f"{FLOOR}DropDownListInsulation", "A As built") + E.save_close(page) + + +def openings(page): + E.goto(page, "Openings", "WebFormOpenings.aspx") + E.click_tab(page, "TabContainer_TabPanelWindowsPanel") + page.wait_for_timeout(500) + E.set_single_window(page, 15.32, "North", _glazing(page)) + E.click_tab(page, "TabContainer_TabPanelDoorsPanel") + E.set_text(page, f"{DP}TextBoxDoors", "2") + E.set_text(page, f"{DP}TextBoxDoorsInsulated", "0") + E.set_text(page, f"{DP}TextBoxDraughtProofedDoors", "0") + E.save_close(page) + + +def _glazing(page): + # glazed_type 13 -> double glazed, 2022 or later (U 1.4) + return "Double post or during 2022" + + +def ventilation(page): + E.goto(page, "VentilationAndCooling", "WebFormVentilationAndCooling.aspx") + E.click_tab(page, "TabContainer_TabPanelVentilationPanel") + E.set_text(page, f"{VP}TextBoxIntermittentFans", "1") + 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 _unused_secondary(page): + E.goto(page, "SpaceHeating", "WebFormSpaceHeating.aspx") + page.wait_for_timeout(600) + E.set_select(page, "DropDownListSecondaryHeatingPresent", "Yes") + page.wait_for_timeout(900) + E.set_heating_dialog(page, "ButtonSecondaryHeatingCode", + "^Gas", "Mains gas", "Room Heater") + tb = page.locator(f"#{E.FP}TextBoxSecondaryHeatingCode") + print("secondary code:", tb.input_value() if tb.count() else "?") + 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]) + + +def cleanup(page): + """Leave the shared assessment neutral for the next build.""" + E.reset_transient_state(page) + print("reset transient state (RR/secondary/meter)") + + +_ORDER = ["property_description", "dimensions", "walls", "roofs", "floors", + "openings", "ventilation", "space_heating", + "water_heating", "download", "cleanup"] + + +def main(): + if len(sys.argv) < 2 or sys.argv[1] not in _ORDER: + print("usage: build_100061275133.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 a1caa14aa..21af95ba8 100644 --- a/tests/domain/sap10_calculator/test_real_cert_sap_accuracy.py +++ b/tests/domain/sap10_calculator/test_real_cert_sap_accuracy.py @@ -863,6 +863,28 @@ _EXPECTATIONS: Final[tuple[RealCertExpectation, ...]] = ( cert_num="uprn-217091901", sap_score=61, ), + # UPRN 100061275133 (corpus; no cert number lodged). RdSAP-21.0.1 native — + # 2-storey SEMI-DETACHED HOUSE, band B, SOLID BRICK 400 mm with EXTERNAL + # insulation, pitched 300 mm loft, SUSPENDED uninsulated ground floor, + # mains-gas COMBI, double glazing (glazed_type 13, 2022+), TFA 78. + # Lodged 76 / engine 77 (77.24). Built in accredited Elmhurst RdSAP10 + # (evidence saved: elmhurst_summary.pdf / elmhurst_worksheet.pdf): the + # checkable FABRIC matches the engine closely — ROOF (300 mm loft, U 0.14) + # and WINDOWS (15.32 m² × eff U 1.3258 = 20.3106 W/K) match EXACTLY; the + # externally-insulated WALL is U 0.29 (engine) vs 0.30 (Elmhurst) — which + # VALIDATES the slice-5 external-insulation default (100 mm added over solid + # brick, `_WALL_ADDED_INSULATION_UNKNOWN_THICKNESS_MM`); the suspended + # ground floor is U 0.68 (engine) vs 0.70 (Elmhurst). (Elmhurst''s overall + # worksheet SAP 67 is NOT comparable — the reused-assessment combi entered + # as a "Standard Combi" carries a ~50 kWh/month Table-3a keep-hot loss the + # lodged assessment did not, a build-side heating artifact, not an engine + # gap.) Engine 77 sits within 1.24 of lodged; PINNED to the observed 77. + RealCertExpectation( + schema="RdSAP-Schema-21.0.1", + sample="uprn_100061275133", + cert_num="uprn-100061275133", + sap_score=77, + ), )