Added forecast support to DarkSky ()

* Added forecast support to DarkSky

	modified:   homeassistant/components/sensor/darksky.py
	modified:   tests/components/sensor/test_darksky.py

* Fix async_volume_up / async_volume_down ()

async_volume_up / async_volume_down should be async versions of
volume_up / volume_down, not a async version of the default variants of
volume_up / volume_down.

The previous code always called into the mediaplayers set_volume_level,
and never into volume_up / volume_down.

Signed-off-by: Anton Lundin <glance@acc.umu.se>

* adding a default icon "blind" to a PowerView blinds scene. ()

* adding a default icon "blind" to a PowerView blinds scene.

* Adding icon property to define blind icon. Removed it from the state attributes dict.

* fixing lint error

* Added forecast support to DarkSky

	modified:   homeassistant/components/sensor/darksky.py
	modified:   tests/components/sensor/test_darksky.py

* Use SHA hash to make token harder to guess ()

* Use SHA hash to make token harder to guess

Use hashlib SHA256 to encode object id instead of using it directly.

* Cache access token

Instead of generating a token on the fly cache it in the constructor.

* Fix lint

* Bugfix async device_tracker see callback ()

* Add support for NAD receivers ()

* Add support for NAD receivers

* remove self.update() in various methods

* remove setting attributes in various methods

* Change import to hass style

* Updated Config Validation, extended daily forecast to all supported types

* Fix style errors from previous commit, fix test since adding daily for all supported types

* Removed temperature from daily as it isn't supported

* Added forecast support to DarkSky

	modified:   homeassistant/components/sensor/darksky.py
	modified:   tests/components/sensor/test_darksky.py

* Updated Config Validation, extended daily forecast to all supported types

* Fix style errors from previous commit, fix test since adding daily for all supported types

* Removed temperature from daily as it isn't supported

* Revert "Bugfix camera streams ()"

This reverts commit 4b43537801.

Revert "Version bump for kodi dependency ()"

This reverts commit 6abad6b76e.

Revert "Add HMWIOSwitch to sensor, binary ()"

This reverts commit 2c3f55acc4.

Revert "Remove GTFS default name & string change"

This reverts commit 6000c59bb5.

Revert "Update pyhomematic 1.19 & small cleanups ()"

This reverts commit a30711f1a0.

Revert "[sensor] Add Dublin bus RTPI sensor ()"

This reverts commit 1219ca3c3b.

Revert "Bugfix group reload ()"

This reverts commit baa8e53e66.

Revert "Support for TrackR device trackers ()"

This reverts commit f7a1d63d52.

Revert "Bump pywemo version."

This reverts commit dc937cc8cf.

Revert "Upgrade to voluptuous to 0.9.3 ()"

This reverts commit d12decc471.

Revert "Upgrade distro to 1.0.2 ()"

This reverts commit 64800fd48c.

Revert "Don't build Adafruit_BBIO - doesn't work on all platforms. ()"

This reverts commit 9a3c0c8cd3.

Revert "Convert flic to synchronous platform. ()"

This reverts commit eb9b95c292.

Revert "Upgrade to aiohttp 1.2 ()"

This reverts commit e68e29e03e.

Revert "Fix TCP sensor to correctly use value_template ()"

This reverts commit 1cf9ae5a01.

Revert "Cleanup language support on TTS ()"

This reverts commit 3f3a3bcc8a.

Revert "Add last triggered to script ()"

This reverts commit 467cb18625.

Revert "Bump flux_led version and make use of PyPi package ()"

This reverts commit 34a9fb01ac.

Revert "Add support for NAD receivers ()"

This reverts commit 3b59e169f1.

Revert "Bugfix async device_tracker see callback ()"

This reverts commit 71fddd26eb.

Revert "Use SHA hash to make token harder to guess ()"

This reverts commit 922308bc1f.

* Revert "Revert "Bugfix camera streams ()""

This reverts commit 2ee8c44021.

* Update darksky.py
This commit is contained in:
nordlead2005 2017-01-27 01:32:45 -05:00 committed by Paulus Schoutsen
parent f2870c3103
commit 837994196e
2 changed files with 70 additions and 37 deletions
homeassistant/components/sensor
tests/components/sensor

View file

