Model/harness/sample_catalogue.json
Khalim Conn-Kowlessar 0918dd37ec feat(scripts): run_modelling_e2e — inspect recommendations per property_id
Revives the local recommendation-inspection flow for specific Properties.
`scripts/run_modelling_e2e.py` reads each Property's UPRN from the DB
(read-only), fetches the latest EPC live from the gov EPC API by UPRN, runs the
Modelling stage in memory (all Generators → Optimiser → costed, attributed
Plan), and prints a per-Property plan table + writes a Markdown/CSV summary.
Persists nothing — purely for inspection.

The local DB's Properties have no linked ingested EPC (epc_property.property_id
is NULL for all rows; Ingestion's source clients are stubbed, #1136), so the
EPC must be fetched inline rather than read back. Builds the connection from the
`DB_*` env vars in backend/.env and the EPC token from `EPC_AUTH_TOKEN`.

Threads optional solar insights through harness `run_modelling` (so Solar PV
Options can fire once coordinates are wired) and adds the `solar_pv` catalogue
row. Solar + planning restrictions + DB persistence are noted follow-ups.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-08 14:25:33 +00:00

17 lines
864 B
JSON

{
"cavity_wall_insulation": { "unit_cost_per_m2": 18.5 },
"loft_insulation": { "unit_cost_per_m2": 12.0 },
"sloping_ceiling_insulation": { "unit_cost_per_m2": 40.0 },
"flat_roof_insulation": { "unit_cost_per_m2": 60.0 },
"suspended_floor_insulation": { "unit_cost_per_m2": 25.0 },
"solid_floor_insulation": { "unit_cost_per_m2": 45.0 },
"mechanical_ventilation": { "unit_cost_per_m2": 450.0 },
"external_wall_insulation": { "unit_cost_per_m2": 100.0 },
"internal_wall_insulation": { "unit_cost_per_m2": 90.0 },
"double_glazing": { "unit_cost_per_m2": 600.0 },
"secondary_glazing": { "unit_cost_per_m2": 510.0 },
"low_energy_lighting": { "unit_cost_per_m2": 8.0 },
"high_heat_retention_storage_heaters": { "unit_cost_per_m2": 3500.0 },
"air_source_heat_pump": { "unit_cost_per_m2": 12000.0 },
"solar_pv": { "unit_cost_per_m2": 0.0 }
}