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", "Energy Savings": "kwh_savings", "Reducing CO2 emissions": "co2_equivalent_savings", } 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