Add destination and icon (#18210)

* Add destination and icon

* Update test_transport_nsw.py

* Error handling fix in external lib

* Reverse sensor name change to prevent break
This commit is contained in:
Dav0815 2018-11-05 18:27:20 +11:00 committed by Fabian Affolter
parent 1c3ef8be55
commit 6e4ce35a69
4 changed files with 43 additions and 11 deletions

View File

@ -4,6 +4,7 @@ Transport NSW (AU) sensor to query next leave event for a specified stop.
For more details about this platform, please refer to the documentation at For more details about this platform, please refer to the documentation at
https://home-assistant.io/components/sensor.transport_nsw/ https://home-assistant.io/components/sensor.transport_nsw/
""" """
from datetime import timedelta
import logging import logging
import voluptuous as vol import voluptuous as vol
@ -13,7 +14,7 @@ from homeassistant.helpers.entity import Entity
from homeassistant.components.sensor import PLATFORM_SCHEMA from homeassistant.components.sensor import PLATFORM_SCHEMA
from homeassistant.const import (CONF_NAME, CONF_API_KEY, ATTR_ATTRIBUTION) from homeassistant.const import (CONF_NAME, CONF_API_KEY, ATTR_ATTRIBUTION)
REQUIREMENTS = ['PyTransportNSW==0.0.8'] REQUIREMENTS = ['PyTransportNSW==0.1.1']
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)
@ -22,19 +23,34 @@ ATTR_ROUTE = 'route'
ATTR_DUE_IN = 'due' ATTR_DUE_IN = 'due'
ATTR_DELAY = 'delay' ATTR_DELAY = 'delay'
ATTR_REAL_TIME = 'real_time' ATTR_REAL_TIME = 'real_time'
ATTR_DESTINATION = 'destination'
ATTR_MODE = 'mode'
CONF_ATTRIBUTION = "Data provided by Transport NSW" CONF_ATTRIBUTION = "Data provided by Transport NSW"
CONF_STOP_ID = 'stop_id' CONF_STOP_ID = 'stop_id'
CONF_ROUTE = 'route' CONF_ROUTE = 'route'
CONF_DESTINATION = 'destination'
DEFAULT_NAME = "Next Bus" DEFAULT_NAME = "Next Bus"
ICON = "mdi:bus" ICONS = {
'Train': 'mdi:train',
'Lightrail': 'mdi:tram',
'Bus': 'mdi:bus',
'Coach': 'mdi:bus',
'Ferry': 'mdi:ferry',
'Schoolbus': 'mdi:bus',
'n/a': 'mdi:clock',
None: 'mdi:clock'
}
SCAN_INTERVAL = timedelta(seconds=60)
PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
vol.Required(CONF_STOP_ID): cv.string, vol.Required(CONF_STOP_ID): cv.string,
vol.Required(CONF_API_KEY): cv.string, vol.Required(CONF_API_KEY): cv.string,
vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string,
vol.Optional(CONF_ROUTE, default=""): cv.string, vol.Optional(CONF_ROUTE, default=""): cv.string,
vol.Optional(CONF_DESTINATION, default=""): cv.string
}) })
@ -43,9 +59,10 @@ def setup_platform(hass, config, add_entities, discovery_info=None):
stop_id = config[CONF_STOP_ID] stop_id = config[CONF_STOP_ID]
api_key = config[CONF_API_KEY] api_key = config[CONF_API_KEY]
route = config.get(CONF_ROUTE) route = config.get(CONF_ROUTE)
destination = config.get(CONF_DESTINATION)
name = config.get(CONF_NAME) name = config.get(CONF_NAME)
data = PublicTransportData(stop_id, route, api_key) data = PublicTransportData(stop_id, route, destination, api_key)
add_entities([TransportNSWSensor(data, stop_id, name)], True) add_entities([TransportNSWSensor(data, stop_id, name)], True)
@ -58,6 +75,7 @@ class TransportNSWSensor(Entity):
self._name = name self._name = name
self._stop_id = stop_id self._stop_id = stop_id
self._times = self._state = None self._times = self._state = None
self._icon = ICONS[None]
@property @property
def name(self): def name(self):
@ -79,6 +97,8 @@ class TransportNSWSensor(Entity):
ATTR_ROUTE: self._times[ATTR_ROUTE], ATTR_ROUTE: self._times[ATTR_ROUTE],
ATTR_DELAY: self._times[ATTR_DELAY], ATTR_DELAY: self._times[ATTR_DELAY],
ATTR_REAL_TIME: self._times[ATTR_REAL_TIME], ATTR_REAL_TIME: self._times[ATTR_REAL_TIME],
ATTR_DESTINATION: self._times[ATTR_DESTINATION],
ATTR_MODE: self._times[ATTR_MODE],
ATTR_ATTRIBUTION: CONF_ATTRIBUTION ATTR_ATTRIBUTION: CONF_ATTRIBUTION
} }
@ -90,36 +110,43 @@ class TransportNSWSensor(Entity):
@property @property
def icon(self): def icon(self):
"""Icon to use in the frontend, if any.""" """Icon to use in the frontend, if any."""
return ICON return self._icon
def update(self): def update(self):
"""Get the latest data from Transport NSW and update the states.""" """Get the latest data from Transport NSW and update the states."""
self.data.update() self.data.update()
self._times = self.data.info self._times = self.data.info
self._state = self._times[ATTR_DUE_IN] self._state = self._times[ATTR_DUE_IN]
self._icon = ICONS[self._times[ATTR_MODE]]
class PublicTransportData: class PublicTransportData:
"""The Class for handling the data retrieval.""" """The Class for handling the data retrieval."""
def __init__(self, stop_id, route, api_key): def __init__(self, stop_id, route, destination, api_key):
"""Initialize the data object.""" """Initialize the data object."""
import TransportNSW import TransportNSW
self._stop_id = stop_id self._stop_id = stop_id
self._route = route self._route = route
self._destination = destination
self._api_key = api_key self._api_key = api_key
self.info = {ATTR_ROUTE: self._route, self.info = {ATTR_ROUTE: self._route,
ATTR_DUE_IN: 'n/a', ATTR_DUE_IN: 'n/a',
ATTR_DELAY: 'n/a', ATTR_DELAY: 'n/a',
ATTR_REAL_TIME: 'n/a'} ATTR_REAL_TIME: 'n/a',
ATTR_DESTINATION: 'n/a',
ATTR_MODE: None}
self.tnsw = TransportNSW.TransportNSW() self.tnsw = TransportNSW.TransportNSW()
def update(self): def update(self):
"""Get the next leave time.""" """Get the next leave time."""
_data = self.tnsw.get_departures(self._stop_id, _data = self.tnsw.get_departures(self._stop_id,
self._route, self._route,
self._destination,
self._api_key) self._api_key)
self.info = {ATTR_ROUTE: _data['route'], self.info = {ATTR_ROUTE: _data['route'],
ATTR_DUE_IN: _data['due'], ATTR_DUE_IN: _data['due'],
ATTR_DELAY: _data['delay'], ATTR_DELAY: _data['delay'],
ATTR_REAL_TIME: _data['real_time']} ATTR_REAL_TIME: _data['real_time'],
ATTR_DESTINATION: _data['destination'],
ATTR_MODE: _data['mode']}

View File

@ -56,7 +56,7 @@ PyRMVtransport==0.1.3
PySwitchbot==0.3 PySwitchbot==0.3
# homeassistant.components.sensor.transport_nsw # homeassistant.components.sensor.transport_nsw
PyTransportNSW==0.0.8 PyTransportNSW==0.1.1
# homeassistant.components.xiaomi_aqara # homeassistant.components.xiaomi_aqara
PyXiaomiGateway==0.11.1 PyXiaomiGateway==0.11.1

View File

@ -25,7 +25,7 @@ HAP-python==2.2.2
PyRMVtransport==0.1.3 PyRMVtransport==0.1.3
# homeassistant.components.sensor.transport_nsw # homeassistant.components.sensor.transport_nsw
PyTransportNSW==0.0.8 PyTransportNSW==0.1.1
# homeassistant.components.notify.yessssms # homeassistant.components.notify.yessssms
YesssSMS==0.2.3 YesssSMS==0.2.3

View File

@ -10,18 +10,21 @@ VALID_CONFIG = {'sensor': {
'platform': 'transport_nsw', 'platform': 'transport_nsw',
'stop_id': '209516', 'stop_id': '209516',
'route': '199', 'route': '199',
'destination': '',
'api_key': 'YOUR_API_KEY'} 'api_key': 'YOUR_API_KEY'}
} }
def get_departuresMock(_stop_id, route, api_key): def get_departuresMock(_stop_id, route, destination, api_key):
"""Mock TransportNSW departures loading.""" """Mock TransportNSW departures loading."""
data = { data = {
'stop_id': '209516', 'stop_id': '209516',
'route': '199', 'route': '199',
'due': 16, 'due': 16,
'delay': 6, 'delay': 6,
'real_time': 'y' 'real_time': 'y',
'destination': 'Palm Beach',
'mode': 'Bus'
} }
return data return data
@ -48,3 +51,5 @@ class TestRMVtransportSensor(unittest.TestCase):
assert state.attributes['route'] == '199' assert state.attributes['route'] == '199'
assert state.attributes['delay'] == 6 assert state.attributes['delay'] == 6
assert state.attributes['real_time'] == 'y' assert state.attributes['real_time'] == 'y'
assert state.attributes['destination'] == 'Palm Beach'
assert state.attributes['mode'] == 'Bus'