mirror of
https://github.com/Hestia-Homes/Model.git
synced 2026-06-08 11:17:27 +00:00
Cohort-2 cert 2102 (House coal secondary) and cohort-1 cert 0300-2747 (mains-gas secondary) both exposed the same bug: cert_to_inputs hardcoded `_STANDARD_ELECTRICITY_FUEL_CODE` for the secondary CO2 and PE factors, ignoring the cert's lodged `secondary_fuel_type`. The cost-side helper `_secondary_fuel_cost_gbp_per_kwh` already routes through the lodged code; this slice mirrors it on the CO2 and PE side. Per SAP 10.2 Table 12d (p.195) and Table 12e (p.196) header text: "Where electricity is the fuel used, the relevant set of factors in the table below should be used to calculate the monthly [CO2 emissions / primary energy] instead the annual average factor given in Table 12." → electricity end-uses use the monthly Table 12d/12e cascade; non-electric fuels (House coal, mains gas, wood logs, etc.) pass through the annual Table 12 factor. Per Appendix M Table 4a + the API mapper's `_api_secondary_fuel_type` spec-fuel override (S0380.43), cert 2102's lodged API code 33 (electricity off-peak) is rewritten to Table 32 code 11 (House coal) because `secondary_heating_type=631` "Open fire in grate" is physically incompatible with an electric secondary fuel. The new `_secondary_fuel_code` helper preserves Table 12 codes (House coal 11 stays 11) and translates raw gov-API codes via API_FUEL_TO_TABLE_12 (e.g. lodged API 29 → Table 12 30 "standard electricity") so the Table 12d/12e monthly lookups resolve consistently across both mapper output regimes. Cert 2102 DEMAND-path residuals (vs lodged): PE +20.36 → +0.20 kWh/m² (lodged 228 integer-rounded) CO2 -0.79 → +0.005 t/yr (lodged 4.1 integer-rounded) Cert 0300-2747 DEMAND-path residuals (mains-gas secondary, fuel 26): PE +8.28 → +0.93 kWh/m² CO2 -0.25 → +0.25 t/yr Other 23 golden certs all use the electricity default and stay pin- exact via the API→Table 12 translation in `_secondary_fuel_code`. New helpers in cert_to_inputs.py: - `_secondary_fuel_code(epc)` — resolves the cert's secondary fuel code through the dual API/Table-12 fallback that `co2_factor_kg_per_kwh` already uses. - `_secondary_heating_co2_factor_kg_per_kwh(epc, secondary_monthly_kwh)` — Table 12d monthly for electric, Table 12 annual for non-electric. - `_secondary_heating_primary_factor(epc, secondary_monthly_kwh)` — Table 12e monthly for electric, Table 12 annual for non-electric. Four call sites replaced: - `cert_to_inputs` `secondary_heating_co2_factor_kg_per_kwh` field (line ~3552) - `cert_to_inputs` `secondary_heating_primary_factor` field (line ~3625) - `environmental_section_from_cert` secondary CO2 §12 (line ~1863) - `primary_energy_section_from_cert` secondary PE §13a (line ~1967) Tests: - `test_house_coal_secondary_routes_to_annual_table_12_co2_and_pe_factors` pins 0.395 / 1.064 (Table 12 code 11). - `test_secondary_heating_with_lodged_type_but_no_fuel_defaults_to_electricity` pins monthly-weighted electricity factors > annual 0.136 / 1.501 (§A.2.2 default still applies). - `test_golden_fixtures.py`: cert 2102 + 0300-2747 pins updated to the new residuals; 57 other golden certs untouched. Baseline: 542 pass + 9 expected `test_sap_result_pin[000565-*]` cascade-gap fails. Pyright net-zero on every touched file. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> |
||
|---|---|---|
| .. | ||
| addresses | ||
| sap10_calculator | ||
| sap10_ml | ||
| tasks | ||
| postcode.py | ||