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 SOLAR_PANEL_WATTAGE = 360 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"] ) has_no_existing_solar_pv = not 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 # 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 = int(np.round(solar_panel_wattage / 1000)) self.recommendation = [ { "parts": [], "type": "solar_pv", "description": f"Install a {kw} kilowatt-peak (kWp) solar photovoltaic (PV) panel system on 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 } ]