diff --git a/homeassistant/components/device_tracker/gpslogger.py b/homeassistant/components/device_tracker/gpslogger.py deleted file mode 100644 index e0d9b37bf84e04ca89a401739ff556bbf4f1cada..0000000000000000000000000000000000000000 --- a/homeassistant/components/device_tracker/gpslogger.py +++ /dev/null @@ -1,32 +0,0 @@ -""" -Support for the GPSLogger platform. - -For more details about this platform, please refer to the documentation at -https://home-assistant.io/components/device_tracker.gpslogger/ -""" -import logging - -from homeassistant.components.gpslogger import TRACKER_UPDATE -from homeassistant.helpers.dispatcher import async_dispatcher_connect -from homeassistant.helpers.typing import HomeAssistantType, ConfigType - -_LOGGER = logging.getLogger(__name__) - -DEPENDENCIES = ['gpslogger'] - - -async def async_setup_scanner(hass: HomeAssistantType, config: ConfigType, - async_see, discovery_info=None): - """Set up an endpoint for the GPSLogger device tracker.""" - async def _set_location(device, gps_location, battery, accuracy, attrs): - """Fire HA event to set location.""" - await async_see( - dev_id=device, - gps=gps_location, - battery=battery, - gps_accuracy=accuracy, - attributes=attrs - ) - - async_dispatcher_connect(hass, TRACKER_UPDATE, _set_location) - return True diff --git a/homeassistant/components/gpslogger/__init__.py b/homeassistant/components/gpslogger/__init__.py index 4d1a5708331ecd80840270042713fcdc6cfae3e2..d4150900223061642d1a9b4927028c726d56d959 100644 --- a/homeassistant/components/gpslogger/__init__.py +++ b/homeassistant/components/gpslogger/__init__.py @@ -15,8 +15,8 @@ from homeassistant.components.device_tracker.tile import ATTR_ALTITUDE from homeassistant.const import HTTP_UNPROCESSABLE_ENTITY, \ HTTP_OK, ATTR_LATITUDE, ATTR_LONGITUDE, CONF_WEBHOOK_ID from homeassistant.helpers import config_entry_flow -from homeassistant.helpers.discovery import async_load_platform from homeassistant.helpers.dispatcher import async_dispatcher_send +from homeassistant.components.device_tracker import DOMAIN as DEVICE_TRACKER _LOGGER = logging.getLogger(__name__) @@ -57,9 +57,6 @@ WEBHOOK_SCHEMA = vol.Schema({ async def async_setup(hass, hass_config): """Set up the GPSLogger component.""" - hass.async_create_task( - async_load_platform(hass, 'device_tracker', DOMAIN, {}, hass_config) - ) return True @@ -103,12 +100,18 @@ async def async_setup_entry(hass, entry): """Configure based on config entry.""" hass.components.webhook.async_register( DOMAIN, 'GPSLogger', entry.data[CONF_WEBHOOK_ID], handle_webhook) + + hass.async_create_task( + hass.config_entries.async_forward_entry_setup(entry, DEVICE_TRACKER) + ) return True async def async_unload_entry(hass, entry): """Unload a config entry.""" hass.components.webhook.async_unregister(entry.data[CONF_WEBHOOK_ID]) + + await hass.config_entries.async_forward_entry_unload(entry, DEVICE_TRACKER) return True config_entry_flow.register_webhook_flow( diff --git a/homeassistant/components/gpslogger/device_tracker.py b/homeassistant/components/gpslogger/device_tracker.py new file mode 100644 index 0000000000000000000000000000000000000000..8a312afa024817fa4bf77fdf90f0a542cc236e59 --- /dev/null +++ b/homeassistant/components/gpslogger/device_tracker.py @@ -0,0 +1,44 @@ +""" +Support for the GPSLogger platform. + +For more details about this platform, please refer to the documentation at +https://home-assistant.io/components/device_tracker.gpslogger/ +""" +import logging + +from homeassistant.components.device_tracker import DOMAIN as \ + DEVICE_TRACKER_DOMAIN +from homeassistant.components.gpslogger import DOMAIN as GPSLOGGER_DOMAIN, \ + TRACKER_UPDATE +from homeassistant.helpers.dispatcher import async_dispatcher_connect +from homeassistant.helpers.typing import HomeAssistantType + +_LOGGER = logging.getLogger(__name__) + +DEPENDENCIES = ['gpslogger'] + +DATA_KEY = '{}.{}'.format(GPSLOGGER_DOMAIN, DEVICE_TRACKER_DOMAIN) + + +async def async_setup_entry(hass: HomeAssistantType, entry, async_see): + """Configure a dispatcher connection based on a config entry.""" + async def _set_location(device, gps_location, battery, accuracy, attrs): + """Fire HA event to set location.""" + await async_see( + dev_id=device, + gps=gps_location, + battery=battery, + gps_accuracy=accuracy, + attributes=attrs + ) + + hass.data[DATA_KEY] = async_dispatcher_connect( + hass, TRACKER_UPDATE, _set_location + ) + return True + + +async def async_unload_entry(hass: HomeAssistantType, entry): + """Unload the config entry and remove the dispatcher connection.""" + hass.data[DATA_KEY]() + return True diff --git a/tests/components/gpslogger/test_init.py b/tests/components/gpslogger/test_init.py index cf818e54911f60975141392bb108afedf1eff764..db1ae655c2583c94484f499ac0adc223e8f546f6 100644 --- a/tests/components/gpslogger/test_init.py +++ b/tests/components/gpslogger/test_init.py @@ -2,15 +2,17 @@ from unittest.mock import patch, Mock import pytest +from homeassistant.helpers.dispatcher import DATA_DISPATCHER from homeassistant import data_entry_flow -from homeassistant.components import zone +from homeassistant.components import zone, gpslogger from homeassistant.components.device_tracker import \ DOMAIN as DEVICE_TRACKER_DOMAIN -from homeassistant.components.gpslogger import DOMAIN +from homeassistant.components.gpslogger import DOMAIN, TRACKER_UPDATE from homeassistant.const import HTTP_OK, HTTP_UNPROCESSABLE_ENTITY, \ - STATE_HOME, STATE_NOT_HOME + STATE_HOME, STATE_NOT_HOME, CONF_WEBHOOK_ID from homeassistant.setup import async_setup_component +from tests.common import MockConfigEntry HOME_LATITUDE = 37.239622 HOME_LONGITUDE = -115.815811 @@ -164,3 +166,21 @@ async def test_enter_with_attrs(hass, gpslogger_client, webhook_id): assert 102.0 == state.attributes['altitude'] assert 'gps' == state.attributes['provider'] assert 'running' == state.attributes['activity'] + + +@pytest.mark.xfail( + reason='The device_tracker component does not support unloading yet.' +) +async def test_load_unload_entry(hass): + """Test that the appropriate dispatch signals are added and removed.""" + entry = MockConfigEntry(domain=DOMAIN, data={ + CONF_WEBHOOK_ID: 'gpslogger_test' + }) + + await gpslogger.async_setup_entry(hass, entry) + await hass.async_block_till_done() + assert 1 == len(hass.data[DATA_DISPATCHER][TRACKER_UPDATE]) + + await gpslogger.async_unload_entry(hass, entry) + await hass.async_block_till_done() + assert 0 == len(hass.data[DATA_DISPATCHER][TRACKER_UPDATE])