mirror of
https://github.com/Hestia-Homes/Model.git
synced 2026-06-08 11:17:27 +00:00
77 lines
2.9 KiB
Python
77 lines
2.9 KiB
Python
import backend.app.assumptions as assumptions
|
|
|
|
|
|
def prepare_input_measures(property_recommendations, goal, needs_ventilation):
|
|
"""
|
|
Basic function to convert recommendations_to_upload to a format that is
|
|
suitable for the optimiser - large
|
|
:param property_recommendations: object containing the recommendations, created in the plan trigger api
|
|
:param goal: goal to be optimised for, should be one of the keys in gain_map. E.g. if the gain is SAP points,
|
|
the goal should reflect that desired gain
|
|
:param needs_ventilation: boolean to indicate if the property needs ventilation
|
|
:return: Nested list of input measures
|
|
"""
|
|
|
|
goal_map = {
|
|
"Increasing EPC": "sap_points"
|
|
}
|
|
|
|
goal_key = goal_map[goal]
|
|
if not goal_key:
|
|
raise NotImplementedError("Not implemented this gain type - investigate me")
|
|
|
|
# We ony ever have one ventilation measure with now
|
|
ventilation_recommendation = next(
|
|
(measure[0] for measure in property_recommendations if measure[0]["type"] == "mechanical_ventilation"),
|
|
{}
|
|
)
|
|
|
|
input_measures = []
|
|
for recs in property_recommendations:
|
|
|
|
if needs_ventilation and recs[0]["type"] == "mechanical_ventilation":
|
|
# If we house needs ventilation, ventilation will be packaged with the fabric measure so
|
|
# we don't need to optimise it independently
|
|
continue
|
|
|
|
if recs[0]["type"] == "solar_pv":
|
|
# if the recommendation is a solar recommendation with a battery, we exclude it from the optimisation.
|
|
recs = [r for r in recs if ~r["has_battery"]]
|
|
|
|
recs_to_append = [rec for rec in recs if rec["energy_cost_savings"] >= 0]
|
|
if not recs_to_append:
|
|
continue
|
|
|
|
to_append = []
|
|
for rec in recs:
|
|
# We bundle the impact of ventilation with the measure
|
|
total = (
|
|
rec["total"] + ventilation_recommendation["total"]
|
|
if rec["type"] in assumptions.measures_needing_ventilation and needs_ventilation
|
|
else rec["total"]
|
|
)
|
|
gain = (
|
|
rec[goal_key] + ventilation_recommendation[goal_key]
|
|
if rec["type"] in assumptions.measures_needing_ventilation and needs_ventilation
|
|
else rec[goal_key]
|
|
)
|
|
|
|
rec_type = (
|
|
"+".join(
|
|
[rec["type"], ventilation_recommendation["type"]]
|
|
) if rec["type"] in assumptions.measures_needing_ventilation and needs_ventilation
|
|
else rec["type"]
|
|
)
|
|
|
|
to_append.append(
|
|
{
|
|
"id": rec["recommendation_id"],
|
|
"cost": total,
|
|
"gain": gain,
|
|
"type": rec_type
|
|
}
|
|
)
|
|
|
|
input_measures.append(to_append)
|
|
|
|
return input_measures
|