mirror of
https://github.com/Hestia-Homes/Model.git
synced 2026-06-30 13:10:47 +00:00
minor change to mds api
This commit is contained in:
parent
acc45eae64
commit
9217ef67f4
2 changed files with 117 additions and 88 deletions
|
|
@ -841,6 +841,11 @@ async def build_mds(body: MdsRequest):
|
||||||
epc_before = p.data["current-energy-rating"]
|
epc_before = p.data["current-energy-rating"]
|
||||||
heat_demand_before = p.data["energy-consumption-current"]
|
heat_demand_before = p.data["energy-consumption-current"]
|
||||||
carbon_before = p.data["co2-emissions-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 = []
|
package_comparison = []
|
||||||
for _id in recommendations[p.id].keys():
|
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]
|
heat_demand_after = heat_demand_prediction["predictions"].values[-1]
|
||||||
carbon_after = carbon_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(
|
expected_adjusted_energy = AnnualBillSavings.adjust_energy_to_metered(
|
||||||
epc_energy_consumption=heat_demand_after * p.floor_area,
|
epc_energy_consumption=heat_demand_after * p.floor_area,
|
||||||
current_epc_rating=epc_before,
|
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)
|
expected_energy_bill = AnnualBillSavings.calculate_annual_bill(expected_adjusted_energy)
|
||||||
|
|
||||||
bill_savings = current_energy_bill - expected_energy_bill
|
bill_savings = current_energy_bill - expected_energy_bill
|
||||||
|
|
@ -935,6 +934,7 @@ async def build_mds(body: MdsRequest):
|
||||||
"carbon_after": carbon_after,
|
"carbon_after": carbon_after,
|
||||||
"bill_savings": bill_savings,
|
"bill_savings": bill_savings,
|
||||||
"energy_savings": energy_savings,
|
"energy_savings": energy_savings,
|
||||||
|
"current_energy_bill": current_energy_bill,
|
||||||
"meets_threshold": meets_threshold
|
"meets_threshold": meets_threshold
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
@ -965,6 +965,7 @@ async def build_mds(body: MdsRequest):
|
||||||
"carbon_after": carbon_before,
|
"carbon_after": carbon_before,
|
||||||
"bill_savings": 0,
|
"bill_savings": 0,
|
||||||
"energy_savings": 0,
|
"energy_savings": 0,
|
||||||
|
"current_energy_bill": current_energy_bill,
|
||||||
"meets_threshold": False
|
"meets_threshold": False
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -990,81 +991,27 @@ async def build_mds(body: MdsRequest):
|
||||||
"heat_demand_after": package_comparison["heat_demand_after"],
|
"heat_demand_after": package_comparison["heat_demand_after"],
|
||||||
"carbon_before": package_comparison["carbon_before"],
|
"carbon_before": package_comparison["carbon_before"],
|
||||||
"carbon_after": package_comparison["carbon_after"],
|
"carbon_after": package_comparison["carbon_after"],
|
||||||
"bill_savings": package_comparison["bill_savings"],
|
"bill_savings": round(package_comparison["bill_savings"], 2),
|
||||||
"energy_savings": package_comparison["energy_savings"],
|
"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)
|
results = pd.DataFrame(results)
|
||||||
|
|
||||||
# For the different measures, we check the impact with a few debugging functions
|
# For the different measures, we check the impact with a few debugging functions
|
||||||
|
|
||||||
def check_mds(results, input_properties, recommendations):
|
walls_check, hhr_check = 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
|
|
||||||
wall_recommendation = [
|
|
||||||
x for x in res["measures"].values[0] if
|
|
||||||
x in ["internal_wall_insulation", "external_wall_insulation", "cavity_wall_insulation"]
|
|
||||||
]
|
|
||||||
|
|
||||||
hhr_recommendation = [
|
results.to_excel("optimised mds_results 5th June.xlsx")
|
||||||
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 = []
|
results = []
|
||||||
for p in input_properties:
|
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
|
# 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_energy_bill = AnnualBillSavings.calculate_annual_bill(
|
||||||
current_adjusted_energy,
|
kwh=current_adjusted_energy,
|
||||||
)
|
)
|
||||||
expected_energy_bill = AnnualBillSavings.calculate_annual_bill(
|
expected_energy_bill = AnnualBillSavings.calculate_annual_bill(
|
||||||
expected_adjusted_energy,
|
kwh=expected_adjusted_energy,
|
||||||
)
|
)
|
||||||
|
|
||||||
bill_savings = current_energy_bill - expected_energy_bill
|
bill_savings = current_energy_bill - expected_energy_bill
|
||||||
|
|
@ -1133,6 +1083,7 @@ async def build_mds(body: MdsRequest):
|
||||||
to_append = {
|
to_append = {
|
||||||
"config_address": config["address"],
|
"config_address": config["address"],
|
||||||
"config_postcode": config["postcode"],
|
"config_postcode": config["postcode"],
|
||||||
|
"uprn": p.uprn,
|
||||||
"address": p.address,
|
"address": p.address,
|
||||||
"postcode": p.postcode,
|
"postcode": p.postcode,
|
||||||
"measures": measures,
|
"measures": measures,
|
||||||
|
|
@ -1146,15 +1097,19 @@ async def build_mds(body: MdsRequest):
|
||||||
"heat_demand_after": heat_demand_after,
|
"heat_demand_after": heat_demand_after,
|
||||||
"carbon_before": carbon_before,
|
"carbon_before": carbon_before,
|
||||||
"carbon_after": carbon_after,
|
"carbon_after": carbon_after,
|
||||||
"bill_savings": bill_savings,
|
"bill_savings": round(bill_savings, 2),
|
||||||
"energy_savings": energy_savings,
|
"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.append(to_append)
|
||||||
|
|
||||||
results = pd.DataFrame(results)
|
results = pd.DataFrame(results)
|
||||||
results["sap_uplift"] = results["sap_after"] - results["sap_before"]
|
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:
|
except IntegrityError:
|
||||||
logger.error("Database integrity error occurred", exc_info=True)
|
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.")
|
return Response(status_code=500, content="An unexpected error occurred.")
|
||||||
finally:
|
finally:
|
||||||
session.close()
|
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
|
||||||
|
|
|
||||||
|
|
@ -11,8 +11,8 @@ load_dotenv(dotenv_path="backend/.env")
|
||||||
EPC_AUTH_TOKEN = os.getenv("EPC_AUTH_TOKEN")
|
EPC_AUTH_TOKEN = os.getenv("EPC_AUTH_TOKEN")
|
||||||
|
|
||||||
searcher = SearchEpc(
|
searcher = SearchEpc(
|
||||||
address1="Flat above 7 Malling Road",
|
address1="108 Blacklands",
|
||||||
postcode="ME6 5AA",
|
postcode="ME19 6DP",
|
||||||
auth_token=EPC_AUTH_TOKEN,
|
auth_token=EPC_AUTH_TOKEN,
|
||||||
os_api_key="",
|
os_api_key="",
|
||||||
property_type=None,
|
property_type=None,
|
||||||
|
|
@ -20,11 +20,8 @@ searcher = SearchEpc(
|
||||||
)
|
)
|
||||||
|
|
||||||
res = searcher.estimate_epc(
|
res = searcher.estimate_epc(
|
||||||
property_type="Flat",
|
property_type="Bungalow",
|
||||||
built_form="Mid-Terrace",
|
built_form="Detached",
|
||||||
lmks_to_drop=[
|
lmks_to_drop=["849273656952012102323315196229804"],
|
||||||
"4c3714a59744ab2c6e60441f0fa0eb903f283c6c62d0691e108cadbc7b5a8caa",
|
exclude_old=True
|
||||||
"363197839762013013017062127708717",
|
|
||||||
"363197811132009091518041845968302"
|
|
||||||
]
|
|
||||||
)
|
)
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue