Fix WUnderground names (#12346)

* 📝 Fix WUnderground names

* 👻 Fix using event loop callback
This commit is contained in:
Otto Winter 2018-02-12 22:15:28 +01:00 committed by Paulus Schoutsen
parent 04bde68db3
commit 2c202690d8
2 changed files with 27 additions and 18 deletions

View file

@ -11,14 +11,14 @@ import re
import requests import requests
import voluptuous as vol import voluptuous as vol
from homeassistant.components.sensor import PLATFORM_SCHEMA from homeassistant.helpers.typing import HomeAssistantType
from homeassistant.components.sensor import PLATFORM_SCHEMA, ENTITY_ID_FORMAT
from homeassistant.const import ( from homeassistant.const import (
CONF_MONITORED_CONDITIONS, CONF_API_KEY, CONF_LATITUDE, CONF_LONGITUDE, CONF_MONITORED_CONDITIONS, CONF_API_KEY, CONF_LATITUDE, CONF_LONGITUDE,
TEMP_FAHRENHEIT, TEMP_CELSIUS, LENGTH_INCHES, LENGTH_KILOMETERS, TEMP_FAHRENHEIT, TEMP_CELSIUS, LENGTH_INCHES, LENGTH_KILOMETERS,
LENGTH_MILES, LENGTH_FEET, STATE_UNKNOWN, ATTR_ATTRIBUTION, LENGTH_MILES, LENGTH_FEET, STATE_UNKNOWN, ATTR_ATTRIBUTION)
ATTR_FRIENDLY_NAME)
from homeassistant.exceptions import PlatformNotReady from homeassistant.exceptions import PlatformNotReady
from homeassistant.helpers.entity import Entity from homeassistant.helpers.entity import Entity, generate_entity_id
from homeassistant.util import Throttle from homeassistant.util import Throttle
import homeassistant.helpers.config_validation as cv import homeassistant.helpers.config_validation as cv
@ -637,7 +637,7 @@ def setup_platform(hass, config, add_devices, discovery_info=None):
config.get(CONF_LANG), latitude, longitude) config.get(CONF_LANG), latitude, longitude)
sensors = [] sensors = []
for variable in config[CONF_MONITORED_CONDITIONS]: for variable in config[CONF_MONITORED_CONDITIONS]:
sensors.append(WUndergroundSensor(rest, variable)) sensors.append(WUndergroundSensor(hass, rest, variable))
rest.update() rest.update()
if not rest.data: if not rest.data:
@ -651,7 +651,7 @@ def setup_platform(hass, config, add_devices, discovery_info=None):
class WUndergroundSensor(Entity): class WUndergroundSensor(Entity):
"""Implementing the WUnderground sensor.""" """Implementing the WUnderground sensor."""
def __init__(self, rest, condition): def __init__(self, hass: HomeAssistantType, rest, condition):
"""Initialize the sensor.""" """Initialize the sensor."""
self.rest = rest self.rest = rest
self._condition = condition self._condition = condition
@ -663,6 +663,8 @@ class WUndergroundSensor(Entity):
self._entity_picture = None self._entity_picture = None
self._unit_of_measurement = self._cfg_expand("unit_of_measurement") self._unit_of_measurement = self._cfg_expand("unit_of_measurement")
self.rest.request_feature(SENSOR_TYPES[condition].feature) self.rest.request_feature(SENSOR_TYPES[condition].feature)
self.entity_id = generate_entity_id(
ENTITY_ID_FORMAT, "pws_" + condition, hass=hass)
def _cfg_expand(self, what, default=None): def _cfg_expand(self, what, default=None):
"""Parse and return sensor data.""" """Parse and return sensor data."""
@ -684,9 +686,6 @@ class WUndergroundSensor(Entity):
"""Parse and update device state attributes.""" """Parse and update device state attributes."""
attrs = self._cfg_expand("device_state_attributes", {}) attrs = self._cfg_expand("device_state_attributes", {})
self._attributes[ATTR_FRIENDLY_NAME] = self._cfg_expand(
"friendly_name")
for (attr, callback) in attrs.items(): for (attr, callback) in attrs.items():
if callable(callback): if callable(callback):
try: try:
@ -701,7 +700,7 @@ class WUndergroundSensor(Entity):
@property @property
def name(self): def name(self):
"""Return the name of the sensor.""" """Return the name of the sensor."""
return "PWS_" + self._condition return self._cfg_expand("friendly_name")
@property @property
def state(self): def state(self):

View file

@ -249,31 +249,41 @@ class TestWundergroundSetup(unittest.TestCase):
None) None)
for device in self.DEVICES: for device in self.DEVICES:
device.update() device.update()
self.assertTrue(str(device.name).startswith('PWS_')) entity_id = device.entity_id
if device.name == 'PWS_weather': friendly_name = device.name
self.assertTrue(entity_id.startswith('sensor.pws_'))
if entity_id == 'sensor.pws_weather':
self.assertEqual(HTTPS_ICON_URL, device.entity_picture) self.assertEqual(HTTPS_ICON_URL, device.entity_picture)
self.assertEqual(WEATHER, device.state) self.assertEqual(WEATHER, device.state)
self.assertIsNone(device.unit_of_measurement) self.assertIsNone(device.unit_of_measurement)
elif device.name == 'PWS_alerts': self.assertEqual("Weather Summary", friendly_name)
elif entity_id == 'sensor.pws_alerts':
self.assertEqual(1, device.state) self.assertEqual(1, device.state)
self.assertEqual(ALERT_MESSAGE, self.assertEqual(ALERT_MESSAGE,
device.device_state_attributes['Message']) device.device_state_attributes['Message'])
self.assertEqual(ALERT_ICON, device.icon) self.assertEqual(ALERT_ICON, device.icon)
self.assertIsNone(device.entity_picture) self.assertIsNone(device.entity_picture)
elif device.name == 'PWS_location': self.assertEqual('Alerts', friendly_name)
elif entity_id == 'sensor.pws_location':
self.assertEqual('Holly Springs, NC', device.state) self.assertEqual('Holly Springs, NC', device.state)
elif device.name == 'PWS_elevation': self.assertEqual('Location', friendly_name)
elif entity_id == 'sensor.pws_elevation':
self.assertEqual('413', device.state) self.assertEqual('413', device.state)
elif device.name == 'PWS_feelslike_c': self.assertEqual('Elevation', friendly_name)
elif entity_id == 'sensor.pws_feelslike_c':
self.assertIsNone(device.entity_picture) self.assertIsNone(device.entity_picture)
self.assertEqual(FEELS_LIKE, device.state) self.assertEqual(FEELS_LIKE, device.state)
self.assertEqual(TEMP_CELSIUS, device.unit_of_measurement) self.assertEqual(TEMP_CELSIUS, device.unit_of_measurement)
elif device.name == 'PWS_weather_1d_metric': self.assertEqual("Feels Like", friendly_name)
elif entity_id == 'sensor.pws_weather_1d_metric':
self.assertEqual(FORECAST_TEXT, device.state) self.assertEqual(FORECAST_TEXT, device.state)
self.assertEqual('Tuesday', friendly_name)
else: else:
self.assertEqual(device.name, 'PWS_precip_1d_in') self.assertEqual(entity_id, 'sensor.pws_precip_1d_in')
self.assertEqual(PRECIP_IN, device.state) self.assertEqual(PRECIP_IN, device.state)
self.assertEqual(LENGTH_INCHES, device.unit_of_measurement) self.assertEqual(LENGTH_INCHES, device.unit_of_measurement)
self.assertEqual('Precipitation Intensity Today',
friendly_name)
@unittest.mock.patch('requests.get', @unittest.mock.patch('requests.get',
side_effect=ConnectionError('test exception')) side_effect=ConnectionError('test exception'))