mirror of
https://github.com/Hestia-Homes/Model.git
synced 2026-06-08 11:17:27 +00:00
Allowing ashp recs to produce multiple recommendations for multiple heating controls
This commit is contained in:
parent
027aa79a0b
commit
59ae6647b3
2 changed files with 106 additions and 74 deletions
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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):
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue