mirror of
https://github.com/home-assistant/core.git
synced 2025-07-15 17:27:10 +00:00
Added buienradar precipitation forecast average & total sensors (#8171)
* Added precipitation forecast average & total sensors * Fixed some code style issues * Fixed some code style issues * Minor fix default timeframe * Update buienradar.py * Update buienradar.py
This commit is contained in:
parent
b488663f2c
commit
6234f2d73f
@ -23,7 +23,7 @@ from homeassistant.helpers.event import (
|
|||||||
async_track_point_in_utc_time)
|
async_track_point_in_utc_time)
|
||||||
from homeassistant.util import dt as dt_util
|
from homeassistant.util import dt as dt_util
|
||||||
|
|
||||||
REQUIREMENTS = ['buienradar==0.4']
|
REQUIREMENTS = ['buienradar==0.6']
|
||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
@ -44,23 +44,35 @@ SENSOR_TYPES = {
|
|||||||
'windgust': ['Wind gust', 'm/s', 'mdi:weather-windy'],
|
'windgust': ['Wind gust', 'm/s', 'mdi:weather-windy'],
|
||||||
'precipitation': ['Precipitation', 'mm/h', 'mdi:weather-pouring'],
|
'precipitation': ['Precipitation', 'mm/h', 'mdi:weather-pouring'],
|
||||||
'irradiance': ['Irradiance', 'W/m2', 'mdi:sunglasses'],
|
'irradiance': ['Irradiance', 'W/m2', 'mdi:sunglasses'],
|
||||||
|
'precipitation_forecast_average': ['Precipitation forecast average',
|
||||||
|
'mm/h', 'mdi:weather-pouring'],
|
||||||
|
'precipitation_forecast_total': ['Precipitation forecast total',
|
||||||
|
'mm/h', 'mdi:weather-pouring']
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CONF_TIMEFRAME = 'timeframe'
|
||||||
|
|
||||||
PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
|
PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
|
||||||
vol.Optional(CONF_MONITORED_CONDITIONS,
|
vol.Optional(CONF_MONITORED_CONDITIONS,
|
||||||
default=['symbol', 'temperature']): vol.All(
|
default=['symbol', 'temperature']): vol.All(
|
||||||
cv.ensure_list, vol.Length(min=1),
|
cv.ensure_list, vol.Length(min=1),
|
||||||
[vol.In(SENSOR_TYPES.keys())]),
|
[vol.In(SENSOR_TYPES.keys())]),
|
||||||
vol.Optional(CONF_LATITUDE): cv.latitude,
|
vol.Inclusive(CONF_LATITUDE, 'coordinates',
|
||||||
vol.Optional(CONF_LONGITUDE): cv.longitude,
|
'Latitude and longitude must exist together'): cv.latitude,
|
||||||
|
vol.Inclusive(CONF_LONGITUDE, 'coordinates',
|
||||||
|
'Latitude and longitude must exist together'): cv.longitude,
|
||||||
|
vol.Optional(CONF_TIMEFRAME): cv.positive_int
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
@asyncio.coroutine
|
@asyncio.coroutine
|
||||||
def async_setup_platform(hass, config, async_add_devices, discovery_info=None):
|
def async_setup_platform(hass, config, async_add_devices, discovery_info=None):
|
||||||
"""Setup the buienradar sensor."""
|
"""Setup the buienradar sensor."""
|
||||||
|
from homeassistant.components.weather.buienradar import DEFAULT_TIMEFRAME
|
||||||
|
|
||||||
latitude = config.get(CONF_LATITUDE, hass.config.latitude)
|
latitude = config.get(CONF_LATITUDE, hass.config.latitude)
|
||||||
longitude = config.get(CONF_LONGITUDE, hass.config.longitude)
|
longitude = config.get(CONF_LONGITUDE, hass.config.longitude)
|
||||||
|
timeframe = config.get(CONF_TIMEFRAME, DEFAULT_TIMEFRAME)
|
||||||
|
|
||||||
if None in (latitude, longitude):
|
if None in (latitude, longitude):
|
||||||
_LOGGER.error("Latitude or longitude not set in HomeAssistant config")
|
_LOGGER.error("Latitude or longitude not set in HomeAssistant config")
|
||||||
@ -74,7 +86,7 @@ def async_setup_platform(hass, config, async_add_devices, discovery_info=None):
|
|||||||
dev.append(BrSensor(sensor_type, config.get(CONF_NAME, 'br')))
|
dev.append(BrSensor(sensor_type, config.get(CONF_NAME, 'br')))
|
||||||
async_add_devices(dev)
|
async_add_devices(dev)
|
||||||
|
|
||||||
data = BrData(hass, coordinates, dev)
|
data = BrData(hass, coordinates, timeframe, dev)
|
||||||
# schedule the first update in 1 minute from now:
|
# schedule the first update in 1 minute from now:
|
||||||
_LOGGER.debug("Start running....")
|
_LOGGER.debug("Start running....")
|
||||||
yield from data.schedule_update(1)
|
yield from data.schedule_update(1)
|
||||||
@ -97,8 +109,8 @@ class BrSensor(Entity):
|
|||||||
def load_data(self, data):
|
def load_data(self, data):
|
||||||
"""Load the sensor with relevant data."""
|
"""Load the sensor with relevant data."""
|
||||||
# Find sensor
|
# Find sensor
|
||||||
from buienradar.buienradar import (ATTRIBUTION, IMAGE,
|
from buienradar.buienradar import (ATTRIBUTION, IMAGE, STATIONNAME,
|
||||||
STATIONNAME, SYMBOL)
|
SYMBOL, PRECIPITATION_FORECAST)
|
||||||
|
|
||||||
self._attribution = data.get(ATTRIBUTION)
|
self._attribution = data.get(ATTRIBUTION)
|
||||||
self._stationname = data.get(STATIONNAME)
|
self._stationname = data.get(STATIONNAME)
|
||||||
@ -112,6 +124,14 @@ class BrSensor(Entity):
|
|||||||
self._state = new_state
|
self._state = new_state
|
||||||
self._entity_picture = img
|
self._entity_picture = img
|
||||||
return True
|
return True
|
||||||
|
elif self.type.startswith(PRECIPITATION_FORECAST):
|
||||||
|
# update nested precipitation forecast sensors
|
||||||
|
nested = data.get(PRECIPITATION_FORECAST)
|
||||||
|
new_state = nested.get(self.type[len(PRECIPITATION_FORECAST)+1:])
|
||||||
|
# pylint: disable=protected-access
|
||||||
|
if new_state != self._state:
|
||||||
|
self._state = new_state
|
||||||
|
return True
|
||||||
else:
|
else:
|
||||||
# update all other sensors
|
# update all other sensors
|
||||||
new_state = data.get(self.type)
|
new_state = data.get(self.type)
|
||||||
@ -172,12 +192,13 @@ class BrSensor(Entity):
|
|||||||
class BrData(object):
|
class BrData(object):
|
||||||
"""Get the latest data and updates the states."""
|
"""Get the latest data and updates the states."""
|
||||||
|
|
||||||
def __init__(self, hass, coordinates, devices):
|
def __init__(self, hass, coordinates, timeframe, devices):
|
||||||
"""Initialize the data object."""
|
"""Initialize the data object."""
|
||||||
self.devices = devices
|
self.devices = devices
|
||||||
self.data = {}
|
self.data = {}
|
||||||
self.hass = hass
|
self.hass = hass
|
||||||
self.coordinates = coordinates
|
self.coordinates = coordinates
|
||||||
|
self.timeframe = timeframe
|
||||||
|
|
||||||
@asyncio.coroutine
|
@asyncio.coroutine
|
||||||
def update_devices(self):
|
def update_devices(self):
|
||||||
@ -222,9 +243,6 @@ class BrData(object):
|
|||||||
except (asyncio.TimeoutError, aiohttp.ClientError) as err:
|
except (asyncio.TimeoutError, aiohttp.ClientError) as err:
|
||||||
result[MESSAGE] = "%s" % err
|
result[MESSAGE] = "%s" % err
|
||||||
return result
|
return result
|
||||||
finally:
|
|
||||||
if resp is not None:
|
|
||||||
yield from resp.release()
|
|
||||||
|
|
||||||
@asyncio.coroutine
|
@asyncio.coroutine
|
||||||
def async_update(self, *_):
|
def async_update(self, *_):
|
||||||
@ -232,14 +250,24 @@ class BrData(object):
|
|||||||
from buienradar.buienradar import (parse_data, CONTENT,
|
from buienradar.buienradar import (parse_data, CONTENT,
|
||||||
DATA, MESSAGE, STATUS_CODE, SUCCESS)
|
DATA, MESSAGE, STATUS_CODE, SUCCESS)
|
||||||
|
|
||||||
result = yield from self.get_data('http://xml.buienradar.nl')
|
content = yield from self.get_data('http://xml.buienradar.nl')
|
||||||
if result.get(SUCCESS, False) is False:
|
if not content.get(SUCCESS, False):
|
||||||
result = yield from self.get_data('http://api.buienradar.nl')
|
content = yield from self.get_data('http://api.buienradar.nl')
|
||||||
|
|
||||||
if result.get(SUCCESS):
|
# rounding coordinates prevents unnecessary redirects/calls
|
||||||
result = parse_data(result.get(CONTENT),
|
rainurl = 'http://gadgets.buienradar.nl/data/raintext/?lat={}&lon={}'
|
||||||
latitude=self.coordinates[CONF_LATITUDE],
|
rainurl = rainurl.format(
|
||||||
longitude=self.coordinates[CONF_LONGITUDE])
|
round(self.coordinates[CONF_LATITUDE], 2),
|
||||||
|
round(self.coordinates[CONF_LONGITUDE], 2)
|
||||||
|
)
|
||||||
|
raincontent = yield from self.get_data(rainurl)
|
||||||
|
|
||||||
|
if content.get(SUCCESS) and raincontent.get(SUCCESS):
|
||||||
|
result = parse_data(content.get(CONTENT),
|
||||||
|
raincontent.get(CONTENT),
|
||||||
|
self.coordinates[CONF_LATITUDE],
|
||||||
|
self.coordinates[CONF_LONGITUDE],
|
||||||
|
self.timeframe)
|
||||||
if result.get(SUCCESS):
|
if result.get(SUCCESS):
|
||||||
self.data = result.get(DATA)
|
self.data = result.get(DATA)
|
||||||
|
|
||||||
|
@ -21,6 +21,8 @@ import voluptuous as vol
|
|||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
DEFAULT_TIMEFRAME = 60
|
||||||
|
|
||||||
CONF_FORECAST = 'forecast'
|
CONF_FORECAST = 'forecast'
|
||||||
|
|
||||||
PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
|
PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
|
||||||
@ -45,7 +47,7 @@ def async_setup_platform(hass, config, async_add_devices, discovery_info=None):
|
|||||||
CONF_LONGITUDE: float(longitude)}
|
CONF_LONGITUDE: float(longitude)}
|
||||||
|
|
||||||
# create weather data:
|
# create weather data:
|
||||||
data = BrData(hass, coordinates, None)
|
data = BrData(hass, coordinates, DEFAULT_TIMEFRAME, None)
|
||||||
# create weather device:
|
# create weather device:
|
||||||
async_add_devices([BrWeather(data, config.get(CONF_FORECAST, True),
|
async_add_devices([BrWeather(data, config.get(CONF_FORECAST, True),
|
||||||
config.get(CONF_NAME, None))])
|
config.get(CONF_NAME, None))])
|
||||||
|
@ -115,7 +115,7 @@ boto3==1.4.3
|
|||||||
broadlink==0.3
|
broadlink==0.3
|
||||||
|
|
||||||
# homeassistant.components.sensor.buienradar
|
# homeassistant.components.sensor.buienradar
|
||||||
buienradar==0.4
|
buienradar==0.6
|
||||||
|
|
||||||
# homeassistant.components.notify.ciscospark
|
# homeassistant.components.notify.ciscospark
|
||||||
ciscosparkapi==0.4.2
|
ciscosparkapi==0.4.2
|
||||||
|
Loading…
x
Reference in New Issue
Block a user