diff --git a/backend/app/plan/router.py b/backend/app/plan/router.py index e0add281..9caab324 100644 --- a/backend/app/plan/router.py +++ b/backend/app/plan/router.py @@ -841,6 +841,11 @@ async def build_mds(body: MdsRequest): epc_before = p.data["current-energy-rating"] heat_demand_before = p.data["energy-consumption-current"] carbon_before = p.data["co2-emissions-current"] + current_adjusted_energy = AnnualBillSavings.adjust_energy_to_metered( + epc_energy_consumption=heat_demand_before * p.floor_area, + current_epc_rating=epc_before, + ) + current_energy_bill = AnnualBillSavings.calculate_annual_bill(current_adjusted_energy) package_comparison = [] for _id in recommendations[p.id].keys(): @@ -904,17 +909,11 @@ async def build_mds(body: MdsRequest): heat_demand_after = heat_demand_prediction["predictions"].values[-1] carbon_after = carbon_prediction["predictions"].values[-1] - current_adjusted_energy = AnnualBillSavings.adjust_energy_to_metered( - epc_energy_consumption=heat_demand_before * p.floor_area, - current_epc_rating=epc_before, - ) - expected_adjusted_energy = AnnualBillSavings.adjust_energy_to_metered( epc_energy_consumption=heat_demand_after * p.floor_area, current_epc_rating=epc_before, ) - current_energy_bill = AnnualBillSavings.calculate_annual_bill(current_adjusted_energy) expected_energy_bill = AnnualBillSavings.calculate_annual_bill(expected_adjusted_energy) bill_savings = current_energy_bill - expected_energy_bill @@ -935,6 +934,7 @@ async def build_mds(body: MdsRequest): "carbon_after": carbon_after, "bill_savings": bill_savings, "energy_savings": energy_savings, + "current_energy_bill": current_energy_bill, "meets_threshold": meets_threshold } ) @@ -965,6 +965,7 @@ async def build_mds(body: MdsRequest): "carbon_after": carbon_before, "bill_savings": 0, "energy_savings": 0, + "current_energy_bill": current_energy_bill, "meets_threshold": False } @@ -990,81 +991,27 @@ async def build_mds(body: MdsRequest): "heat_demand_after": package_comparison["heat_demand_after"], "carbon_before": package_comparison["carbon_before"], "carbon_after": package_comparison["carbon_after"], - "bill_savings": package_comparison["bill_savings"], - "energy_savings": package_comparison["energy_savings"], + "bill_savings": round(package_comparison["bill_savings"], 2), + "energy_savings": round(package_comparison["energy_savings"], 2), + "current_energy_bill": round(package_comparison["current_energy_bill"], 2), + "EWI": "EWI" if "external_wall_insulation" in package_comparison["measures"] else None, + "CWI": "CWI" if "cavity_wall_insulation" in package_comparison["measures"] else None, + "LI": "LI" if "loft_insulation" in package_comparison["measures"] else None, + "ASHP Htg": "ASHP Htg" if "air_source_heat_pump" in package_comparison["measures"] else None, + "Elec Storage": ( + "Elec Storage Htrs (Out of scope -Prov sum only)" if "high_heat_retention_storage_heaters" in + package_comparison["measures"] else None + ), + "Solar PV": "Solar PV" if "solar_pv" in package_comparison["measures"] else None, }) results = pd.DataFrame(results) # For the different measures, we check the impact with a few debugging functions - def check_mds(results, input_properties, recommendations): - import ast - walls_check = [] - hhr_check = [] - for p in input_properties: - res = results[results["uprn"] == p.uprn] - wall = p.walls - heating = p.main_heating - heating_controls = p.main_heating_controls - wall_recommendation = [ - x for x in res["measures"].values[0] if - x in ["internal_wall_insulation", "external_wall_insulation", "cavity_wall_insulation"] - ] + walls_check, hhr_check = check_mds(results, input_properties, recommendations, optimise_measures) - hhr_recommendation = [ - x for x in res["measures"].values[0] if - x in ["high_heat_retention_storage_heaters"] - ] - - possible_measures = [ast.literal_eval(x) for x in list(recommendations[p.id].keys())] - # Unlist them - possible_measures = [x for sublist in possible_measures for x in sublist] - possible_measures = list(set(possible_measures)) - - if wall_recommendation: - if len(wall_recommendation) > 1: - raise Exception("something went wrong") - wall_recommendation = wall_recommendation[0] - else: - wall_recommendation = None - - hhr_recommendation = hhr_recommendation[0] if hhr_recommendation else None - - walls_check.append( - { - "uprn": p.uprn, - "address": p.address, - "postcode": p.postcode, - "conservation_status": p.spatial["conservation_status"], - "is_listed_building": p.spatial["is_listed_building"], - "is_heritage_building": p.spatial["is_heritage_building"], - "wall": wall["clean_description"], - "recommendation": wall_recommendation, - "possible_measures": possible_measures, - "selected_measures": res["measures"].values[0], - } - ) - - hhr_check.append( - { - "uprn": p.uprn, - "address": p.address, - "postcode": p.postcode, - "heating": heating["clean_description"], - "heating_controls": heating_controls["clean_description"], - "recommendation": hhr_recommendation, - "possible_measures": possible_measures, - "selected_measures": res["measures"].values[0], - } - ) - - walls_check = pd.DataFrame(walls_check) - hhr_check = pd.DataFrame(hhr_check) - - return walls_check, hhr_check - - walls_check, hhr_check = check_mds(results, input_properties, recommendations) + results.to_excel("optimised mds_results 5th June.xlsx") results = [] for p in input_properties: @@ -1114,11 +1061,14 @@ async def build_mds(body: MdsRequest): ) # TODO: We should determine if the home is gas & electricity or just electricity + + # Determine if the heating and hotwater was previously electric only or both + current_energy_bill = AnnualBillSavings.calculate_annual_bill( - current_adjusted_energy, + kwh=current_adjusted_energy, ) expected_energy_bill = AnnualBillSavings.calculate_annual_bill( - expected_adjusted_energy, + kwh=expected_adjusted_energy, ) bill_savings = current_energy_bill - expected_energy_bill @@ -1133,6 +1083,7 @@ async def build_mds(body: MdsRequest): to_append = { "config_address": config["address"], "config_postcode": config["postcode"], + "uprn": p.uprn, "address": p.address, "postcode": p.postcode, "measures": measures, @@ -1146,15 +1097,19 @@ async def build_mds(body: MdsRequest): "heat_demand_after": heat_demand_after, "carbon_before": carbon_before, "carbon_after": carbon_after, - "bill_savings": bill_savings, - "energy_savings": energy_savings, + "bill_savings": round(bill_savings, 2), + "energy_savings": round(energy_savings, 2), + "current_energy_bill": round(current_energy_bill, 2), + "fuel_type": p.main_fuel["fuel_type"], } results.append(to_append) results = pd.DataFrame(results) results["sap_uplift"] = results["sap_after"] - results["sap_before"] - # results.to_excel("mds_results 30th May.xlsx") + # results.to_excel("mds_results 5th June.xlsx") + + walls_check, hhr_check = check_mds(results, input_properties, recommendations, optimise_measures) except IntegrityError: logger.error("Database integrity error occurred", exc_info=True) @@ -1174,3 +1129,80 @@ async def build_mds(body: MdsRequest): return Response(status_code=500, content="An unexpected error occurred.") finally: session.close() + + +def check_mds(results, input_properties, recommendations, optimise_measures): + import ast + walls_check = [] + hhr_check = [] + for p in input_properties: + res = results[results["uprn"] == p.uprn] + wall = p.walls + heating = p.main_heating + heating_controls = p.main_heating_controls + + if optimise_measures: + measures = res["measures"].values[0] + else: + measures = [list(z.keys())[0] for z in res["measures"].values[0]] + + wall_recommendation = [ + x for x in measures if + x in ["internal_wall_insulation", "external_wall_insulation", "cavity_wall_insulation"] + ] + + hhr_recommendation = [ + x for x in measures if + x in ["high_heat_retention_storage_heaters"] + ] + + if optimise_measures: + possible_measures = [ast.literal_eval(x) for x in list(recommendations[p.id].keys())] + # Unlist them + possible_measures = [x for sublist in possible_measures for x in sublist] + possible_measures = list(set(possible_measures)) + else: + possible_measures = p.measures + + if wall_recommendation: + if len(wall_recommendation) > 1: + raise Exception("something went wrong") + wall_recommendation = wall_recommendation[0] + else: + wall_recommendation = None + + hhr_recommendation = hhr_recommendation[0] if hhr_recommendation else None + + walls_check.append( + { + "uprn": p.uprn, + "address": p.address, + "postcode": p.postcode, + "property_type": p.data['property-type'], + "conservation_status": p.spatial["conservation_status"], + "is_listed_building": p.spatial["is_listed_building"], + "is_heritage_building": p.spatial["is_heritage_building"], + "wall": wall["clean_description"], + "recommendation": wall_recommendation, + "possible_measures": possible_measures, + "selected_measures": res["measures"].values[0], + } + ) + + hhr_check.append( + { + "uprn": p.uprn, + "address": p.address, + "postcode": p.postcode, + "heating": heating["clean_description"], + "heating_controls": heating_controls["clean_description"], + "recommendation": hhr_recommendation, + "possible_measures": possible_measures, + "selected_measures": res["measures"].values[0], + } + ) + + walls_check = pd.DataFrame(walls_check) + hhr_check = pd.DataFrame(hhr_check) + + return walls_check, hhr_check diff --git a/etl/customers/eon/deck_examples.py b/etl/customers/eon/deck_examples.py index 8773ce09..e0e3abe9 100644 --- a/etl/customers/eon/deck_examples.py +++ b/etl/customers/eon/deck_examples.py @@ -11,8 +11,8 @@ load_dotenv(dotenv_path="backend/.env") EPC_AUTH_TOKEN = os.getenv("EPC_AUTH_TOKEN") searcher = SearchEpc( - address1="Flat above 7 Malling Road", - postcode="ME6 5AA", + address1="108 Blacklands", + postcode="ME19 6DP", auth_token=EPC_AUTH_TOKEN, os_api_key="", property_type=None, @@ -20,11 +20,8 @@ searcher = SearchEpc( ) res = searcher.estimate_epc( - property_type="Flat", - built_form="Mid-Terrace", - lmks_to_drop=[ - "4c3714a59744ab2c6e60441f0fa0eb903f283c6c62d0691e108cadbc7b5a8caa", - "363197839762013013017062127708717", - "363197811132009091518041845968302" - ] + property_type="Bungalow", + built_form="Detached", + lmks_to_drop=["849273656952012102323315196229804"], + exclude_old=True )