def forecast(midnight): def forehour(h, midnight): global c_start global c_stop p = " (\d\d):" t_start = re.findall(p, c_start) t_stop = re.findall(p, c_stop) try: t_start = int(t_start[0]) except: t_start = 8 try: t_stop = int(t_stop[0]) except: t_stop = 20 if config.debug: print(time.ctime(h)) forecast_time = int((float(time.strftime("%H", time.localtime(h))) - float(time.strftime("%H"))) / 2) * 2 forecast_time = max(forecast_time, 1) * 3600 forecast_time = forecast_time + ( 60 - float(time.strftime("%M", time.localtime()))) * 60 forecast_time = forecast_time - float( time.strftime("%S", time.localtime())) + time.time() if config.debug: print(t_start) print(t_stop) print(time.ctime(forecast_time)) t = int( time.mktime( time.strptime( time.strftime('%Y-%m-%d %H:00:00', time.localtime(forecast_time)), "%Y-%m-%d %H:%M:%S"))) if float(time.strftime("%H", time.localtime(t))) > t_stop: forecast_time = forecast_time + (24 - float( time.strftime("%H", time.localtime(t))) + t_start - 1) * 3600 t = int( time.mktime( time.strptime( time.strftime('%Y-%m-%d %H:00:00', time.localtime(forecast_time)), "%Y-%m-%d %H:%M:%S"))) if float(time.strftime("%H", time.localtime(t))) < t_start: forecast_time = int( time.mktime( time.strptime( time.strftime('%Y-%m-%d ' + str(t_start) + ':00:00', time.localtime(t)), "%Y-%m-%d %H:%M:%S"))) if (forecast_time - time.time() < 80): forehour(time.time() + 100, midnight) if (forecast_time - time.time() < 3600): print("redoing") print(forecast_time - time.time()) forecast_time = forehour(h + 3 * 3600, midnight) print("next forecast " + time.ctime(forecast_time)) return int(forecast_time) global flux_client print("in forecast") try: if (config.solfor == 1): r1 = solcast.get_rooftop_forecasts(config.site_UUID, api_key=config.solcast_key) elif (config.solfor == 2): r1 = solcast.get_wpv_power_forecasts( config.latitude, config.longitude, config.forecast_capacity, tilt=config.tilt, azimuth=config.azimuth, install_date=config.install_date, hours=48, api_key=config.solcast_key) else: return forehour(int(time.time() + 6 * 3600), midnight) except Exception as e: print("forecast error: %s" % str(e)) print("solcast off-line") return forehour(int(time.time() + 30 * 60), midnight) try: for x in r1.content['forecasts']: dt = x['period_end'] dt = dt.replace(tzinfo=pytz.timezone('UTC')) dt = dt.astimezone(pytz.timezone(config.time_zone)) dt = time.mktime(dt.timetuple()) if (config.solfor == 1): measurement = { 'power': float(x['pv_estimate']), 'power10': float(x['pv_estimate10']), 'power90': float(x['pv_estimate90']) } elif (config.solfor == 2): measurement = {'power': float(x['pv_estimate'])} utils.write_influx(flux_client, measurement, "forcast", config.influxdb_database, int(dt) * 1000000000) print("done getting forecast") except Exception as e: print("forecast 1 error: %s" % str(e)) print("error in forecast") return forehour( min(int(time.time() + 6 * 3600), midnight - time.altzone), midnight) return forehour(time.time(), midnight)
def forcast(): global flux_client print("in forcast") try: if (config.solfor == 1): r1 = solcast.get_rooftop_forcasts(config.site_UUID, api_key=config.solcast_key) elif (config.solfor == 2): r1 = solcast.get_wpv_power_forecasts( config.latitude, config.longitude, config.forcast_capacity, tilt=config.tilt, azimuth=config.azimuth, install_date=config.install_date, hours=48, api_key=config.solcast_key) else: return int(time.time() + 24 * 3600) except Exception as e: print("forcast error: %s" % str(e)) print("solcast off-line") return int(time.time() + 15 * 60) try: for x in r1.content['forecasts']: dt = x['period_end'] dt = dt.replace(tzinfo=pytz.timezone('UTC')) dt = dt.astimezone(pytz.timezone(config.time_zone)) dt = time.mktime(dt.timetuple()) if (config.solfor == 1): measurement = { 'power': float(x['pv_estimate']), 'power10': float(x['pv_estimate10']), 'power90': float(x['pv_estimate90']) } elif (config.solfor == 2): measurement = {'power': float(x['pv_estimate'])} utils.write_influx(flux_client, measurement, "forcast", config.influxdb_database, int(dt) * 1000000000) print("done getting forcast") except AttributeError as e: print("forcast 1 error: %s" % str(e)) print("error in forcast attribute") return int(time.time() + 12 * 3600) except Exception as e: print("forcast 2 error: %s" % str(e)) print("error in forcast") return int(time.time() + 24 * 3600) forcast_time = float(time.strftime("%H")) if (8 <= forcast_time <= 20): forcast_time = 2 - (forcast_time % 2) else: forcast_time = 12 - (forcast_time % 12) forcast_time *= 3600 forcast_time = int( time.mktime( time.strptime( time.strftime('%Y-%m-%d %H:00:00', time.localtime(time.time() + forcast_time)), "%Y-%m-%d %H:%M:%S"))) print("next forcast " + time.ctime(forcast_time)) return forcast_time