def now(self, timestamp=None, weather_data=None, model='STC'): """Preditive power output""" if timestamp is None: timestamp = datetime.datetime.now() - \ datetime.timedelta(hours=self.tz) if model != 'STC' and weather_data == None: weather_data = forecast.data(self.place)['currently'] if model == 'CC': record = irradiation.blave(timestamp, self.place, self.tilt, \ self.azimuth, cloudCover=weather_data['cloudCover']) else: record = irradiation.blave(timestamp, self.place, self.tilt, \ self.azimuth) irradiance = irradiation.irradiation(record, self.place, None,\ t=self.tilt, array_azimuth=self.azimuth, model='p9') if hasattr(self, 'hourly_shade'): irradiance = irradiance * self.hourly_shade.shade(timestamp) if model == 'STC': return self.p_ac(irradiance) else: t_cell = irradiation.moduleTemp(irradiance, weather_data) return self.p_ac(irradiance, t_cell)
def virr(self, p_ac, timestamp=None, weather_data=None): """calculate virtual irradiation""" girr = 1000. gp_ac = self.p_ac(girr) if p_ac > gp_ac: print "WARNING: Edge effect?" iteration = 2 while round(p_ac, -1) != round(gp_ac, -1): #todo: improve non linear search routine t_cell = irradiation.moduleTemp(girr, weather_data) gp_ac = self.p_ac(girr, t_cell) if gp_ac <= p_ac: girr = girr + 1000./(iteration**2) else: girr = girr - 1000./(iteration**2) iteration += 1 if iteration > 25: raise Exception('too many iterations') solar_az, solar_alt = irradiation.ephem_sun(self.place, timestamp) irrRec = irradiation.irrGuess(timestamp, girr, solar_alt, solar_az,\ self.tilt, self.azimuth) irrRec['girr'] = round(girr, 0) return irrRec
def virr(self, p_ac, timestamp=None, weather_data=None): """calculate virtual irradiation""" girr = 1000. gp_ac = self.p_ac(girr) if p_ac > gp_ac: print "WARNING: Edge effect?" iteration = 2 while round(p_ac, -1) != round(gp_ac, -1): #todo: improve non linear search routine t_cell = irradiation.moduleTemp(girr, weather_data) gp_ac = self.p_ac(girr, t_cell) if gp_ac <= p_ac: girr = girr + 1000. / (iteration**2) else: girr = girr - 1000. / (iteration**2) iteration += 1 if iteration > 25: raise Exception('too many iterations') solar_az, solar_alt = irradiation.ephem_sun(self.place, timestamp) irrRec = irradiation.irrGuess(timestamp, girr, solar_alt, solar_az,\ self.tilt, self.azimuth) irrRec['girr'] = round(girr, 0) return irrRec
def forecast_output(self, daylightSavings=False, source=None, hours=24): """forecast output of system""" #todo: model and forecast should use consistant units; Wh or KWh #default is forecast with solpy.blave #this is ugly code... sorry #todo: refactor d = datetime.date.today() endTimeUTC = datetime.datetime(d.year, d.month, d.day)\ + datetime.timedelta(hours=hours-self.tz) if source == 'noaa': wseries = noaa.herp_derp_interp(self.place) ts = [] irr = [] for i in wseries: if i['utc_datetime'] > endTimeUTC: break rec = irradiation.blave(i['utc_datetime'], self.place, \ self.tilt, self.azimuth, cloudCover=i['cloudCover']) irradiance = irradiation.irradiation(rec, self.place,\ t=self.tilt, array_azimuth=self.azimuth, model='p90') t_cell = irradiation.moduleTemp(irradiance, i) irr.append(self.p_ac(irradiance, t_cell)) ts.append(i['utc_datetime']) resultset = ResultSet() resultset.values = irr resultset.timeseries = ts return resultset if source == 'forecast': wseries = forecast.hourly(self.place) ts = [] irr = [] for i in wseries: if i['utc_datetime'] > endTimeUTC: break irradiance = irradiation.irradiation(i, self.place,\ t=self.tilt, array_azimuth=self.azimuth, model='p90') t_cell = irradiation.moduleTemp(irradiance, i) irr.append(self.p_ac(irradiance, t_cell)) ts.append(i['utc_datetime']) resultset = ResultSet() resultset.values = irr resultset.timeseries = ts return resultset if source == 'blave': wseries = forecast.hourly(self.place) ts = [] irr = [] for i in wseries: if i['utc_datetime'] > endTimeUTC: break rec = irradiation.blave(i['utc_datetime'], self.place, \ self.tilt, self.azimuth, cloudCover=i['cloudCover']) irradiance = irradiation.irradiation(rec, self.place,\ t=self.tilt, array_azimuth=self.azimuth, model='p90') t_cell = irradiation.moduleTemp(irradiance, i) irr.append(self.p_ac(irradiance, t_cell)) ts.append(i['utc_datetime']) rs = ResultSet() rs.values = irr rs.timeseries = ts return rs else: #blave stime = datetime.datetime.today().timetuple() tz_off = datetime.timedelta(hours=self.tz) if daylightSavings: tz_off += datetime.timedelta(hours=1) else: tz_off += datetime.timedelta(hours=0) initTime = datetime.datetime(stime[0], stime[1], stime[2]) - tz_off timeseries = [] values = [] ts = initTime while ts < datetime.datetime.now()-tz_off: ts += datetime.timedelta(minutes=5) currentPower = self.now(ts) values.append(currentPower) timeseries.append(ts) rs = ResultSet() rs.values = values rs.timeseries = timeseries return rs
def forecast_output(self, daylightSavings=False, source=None, hours=24): """forecast output of system""" #todo: model and forecast should use consistant units; Wh or KWh #default is forecast with solpy.blave #this is ugly code... sorry #todo: refactor d = datetime.date.today() endTimeUTC = datetime.datetime(d.year, d.month, d.day)\ + datetime.timedelta(hours=hours-self.tz) if source == 'noaa': wseries = noaa.herp_derp_interp(self.place) ts = [] irr = [] for i in wseries: if i['utc_datetime'] > endTimeUTC: break rec = irradiation.blave(i['utc_datetime'], self.place, \ self.tilt, self.azimuth, cloudCover=i['cloudCover']) irradiance = irradiation.irradiation(rec, self.place,\ t=self.tilt, array_azimuth=self.azimuth, model='p90') t_cell = irradiation.moduleTemp(irradiance, i) irr.append(self.p_ac(irradiance, t_cell)) ts.append(i['utc_datetime']) resultset = ResultSet() resultset.values = irr resultset.timeseries = ts return resultset if source == 'forecast': wseries = forecast.hourly(self.place) ts = [] irr = [] for i in wseries: if i['utc_datetime'] > endTimeUTC: break irradiance = irradiation.irradiation(i, self.place,\ t=self.tilt, array_azimuth=self.azimuth, model='p90') t_cell = irradiation.moduleTemp(irradiance, i) irr.append(self.p_ac(irradiance, t_cell)) ts.append(i['utc_datetime']) resultset = ResultSet() resultset.values = irr resultset.timeseries = ts return resultset if source == 'blave': wseries = forecast.hourly(self.place) ts = [] irr = [] for i in wseries: if i['utc_datetime'] > endTimeUTC: break rec = irradiation.blave(i['utc_datetime'], self.place, \ self.tilt, self.azimuth, cloudCover=i['cloudCover']) irradiance = irradiation.irradiation(rec, self.place,\ t=self.tilt, array_azimuth=self.azimuth, model='p90') t_cell = irradiation.moduleTemp(irradiance, i) irr.append(self.p_ac(irradiance, t_cell)) ts.append(i['utc_datetime']) rs = ResultSet() rs.values = irr rs.timeseries = ts return rs else: #blave stime = datetime.datetime.today().timetuple() tz_off = datetime.timedelta(hours=self.tz) if daylightSavings: tz_off += datetime.timedelta(hours=1) else: tz_off += datetime.timedelta(hours=0) initTime = datetime.datetime(stime[0], stime[1], stime[2]) - tz_off timeseries = [] values = [] ts = initTime while ts < datetime.datetime.now() - tz_off: ts += datetime.timedelta(minutes=5) currentPower = self.now(ts) values.append(currentPower) timeseries.append(ts) rs = ResultSet() rs.values = values rs.timeseries = timeseries return rs