Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Limit BUS grant cap per annum #150

Merged
merged 2 commits into from
Nov 22, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 37 additions & 3 deletions simulation/costs.py
Original file line number Diff line number Diff line change
Expand Up @@ -155,6 +155,24 @@
# Source: Distribution based on values in https://www.theccc.org.uk/publication/analysis-of-alternative-uk-heat-decarbonisation-pathways/
DECOMMISSIONING_COST_MIN, DECOMMISSIONING_COST_MAX = 500, 2_000

# Grant cap is set to £250M for 2024-’25, SOURCE: https://www.gov.uk/government/publications/boiler-upgrade-scheme-budget-increase-and-approval-to-over-allocate-vouchers/approval-to-increase-the-budget-and-over-allocate-vouchers-for-the-boiler-upgrade-scheme-november-2024
# Grant cap is set to £1.54B for 2025-’28, SOURCE: https://www.gov.uk/government/news/families-business-and-industry-to-get-energy-efficiency-support
# Assume limited spend of £515M per annum during 2025-’28, unless the grant was underspent in year in which case the underspent amount gets carried forward to the future years
# Assume £515M PA grant will be extended to 2035.
BOILER_UPGRADE_SCHEME_GRANT_CAP = {
2024: 250_000_000,
2025: 765_000_000,
2026: 1280_000_000,
2027: 1795_000_000,
2028: 2310_000_000,
2029: 2825_000_000,
2030: 3340_000_000,
2031: 3855_000_000,
2032: 4370_000_000,
2033: 4885_000_000,
2034: 5400_000_000,
}


def get_unit_and_install_costs(
household: "Household",
Expand Down Expand Up @@ -345,20 +363,36 @@ def estimate_extended_boiler_upgrade_scheme_grant(
return 0

model_population_scale = ENGLAND_WALES_HOUSEHOLD_COUNT_2020 / model.household_count
boiler_upgrade_funding_cap_gbp = 5_400_000_000 / model_population_scale
if (

if (model.current_datetime.date() < datetime.date(2025, 4, 1)) and (
model.boiler_upgrade_scheme_cumulative_spend_gbp
>= boiler_upgrade_funding_cap_gbp
>= BOILER_UPGRADE_SCHEME_GRANT_CAP[2024] / model_population_scale
):
return 0

for year in BOILER_UPGRADE_SCHEME_GRANT_CAP.keys():
boiler_upgrade_funding_cap_gbp = (
BOILER_UPGRADE_SCHEME_GRANT_CAP[year] / model_population_scale
)
if (
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this assuming that if in a year we underspend, the underspent amount gets carried forward to future years? If so worth clarifying that in the comment.

Helps with reviewing that the code is trying to emulate that behaviour. Worth calling out the assumption too in the report..

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

IDK how govt works, but in a corporate world if budget is underspent, it usually doesn't get carried forward!

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, it get carried forward, I will add a clarifying comment :)

(model.current_datetime.date() >= datetime.date(year, 4, 1))
and (model.current_datetime.date() < datetime.date(year + 1, 4, 1))
and (
model.boiler_upgrade_scheme_cumulative_spend_gbp
>= boiler_upgrade_funding_cap_gbp
)
):
return 0

# Date range for BUS scheme 2022-2035
if (
not datetime.date(2022, 4, 1)
<= model.current_datetime.date()
< datetime.date(2035, 4, 1)
):
return 0

# Grant is £7.5k up to 2028, then reduces to £5k after 2028
if (
not datetime.date(2022, 4, 1)
<= model.current_datetime.date()
Expand Down
10 changes: 7 additions & 3 deletions simulation/tests/test_costs.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
HeatingSystem,
)
from simulation.costs import (
BOILER_UPGRADE_SCHEME_GRANT_CAP,
DECOMMISSIONING_COST_MAX,
MEAN_COST_GBP_BOILER_GAS,
estimate_boiler_upgrade_scheme_grant,
Expand Down Expand Up @@ -324,12 +325,13 @@ def test_extended_boiler_upgrade_scheme_grant_is_zero_when_outside_grant_window(
assert estimate_extended_boiler_upgrade_scheme_grant(heating_system, model) == 0

@pytest.mark.parametrize("heat_pump", set(HEAT_PUMPS))
@pytest.mark.parametrize("year", list(range(2024, 2035)))
def test_extended_boiler_upgrade_scheme_grant_is_zero_when_grant_cap_exceeded(
self, heat_pump
self, heat_pump, year
):

model = model_factory(
start_datetime=datetime.datetime(2024, 1, 1, 0, 0),
start_datetime=datetime.datetime(year, 6, 1, 0, 0),
)

num_households = random.randint(1, 5)
Expand All @@ -338,7 +340,9 @@ def test_extended_boiler_upgrade_scheme_grant_is_zero_when_grant_cap_exceeded(
model_population_scale = (
ENGLAND_WALES_HOUSEHOLD_COUNT_2020 / model.household_count
)
boiler_upgrade_scheme_budget_scaled = 5_400_000_000 / model_population_scale
boiler_upgrade_scheme_budget_scaled = (
BOILER_UPGRADE_SCHEME_GRANT_CAP[year] / model_population_scale
)

model.boiler_upgrade_scheme_cumulative_spend_gbp = (
boiler_upgrade_scheme_budget_scaled * 0.8
Expand Down
Loading