diff --git a/backend/app/plan/router.py b/backend/app/plan/router.py index d82e774b..4f2b578e 100644 --- a/backend/app/plan/router.py +++ b/backend/app/plan/router.py @@ -445,6 +445,16 @@ async def trigger_plan(body: PlanTriggerRequest): bucket_name=get_settings().DATA_BUCKET, file_key="sap_change_model/cleaning_dataset.parquet", ) + # Set up model api and warm up the lambdas + model_api = ModelApi( + portfolio_id=body.portfolio_id, + timestamp=created_at, + prediction_buckets=get_prediction_buckets() + ) + await model_api.async_warm_up_lambdas( + model_prefies=model_api.KWH_MODEL_PREFIXES + model_api.MODEL_PREFIXES + ) + input_properties = [] for config in tqdm(plan_input): # We validate each record in the file. If the record is NOT valid, we need to handle this accordingly @@ -539,16 +549,6 @@ async def trigger_plan(body: PlanTriggerRequest): if not input_properties: return Response(status_code=204) - # Set up model api and warm up the lambdas - model_api = ModelApi( - portfolio_id=body.portfolio_id, - timestamp=created_at, - prediction_buckets=get_prediction_buckets() - ) - await model_api.async_warm_up_lambdas( - model_prefies=model_api.KWH_MODEL_PREFIXES + model_api.MODEL_PREFIXES - ) - # The materials data could be cached or local so we don't need to make # consistent requests to the backend for # the same data @@ -683,8 +683,6 @@ async def trigger_plan(body: PlanTriggerRequest): ) # We now insert kwh estimates and costs into the recommendations - # TODO: We should join the methodology which maps the heating and hot water descriptions to the fuel types in - # Recommendations, but also the Property class logger.info("Calculating tenant savings - kwh and bills") for property_id in tqdm([p.id for p in input_properties]): property_recommendations = recommendations.get(property_id, []) @@ -701,8 +699,6 @@ async def trigger_plan(body: PlanTriggerRequest): property_instance.current_energy_bill = property_current_energy_bill # Insert the predictions into the recommendations and run the optimiser - # TODO: If a recommendation has a negative impact on SAP, we should remove it - this seems to have become a - # possibility with heating system? for p in input_properties: if not recommendations.get(p.id): @@ -814,23 +810,23 @@ async def trigger_plan(body: PlanTriggerRequest): # Funding # ~~~~~~~~~~~~~~~~ - for p in input_properties: - funding_calulator = Funding( - tenure=body.housing_type, - starting_epc=p.data["current-energy-rating"], - starting_sap=int(p.data["current-energy-efficiency"]), - postcode=p.postcode, - floor_area=p.floor_area, - council_tax_band=None, # This is seemingly always None at the moment - property_recommendations=recommendations[p.id], - project_scores_matrix=eco_project_scores_matrix, - whlg_eligible_postcodes=whlg_eligible_postcodes, - gbis_abs_rate=15, - eco4_abs_rate=15, - ) - funding_calulator.check_eligibiltiy() - # Insert finding - p.insert_funding(funding_calulator) + # for p in input_properties: + # funding_calulator = Funding( + # tenure=body.housing_type, + # starting_epc=p.data["current-energy-rating"], + # starting_sap=int(p.data["current-energy-efficiency"]), + # postcode=p.postcode, + # floor_area=p.floor_area, + # council_tax_band=None, # This is seemingly always None at the moment + # property_recommendations=recommendations[p.id], + # project_scores_matrix=eco_project_scores_matrix, + # whlg_eligible_postcodes=whlg_eligible_postcodes, + # gbis_abs_rate=15, + # eco4_abs_rate=15, + # ) + # funding_calulator.check_eligibiltiy() + # # Insert finding + # p.insert_funding(funding_calulator) logger.info("Uploading recommendations to the database") # If we have any work to do, we create a new scenario diff --git a/recommendations/LightingRecommendations.py b/recommendations/LightingRecommendations.py index f9a1d63a..3447394d 100644 --- a/recommendations/LightingRecommendations.py +++ b/recommendations/LightingRecommendations.py @@ -4,6 +4,7 @@ from backend.Property import Property from typing import List from recommendations.Costs import Costs from recommendations.recommendation_utils import override_costs +from backend.ml_models.AnnualBillSavings import AnnualBillSavings class LightingRecommendations: @@ -161,6 +162,7 @@ class LightingRecommendations: # the proportion of lights that will be set to low energy "sap_points": sap_points, "kwh_savings": heat_demand_change, + "energy_cost_savings": heat_demand_change * AnnualBillSavings.ELECTRICITY_PRICE_CAP, "co2_equivalent_savings": carbon_change, "description_simulation": { "lighting-energy-eff": "Very Good", diff --git a/recommendations/Recommendations.py b/recommendations/Recommendations.py index edaa611a..813f5a80 100644 --- a/recommendations/Recommendations.py +++ b/recommendations/Recommendations.py @@ -858,7 +858,7 @@ class Recommendations: for recs in property_recommendations: for rec in recs: if rec["type"] in [ - "mechanical_ventilation", "trickle_vents", "draught_proofing", "extension_cavity_wall_insulation" + "trickle_vents", "draught_proofing", "extension_cavity_wall_insulation" ]: # We cannot score the impact on draught proofing continue @@ -883,13 +883,18 @@ class Recommendations: heating_kwh_savings = ( previous_phase_impact["predictions_heating"].mean() - rec_impact["predictions_heating"].values[0] ) - heating_cost_savings = ( - previous_phase_impact["heating_cost"].mean() - rec_impact["heating_cost"].values[0] - ) - hotwater_kwh_savings = ( previous_phase_impact["predictions_hotwater"].mean() - rec_impact["predictions_hotwater"].values[0] ) + + # Shouldn't be positive + if rec["type"] == "mechanical_ventilation": + heating_kwh_savings = 0 if heating_kwh_savings > 0 else heating_kwh_savings + hotwater_kwh_savings = 0 if hotwater_kwh_savings > 0 else hotwater_kwh_savings + + heating_cost_savings = ( + previous_phase_impact["heating_cost"].mean() - rec_impact["heating_cost"].values[0] + ) hotwater_host = ( previous_phase_impact["hotwater_cost"].mean() - rec_impact["hotwater_cost"].values[0] ) @@ -897,9 +902,8 @@ class Recommendations: total_kwh_savings = heating_kwh_savings + hotwater_kwh_savings energy_cost_savings = heating_cost_savings + hotwater_host - if rec["type"] == "lighting": - # In this case, we should probably just SKIP but check when we have one! - raise Exception("Implement me 3") + if rec["type"] == "low_energy_lighting": + continue rec["kwh_savings"] = total_kwh_savings rec["energy_cost_savings"] = energy_cost_savings