Beispiel #1
0
    def get_wunderground_history(self, days_history):
        if days_history == 0:
            return {}

        check_date = datetime.date.today()
        day_delta = datetime.timedelta(days=1)

        info = {}
        for index in range(-1, -1 - days_history, -1):
            check_date -= day_delta
            data = self._get_history(check_date)

            if data and len(data['history']['dailysummary']) > 0:
                info[index] = data['history']['dailysummary'][0]

        result = {}
        for index, day_info in info.iteritems():
            result[index] = {
                'temp_c': try_float(day_info['maxtempm'], 20),
                'rain_mm': try_float(day_info['precipm']),
                'wind_ms': try_float(day_info['meanwindspdm']) / 3.6,
                'humidity': try_float(day_info['humidity'], 50)
            }

        return result
Beispiel #2
0
    def get_rain(self, check_date):
        if isinstance(check_date, datetime.datetime):
            check_date = check_date.date()

        result = 0.0
        if check_date < datetime.date.today():
            data = self._get_history(check_date)
            if data and len(data['history']['dailysummary']) > 0:
                result = try_float(
                    data['history']['dailysummary'][0]['precipm'])
        else:
            datestring = datetime.date.today().strftime('%Y%m%d')
            data = self._get_wunderground_data("forecast10day",
                                               "forecast10day_" + datestring)
            for entry in data['forecast']['simpleforecast']['forecastday']:
                if self._datetime(entry['date']).date() == check_date:
                    if entry['qpf_allday']['mm'] is None:
                        entry['qpf_allday']['mm'] = 0
                    result = try_float(entry['qpf_allday']['mm'])
                    break
        return result
Beispiel #3
0
    def get_wunderground_forecast(self, days_forecast):
        datestring = datetime.date.today().strftime('%Y%m%d')
        data = self._get_wunderground_data("forecast10day",
                                           "forecast10day_" + datestring)

        info = {}
        for day_index, entry in enumerate(
                data['forecast']['simpleforecast']['forecastday']):
            info[day_index] = entry

        result = {}
        for index, day_info in info.iteritems():
            if index <= days_forecast:
                if day_info['qpf_allday']['mm'] is None:
                    day_info['qpf_allday']['mm'] = 0
                result[index] = {
                    'temp_c': try_float(day_info['high']['celsius'], 20),
                    'rain_mm': try_float(day_info['qpf_allday']['mm']),
                    'wind_ms': try_float(day_info['avewind']['kph']) / 3.6,
                    'humidity': try_float(day_info['avehumidity'], 50)
                }

        return result
Beispiel #4
0
    def get_wunderground_conditions(self, force=True):
        datestring = datetime.date.today().strftime('%Y%m%d')
        data = self._get_wunderground_data("conditions",
                                           "conditions_" + datestring, force)

        day_info = data['current_observation']

        result = {
            'temperature_string':
            day_info['temperature_string'],
            'temp_c':
            try_float(day_info['temp_c'], 20),
            'temp_f':
            try_float(day_info['temp_f'], 68),
            'rain_mm':
            try_float(day_info['precip_today_metric']),
            'wind_ms':
            try_float(day_info['wind_kph']) / 3.6,
            'humidity':
            try_float(day_info['relative_humidity'].replace('%', ''), 50)
        }

        return result
