mirror of
https://github.com/Hestia-Homes/Model.git
synced 2026-06-08 11:17:27 +00:00
68 lines
2.7 KiB
Python
68 lines
2.7 KiB
Python
import numpy as np
|
|
from recommendations.Costs import Costs
|
|
|
|
|
|
class SolarPvRecommendations:
|
|
# Approximate area of the solar panels
|
|
SOLAR_PANEL_AREA = 1.6
|
|
# Wattage per panel - this is based on the average wattage of a solar panel being between 250w and 420w
|
|
SOLAR_PANEL_WATTAGE = 250
|
|
|
|
def __init__(self, property_instance):
|
|
"""
|
|
:param property_instance: Instance of the Property class, for the home associated to property_id
|
|
"""
|
|
|
|
self.property = property_instance
|
|
self.costs = Costs(self.property)
|
|
|
|
self.recommendation = []
|
|
|
|
def recommend(self):
|
|
"""
|
|
We check if a property is potentially suitable for solar PV based on the following criteria:
|
|
- The property is a house or bungalow
|
|
- The property has a flat or pitched roof
|
|
- The property does not have existing solar pv
|
|
:return:
|
|
"""
|
|
|
|
is_valid_property_type = self.property.data["property-type"] in ["House", "Bungalow"]
|
|
is_valid_roof_type = (
|
|
self.property.roof["is_flat"] or self.property.roof["is_pitched"] or self.property.roof["is_roof_room"]
|
|
)
|
|
# If there is no existing solar PV, the photo-supply field will be None or a missing value
|
|
has_no_existing_solar_pv = self.property.data["photo-supply"] in [
|
|
None, 0, self.property.DATA_ANOMALY_MATCHES
|
|
]
|
|
|
|
if not is_valid_property_type or not is_valid_roof_type or not has_no_existing_solar_pv:
|
|
return
|
|
|
|
# We now have a property which is potentially suitable for solar PV
|
|
number_solar_panels = np.floor(self.property.solar_pv_roof_area / self.SOLAR_PANEL_AREA)
|
|
solar_panel_wattage = number_solar_panels * self.SOLAR_PANEL_WATTAGE
|
|
|
|
roof_coverage_percent = round(self.property.solar_pv_percentage * 100)
|
|
|
|
# Given the wattage, we estimate the cost of the solar PV system. This is based on the MCS database
|
|
# of solar PV installations
|
|
cost_result = self.costs.solar_pv(wattage=solar_panel_wattage)
|
|
|
|
kw = np.floor(solar_panel_wattage / 100) / 10
|
|
|
|
self.recommendation = [
|
|
{
|
|
"parts": [],
|
|
"type": "solar_pv",
|
|
"description": f"Install a {kw} kilowatt-peak (kWp) solar photovoltaic (PV) panel system on "
|
|
f"{roof_coverage_percent}% the roof",
|
|
"starting_u_value": None,
|
|
"new_u_value": None,
|
|
"sap_points": None,
|
|
**cost_result,
|
|
# This is required for simulating the SAP impact. solar_pv_percentage is between 0 & 1 so we scale
|
|
# back up here
|
|
"photo_supply": 100 * self.property.solar_pv_percentage
|
|
}
|
|
]
|