mirror of
https://github.com/Hestia-Homes/Model.git
synced 2026-06-30 13:10:47 +00:00
using elmhurst roof area methodology
This commit is contained in:
parent
5bceee1acb
commit
aa97c77747
3 changed files with 9 additions and 40 deletions
|
|
@ -623,9 +623,7 @@ class Property:
|
||||||
self.find_energy_sources()
|
self.find_energy_sources()
|
||||||
self.set_current_energy(kwh_client, kwh_predictions)
|
self.set_current_energy(kwh_client, kwh_predictions)
|
||||||
|
|
||||||
def set_solar_panel_configuration(
|
def set_solar_panel_configuration(self, solar_panel_configuration):
|
||||||
self, solar_panel_configuration, roof_area
|
|
||||||
):
|
|
||||||
"""
|
"""
|
||||||
This funtion inserts the solar panel configuration into the property object
|
This funtion inserts the solar panel configuration into the property object
|
||||||
"""
|
"""
|
||||||
|
|
@ -634,22 +632,11 @@ class Property:
|
||||||
if not self.roof["is_flat"]:
|
if not self.roof["is_flat"]:
|
||||||
default_roof_area = estimate_pitched_roof_area(
|
default_roof_area = estimate_pitched_roof_area(
|
||||||
floor_area=self.insulation_floor_area,
|
floor_area=self.insulation_floor_area,
|
||||||
floor_height=self.floor_height
|
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
default_roof_area = self.insulation_floor_area
|
default_roof_area = self.insulation_floor_area
|
||||||
|
|
||||||
# Keep a record
|
self.roof_area = default_roof_area
|
||||||
self.roof_area_comparison = {
|
|
||||||
"api": roof_area,
|
|
||||||
"estimated": default_roof_area
|
|
||||||
}
|
|
||||||
|
|
||||||
# We also set the roof area
|
|
||||||
if roof_area is None:
|
|
||||||
self.roof_area = default_roof_area
|
|
||||||
else:
|
|
||||||
self.roof_area = roof_area
|
|
||||||
|
|
||||||
def set_current_energy(self, kwh_client, kwh_predictions):
|
def set_current_energy(self, kwh_client, kwh_predictions):
|
||||||
"""
|
"""
|
||||||
|
|
|
||||||
|
|
@ -766,7 +766,6 @@ class GoogleSolarApi:
|
||||||
"panel_performance": cls.default_panel_performance(property_instance=property_instance),
|
"panel_performance": cls.default_panel_performance(property_instance=property_instance),
|
||||||
"unit_share_of_energy": 1
|
"unit_share_of_energy": 1
|
||||||
},
|
},
|
||||||
roof_area=None
|
|
||||||
)
|
)
|
||||||
continue
|
continue
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -205,7 +205,7 @@ def get_wall_u_value(
|
||||||
|
|
||||||
mapped_value = wall_uvalues_df[
|
mapped_value = wall_uvalues_df[
|
||||||
wall_uvalues_df["Wall_type"] == mapped_description
|
wall_uvalues_df["Wall_type"] == mapped_description
|
||||||
][age_band].values[0]
|
][age_band].values[0]
|
||||||
|
|
||||||
if pd.isnull(mapped_value) and "Park home" in mapped_description:
|
if pd.isnull(mapped_value) and "Park home" in mapped_description:
|
||||||
# We don't know enough in this case so we default to 0
|
# We don't know enough in this case so we default to 0
|
||||||
|
|
@ -505,7 +505,7 @@ def get_floor_u_value(
|
||||||
insulation_lookup = s11[
|
insulation_lookup = s11[
|
||||||
s11["Age_band"].str.contains(age_band) & s11["Floor_construction"]
|
s11["Age_band"].str.contains(age_band) & s11["Floor_construction"]
|
||||||
== floor_type
|
== floor_type
|
||||||
]
|
]
|
||||||
if insulation_lookup.empty:
|
if insulation_lookup.empty:
|
||||||
insulation_thickness = 0
|
insulation_thickness = 0
|
||||||
else:
|
else:
|
||||||
|
|
@ -700,34 +700,17 @@ def convert_thickness_to_numeric(string_thickness, is_pitched, is_flat):
|
||||||
return int(string_thickness)
|
return int(string_thickness)
|
||||||
|
|
||||||
|
|
||||||
def estimate_pitched_roof_area(floor_area: float, floor_height: float) -> float:
|
def estimate_pitched_roof_area(floor_area: float) -> float:
|
||||||
"""
|
"""
|
||||||
This function will estimate the area of a pitched roof, given the floor area below the roof and the floor
|
This function mimics the methodology for calculating floor area in Elmhurst, so that we can simulate the outcomes
|
||||||
height of the property.
|
in a way that is consistent with the Elmhurst methodology.
|
||||||
|
|
||||||
Given limited information about the home, this is a very rough method to estimate the roof area and we
|
|
||||||
assume the the room is a gable roof.
|
|
||||||
|
|
||||||
We assume a roughly average pitch of 45 degrees
|
|
||||||
|
|
||||||
Note that both floor area and height should be in the same units. E.g. if floor area is meters squared,
|
|
||||||
floor height should be in meters
|
|
||||||
|
|
||||||
:param floor_area: area of the home's floor
|
:param floor_area: area of the home's floor
|
||||||
:param floor_height: height of the home's floors
|
|
||||||
:return: Numerical estimate of the surface area of the top of the pitched roof
|
:return: Numerical estimate of the surface area of the top of the pitched roof
|
||||||
"""
|
"""
|
||||||
|
|
||||||
# We estimate the length of the wall by just modelling the house as a square
|
scalar = 1.0571283428862048
|
||||||
wall_width = np.sqrt(floor_area)
|
return scalar * (floor_area / np.cos(np.radians(30)))
|
||||||
|
|
||||||
# We're modelling the roof as two triangles where we know two of the three sides.
|
|
||||||
# The floor height makes up one side and half of the wall width makes up the other side
|
|
||||||
slope = np.sqrt(np.square(wall_width / 2) + np.square(floor_height))
|
|
||||||
|
|
||||||
area = 2 * (slope * wall_width)
|
|
||||||
|
|
||||||
return area
|
|
||||||
|
|
||||||
|
|
||||||
def estimate_windows(
|
def estimate_windows(
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue