From 66fd60586786019efe50d6df5e1059d21e444c71 Mon Sep 17 00:00:00 2001 From: Dav0815 Date: Mon, 5 Nov 2018 09:46:04 +1100 Subject: [PATCH 1/4] Add destination and icon --- .../components/sensor/transport_nsw.py | 41 +++++++++++++++---- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- tests/components/sensor/test_transport_nsw.py | 11 +++-- 4 files changed, 44 insertions(+), 12 deletions(-) diff --git a/homeassistant/components/sensor/transport_nsw.py b/homeassistant/components/sensor/transport_nsw.py index 08a2907748ca2..ed7a83ebe443b 100644 --- a/homeassistant/components/sensor/transport_nsw.py +++ b/homeassistant/components/sensor/transport_nsw.py @@ -4,6 +4,7 @@ For more details about this platform, please refer to the documentation at https://home-assistant.io/components/sensor.transport_nsw/ """ +from datetime import timedelta import logging import voluptuous as vol @@ -13,7 +14,7 @@ from homeassistant.components.sensor import PLATFORM_SCHEMA from homeassistant.const import (CONF_NAME, CONF_API_KEY, ATTR_ATTRIBUTION) -REQUIREMENTS = ['PyTransportNSW==0.0.8'] +REQUIREMENTS = ['PyTransportNSW==0.1.0'] _LOGGER = logging.getLogger(__name__) @@ -22,19 +23,34 @@ ATTR_DUE_IN = 'due' ATTR_DELAY = 'delay' ATTR_REAL_TIME = 'real_time' +ATTR_DESTINATION = 'destination' +ATTR_MODE = 'mode' CONF_ATTRIBUTION = "Data provided by Transport NSW" CONF_STOP_ID = 'stop_id' CONF_ROUTE = 'route' +CONF_DESTINATION = 'destination' 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({ vol.Required(CONF_STOP_ID): cv.string, vol.Required(CONF_API_KEY): cv.string, vol.Optional(CONF_NAME, default=DEFAULT_NAME): 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] api_key = config[CONF_API_KEY] route = config.get(CONF_ROUTE) + destination = config.get(CONF_DESTINATION) 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) @@ -58,6 +75,7 @@ def __init__(self, data, stop_id, name): self._name = name self._stop_id = stop_id self._times = self._state = None + self._icon = ICONS[None] @property def name(self): @@ -79,6 +97,8 @@ def device_state_attributes(self): ATTR_ROUTE: self._times[ATTR_ROUTE], ATTR_DELAY: self._times[ATTR_DELAY], ATTR_REAL_TIME: self._times[ATTR_REAL_TIME], + ATTR_DESTINATION: self._times[ATTR_DESTINATION], + ATTR_MODE: self._times[ATTR_MODE], ATTR_ATTRIBUTION: CONF_ATTRIBUTION } @@ -90,36 +110,43 @@ def unit_of_measurement(self): @property def icon(self): """Icon to use in the frontend, if any.""" - return ICON + return self._icon def update(self): """Get the latest data from Transport NSW and update the states.""" self.data.update() self._times = self.data.info self._state = self._times[ATTR_DUE_IN] + self._icon = ICONS[self._times[ATTR_MODE]] class PublicTransportData: """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.""" import TransportNSW self._stop_id = stop_id self._route = route + self._destination = destination self._api_key = api_key self.info = {ATTR_ROUTE: self._route, ATTR_DUE_IN: '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() def update(self): """Get the next leave time.""" _data = self.tnsw.get_departures(self._stop_id, self._route, + self._destination, self._api_key) self.info = {ATTR_ROUTE: _data['route'], ATTR_DUE_IN: _data['due'], ATTR_DELAY: _data['delay'], - ATTR_REAL_TIME: _data['real_time']} + ATTR_REAL_TIME: _data['real_time'], + ATTR_DESTINATION: _data['destination'], + ATTR_MODE: _data['mode']} diff --git a/requirements_all.txt b/requirements_all.txt index 9b646695a113e..31d393bceb6fa 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -56,7 +56,7 @@ PyRMVtransport==0.1.3 PySwitchbot==0.3 # homeassistant.components.sensor.transport_nsw -PyTransportNSW==0.0.8 +PyTransportNSW==0.1.0 # homeassistant.components.xiaomi_aqara PyXiaomiGateway==0.11.1 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 75e21b33c388f..7c1582cdb4a70 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -25,7 +25,7 @@ HAP-python==2.2.2 PyRMVtransport==0.1.3 # homeassistant.components.sensor.transport_nsw -PyTransportNSW==0.0.8 +PyTransportNSW==0.1.0 # homeassistant.components.notify.yessssms YesssSMS==0.2.3 diff --git a/tests/components/sensor/test_transport_nsw.py b/tests/components/sensor/test_transport_nsw.py index c0ad4be4110db..72a374cc308b6 100644 --- a/tests/components/sensor/test_transport_nsw.py +++ b/tests/components/sensor/test_transport_nsw.py @@ -10,18 +10,21 @@ 'platform': 'transport_nsw', 'stop_id': '209516', 'route': '199', + 'destination': '', '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.""" data = { 'stop_id': '209516', 'route': '199', 'due': 16, 'delay': 6, - 'real_time': 'y' + 'real_time': 'y', + 'destination' : 'Palm Beach', + 'mode': 'Bus' } return data @@ -42,9 +45,11 @@ def tearDown(self): def test_transportnsw_config(self, mock_get_departures): """Test minimal TransportNSW configuration.""" assert setup_component(self.hass, 'sensor', VALID_CONFIG) - state = self.hass.states.get('sensor.next_bus') + state = self.hass.states.get('sensor.next_leave_event') assert state.state == '16' assert state.attributes['stop_id'] == '209516' assert state.attributes['route'] == '199' assert state.attributes['delay'] == 6 assert state.attributes['real_time'] == 'y' + assert state.attributes['destination'] == 'Palm Beach' + assert state.attributes['mode'] == 'Bus' From 8a03ab1ef9513296a37b05d9af4a39b3559a48c0 Mon Sep 17 00:00:00 2001 From: Dav0815 <35415680+Dav0815@users.noreply.github.com> Date: Mon, 5 Nov 2018 09:53:22 +1100 Subject: [PATCH 2/4] Update test_transport_nsw.py --- tests/components/sensor/test_transport_nsw.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/components/sensor/test_transport_nsw.py b/tests/components/sensor/test_transport_nsw.py index 72a374cc308b6..abd6141add565 100644 --- a/tests/components/sensor/test_transport_nsw.py +++ b/tests/components/sensor/test_transport_nsw.py @@ -23,7 +23,7 @@ def get_departuresMock(_stop_id, route, destination, api_key): 'due': 16, 'delay': 6, 'real_time': 'y', - 'destination' : 'Palm Beach', + 'destination': 'Palm Beach', 'mode': 'Bus' } return data From 31ba61a52e56c709182be27d56c65a4a4fb70dc3 Mon Sep 17 00:00:00 2001 From: Dav0815 Date: Mon, 5 Nov 2018 10:13:17 +1100 Subject: [PATCH 3/4] Error handling fix in external lib --- homeassistant/components/sensor/transport_nsw.py | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/sensor/transport_nsw.py b/homeassistant/components/sensor/transport_nsw.py index ed7a83ebe443b..2e28d81a2c36f 100644 --- a/homeassistant/components/sensor/transport_nsw.py +++ b/homeassistant/components/sensor/transport_nsw.py @@ -14,7 +14,7 @@ from homeassistant.components.sensor import PLATFORM_SCHEMA from homeassistant.const import (CONF_NAME, CONF_API_KEY, ATTR_ATTRIBUTION) -REQUIREMENTS = ['PyTransportNSW==0.1.0'] +REQUIREMENTS = ['PyTransportNSW==0.1.1'] _LOGGER = logging.getLogger(__name__) diff --git a/requirements_all.txt b/requirements_all.txt index 31d393bceb6fa..960963f3d9d2e 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -56,7 +56,7 @@ PyRMVtransport==0.1.3 PySwitchbot==0.3 # homeassistant.components.sensor.transport_nsw -PyTransportNSW==0.1.0 +PyTransportNSW==0.1.1 # homeassistant.components.xiaomi_aqara PyXiaomiGateway==0.11.1 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 7c1582cdb4a70..7209e3b6b2e4a 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -25,7 +25,7 @@ HAP-python==2.2.2 PyRMVtransport==0.1.3 # homeassistant.components.sensor.transport_nsw -PyTransportNSW==0.1.0 +PyTransportNSW==0.1.1 # homeassistant.components.notify.yessssms YesssSMS==0.2.3 From bc28cf1d9e50f1f752acdec116c3d3e86e69730a Mon Sep 17 00:00:00 2001 From: Dav0815 Date: Mon, 5 Nov 2018 10:47:46 +1100 Subject: [PATCH 4/4] Reverse sensor name change to prevent break --- tests/components/sensor/test_transport_nsw.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/components/sensor/test_transport_nsw.py b/tests/components/sensor/test_transport_nsw.py index abd6141add565..231e175893fd2 100644 --- a/tests/components/sensor/test_transport_nsw.py +++ b/tests/components/sensor/test_transport_nsw.py @@ -45,7 +45,7 @@ def tearDown(self): def test_transportnsw_config(self, mock_get_departures): """Test minimal TransportNSW configuration.""" assert setup_component(self.hass, 'sensor', VALID_CONFIG) - state = self.hass.states.get('sensor.next_leave_event') + state = self.hass.states.get('sensor.next_bus') assert state.state == '16' assert state.attributes['stop_id'] == '209516' assert state.attributes['route'] == '199'