diff --git a/recommendations/HeatingControlRecommender.py b/recommendations/HeatingControlRecommender.py index 80615b30..ef0df011 100644 --- a/recommendations/HeatingControlRecommender.py +++ b/recommendations/HeatingControlRecommender.py @@ -298,8 +298,15 @@ class HeatingControlRecommender: "mainheatc-energy-eff": simulation_config["mainheatc_energy_eff_ending"] } + has_programmer = self.property.main_heating_controls["switch_system"] == "programmer" + has_trvs = self.property.main_heating_controls["trvs"] is not None + has_bypass = self.property.main_heating_controls["auxiliary_systems"] == "bypass" + cost_result = self.costs.programmer_trvs_bypass( - number_heated_rooms=int(self.property.data["number-heated-rooms"]) + number_heated_rooms=int(self.property.data["number-heated-rooms"]), + has_trvs=has_trvs, + has_programmer=has_programmer, + has_bypass=has_bypass ) description = "Install a Bypass valve, TRVs and a Programmer" diff --git a/recommendations/HeatingRecommender.py b/recommendations/HeatingRecommender.py index 1d409be6..fd2dfe38 100644 --- a/recommendations/HeatingRecommender.py +++ b/recommendations/HeatingRecommender.py @@ -204,15 +204,41 @@ class HeatingRecommender: ashp_costs[key] += controls_recommender.recommendation[0][key] already_installed = "air_source_heat_pump" in self.property.already_installed + + controls_recommendations = controls_recommender.recommendation + if already_installed or not controls_recommendations: + # We set an empty object, so we just produce one recommendation + controls_recommendations = [None] + if already_installed: ashp_costs = override_costs(ashp_costs) - description = "The property already has an air source heat pump, no further action needed." - else: - if controls_recommender.recommendation: - description = ("Install an air source heat pump, and upgrade heating controls to Smart Thermostats, " - "room sensors and smart radiator valves (time & temperature zone control).") - else: + + # This is a map from the heating controls description to the description of the air source heat pump set up + ashp_descriptions = { + "Time and temperature zone control": ( + "Install an air source heat pump, and upgrade heating controls to Smart Thermostats, " + "room sensors and smart radiator valves (time & temperature zone control)." + ), + "Programmer, TRVs and bypass": ( + "Install an air source heat pump, with programmer, TRVs and a Bypass valve." + ), + } + + new_heating_description = "Air source heat pump, radiators, electric" + new_hot_water_description = "From main system" + ashp_recommendations = [] + for controls_rec in controls_recommendations: + + if controls_rec: + for key in ashp_costs: + ashp_costs[key] += controls_rec[key] + + if controls_rec is None: description = "Install an air source heat pump." + elif already_installed: + description = "The property already has an air source heat pump, no further action needed." + else: + description = ashp_descriptions[controls_rec["description_simulation"]["mainheatcont-description"]] # If the property does not have existing cavity and loft insulation, we include a note that the cost # includes the boiler upgrade scheme and that the cavity and loft need to be treated, to ensure access @@ -226,85 +252,84 @@ class HeatingRecommender: description = description + (f" The cost includes the £" f"{BOILER_UPGRADE_SCHEME_ASHP_VALUE} boiler upgrade scheme grant") - new_heating_description = "Air source heat pump, radiators, electric" - new_hot_water_description = "From main system" - simulation_config = { - "mainheat_energy_eff_ending": "Good", - "hot_water_energy_eff_ending": "Good" - } - description_simulation = { - "mainheat-description": new_heating_description, - "mainheat-energy-eff": simulation_config["mainheat_energy_eff_ending"], - "hot-water-energy-eff": simulation_config["hot_water_energy_eff_ending"], - "hotwater-description": new_hot_water_description, - } - # Installation of a boiler improves the hot water system so we need to reflect this in - # the outcome of the recommendation - heating_ending_config = MainHeatAttributes(new_heating_description).process() - hotwater_ending_config = HotWaterAttributes(new_hot_water_description).process() - - # If the property does not currently have electric main fuel, we'll simulate the change - fuel_ending_config = {} - if self.property.main_fuel["fuel_type"] != "electricity": - new_fuel_description = "electricity (not community)" - fuel_ending_config = MainFuelAttributes(new_fuel_description).process() - description_simulation = { - **description_simulation, - "main-fuel": new_fuel_description + simulation_config = { + "mainheat_energy_eff_ending": "Good", + "hot_water_energy_eff_ending": "Good" } + description_simulation = { + "mainheat-description": new_heating_description, + "mainheat-energy-eff": simulation_config["mainheat_energy_eff_ending"], + "hot-water-energy-eff": simulation_config["hot_water_energy_eff_ending"], + "hotwater-description": new_hot_water_description, + } + # Installation of a boiler improves the hot water system so we need to reflect this in + # the outcome of the recommendation + heating_ending_config = MainHeatAttributes(new_heating_description).process() + hotwater_ending_config = HotWaterAttributes(new_hot_water_description).process() - # Check the simulation differences - heating_simulation_config = check_simulation_difference( - new_config=heating_ending_config, old_config=self.property.main_heating - ) - hotwater_simulation_config = check_simulation_difference( - new_config=hotwater_ending_config, old_config=self.property.hotwater - ) - fuel_simulation_config = check_simulation_difference( - new_config=fuel_ending_config, old_config=self.property.main_fuel - ) + # If the property does not currently have electric main fuel, we'll simulate the change + fuel_ending_config = {} + if self.property.main_fuel["fuel_type"] != "electricity": + new_fuel_description = "electricity (not community)" + fuel_ending_config = MainFuelAttributes(new_fuel_description).process() + description_simulation = { + **description_simulation, + "main-fuel": new_fuel_description + } - simulation_config = { - **simulation_config, - **heating_simulation_config, - **hotwater_simulation_config, - **fuel_simulation_config, - } + # Check the simulation differences + heating_simulation_config = check_simulation_difference( + new_config=heating_ending_config, old_config=self.property.main_heating + ) + hotwater_simulation_config = check_simulation_difference( + new_config=hotwater_ending_config, old_config=self.property.hotwater + ) + fuel_simulation_config = check_simulation_difference( + new_config=fuel_ending_config, old_config=self.property.main_fuel + ) - if controls_recommender.recommendation: - # We should have just the single recommendation for heat controls, which is time - # and temperature zone controls - if len(controls_recommender.recommendation) != 1: - raise NotImplementedError("More than one heat controls recommendation for air source heat pump") simulation_config = { **simulation_config, - **controls_recommender.recommendation[0]["simulation_config"] + **heating_simulation_config, + **hotwater_simulation_config, + **fuel_simulation_config, } - description_simulation = { - **description_simulation, - **controls_recommender.recommendation[0]["description_simulation"] + if controls_rec is not None: + # We should have just the single recommendation for heat controls, which is time + # and temperature zone controls + simulation_config = { + **simulation_config, + **controls_rec["simulation_config"] + } + + description_simulation = { + **description_simulation, + **controls_rec["description_simulation"] + } + + ashp_recommendation = { + "phase": phase, + "parts": [ + # TODO + ], + "type": "heating", + "description": description, + "starting_u_value": None, + "new_u_value": None, + "sap_points": None, + "already_installed": already_installed, + "simulation_config": simulation_config, + "description_simulation": description_simulation, + **ashp_costs } - ashp_recommendation = { - "phase": phase, - "parts": [ - # TODO - ], - "type": "heating", - "description": description, - "starting_u_value": None, - "new_u_value": None, - "sap_points": None, - "already_installed": already_installed, - "simulation_config": simulation_config, - "description_simulation": description_simulation, - **ashp_costs - } + ashp_recommendations.append(ashp_recommendation) if _return: - return [ashp_recommendation] - self.heating_recommendations.append(ashp_recommendation) + return [ashp_recommendations] + + self.heating_recommendations.extend(ashp_recommendations) @staticmethod def check_simulation_difference(old_config, new_config):