From c112d23c6762c2759807e36574271502b7162c3a Mon Sep 17 00:00:00 2001 From: Khalim Conn-Kowlessar Date: Wed, 10 Jul 2024 01:10:19 +0100 Subject: [PATCH] removed electric boiler rec --- recommendations/Costs.py | 15 ++-- recommendations/HeatingControlRecommender.py | 4 ++ recommendations/HeatingRecommender.py | 76 ++++++++++++++++++++ 3 files changed, 91 insertions(+), 4 deletions(-) diff --git a/recommendations/Costs.py b/recommendations/Costs.py index 9a12af42..2dbce327 100644 --- a/recommendations/Costs.py +++ b/recommendations/Costs.py @@ -92,6 +92,12 @@ CONDENSING_BOILER_COSTS = { "40kw": 1625 } +# Electric boiler prices base on +# https://www.greenmatch.co.uk/boilers/combi-boilers/electric-combi-boilers +# https://www.tlc-direct.co.uk/Products/ERMAC15.html +# The unit is a 15kw boiler, capable of outputting between 3kw and 15kw. Costs seem to be around £1800 +ELECTRIC_BOILER_COSTS = 1800 + # Assumes 3 hours to remove each heater (including re-decorating) ROOM_HEATER_REMOVAL_COST = 120 ROOM_HEATER_REMOVAL_LABOUR_HOURS = 3 @@ -1285,7 +1291,7 @@ class Costs: estimated_radiators = max(total_radiators_based_on_power, base_radiators + additional_radiators) return round(estimated_radiators) - def boiler(self, size, exising_room_heaters, system_change, n_heated_rooms, n_rooms): + def boiler(self, size, exising_room_heaters, system_change, n_heated_rooms, n_rooms, is_electric=False): """ Based on a basic estimate of median value £2600 to install a low carbon combi boiler First time central heating vosts can als be found here: @@ -1293,7 +1299,10 @@ class Costs: :return: """ - unit_cost = CONDENSING_BOILER_COSTS[size] + if not is_electric: + unit_cost = CONDENSING_BOILER_COSTS[size] + else: + unit_cost = ELECTRIC_BOILER_COSTS # The unit cost is the cost without VAT # We now need to estimate the cost of the works labour_days = 2 @@ -1307,8 +1316,6 @@ class Costs: # Add contingency and preliminaries labour_cost = labour_cost * (1 + self.CONTINGENCY + self.PRELIMINARIES) - # labour_days = labour_days + (removal_labour_hours / 8) - vat = labour_cost * self.VAT_RATE subtotal_before_vat = unit_cost + labour_cost diff --git a/recommendations/HeatingControlRecommender.py b/recommendations/HeatingControlRecommender.py index 76da6c37..a94c2304 100644 --- a/recommendations/HeatingControlRecommender.py +++ b/recommendations/HeatingControlRecommender.py @@ -35,6 +35,10 @@ class HeatingControlRecommender: return + if heating_description in ["Boiler and radiators, electric"]: + self.recommend_roomstat_programmer_trvs() + return + if heating_description in ["Air source heat pump, radiators, electric"]: self.recommend_time_temperature_zone_controls() diff --git a/recommendations/HeatingRecommender.py b/recommendations/HeatingRecommender.py index ac8c4973..4ad1d987 100644 --- a/recommendations/HeatingRecommender.py +++ b/recommendations/HeatingRecommender.py @@ -119,6 +119,69 @@ class HeatingRecommender: return + def recommend_electric_boiler_upgrade(self, phase): + + # Small initial scope, just handles the case of properties that have electric boilers where the efficiency + # is poor or very poor + # We recommend upgrading to a new electric boiler + + recommendation_phase = phase + + if self.property.data["mainheat-energy-eff"] not in ["Poor", "Very Poor"]: + return + + hotwater_from_mains = self.property.hotwater["clean_description"] in ["From main system"] + hotwater_from_cylinder = self.property.hotwater["clean_description"] in [ + "From main system, no cylinder thermostat" + ] + # if the hotwater is from the mains, we probably have a combi boiler so we recommend a new electric boiler + + if hotwater_from_mains: + description = f"Upgrade to a higher efficiency electric boiler" + + simulation_config = { + "mainheat_energy_eff_ending": "Average", + "hot_water_energy_eff_ending": "Average" + } + + boiler_costs = self.costs.boiler( + size=None, + exising_room_heaters=False, + system_change=False, + n_heated_rooms=self.property.data["number-heated-rooms"], + n_rooms=self.property.number_of_rooms, + is_electric=True + ) + + already_installed = "heating" in self.property.already_installed + if already_installed: + boiler_costs = override_costs(boiler_costs) + description = "Heating system has already been upgraded, no further action needed." + + boiler_recommendation = { + "phase": recommendation_phase, + "parts": [], + "type": "heating", + "description": description, + "starting_u_value": None, + "new_u_value": None, + "sap_points": None, + "already_installed": already_installed, + "simulation_config": simulation_config, + **boiler_costs + } + + controls_recommender = HeatingControlRecommender(self.property) + controls_recommender.recommend(heating_description="Boiler and radiators, electric") + + self.heating_recommendations.extend([boiler_recommendation] + controls_recommender.recommendation) + return + + if hotwater_from_cylinder: + # We recommend a change from a system boiler, with a cylinder to a combi boiler + description = ("Replace the existing boiler and cylinder without a thermostat with a new electric combi " + "boiler") + def is_ashp_valid(self): suitable_property_type = self.property.data["property-type"] in ["House", "Bungalow"] has_air_source_heat_pump = self.property.main_heating["has_air_source_heat_pump"] @@ -458,6 +521,19 @@ class HeatingRecommender: return closest_size + @staticmethod + def estimate_electric_boiler_size(num_heated_rooms): + """ + We use the approach similar to as defined in + https://www.greenmatch.co.uk/boilers/combi-boilers/electric-combi-boilers + Instead of radiators as a proxy, we do the number of heated rooms + + :param num_heated_rooms: The number of heated rooms in the property + :return: + """ + + return max(num_heated_rooms * 1.5, 6) + def recommend_boiler_upgrades(self, phase, system_change, exising_room_heaters): """ This boiler recommendation will only recommend a like-for-like upgrade, since changing the system