From 193e0137646a9057831a191485dc0758948660e0 Mon Sep 17 00:00:00 2001 From: Khalim Conn-Kowlessar Date: Fri, 20 Oct 2023 19:21:42 +1100 Subject: [PATCH] added roof insulation to backend - almost complete --- backend/app/db/models/materials.py | 1 + backend/app/plan/router.py | 22 +++++++------- backend/app/plan/utils.py | 46 ++++++++++++++++++------------ 3 files changed, 40 insertions(+), 29 deletions(-) diff --git a/backend/app/db/models/materials.py b/backend/app/db/models/materials.py index cf6dd971..1dc47276 100644 --- a/backend/app/db/models/materials.py +++ b/backend/app/db/models/materials.py @@ -14,6 +14,7 @@ class MaterialType(enum.Enum): internal_wall_insulation = "internal_wall_insulation" cavity_wall_insulation = "cavity_wall_insulation" mechanical_ventilation = "mechanical_ventilation" + loft_insulation = "loft_insulation" class DepthUnit(enum.Enum): diff --git a/backend/app/plan/router.py b/backend/app/plan/router.py index fdbf155d..d5555d0b 100644 --- a/backend/app/plan/router.py +++ b/backend/app/plan/router.py @@ -30,6 +30,7 @@ from backend.Property import Property from etl.epc.DataProcessor import DataProcessor from etl.epc.settings import COLUMNS_TO_MERGE_ON from recommendations.FloorRecommendations import FloorRecommendations +from recommendations.RoofRecommendations import RoofRecommendations from recommendations.VentilationRecommendations import VentilationRecommendations from recommendations.FireplaceRecommendations import FireplaceRecommendations from recommendations.optimiser.CostOptimiser import CostOptimiser @@ -139,10 +140,7 @@ async def trigger_plan(body: PlanTriggerRequest): p.get_components(cleaned) # Floor recommendations - floor_recommender = FloorRecommendations( - property_instance=p, - materials=materials_by_type["floor"], - ) + floor_recommender = FloorRecommendations(property_instance=p, materials=materials_by_type["floor"]) floor_recommender.recommend() if floor_recommender.recommendations: @@ -150,15 +148,19 @@ async def trigger_plan(body: PlanTriggerRequest): # Wall recommendations - wall_recomender = WallRecommendations( - property_instance=p, - materials=materials_by_type["walls"] - ) + wall_recomender = WallRecommendations(property_instance=p, materials=materials_by_type["walls"]) wall_recomender.recommend() if wall_recomender.recommendations: property_recommendations.append(wall_recomender.recommendations) + # Roof recommendations + roof_recommender = RoofRecommendations(property_instance=p, materials=materials_by_type["roof"]) + roof_recommender.recommend() + + if roof_recommender.recommendations: + property_recommendations.append(roof_recommender.recommendations) + # Ventilation recommendations ventilation_recomender = VentilationRecommendations( property_instance=p, @@ -170,9 +172,7 @@ async def trigger_plan(body: PlanTriggerRequest): property_recommendations.append(ventilation_recomender.recommendation) # Fireplace sealing recommendations - fireplace_recommender = FireplaceRecommendations( - property_instance=p - ) + fireplace_recommender = FireplaceRecommendations(property_instance=p) fireplace_recommender.recommend() if fireplace_recommender.recommendation: diff --git a/backend/app/plan/utils.py b/backend/app/plan/utils.py index c06d9293..5a761b2d 100644 --- a/backend/app/plan/utils.py +++ b/backend/app/plan/utils.py @@ -17,6 +17,7 @@ def filter_materials(materials): "walls": ["internal_wall_insulation", "external_wall_insulation", "cavity_wall_insulation"], "floor": ["suspended_floor_insulation", "solid_floor_insulation"], "ventilation": ["mechanical_ventilation"], + "roof": ["loft_insulation"] } materials = [row2dict(material) for material in materials] @@ -145,7 +146,6 @@ def create_recommendation_scoring_data( # Update description to indicate it's insulate if recommendation["type"] == "floor_insulation": - if len(recommendation["parts"]) > 1: raise NotImplementedError("Have more than 1 floor insulation part - handle this case") @@ -167,6 +167,33 @@ def create_recommendation_scoring_data( if scoring_dict["floor_insulation_thickness_ENDING"] is None: scoring_dict["floor_insulation_thickness_ENDING"] = "none" + if recommendation["type"] == "roof_insulation": + scoring_dict["roof_thermal_transmittance_ENDING"] = recommendation["new_u_value"] + + parts = recommendation["parts"] + if len(parts) != 1: + raise ValueError("More than one part for roof insulation - investiage me") + + scoring_dict["roof_insulation_thickness_ENDING"] = str(parts[0]["depths"][0]) + scoring_dict["ROOF_ENERGY_EFF_ENDING"] = "Very Good" + else: + # Fill missing roof u-values - this fill is not based on recommended upgrades + if scoring_dict["roof_thermal_transmittance_ENDING"] is None: + scoring_dict["roof_thermal_transmittance_ENDING"] = get_roof_u_value( + insulation_thickness=property.roof["insulation_thickness"], + has_dwelling_above=property.roof["has_dwelling_above"], + is_loft=property.roof["is_loft"], + is_roof_room=property.roof["is_roof_room"], + is_thatched=property.roof["is_thatched"], + age_band=property.age_band, + is_flat=property.roof["is_flat"], + is_pitched=property.roof["is_pitched"], + is_at_rafters=property.roof["is_at_rafters"], + ) + + if scoring_dict["roof_insulation_thickness_ENDING"] is None: + scoring_dict["roof_insulation_thickness_ENDING"] = "none" + if recommendation["type"] == "mechanical_ventilation": scoring_dict["MECHANICAL_VENTILATION_ENDING"] = 'mechanical, extract only' @@ -178,21 +205,4 @@ def create_recommendation_scoring_data( ]: raise NotImplementedError("Implement me") - # Fill missing roof u-values - this fill is not based on recommended upgrades - if scoring_dict["roof_thermal_transmittance_ENDING"] is None: - scoring_dict["roof_thermal_transmittance_ENDING"] = get_roof_u_value( - insulation_thickness=property.roof["insulation_thickness"], - has_dwelling_above=property.roof["has_dwelling_above"], - is_loft=property.roof["is_loft"], - is_roof_room=property.roof["is_roof_room"], - is_thatched=property.roof["is_thatched"], - age_band=property.age_band, - is_flat=property.roof["is_flat"], - is_pitched=property.roof["is_pitched"], - is_at_rafters=property.roof["is_at_rafters"], - ) - - if scoring_dict["roof_insulation_thickness_ENDING"] is None: - scoring_dict["roof_insulation_thickness_ENDING"] = "none" - return scoring_dict