예제 #1
0
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)
예제 #2
0
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