@ -25,58 +25,76 @@ _LOGGER = logging.getLogger(__name__)
CONF_ATTRIBUTION = "Powered by Dark Sky"
CONF_UNITS = 'units'
CONF_UPDATE_INTERVAL = 'update_interval'
CONF_FORECAST = 'forecast'
DEFAULT_NAME = 'Dark Sky'
# Sensor types are defined like so:
# Name, si unit, us unit, ca unit, uk unit, uk2 unit
SENSOR_TYPES = {
'summary': ['Summary', None, None, None, None, None, None],
'summary': ['Summary', None, None, None, None, None, None, []],
'minutely_summary': ['Minutely Summary',
None, None, None, None, None, None],
'hourly_summary': ['Hourly Summary', None, None, None, None, None, None],
'daily_summary': ['Daily Summary', None, None, None, None, None, None],
'icon': ['Icon', None, None, None, None, None, None],
None, None, None, None, None, None, []],
'hourly_summary': ['Hourly Summary', None, None, None, None, None, None,
[]],
'daily_summary': ['Daily Summary', None, None, None, None, None, None, []],
'icon': ['Icon', None, None, None, None, None, None,
['currently', 'hourly', 'daily']],
'nearest_storm_distance': ['Nearest Storm Distance',
'km', 'mi', 'km', 'km', 'mi',
'mdi:weather-lightning'],
'km', 'm', 'km', 'km', 'm',
'mdi:weather-lightning', ['currently']],
'nearest_storm_bearing': ['Nearest Storm Bearing',
'°', '°', '°', '°', '°',
'mdi:weather-lightning'],
'mdi:weather-lightning', ['currently']],
'precip_type': ['Precip', None, None, None, None, None,
'mdi:weather-pouring'],
'mdi:weather-pouring',
['currently', 'minutely', 'hourly', 'daily']],
'precip_intensity': ['Precip Intensity',
'mm', 'in', 'mm', 'mm', 'mm', 'mdi:weather-rainy'],
'mm', 'in', 'mm', 'mm', 'mm', 'mdi:weather-rainy',
['currently', 'minutely', 'hourly', 'daily']],
'precip_probability': ['Precip Probability',
'%', '%', '%', '%', '%', 'mdi:water-percent'],
'%', '%', '%', '%', '%', 'mdi:water-percent',
['currently', 'minutely', 'hourly', 'daily']],
'temperature': ['Temperature',
'°C', '°F', '°C', '°C', '°C', 'mdi:thermometer'],
'°C', '°F', '°C', '°C', '°C', 'mdi:thermometer',
['currently', 'hourly']],
'apparent_temperature': ['Apparent Temperature',
'°C', '°F', '°C', '°C', '°C', 'mdi:thermometer'],
'°C', '°F', '°C', '°C', '°C', 'mdi:thermometer',
['currently', 'hourly']],
'dew_point': ['Dew point', '°C', '°F', '°C', '°C', '°C',
'mdi:thermometer'],
'mdi:thermometer', ['currently', 'hourly', 'daily']],
'wind_speed': ['Wind Speed', 'm/s', 'mph', 'km/h', 'mph', 'mph',
'mdi:weather-windy'],
'wind_bearing': ['Wind Bearing', '°', '°', '°', '°', '°', 'mdi:compass'],
'mdi:weather-windy', ['currently', 'hourly', 'daily']],
'wind_bearing': ['Wind Bearing', '°', '°', '°', '°', '°', 'mdi:compass',
['currently', 'hourly', 'daily']],
'cloud_cover': ['Cloud Coverage', '%', '%', '%', '%', '%',
'mdi:weather-partlycloudy'],
'humidity': ['Humidity', '%', '%', '%', '%', '%', 'mdi:water-percent'],
'mdi:weather-partlycloudy',
['currently', 'hourly', 'daily']],
'humidity': ['Humidity', '%', '%', '%', '%', '%', 'mdi:water-percent',
['currently', 'hourly', 'daily']],
'pressure': ['Pressure', 'mbar', 'mbar', 'mbar', 'mbar', 'mbar',
'mdi:gauge'],
'visibility': ['Visibility', 'km', 'mi', 'km', 'km', 'mi', 'mdi:eye'],
'ozone': ['Ozone', 'DU', 'DU', 'DU', 'DU', 'DU', 'mdi:eye'],
'mdi:gauge', ['currently', 'hourly', 'daily']],
'visibility': ['Visibility', 'km', 'm', 'km', 'km', 'm', 'mdi:eye',
['currently', 'hourly', 'daily']],
'ozone': ['Ozone', 'DU', 'DU', 'DU', 'DU', 'DU', 'mdi:eye',
['currently', 'hourly', 'daily']],
'apparent_temperature_max': ['Daily High Apparent Temperature',
'°C', '°F', '°C', '°C', '°C',
'mdi:thermometer'],
'mdi:thermometer',
['currently', 'hourly', 'daily']],
'apparent_temperature_min': ['Daily Low Apparent Temperature',
'°C', '°F', '°C', '°C', '°C',
'mdi:thermometer'],
'mdi:thermometer',
['currently', 'hourly', 'daily']],
'temperature_max': ['Daily High Temperature',
'°C', '°F', '°C', '°C', '°C', 'mdi:thermometer'],
'°C', '°F', '°C', '°C', '°C', 'mdi:thermometer',
['currently', 'hourly', 'daily']],
'temperature_min': ['Daily Low Temperature',
'°C', '°F', '°C', '°C', '°C', 'mdi:thermometer'],
'°C', '°F', '°C', '°C', '°C', 'mdi:thermometer',
['currently', 'hourly', 'daily']],
'precip_intensity_max': ['Daily Max Precip Intensity',
'mm', 'in', 'mm', 'mm', 'mm', 'mdi:thermometer'],
'mm', 'in', 'mm', 'mm', 'mm', 'mdi:thermometer',
['currently', 'hourly', 'daily']],
}
PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
@ -87,6 +105,8 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
vol.Optional(CONF_UNITS): vol.In(['auto', 'si', 'us', 'ca', 'uk', 'uk2']),
vol.Optional(CONF_UPDATE_INTERVAL, default=timedelta(seconds=120)): (
vol.All(cv.time_period, cv.positive_timedelta)),
vol.Optional(CONF_FORECAST):
vol.All(cv.ensure_list, [vol.Range(min=1, max=7)]),
})
@ -119,9 +139,14 @@ def setup_platform(hass, config, add_devices, discovery_info=None):
name = config.get(CONF_NAME)
forecast = config.get(CONF_FORECAST)
sensors = []
for variable in config[CONF_MONITORED_CONDITIONS]:
sensors.append(DarkSkySensor(forecast_data, variable, name))
if forecast is not None and 'daily' in SENSOR_TYPES[variable][7]:
for forecast_day in forecast:
sensors.append(DarkSkySensor(forecast_data,
variable, name, forecast_day))
add_devices(sensors, True)
@ -129,19 +154,24 @@ def setup_platform(hass, config, add_devices, discovery_info=None):
class DarkSkySensor(Entity):
"""Implementation of a Dark Sky sensor."""
def __init__(self, forecast_data, sensor_type, name):
def __init__(self, forecast_data, sensor_type, name, forecast_day=0):
"""Initialize the sensor."""
self.client_name = name
self._name = SENSOR_TYPES[sensor_type][0]
self.forecast_data = forecast_data
self.type = sensor_type
self.forecast_day = forecast_day
self._state = None
self._unit_of_measurement = None
@property
def name(self):
"""Return the name of the sensor."""
return '{} {}'.format(self.client_name, self._name)
if self.forecast_day == 0:
return '{} {}'.format(self.client_name, self._name)
else:
return '{} {} {}'.format(self.client_name, self._name,
self.forecast_day)
@property
def state(self):
@ -198,19 +228,21 @@ class DarkSkySensor(Entity):
self.forecast_data.update_hourly()
hourly = self.forecast_data.data_hourly
self._state = getattr(hourly, 'summary', '')
elif self.type in ['daily_summary',
'temperature_min',
'temperature_max',
'apparent_temperature_min',
'apparent_temperature_max',
'precip_intensity_max']:
elif self.forecast_day > 0 or (
self.type in ['daily_summary',
'temperature_min',
'temperature_max',
'apparent_temperature_min',
'apparent_temperature_max',
'precip_intensity_max']):
self.forecast_data.update_daily()
daily = self.forecast_data.data_daily
if self.type == 'daily_summary':
self._state = getattr(daily, 'summary', '')
else:
if hasattr(daily, 'data'):
self._state = self.get_state(daily.data[0])
self._state = self.get_state(
daily.data[self.forecast_day])
else:
self._state = 0
else:

View file

@ -32,7 +32,8 @@ class TestDarkSkySetup(unittest.TestCase):
self.key = 'foo'
self.config = {
'api_key': 'foo',
'monitored_conditions': ['summary', 'icon'],
'forecast': [1, 2],
'monitored_conditions': ['summary', 'icon', 'temperature_max'],
'update_interval': timedelta(seconds=120),
}
self.lat = 37.8267
@ -80,4 +81,4 @@ class TestDarkSkySetup(unittest.TestCase):
darksky.setup_platform(self.hass, self.config, self.add_entities)
self.assertTrue(mock_get_forecast.called)
self.assertEqual(mock_get_forecast.call_count, 1)
self.assertEqual(len(self.entities), 2)
self.assertEqual(len(self.entities), 7)