Esempio n. 1
0
def get_weather_variables(forecast, location):
    """
    :param forecast: forecastio object
    :param location: location dict with 'lat', 'lng', and 'name' keys
    :return: weather_data dict containing weather information
    """
    try:
        weather_data = dict()
        if 'darksky-unavailable' in forecast.json['flags']:
            raise BadForecastDataError('Darksky unavailable')
        if not forecast.currently().temperature:
            raise BadForecastDataError('Temp is None')
        if not forecast.currently().summary:
            raise BadForecastDataError('Summary is None')
        weather_data['units'] = utils.get_units(CONFIG['basic']['units'])
        # forecast.io doesn't always include 'windBearing' or 'nearestStormDistance'
        if hasattr(forecast.currently(), 'windBearing'):
            weather_data['windBearing'] = utils.get_wind_direction(forecast.currently().windBearing)
        else:
            weather_data['windBearing'] = 'unknown direction'
        if hasattr(forecast.currently(), 'nearestStormDistance'):
            weather_data['nearestStormDistance'] = forecast.currently().nearestStormDistance
        else:
            weather_data['nearestStormDistance'] = 99999
        weather_data['windSpeed'] = forecast.currently().windSpeed
        weather_data['windSpeed_and_unit'] = str(round(forecast.currently().windSpeed)) + ' ' + \
            weather_data['units']['windSpeed']
        weather_data['apparentTemperature'] = forecast.currently().apparentTemperature
        weather_data['apparentTemperature_and_unit'] = str(round(forecast.currently().apparentTemperature)) + 'º' \
            + weather_data['units']['apparentTemperature']
        weather_data['temp'] = forecast.currently().temperature
        weather_data['temp_and_unit'] = str(round(forecast.currently().temperature)) + 'º' + \
            weather_data['units']['temperature']
        weather_data['humidity'] = round(forecast.currently().humidity * 100)
        weather_data['precipIntensity'] = forecast.currently().precipIntensity
        weather_data['precipProbability'] = forecast.currently().precipProbability
        if hasattr(forecast.currently(), 'precipType'):
            weather_data['precipType'] = forecast.currently().precipType
        else:
            weather_data['precipType'] = 'none'
        weather_data['summary'] = forecast.currently().summary.lower()
        weather_data['icon'] = forecast.currently().icon
        weather_data['location'] = location['name']
        weather_data['latitude'] = location['lat']
        weather_data['longitude'] = location['lng']
        weather_data['timezone'] = forecast.json['timezone']
        weather_data['forecast'] = forecast.daily().data[0]
        weather_data['hour_icon'] = forecast.minutely().icon
        weather_data['hour_summary'] = forecast.minutely().summary
        weather_data['alerts'] = forecast.alerts()
        weather_data['valid'] = True
        logging.debug('Weather data: {0}'.format(weather_data))
        return weather_data
    except (KeyError, TypeError, BadForecastDataError) as err:
        logging.error('Found an error in get_weather_variables')
        logging.error(err)
        return {'valid': False}
Esempio n. 2
0
    def __init__(self, forecast, location):
        """
        :type location: WeatherLocation
        :type forecast: forecastio.models.Forecast
        """
        self.__forecast = forecast

        try:
            if 'darksky-unavailable' in forecast.json['flags']:
                raise BadForecastDataError('Darksky unavailable')
            self.units = utils.get_units(forecast.json['flags']['units'])
            # Dark Sky doesn't always include 'windBearing' or 'nearestStormDistance'
            if hasattr(forecast.currently(), 'windBearing'):
                self.windBearing = utils.get_wind_direction(
                    forecast.currently().windBearing)
            else:
                self.windBearing = 'unknown direction'
            self.windSpeed = forecast.currently().windSpeed
            self.apparentTemperature = forecast.currently().apparentTemperature
            self.temp = forecast.currently().temperature
            self.humidity = round(forecast.currently().humidity * 100)
            self.precipIntensity = forecast.currently().precipIntensity
            self.precipProbability = forecast.currently().precipProbability
            if hasattr(forecast.currently(), 'precipType'):
                self.precipType = forecast.currently().precipType
            else:
                self.precipType = 'none'
            self.summary = forecast.currently().summary
            self.icon = forecast.currently().icon
            self.location = location
            self.timezone = forecast.json['timezone']
            self.forecast = forecast.daily().data[0]
            self.minutely = forecast.minutely(
            )  # this will return None in many parts of the world
            self.alerts = list()
            for alert in forecast.alerts():
                self.alerts.append(WeatherAlert(alert))
            self.valid = True
        except (KeyError, TypeError, BadForecastDataError,
                PropertyUnavailable):
            self.valid = False
