from recommendations.Costs import Costs from recommendations.recommendation_utils import check_simulation_difference from backend.Property import Property from etl.epc_clean.epc_attributes.MainheatControlAttributes import MainheatControlAttributes class HeatingControlRecommender: def __init__(self, property_instance: Property): self.property = property_instance self.costs = Costs(self.property) self.recommendation = [] def recommend(self, heating_description): # Reset the recommendations self.recommendation = [] # This first iteration of the recommender will provide very basic recommendation # We recommend heating controls based on the main heating system if heating_description in ["Room heaters, electric"]: self.recommend_room_heaters_electric_controls() return if heating_description in ["Electric storage heaters", "Electric storage heaters, radiators"]: self.recommend_high_heat_retention_controls() return def recommend_room_heaters_electric_controls(self): """ If the home has Room heaters, electric, we start by identifying potential heating controls that could be upgraded, that would provide a practical impact. This will be the least invasive improvement. We can then consider the heating system itself :return: """ if (self.property.data["mainheatc-energy-eff"] in ["Poor", "Very Poor", "Average"]) or ( self.property.main_heating_controls["clean_description"] in ["Programmer and room thermostat"] ): # We recommend Programmer and appliance thermostats as the heating control. This has an average energy # efficiency rating, and is likely to be more efficient than the current heating controls. if the # rating is poor or very poor, the home may have a Programmer and room thermostat, which is less efficient # than a Programmer and appliance thermostats, because it allows for much more granular control at not # just a room level but individual heater/appliance level # Note: A room thermostat is commonly placed in a hallway, and it measures the temperature of the air # surrounding it. It then sends a signal to the heating system to turn on or off, depending on the # temperature. An appliance thermostat, on the other hand, is placed on the heater/appliance itself, and # measures the temperature of the heater/appliance. This allows for much more granular control, and # prevents overheating. # In order to cost, we check if the property already has a programmer, and therefor we will just need to # add the cost of the appliance thermostats has_programmer = self.property.main_heating_controls["switch_system"] == "programmer" ending_config = MainheatControlAttributes("Programmer and appliance thermostats").process() # We look at what has changed in the ending config, and compare it to the current config # We use this to determine how we should be updating the config simulation_config = check_simulation_difference( new_config=ending_config, old_config=self.property.main_heating_controls ) # This upgrade will only take the heating system to average energy efficiency simulation_config["mainheatc_energy_eff_ending"] = "Good" self.recommendation.append( { "description": "upgrade heating controls to Programmer and Appliance or Smart Thermostats", **self.costs.programmer_and_appliance_thermostat(has_programmer=has_programmer), "simulation_config": simulation_config } ) # We don't implement any other recommendations right now return def recommend_high_heat_retention_controls(self): """ When applicable, we recommend upgrading the heating controls to high heat retention controls. This is a specific type of control system that is designed to work with electric storage heaters. It is a more efficient control system than the standard controls that come with electric storage heaters. We can then consider the heating system itself :return: """ # We recommend upgrading to Celect type controls ending_config = MainheatControlAttributes("Controls for high heat retention storage heaters").process() # We look at what has changed in the ending config, and compare it to the current config simulation_config = check_simulation_difference( new_config=ending_config, old_config=self.property.main_heating_controls ) # This upgrade will only take the heating system to average energy efficiency simulation_config["mainheatc_energy_eff_ending"] = "Good" self.recommendation.append( { "description": "upgrade heating controls to High Heat Retention Storage Heater Controls", **self.costs.celect_type_controls(), "simulation_config": simulation_config } ) # We don't implement any other recommendations right now return