Beispiel #5
0
    def _calc_eto(self, total_solar_radiation, total_clear_sky_isolation,
                  data):
        # Solar Radiation
        r_s = total_solar_radiation * 3600 / 1000 / 1000  # MJ / m^2 / d
        # Net shortwave radiation
        r_ns = 0.77 * r_s

        # Extraterrestrial Radiation
        r_a = total_clear_sky_isolation * 3600 / 1000 / 1000  # MJ / m^2 / d
        # Clear sky solar radiation
        r_so = (0.75 + 0.00002 * options.elevation) * r_a

        # m/s at 2m above ground
        wind_speed = try_float(data['meanwindspdm']) * 1000 / 3600 * 0.748

        pressure = try_float(data['meanpressurem'], 1000) / 10  # kPa

        temp_avg = try_float(data['meantempm'], 20)  # degrees C
        temp_min = try_float(data['mintempm'], 20)  # degrees C
        temp_max = try_float(data['maxtempm'], 20)  # degrees C
        humid_max = try_float(data['maxhumidity'], 50)  # %
        humid_min = try_float(data['minhumidity'], 50)  # %

        sigma_t_max4 = 0.000000004903 * math.pow(temp_max + 273.16, 4)
        sigma_t_min4 = 0.000000004903 * math.pow(temp_min + 273.16, 4)
        avg_sigma_t = (sigma_t_max4 + sigma_t_min4) / 2

        d = 4098 * self.saturation_vapour_pressure(temp_avg) / math.pow(
            temp_avg + 237.3, 2)
        g = 0.665e-3 * pressure

        es = (self.saturation_vapour_pressure(temp_min) +
              self.saturation_vapour_pressure(temp_max)) / 2
        ea = self.saturation_vapour_pressure(
            temp_min) * humid_max / 200 + self.saturation_vapour_pressure(
                temp_max) * humid_min / 200

        vapor_press_deficit = es - ea

        # Net longwave radiation
        r_nl = avg_sigma_t * (0.34 - 0.14 * math.sqrt(ea)) * (
            1.35 * r_s / max(1, r_so) - 0.35)
        # Net radiation
        r_n = r_ns - r_nl

        eto = ((0.408 * d * r_n) +
               (g * 900 * wind_speed * vapor_press_deficit) /
               (temp_avg + 273)) / (d + g * (1 + 0.34 * wind_speed))

        return eto
Beispiel #6
0
    def _get_future_eto(self, check_date):
        datestring = datetime.date.today().strftime('%Y%m%d')
        hourly_data = self._get_wunderground_data("hourly10day",
                                                  "hourly10day_" + datestring)
        today_data = self._get_wunderground_data("conditions",
                                                 "conditions_" + datestring)

        if isinstance(check_date, datetime.datetime):
            check_date = check_date.date()

        summaries = {
            'meanwindspdm':
            (lambda x: sum(x) / max(1, len(x)), 'wspd', 'metric'),
            'meantempm': (lambda x: sum(x) / max(1, len(x)), 'temp', 'metric'),
            'mintempm': (lambda x: min(x), 'temp', 'metric'),
            'maxtempm': (lambda x: max(x), 'temp', 'metric'),
            'maxhumidity': (lambda x: max(x), 'humidity'),
            'minhumidity': (lambda x: min(x), 'humidity'),
        }
        summary = {}
        for key in summaries.keys():
            summary[key] = []

        coverages = {}
        for observation in hourly_data['hourly_forecast']:
            current_date = datetime.datetime.utcfromtimestamp(
                int(observation['FCTTIME']['epoch']))
            year_date = datetime.datetime(current_date.year, 1, 1)
            if current_date.date() == check_date:
                hour = current_date.hour
                if hour not in coverages:
                    coverages[hour] = {
                        'fractional_day': (360 / 365.25) *
                        (current_date - year_date).total_seconds() / 3600 / 24,
                        'coverage': []
                    }

                coverage = self._calc_coverage(observation['condition'])
                coverages[hour]['coverage'].append(coverage)

                for key, search in summaries.iteritems():
                    elem_data = observation
                    for elem in search[1:]:
                        elem_data = elem_data[elem]
                    summary[key].append(try_float(elem_data))

        for key, search in summaries.iteritems():
            summary[key] = search[0](summary[key])

        # No pressure forecast, use today's data:
        summary['meanpressurem'] = try_float(
            today_data['current_observation']['pressure_mb'], 1000)
        day_delta = (check_date -
                     datetime.date.today()).total_seconds() / 3600 / 24
        if today_data['current_observation']['pressure_trend'] == '+':
            summary['meanpressurem'] += day_delta
        elif today_data['current_observation']['pressure_trend'] == '-':
            summary['meanpressurem'] -= day_delta

        total_solar_radiation = 0
        total_clear_sky_isolation = 0
        for hour, coverage in coverages.iteritems():
            cov = sum(coverage['coverage']) / max(1, len(coverage['coverage']))
            solar_radiation, clear_sky_isolation = self._calc_radiation(
                cov, coverage['fractional_day'], hour)

            # Accumulate clear sky radiation and solar radiation on the ground
            total_solar_radiation += solar_radiation
            total_clear_sky_isolation += clear_sky_isolation

        return self._calc_eto(total_solar_radiation, total_clear_sky_isolation,
                              summary)