Esempio n. 3
0
 def test_init(self):
     """Testing that weather data is loaded correctly"""
     forecast = forecastio.manual(os.path.join('fixtures', 'us.json'))
     wd = models.WeatherData(forecast, self.location)
     self.assertEqual(wd.units, utils.get_units('us'))
     self.assertEqual(wd.windBearing, 'SW')
     self.assertEqual(wd.windSpeed, 10.81)
     self.assertEqual(wd.apparentTemperature, 50.84)
     self.assertEqual(wd.temp, 50.84)
     self.assertEqual(wd.humidity, 89)
     self.assertEqual(wd.precipIntensity, 0)
     self.assertEqual(wd.precipProbability, 0)
     self.assertEqual(wd.precipType, 'none')
     self.assertEqual(wd.summary, 'Partly Cloudy')
     self.assertEqual(wd.icon, 'partly-cloudy-day')
     self.assertEqual(wd.location, self.location)
     self.assertEqual(wd.timezone, 'Europe/Copenhagen')
     self.assertEqual(wd.alerts, [])
     self.assertTrue(wd.valid)
     self.assertEqual(str(wd),
                      '<WeatherData: Lyngby-Taarbæk, Hovedstaden(55.76,12.49) at 2016-10-01 05:56:38+00:00>')
Esempio n. 4
0
    def __init__(self, forecast, location):
        """
        :type location: WeatherLocation
        :type forecast: forecastio.models.Forecast
        """
        self.__forecast = forecast

        try:
            if 'darksky-unavailable' in forecast.json['flags']:
                raise BadForecastDataError('Darksky unavailable')
            self.units = utils.get_units(forecast.json['flags']['units'])
            # Dark Sky doesn't always include 'windBearing'
            if hasattr(forecast.currently(), 'windBearing'):
                self.windBearing = utils.get_wind_direction(forecast.currently().windBearing)
            else:
                self.windBearing = 'unknown direction'
            self.windSpeed = forecast.currently().windSpeed
            self.apparentTemperature = forecast.currently().apparentTemperature
            self.temp = forecast.currently().temperature
            self.humidity = round(forecast.currently().humidity * 100)
            self.precipIntensity = forecast.currently().precipIntensity
            self.precipProbability = forecast.currently().precipProbability
            if hasattr(forecast.currently(), 'precipType'):
                self.precipType = forecast.currently().precipType
            else:
                self.precipType = 'none'
            self.summary = forecast.currently().summary
            self.icon = forecast.currently().icon
            self.location = location
            self.timezone = forecast.json['timezone']
            self.forecast = forecast.daily().data[0]
            self.minutely = forecast.minutely()  # this will return None in many parts of the world
            self.alerts = list()
            for alert in forecast.alerts():
                self.alerts.append(WeatherAlert(alert))
            self.valid = True
        except (KeyError, TypeError, BadForecastDataError, PropertyUnavailable):
            self.valid = False
