From 8e4942088e3b0214faa40806e2e9b32818c293d6 Mon Sep 17 00:00:00 2001 From: Mitko Masarliev Date: Wed, 6 Dec 2017 07:56:43 +0200 Subject: [PATCH] Add option to set default hide if away for new devices (#10762) * Option to change hide_if_away * tests fix * change new device defaults * tests and requested changes * fix assert --- .../components/device_tracker/__init__.py | 22 ++++++++++++++----- .../components/device_tracker/test_asuswrt.py | 15 ++++++++++--- tests/components/device_tracker/test_init.py | 22 ++++++++++++++----- .../device_tracker/test_unifi_direct.py | 9 ++++++-- 4 files changed, 53 insertions(+), 15 deletions(-) diff --git a/homeassistant/components/device_tracker/__init__.py b/homeassistant/components/device_tracker/__init__.py index 0b18cc72f6e..28505900f14 100644 --- a/homeassistant/components/device_tracker/__init__.py +++ b/homeassistant/components/device_tracker/__init__.py @@ -53,6 +53,7 @@ YAML_DEVICES = 'known_devices.yaml' CONF_TRACK_NEW = 'track_new_devices' DEFAULT_TRACK_NEW = True +CONF_NEW_DEVICE_DEFAULTS = 'new_device_defaults' CONF_CONSIDER_HOME = 'consider_home' DEFAULT_CONSIDER_HOME = timedelta(seconds=180) @@ -81,12 +82,18 @@ ATTR_VENDOR = 'vendor' SOURCE_TYPE_GPS = 'gps' SOURCE_TYPE_ROUTER = 'router' +NEW_DEVICE_DEFAULTS_SCHEMA = vol.Any(None, vol.Schema({ + vol.Optional(CONF_TRACK_NEW, default=DEFAULT_TRACK_NEW): cv.boolean, + vol.Optional(CONF_AWAY_HIDE, default=DEFAULT_AWAY_HIDE): cv.boolean, +})) PLATFORM_SCHEMA = cv.PLATFORM_SCHEMA.extend({ vol.Optional(CONF_SCAN_INTERVAL): cv.time_period, vol.Optional(CONF_TRACK_NEW, default=DEFAULT_TRACK_NEW): cv.boolean, vol.Optional(CONF_CONSIDER_HOME, default=DEFAULT_CONSIDER_HOME): vol.All( - cv.time_period, cv.positive_timedelta) + cv.time_period, cv.positive_timedelta), + vol.Optional(CONF_NEW_DEVICE_DEFAULTS, + default={}): NEW_DEVICE_DEFAULTS_SCHEMA }) @@ -125,9 +132,11 @@ def async_setup(hass: HomeAssistantType, config: ConfigType): conf = conf[0] if conf else {} consider_home = conf.get(CONF_CONSIDER_HOME, DEFAULT_CONSIDER_HOME) track_new = conf.get(CONF_TRACK_NEW, DEFAULT_TRACK_NEW) + defaults = conf.get(CONF_NEW_DEVICE_DEFAULTS, {}) devices = yield from async_load_config(yaml_path, hass, consider_home) - tracker = DeviceTracker(hass, consider_home, track_new, devices) + tracker = DeviceTracker( + hass, consider_home, track_new, defaults, devices) @asyncio.coroutine def async_setup_platform(p_type, p_config, disc_info=None): @@ -211,13 +220,15 @@ class DeviceTracker(object): """Representation of a device tracker.""" def __init__(self, hass: HomeAssistantType, consider_home: timedelta, - track_new: bool, devices: Sequence) -> None: + track_new: bool, defaults: dict, + devices: Sequence) -> None: """Initialize a device tracker.""" self.hass = hass self.devices = {dev.dev_id: dev for dev in devices} self.mac_to_dev = {dev.mac: dev for dev in devices if dev.mac} self.consider_home = consider_home - self.track_new = track_new + self.track_new = defaults.get(CONF_TRACK_NEW, track_new) + self.defaults = defaults self.group = None self._is_updating = asyncio.Lock(loop=hass.loop) @@ -274,7 +285,8 @@ class DeviceTracker(object): device = Device( self.hass, self.consider_home, self.track_new, dev_id, mac, (host_name or dev_id).replace('_', ' '), - picture=picture, icon=icon) + picture=picture, icon=icon, + hide_if_away=self.defaults.get(CONF_AWAY_HIDE, DEFAULT_AWAY_HIDE)) self.devices[dev_id] = device if mac is not None: self.mac_to_dev[mac] = device diff --git a/tests/components/device_tracker/test_asuswrt.py b/tests/components/device_tracker/test_asuswrt.py index b507bfea7c9..a6827d165cd 100644 --- a/tests/components/device_tracker/test_asuswrt.py +++ b/tests/components/device_tracker/test_asuswrt.py @@ -9,7 +9,8 @@ import voluptuous as vol from homeassistant.setup import setup_component from homeassistant.components import device_tracker from homeassistant.components.device_tracker import ( - CONF_CONSIDER_HOME, CONF_TRACK_NEW) + CONF_CONSIDER_HOME, CONF_TRACK_NEW, CONF_NEW_DEVICE_DEFAULTS, + CONF_AWAY_HIDE) from homeassistant.components.device_tracker.asuswrt import ( CONF_PROTOCOL, CONF_MODE, CONF_PUB_KEY, DOMAIN, CONF_PORT, PLATFORM_SCHEMA) @@ -78,7 +79,11 @@ class TestComponentsDeviceTrackerASUSWRT(unittest.TestCase): CONF_USERNAME: 'fake_user', CONF_PASSWORD: 'fake_pass', CONF_TRACK_NEW: True, - CONF_CONSIDER_HOME: timedelta(seconds=180) + CONF_CONSIDER_HOME: timedelta(seconds=180), + CONF_NEW_DEVICE_DEFAULTS: { + CONF_TRACK_NEW: True, + CONF_AWAY_HIDE: False + } } } @@ -104,7 +109,11 @@ class TestComponentsDeviceTrackerASUSWRT(unittest.TestCase): CONF_USERNAME: 'fake_user', CONF_PUB_KEY: FAKEFILE, CONF_TRACK_NEW: True, - CONF_CONSIDER_HOME: timedelta(seconds=180) + CONF_CONSIDER_HOME: timedelta(seconds=180), + CONF_NEW_DEVICE_DEFAULTS: { + CONF_TRACK_NEW: True, + CONF_AWAY_HIDE: False + } } } diff --git a/tests/components/device_tracker/test_init.py b/tests/components/device_tracker/test_init.py index 704b2590f12..34c7ecf465d 100644 --- a/tests/components/device_tracker/test_init.py +++ b/tests/components/device_tracker/test_init.py @@ -123,7 +123,7 @@ class TestComponentsDeviceTracker(unittest.TestCase): 'My device', None, None, False), device_tracker.Device(self.hass, True, True, 'your_device', 'AB:01', 'Your device', None, None, False)] - device_tracker.DeviceTracker(self.hass, False, True, devices) + device_tracker.DeviceTracker(self.hass, False, True, {}, devices) _LOGGER.debug(mock_warning.call_args_list) assert mock_warning.call_count == 1, \ "The only warning call should be duplicates (check DEBUG)" @@ -137,7 +137,7 @@ class TestComponentsDeviceTracker(unittest.TestCase): 'AB:01', 'My device', None, None, False), device_tracker.Device(self.hass, True, True, 'my_device', None, 'Your device', None, None, False)] - device_tracker.DeviceTracker(self.hass, False, True, devices) + device_tracker.DeviceTracker(self.hass, False, True, {}, devices) _LOGGER.debug(mock_warning.call_args_list) assert mock_warning.call_count == 1, \ @@ -299,7 +299,7 @@ class TestComponentsDeviceTracker(unittest.TestCase): vendor_string = 'Raspberry Pi Foundation' tracker = device_tracker.DeviceTracker( - self.hass, timedelta(seconds=60), 0, []) + self.hass, timedelta(seconds=60), 0, {}, []) with mock_aiohttp_client() as aioclient_mock: aioclient_mock.get('http://api.macvendors.com/b8:27:eb', @@ -622,7 +622,7 @@ class TestComponentsDeviceTracker(unittest.TestCase): def test_see_failures(self, mock_warning): """Test that the device tracker see failures.""" tracker = device_tracker.DeviceTracker( - self.hass, timedelta(seconds=60), 0, []) + self.hass, timedelta(seconds=60), 0, {}, []) # MAC is not a string (but added) tracker.see(mac=567, host_name="Number MAC") @@ -654,7 +654,7 @@ class TestComponentsDeviceTracker(unittest.TestCase): def test_picture_and_icon_on_see_discovery(self): """Test that picture and icon are set in initial see.""" tracker = device_tracker.DeviceTracker( - self.hass, timedelta(seconds=60), False, []) + self.hass, timedelta(seconds=60), False, {}, []) tracker.see(dev_id=11, picture='pic_url', icon='mdi:icon') self.hass.block_till_done() config = device_tracker.load_config(self.yaml_devices, self.hass, @@ -663,6 +663,18 @@ class TestComponentsDeviceTracker(unittest.TestCase): assert config[0].icon == 'mdi:icon' assert config[0].entity_picture == 'pic_url' + def test_default_hide_if_away_is_used(self): + """Test that default track_new is used.""" + tracker = device_tracker.DeviceTracker( + self.hass, timedelta(seconds=60), False, + {device_tracker.CONF_AWAY_HIDE: True}, []) + tracker.see(dev_id=12) + self.hass.block_till_done() + config = device_tracker.load_config(self.yaml_devices, self.hass, + timedelta(seconds=0)) + assert len(config) == 1 + self.assertTrue(config[0].hidden) + @asyncio.coroutine def test_async_added_to_hass(hass): diff --git a/tests/components/device_tracker/test_unifi_direct.py b/tests/components/device_tracker/test_unifi_direct.py index 0e22758d07e..b378118141a 100644 --- a/tests/components/device_tracker/test_unifi_direct.py +++ b/tests/components/device_tracker/test_unifi_direct.py @@ -11,7 +11,8 @@ import voluptuous as vol from homeassistant.setup import setup_component from homeassistant.components import device_tracker from homeassistant.components.device_tracker import ( - CONF_CONSIDER_HOME, CONF_TRACK_NEW) + CONF_CONSIDER_HOME, CONF_TRACK_NEW, CONF_AWAY_HIDE, + CONF_NEW_DEVICE_DEFAULTS) from homeassistant.components.device_tracker.unifi_direct import ( DOMAIN, CONF_PORT, PLATFORM_SCHEMA, _response_to_json, get_scanner) from homeassistant.const import (CONF_PLATFORM, CONF_PASSWORD, CONF_USERNAME, @@ -54,7 +55,11 @@ class TestComponentsDeviceTrackerUnifiDirect(unittest.TestCase): CONF_USERNAME: 'fake_user', CONF_PASSWORD: 'fake_pass', CONF_TRACK_NEW: True, - CONF_CONSIDER_HOME: timedelta(seconds=180) + CONF_CONSIDER_HOME: timedelta(seconds=180), + CONF_NEW_DEVICE_DEFAULTS: { + CONF_TRACK_NEW: True, + CONF_AWAY_HIDE: False + } } }