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
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
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
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
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
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)