Added forecast support to DarkSky (#5264)
* 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 (#5249) 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. (#5210) * 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 (#5258) * 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 (#5259) * Add support for NAD receivers (#5191) * 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 (#5306)" This reverts commitpull/5562/merge4b43537801
. Revert "Version bump for kodi dependency (#5307)" This reverts commit6abad6b76e
. Revert "Add HMWIOSwitch to sensor, binary (#5304)" This reverts commit2c3f55acc4
. Revert "Remove GTFS default name & string change" This reverts commit6000c59bb5
. Revert "Update pyhomematic 1.19 & small cleanups (#5299)" This reverts commita30711f1a0
. Revert "[sensor] Add Dublin bus RTPI sensor (#5257)" This reverts commit1219ca3c3b
. Revert "Bugfix group reload (#5292)" This reverts commitbaa8e53e66
. Revert "Support for TrackR device trackers (#5010)" This reverts commitf7a1d63d52
. Revert "Bump pywemo version." This reverts commitdc937cc8cf
. Revert "Upgrade to voluptuous to 0.9.3 (#5288)" This reverts commitd12decc471
. Revert "Upgrade distro to 1.0.2 (#5291)" This reverts commit64800fd48c
. Revert "Don't build Adafruit_BBIO - doesn't work on all platforms. (#5281)" This reverts commit9a3c0c8cd3
. Revert "Convert flic to synchronous platform. (#5276)" This reverts commiteb9b95c292
. Revert "Upgrade to aiohttp 1.2 (#4964)" This reverts commite68e29e03e
. Revert "Fix TCP sensor to correctly use value_template (#5211)" This reverts commit1cf9ae5a01
. Revert "Cleanup language support on TTS (#5255)" This reverts commit3f3a3bcc8a
. Revert "Add last triggered to script (#5261)" This reverts commit467cb18625
. Revert "Bump flux_led version and make use of PyPi package (#5267)" This reverts commit34a9fb01ac
. Revert "Add support for NAD receivers (#5191)" This reverts commit3b59e169f1
. Revert "Bugfix async device_tracker see callback (#5259)" This reverts commit71fddd26eb
. Revert "Use SHA hash to make token harder to guess (#5258)" This reverts commit922308bc1f
. * Revert "Revert "Bugfix camera streams (#5306)"" This reverts commit2ee8c44021
. * Update darksky.py
parent
f2870c3103
commit
837994196e
|
@ -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:
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue