From 7be4d83ffae180df42bffd08687efb1a0c823bc8 Mon Sep 17 00:00:00 2001 From: Khalim Conn-Kowlessar Date: Thu, 4 Jun 2026 10:27:29 +0000 Subject: [PATCH] chore(billing): refresh off-gas fuel rates onto one consistent basis Apply the deep-research off-gas figures so oil/smokeless/wood sit on the same NEP-Apr-2026 retail / DESNZ DUKES gross-CV basis as the new coal proxy (fuel-input, not useful-heat): OIL 9.16 -> 12.11 (prior value was materially low vs current kerosene), SMOKELESS 10.0 -> 8.69, WOOD_LOGS 8.83 -> 8.25, WOOD_PELLETS 7.99 -> 7.38. SEG (15.0, Solar Energy UK) and LPG (17.61, bottled-propane) kept; gas/electricity (Ofgem cap) unchanged. CV arithmetic recorded in the snapshot _assumptions. OIL pin updated. Co-Authored-By: Claude Opus 4.8 --- .../fuel_rates/data/fuel_rates_2026_q2.json | 25 +++++++++++++------ .../test_fuel_rates_static_file_repository.py | 2 +- 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/repositories/fuel_rates/data/fuel_rates_2026_q2.json b/repositories/fuel_rates/data/fuel_rates_2026_q2.json index bb095c72..c92af0dc 100644 --- a/repositories/fuel_rates/data/fuel_rates_2026_q2.json +++ b/repositories/fuel_rates/data/fuel_rates_2026_q2.json @@ -1,9 +1,9 @@ { "period": "2026-04 to 2026-06", - "basis": "GB national average; Ofgem price cap (gas/electricity), DESNZ/NEP May 2026 (off-gas fuels)", + "basis": "GB national average; fuel-input / metered p/kWh (NOT useful-heat). Ofgem price cap (gas/electricity); NEP Apr 2026 retail prices converted with DESNZ DUKES gross calorific values (off-gas fuels)", "sources": { "gas_electricity": "Ofgem energy price cap unit rates and standing charges, announced 2026-02-25, cap period Apr-Jun 2026", - "off_gas": "DESNZ QEP petroleum table (oil, May 2026) + Nottingham Energy Partnership May 2026 comparison (LPG, smokeless, wood)", + "off_gas": "Nottingham Energy Partnership Apr 2026 retail prices (oil, smokeless, wood; LPG bottled-propane proxy) / DESNZ DUKES 2024 gross calorific values; see _assumptions", "seg": "Solar Energy UK SEG league table, updated 2026-05-12" }, "seg_export_p_per_kwh": 15.0, @@ -11,11 +11,11 @@ "MAINS_GAS": { "unit_rate_p_per_kwh": 5.74, "standing_charge_p_per_day": 29.09 }, "ELECTRICITY": { "unit_rate_p_per_kwh": 24.67, "standing_charge_p_per_day": 57.21 }, "ELECTRICITY_OFF_PEAK": { "day_p_per_kwh": 29.73, "night_p_per_kwh": 13.89, "standing_charge_p_per_day": 56.99 }, - "OIL": { "unit_rate_p_per_kwh": 9.16, "standing_charge_p_per_day": 0.0 }, - "LPG": { "unit_rate_p_per_kwh": 17.61, "standing_charge_p_per_day": 0.0 }, - "SMOKELESS": { "unit_rate_p_per_kwh": 10.0, "standing_charge_p_per_day": 0.0 }, - "WOOD_LOGS": { "unit_rate_p_per_kwh": 8.83, "standing_charge_p_per_day": 0.0 }, - "WOOD_PELLETS": { "unit_rate_p_per_kwh": 7.99, "standing_charge_p_per_day": 0.0, "_note": "bagged pellets; blown bulk is 6.76 p/kWh" }, + "OIL": { "unit_rate_p_per_kwh": 12.11, "standing_charge_p_per_day": 0.0 }, + "LPG": { "unit_rate_p_per_kwh": 17.61, "standing_charge_p_per_day": 0.0, "_note": "bottled-propane basis; bulk tank LPG is materially lower" }, + "SMOKELESS": { "unit_rate_p_per_kwh": 8.69, "standing_charge_p_per_day": 0.0 }, + "WOOD_LOGS": { "unit_rate_p_per_kwh": 8.25, "standing_charge_p_per_day": 0.0 }, + "WOOD_PELLETS": { "unit_rate_p_per_kwh": 7.38, "standing_charge_p_per_day": 0.0, "_note": "bagged pellets (NEP Apr 2026 / DUKES GCV); blown bulk is lower" }, "COAL": { "unit_rate_p_per_kwh": 7.13, "standing_charge_p_per_day": 0.0, "proxy": true, "_note": "PROXY, not a market rate. No current GB retail house-coal price (NEP Apr 2026 blank; domestic house-coal sale restricted since 2021). NEP Nov 2025 coal 48.50p/kg uprated by smokeless movement -> 52.39p/kg / DUKES house-coal GCV 7.3502 kWh/kg = 7.13 p/kWh." }, "HEAT_NETWORK": { "unit_rate_p_per_kwh": 16.0, "standing_charge_p_per_day": 69.4, "indicative": true, "_note": "INDICATIVE, not a regulated rate. Delivered-heat charge; no national tariff/cap. Insite Energy Nov 2024 operator sample avg 16.03 p/kWh + 69.42 p/day; schemes vary widely (~8-30 p/kWh per CMA/Heat Trust)." } }, @@ -24,5 +24,14 @@ "HEAT_NETWORK": "INDICATIVE rate (see _note): scheme-specific, no national tariff/cap; treat the bill as indicative.", "ELECTRICITY_OFF_PEAK": "day/night split; priced once the off-peak slice adds the day/night accessor" }, - "_proxy_research": "COAL + HEAT_NETWORK proxies sourced 2026-06 via deep research (NEP retail + DESNZ DUKES gross CVs for coal; Insite Energy / CMA / Heat Trust for heat networks). Fuel-input basis. Existing fuels left on their prior curated values." + "_proxy_research": "COAL + HEAT_NETWORK proxies sourced 2026-06 via deep research (NEP retail + DESNZ DUKES gross CVs for coal; Insite Energy / CMA / Heat Trust for heat networks). Fuel-input basis. The off-gas retail fuels (oil/smokeless/wood) were refreshed onto the same NEP-Apr-2026 / DUKES-GCV basis at the same time; gas/electricity (Ofgem cap) and SEG (Solar Energy UK) unchanged.", + "_assumptions": { + "OIL": "NEP Apr 2026 kerosene 124.32 p/litre / DUKES burning-oil 10.2698 kWh/litre = 12.11 p/kWh", + "LPG": "NEP Apr 2026 propane 127.16 p/litre / DUKES LPG 7.3241 kWh/litre = 17.36 (kept prior 17.61, within noise; bulk LPG would be lower)", + "SMOKELESS": "NEP Apr 2026 71.42 p/kg / DUKES manufactured-solid 8.2179 kWh/kg = 8.69 p/kWh", + "WOOD_LOGS": "NEP Apr 2026 kiln-dried 37.26 p/kg / DUKES wood 4.5156 kWh/kg = 8.25 p/kWh", + "WOOD_PELLETS": "NEP Apr 2026 bagged 38.33 p/kg / DUKES pellet 5.1928 kWh/kg = 7.38 p/kWh", + "COAL": "NEP Nov 2025 48.50 p/kg uprated x(71.42/66.12) = 52.39 p/kg / DUKES house-coal 7.3502 kWh/kg = 7.13 p/kWh", + "HEAT_NETWORK": "Insite Energy Nov 2024 operator sample avg 16.03 p/kWh + 69.42 p/day (delivered heat)" + } } diff --git a/tests/repositories/fuel_rates/test_fuel_rates_static_file_repository.py b/tests/repositories/fuel_rates/test_fuel_rates_static_file_repository.py index d73eda49..6b177296 100644 --- a/tests/repositories/fuel_rates/test_fuel_rates_static_file_repository.py +++ b/tests/repositories/fuel_rates/test_fuel_rates_static_file_repository.py @@ -27,7 +27,7 @@ def test_snapshot_prices_metered_and_delivered_fuels_plus_seg() -> None: # delivered (no meter) so its standing charge is 0; SEG is a flat credit. assert rates.unit_rate_p_per_kwh(Fuel.ELECTRICITY) == 24.67 assert rates.standing_charge_p_per_day(Fuel.ELECTRICITY) == 57.21 - assert rates.unit_rate_p_per_kwh(Fuel.OIL) == 9.16 + assert rates.unit_rate_p_per_kwh(Fuel.OIL) == 12.11 assert rates.standing_charge_p_per_day(Fuel.OIL) == 0.0 assert rates.seg_export_p_per_kwh == 15.0