From 8f0432721c79836a67ad4ce2bf133b84c6f13715 Mon Sep 17 00:00:00 2001 From: Jun-te Kim Date: Tue, 23 Jun 2026 16:13:34 +0000 Subject: [PATCH] test(accuracy): pin RdSAP-20.0.0 PV semi uprn_22086693 (PV-list fix corpus) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Corpus validation of the modelling_e2e photovoltaic_supply-as-list fix. Cert 6102-6227-8000-0083-2292 (RdSAP-20.0.0 semi, gas combi + 2× 1.14 kW PV arrays) crashed from_rdsap_schema_20_0_0 on the measured-array list; the fix routes it through the dict-tolerant _map_schema_21_pv. PV correctly credited: engine 61 (no PV) → 66 (+5). Built in Elmhurst (evidence: epc.json + summary + worksheet, fabric+heating; the PV "New Technologies" Panel-details grid deferred): worksheet 55 = engine-on-Elmhurst-inputs 55 exactly → calculator faithful. The +6 engine-vs- Elmhurst base-dwelling residual is the documented RdSAP-default gap (band-C cavity- uninsulated suspended-floor semi). Pinned engine 66. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../uprn_22086693/elmhurst_summary.pdf | Bin 0 -> 66213 bytes .../uprn_22086693/elmhurst_worksheet.pdf | Bin 0 -> 44131 bytes scripts/hyde/build_22086693.py | 307 ++++++++++++++++++ .../test_real_cert_sap_accuracy.py | 24 ++ 4 files changed, 331 insertions(+) create mode 100644 backend/epc_api/json_samples/real_life_examples/RdSAP-Schema-20.0.0/uprn_22086693/elmhurst_summary.pdf create mode 100644 backend/epc_api/json_samples/real_life_examples/RdSAP-Schema-20.0.0/uprn_22086693/elmhurst_worksheet.pdf create mode 100644 scripts/hyde/build_22086693.py diff --git a/backend/epc_api/json_samples/real_life_examples/RdSAP-Schema-20.0.0/uprn_22086693/elmhurst_summary.pdf b/backend/epc_api/json_samples/real_life_examples/RdSAP-Schema-20.0.0/uprn_22086693/elmhurst_summary.pdf new file mode 100644 index 0000000000000000000000000000000000000000..56569fde69d5140917f6ba22d1e5edeb642ab688 GIT binary patch literal 66213 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༚%hcPLwyc4{&zPb2BeAr?nP==y{Cf=$Z@6Uv+% z={zTD@&j;nI-(0HrX#{bJeg-mSmR6oF7o)ZW*ZS-E~uoYPZrCUDgKf;|5XXG1Eo|N zN#%tEw+$-6C41EWOi2XyuEFm9_h|pQPt|UyH7H*qV&Sbi>%oCA=erVfI zEDbx}cTBN*RDHZi2ld`g=x$&bF4Y9i40mnK#V2WI>+|DfgUPE|lklxf+O3KsFZ)hs zizSM)b5Cu`cjFIDvs$%tEZcI8 z>Z32UD-H13@mjNGu59W@MLR`YDsBO}`z0R>;O+Rf#&=~fS8%mG3BZ(Qe{A{yXAhX( z7dOMUx+|1E<>xPV^ql*uQ$^m8&_jDdo6t3*uex?W7!!Ref?a>&nbVrFWc?)`8-AP- zfm1&a4^r_uLc7sEOgc}0n#d%;X?P2x;u|%jwt}6ta~kJdW_cB)O=&c2(M+9vIJ_|5 zC+-p+LT^{-^%b!2p5#F^sd4`s0do@08A6%qG}!>2?))}v*REPl1_)zDfEB*r0FnD}q{cd;RPhmo=wY%NW z>jki7lVeh?!9@Zf#-NM>(snjrPcD!TjcK)$~cbYEd z{#9~?Uz?3!mG?+FG8HvH1MU%VSNEbI9Xdj?jBsuthWFYhT|SZ%8t#-?|7hgP+07lU z7iz}VlEgbDE{h}t|?m6&E!lxhbOS z=d9{O(sH8@h^)misxC3~pez2Ys?5&1SDgDR%#_@yEQ*>J6Ik{-OZUG%3Zn1u%GIk! z%8);mc8kM`$0WN`&ewdqb8rHZ{`1z%(=M@py7;H=wswGD*#rRK|6U9bFc<`8uw(cO zyY|4pE(Yhnuo_tg0FMr z|54v{v;P7U`A7eR`5`y$1q*`&Zng^nf&_1l$94C9?SsGB3lX?}`yZH);LUa+g4bz6 zH_HivfPX9J>23vev~>rFiv##{pnkT$<_n*;i_7&-2EVpufP@6V!_&&$^N-mCx&Bx} L09ICc4Tb*#IxY&0 literal 0 HcmV?d00001 diff --git a/backend/epc_api/json_samples/real_life_examples/RdSAP-Schema-20.0.0/uprn_22086693/elmhurst_worksheet.pdf b/backend/epc_api/json_samples/real_life_examples/RdSAP-Schema-20.0.0/uprn_22086693/elmhurst_worksheet.pdf new file mode 100644 index 0000000000000000000000000000000000000000..eb7b60b6fa0fa35f93c10c6ea30b601f656a8ae4 GIT binary patch literal 44131 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 rW&W@Kg+gS^7T!{5#Xu literal 0 HcmV?d00001 diff --git a/scripts/hyde/build_22086693.py b/scripts/hyde/build_22086693.py new file mode 100644 index 00000000..5f102a45 --- /dev/null +++ b/scripts/hyde/build_22086693.py @@ -0,0 +1,307 @@ +"""Elmhurst build for UPRN 22086693 (RdSAP-Schema-20.0.0, SEMI-DETACHED HOUSE, +2-storey, band C 1930-1949, cavity UNINSULATED, mains-gas COMBI (no PCDB index → +generic SAP Table 4b combi), control 2106 (CBE), pitched 200 mm loft, suspended +uninsulated floor, party wall 6.8 m, double glazed, 2× PV ARRAYS @1.14 kW +(orientations SE/SW, pitch 30°, overshading modest), electric SECONDARY room +heater (SAP 691 REA), TFA ~74, window 11.84 m². Engine 66 / lodged 72. + +P2 of the modelling_e2e corpus validation — the photovoltaic_supply-as-list fix +cert. The PV adds +5 (engine 61→66) so it IS credited; the −6 vs lodged is a +fabric/heating gap to localise. NEW build elements: generic (no-PCDB) combi + +the Renewables/PV page. Run: + DISPLAY=:99 python scripts/hyde/build_22086693.py +""" +from __future__ import annotations +import sys +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_" +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_" + + +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") + E.set_select(page, "DropDownListPropertyType1", "H House") + _pick(page, "DropDownListPropertyType2", "semi") # built_form 2 + E.set_text(page, "TextBoxStoreys", "2") + E.set_text(page, "TextBoxHabitableRooms", "4") + E.set_text(page, "TextBoxHeatedHabitableRooms", "4") + print("date ->", _pick(page, "DropDownListDateBuiltMain", "1930-1949")) # band C + 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", "36.86") + E.set_text(page, f"{DIM}TextBoxRoomHeightLowestFloor", "2.30") + E.set_text(page, f"{DIM}TextBoxWallPerimeterLowestFloor", "13.4") + E.set_text(page, f"{DIM}TextBoxPartyWallLengthLowestFloor", "6.8") + E.set_text(page, f"{DIM}TextBoxFloorArea1stFloor", "36.86") + E.set_text(page, f"{DIM}TextBoxRoomHeight1stFloor", "2.30") + E.set_text(page, f"{DIM}TextBoxWallPerimeter1stFloor", "17.4") + E.set_text(page, f"{DIM}TextBoxPartyWallLength1stFloor", "6.8") + 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(400) + print("insulation ->", _pick(page, f"{WALL}DropDownListInsulation", "as built")) # uninsulated + # Semi party wall: cavity. Match "masonry filled" → CF (U≈0); avoid loose "filled". + pw = _pick(page, f"{PWALL}DropDownListPartyWallType", "masonry filled") \ + or _pick(page, f"{PWALL}DropDownListPartyWallType", "determine") + print("party wall ->", pw) + E.save_close(page) + + +def roofs(page): + E.goto(page, "Roofs", "WebFormRoofs.aspx") + _pick(page, f"{ROOF}DropDownListType", "access to loft") + _pick(page, f"{ROOF}DropDownListInsulationAt", "joists") + E.set_select(page, f"{ROOF}DropDownListThickness", "200 mm") + E.save_close(page) + + +def floors(page): + E.goto(page, "Floors", "WebFormFloors.aspx") + E.set_select(page, f"{FLOOR}DropDownListLocation", "G Ground floor") + _pick(page, f"{FLOOR}DropDownListType", "suspended timber") + 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") + _add_window(page, 11.84, "North", _glazing(page)) + _delete_zero_rows(page) + E.click_tab(page, "TabContainer_TabPanelDoorsPanel") + E.set_text(page, f"{DP}TextBoxDoors", "1") + 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 fix_window(page): + """Edit-in-place: overwrite the shared assessment's leftover window width to ours.""" + E.goto(page, "Openings", "WebFormOpenings.aspx") + E.click_tab(page, "TabContainer_TabPanelWindowsPanel") + page.wait_for_timeout(800) + 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, "11.84"]) + print("window width now:", page.locator(f"#{wid}").input_value()) + E.save_close(page) + + +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", "10") + E.set_text(page, f"{LP}TextBoxLedLightsTotal", "10") # 100% LED + E.set_text(page, f"{LP}TextBoxCflLightsTotal", "0") + E.save_close(page) + + +def space_heating(page): + # Generic (no-PCDB) mains-gas combi. The shared assessment may carry a prior + # cert's storage SEB / PCDB boiler — clear it first if present, then select a + # generic gas combi via the boiler dialog. Two passes if a SAP code is bound. + E.goto(page, "SpaceHeating", "WebFormSpaceHeating.aspx") + page.wait_for_timeout(1000) + # Pass 1: clear a leftover SAP-table MainHeatingCode (e.g. SEB) so the boiler + # search/dialog is usable. + 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 + # Generic (no-PCDB) mains-gas boiler via the cascade: Gas → Mains gas → + # Boilers → Post 1998 → Condensing (combi vs regular is set by the water- + # heating page: "from primary" + no cylinder = combi). ~89% SAP Table 4b. + E.set_heating_dialog(page, f"{MH1B}ButtonMainHeatingCode", + "^Gas", "Mains gas", "Boilers", "Post 1998", "Condensing", + "Combi condens") # L6 = BGW Post 98 Combi condens. (SAP 4b ~89%) + 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.save_close(page) + + +def secondary(page): + # Lodged secondary: SAP 691 = REA electric panel/convector/radiant room heater. + 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", + "Electric", "Electric", "Room Heater", "REA Panel") + 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 renewables(page): + # 2× PV arrays @1.14 kW. Discover the Renewables/PV page structure. + for url in ("WebFormRenewables.aspx", "WebFormPhotovoltaics.aspx", "WebFormSolar.aspx"): + try: + E.goto(page, url.replace("WebForm", "").replace(".aspx", ""), url) + page.wait_for_timeout(800) + print("PV page:", url, "->", page.url) + inputs = page.evaluate( + """()=>Array.from(document.querySelectorAll("[id*=ContentPlaceHolder1] input,[id*=ContentPlaceHolder1] select")).map(e=>e.id.replace('ContentBody_ContentPlaceHolder1_','')).filter(i=>/pv|photov|solar|peak|orient|pitch|oversh|panel/i.test(i)).slice(0,30)""") + print("PV-ish fields:", inputs) + return + except Exception as e: + print(" ", url, "->", type(e).__name__) + + +_ORDER = ["property_description", "dimensions", "walls", "roofs", "floors", + "openings", "fix_window", "ventilation", "space_heating", "secondary", + "water_heating", "renewables"] + + +def main(): + if len(sys.argv) < 2 or sys.argv[1] not in _ORDER: + print("usage: build_22086693.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 df9a58e1..5575384f 100644 --- a/tests/domain/sap10_calculator/test_real_cert_sap_accuracy.py +++ b/tests/domain/sap10_calculator/test_real_cert_sap_accuracy.py @@ -625,6 +625,30 @@ _EXPECTATIONS: Final[tuple[RealCertExpectation, ...]] = ( cert_num="8742-6624-9300-2780-4926", sap_score=66, ), + # UPRN 22086693 → cert 6102-6227-8000-0083-2292. RdSAP-Schema-20.0.0, SEMI- + # DETACHED HOUSE 2-storey, band C, cavity UNINSULATED, mains-gas COMBI (no PCDB + # → generic SAP Table-4b BGW post-98 condensing combi), control 2106 (CBE), + # pitched 200 mm loft, suspended uninsulated floor, party wall 6.8 m, double + # glazed, electric secondary room heater (SAP 691 REA), 2× PV ARRAYS @1.14 kW, + # 100% LED, TFA ~74. Engine 66 / lodged 72. + # This is the modelling_e2e photovoltaic_supply-AS-LIST fix cert: 20.0.0 typed + # `photovoltaic_supply` as the wrapper only, so a measured-array LIST crashed + # `from_rdsap_schema_20_0_0` ("'list' object has no attribute none_or_no_details") + # and sank the whole prediction cohort. The fix routes it through the dict-tolerant + # `_map_schema_21_pv`, capturing the arrays. PV is correctly credited: engine + # WITHOUT pv = 61, WITH pv = 66 (+5). Built in Elmhurst RdSAP10 (evidence saved: + # elmhurst_summary.pdf / elmhurst_worksheet.pdf) — fabric+heating only (the PV + # is a separate "New Technologies" Panel-details grid, deferred): worksheet 55, + # engine on Elmhurst's own parsed inputs 55 = 55 EXACTLY → calculator faithful. + # The engine-without-pv 61 vs Elmhurst 55 (+6) is the documented engine-vs- + # Elmhurst-RdSAP-default residual on a band-C cavity-uninsulated suspended-floor + # semi; lodged 72 vs engine 66 (−6) is that plus PV-credit method. PINNED engine 66. + RealCertExpectation( + schema="RdSAP-Schema-20.0.0", + sample="uprn_22086693", + cert_num="6102-6227-8000-0083-2292", + sap_score=66, + ), )