Esempio n. 5
0
 def test_get_units(self):
     """Testing getting units from a country/unit identifier"""
     self.assertEqual(utils.get_units('us')['unit'], 'us')
     self.assertEqual(utils.get_units('us')['nearestStormDistance'], 'mph')
     self.assertEqual(utils.get_units('us')['precipIntensity'], 'in/h')
     self.assertEqual(utils.get_units('us')['precipIntensityMax'], 'in/h')
     self.assertEqual(utils.get_units('us')['precipAccumulation'], 'in')
     self.assertEqual(utils.get_units('us')['temperature'], 'F')
     self.assertEqual(utils.get_units('us')['temperatureMin'], 'F')
     self.assertEqual(utils.get_units('us')['temperatureMax'], 'F')
     self.assertEqual(utils.get_units('us')['apparentTemperature'], 'F')
     self.assertEqual(utils.get_units('us')['dewPoint'], 'F')
     self.assertEqual(utils.get_units('us')['windSpeed'], 'mph')
     self.assertEqual(utils.get_units('us')['pressure'], 'mb')
     self.assertEqual(utils.get_units('us')['visibility'], 'mi')
     self.assertEqual(utils.get_units('ca')['unit'], 'ca')
     self.assertEqual(utils.get_units('ca')['nearestStormDistance'], 'km')
     self.assertEqual(utils.get_units('ca')['precipIntensity'], 'mm/h')
     self.assertEqual(utils.get_units('ca')['precipIntensityMax'], 'mm/h')
     self.assertEqual(utils.get_units('ca')['precipAccumulation'], 'cm')
     self.assertEqual(utils.get_units('ca')['temperature'], 'C')
     self.assertEqual(utils.get_units('ca')['temperatureMin'], 'C')
     self.assertEqual(utils.get_units('ca')['temperatureMax'], 'C')
     self.assertEqual(utils.get_units('ca')['apparentTemperature'], 'C')
     self.assertEqual(utils.get_units('ca')['dewPoint'], 'C')
     self.assertEqual(utils.get_units('ca')['windSpeed'], 'km/h')
     self.assertEqual(utils.get_units('ca')['pressure'], 'hPa')
     self.assertEqual(utils.get_units('ca')['visibility'], 'km')
     self.assertEqual(utils.get_units('uk2')['unit'], 'uk2')
     self.assertEqual(utils.get_units('uk2')['nearestStormDistance'], 'mi')
     self.assertEqual(utils.get_units('uk2')['precipIntensity'], 'mm/h')
     self.assertEqual(utils.get_units('uk2')['precipIntensityMax'], 'mm/h')
     self.assertEqual(utils.get_units('uk2')['precipAccumulation'], 'cm')
     self.assertEqual(utils.get_units('uk2')['temperature'], 'C')
     self.assertEqual(utils.get_units('uk2')['temperatureMin'], 'C')
     self.assertEqual(utils.get_units('uk2')['temperatureMax'], 'C')
     self.assertEqual(utils.get_units('uk2')['apparentTemperature'], 'C')
     self.assertEqual(utils.get_units('uk2')['dewPoint'], 'C')
     self.assertEqual(utils.get_units('uk2')['windSpeed'], 'mph')
     self.assertEqual(utils.get_units('uk2')['pressure'], 'hPa')
     self.assertEqual(utils.get_units('uk2')['visibility'], 'mi')
     self.assertEqual(utils.get_units('si')['unit'], 'si')
     self.assertEqual(utils.get_units('si')['nearestStormDistance'], 'km')
     self.assertEqual(utils.get_units('si')['precipIntensity'], 'mm/h')
     self.assertEqual(utils.get_units('si')['precipIntensityMax'], 'mm/h')
     self.assertEqual(utils.get_units('si')['precipAccumulation'], 'cm')
     self.assertEqual(utils.get_units('si')['temperature'], 'C')
     self.assertEqual(utils.get_units('si')['temperatureMin'], 'C')
     self.assertEqual(utils.get_units('si')['temperatureMax'], 'C')
     self.assertEqual(utils.get_units('si')['apparentTemperature'], 'C')
     self.assertEqual(utils.get_units('si')['dewPoint'], 'C')
     self.assertEqual(utils.get_units('si')['windSpeed'], 'm/s')
     self.assertEqual(utils.get_units('si')['pressure'], 'hPa')
     self.assertEqual(utils.get_units('si')['visibility'], 'km')