mirror of
https://github.com/Hestia-Homes/Model.git
synced 2026-07-12 13:29:04 +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"]
|
"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(
|
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"
|
description = "Install a Bypass valve, TRVs and a Programmer"
|
||||||
|
|
|
||||||
|
|
@ -204,15 +204,41 @@ class HeatingRecommender:
|
||||||
ashp_costs[key] += controls_recommender.recommendation[0][key]
|
ashp_costs[key] += controls_recommender.recommendation[0][key]
|
||||||
|
|
||||||
already_installed = "air_source_heat_pump" in self.property.already_installed
|
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:
|
if already_installed:
|
||||||
ashp_costs = override_costs(ashp_costs)
|
ashp_costs = override_costs(ashp_costs)
|
||||||
description = "The property already has an air source heat pump, no further action needed."
|
|
||||||
else:
|
# This is a map from the heating controls description to the description of the air source heat pump set up
|
||||||
if controls_recommender.recommendation:
|
ashp_descriptions = {
|
||||||
description = ("Install an air source heat pump, and upgrade heating controls to Smart Thermostats, "
|
"Time and temperature zone control": (
|
||||||
"room sensors and smart radiator valves (time & temperature zone control).")
|
"Install an air source heat pump, and upgrade heating controls to Smart Thermostats, "
|
||||||
else:
|
"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."
|
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
|
# 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
|
# 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 £"
|
description = description + (f" The cost includes the £"
|
||||||
f"{BOILER_UPGRADE_SCHEME_ASHP_VALUE} boiler upgrade scheme grant")
|
f"{BOILER_UPGRADE_SCHEME_ASHP_VALUE} boiler upgrade scheme grant")
|
||||||
|
|
||||||
new_heating_description = "Air source heat pump, radiators, electric"
|
simulation_config = {
|
||||||
new_hot_water_description = "From main system"
|
"mainheat_energy_eff_ending": "Good",
|
||||||
simulation_config = {
|
"hot_water_energy_eff_ending": "Good"
|
||||||
"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
|
|
||||||
}
|
}
|
||||||
|
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
|
# If the property does not currently have electric main fuel, we'll simulate the change
|
||||||
heating_simulation_config = check_simulation_difference(
|
fuel_ending_config = {}
|
||||||
new_config=heating_ending_config, old_config=self.property.main_heating
|
if self.property.main_fuel["fuel_type"] != "electricity":
|
||||||
)
|
new_fuel_description = "electricity (not community)"
|
||||||
hotwater_simulation_config = check_simulation_difference(
|
fuel_ending_config = MainFuelAttributes(new_fuel_description).process()
|
||||||
new_config=hotwater_ending_config, old_config=self.property.hotwater
|
description_simulation = {
|
||||||
)
|
**description_simulation,
|
||||||
fuel_simulation_config = check_simulation_difference(
|
"main-fuel": new_fuel_description
|
||||||
new_config=fuel_ending_config, old_config=self.property.main_fuel
|
}
|
||||||
)
|
|
||||||
|
|
||||||
simulation_config = {
|
# Check the simulation differences
|
||||||
**simulation_config,
|
heating_simulation_config = check_simulation_difference(
|
||||||
**heating_simulation_config,
|
new_config=heating_ending_config, old_config=self.property.main_heating
|
||||||
**hotwater_simulation_config,
|
)
|
||||||
**fuel_simulation_config,
|
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 = {
|
||||||
**simulation_config,
|
**simulation_config,
|
||||||
**controls_recommender.recommendation[0]["simulation_config"]
|
**heating_simulation_config,
|
||||||
|
**hotwater_simulation_config,
|
||||||
|
**fuel_simulation_config,
|
||||||
}
|
}
|
||||||
|
|
||||||
description_simulation = {
|
if controls_rec is not None:
|
||||||
**description_simulation,
|
# We should have just the single recommendation for heat controls, which is time
|
||||||
**controls_recommender.recommendation[0]["description_simulation"]
|
# 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 = {
|
ashp_recommendations.append(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
|
|
||||||
}
|
|
||||||
|
|
||||||
if _return:
|
if _return:
|
||||||
return [ashp_recommendation]
|
return [ashp_recommendations]
|
||||||
self.heating_recommendations.append(ashp_recommendation)
|
|
||||||
|
self.heating_recommendations.extend(ashp_recommendations)
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def check_simulation_difference(old_config, new_config):
|
def check_simulation_difference(old_config, new_config):
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue