diff --git a/homeassistant/components/device_tracker/owntracks.py b/homeassistant/components/device_tracker/owntracks.py index 8254285a98b..f59fc06c59a 100644 --- a/homeassistant/components/device_tracker/owntracks.py +++ b/homeassistant/components/device_tracker/owntracks.py @@ -11,7 +11,7 @@ from collections import defaultdict import homeassistant.components.mqtt as mqtt from homeassistant.const import STATE_HOME -from homeassistant.util import convert +from homeassistant.util import convert, slugify DEPENDENCIES = ['mqtt'] @@ -53,6 +53,12 @@ def setup_scanner(hass, config, see): 'accuracy %s is not met: %s', data_type, max_gps_accuracy, data) return None + if convert(data.get('acc'), float, 1.0) == 0.0: + _LOGGER.debug('Skipping %s update because GPS accuracy' + 'is zero', + data_type) + return None + return data def owntracks_location_update(topic, payload, qos): @@ -91,7 +97,7 @@ def setup_scanner(hass, config, see): return # OwnTracks uses - at the start of a beacon zone # to switch on 'hold mode' - ignore this - location = data['desc'].lstrip("-") + location = slugify(data['desc'].lstrip("-")) if location.lower() == 'home': location = STATE_HOME diff --git a/tests/components/device_tracker/test_owntracks.py b/tests/components/device_tracker/test_owntracks.py index 7fa290e4005..756f6271e59 100644 --- a/tests/components/device_tracker/test_owntracks.py +++ b/tests/components/device_tracker/test_owntracks.py @@ -55,6 +55,21 @@ LOCATION_MESSAGE_INACCURATE = { 'tst': 1, 'vel': 0} +LOCATION_MESSAGE_ZERO_ACCURACY = { + 'batt': 92, + 'cog': 248, + 'tid': 'user', + 'lon': 2.0, + 't': 'u', + 'alt': 27, + 'acc': 0, + 'p': 101.3977584838867, + 'vac': 4, + 'lat': 6.0, + '_type': 'location', + 'tst': 1, + 'vel': 0} + REGION_ENTER_MESSAGE = { 'lon': 1.0, 'event': 'enter', @@ -204,6 +219,14 @@ class TestDeviceTrackerOwnTracks(unittest.TestCase): self.assert_location_latitude(2.0) self.assert_location_longitude(1.0) + def test_location_zero_accuracy_gps(self): + """Ignore the location for zero accuracy GPS information.""" + self.send_message(LOCATION_TOPIC, LOCATION_MESSAGE) + self.send_message(LOCATION_TOPIC, LOCATION_MESSAGE_ZERO_ACCURACY) + + self.assert_location_latitude(2.0) + self.assert_location_longitude(1.0) + def test_event_entry_exit(self): """Test the entry event.""" self.send_message(EVENT_TOPIC, REGION_ENTER_MESSAGE) @@ -230,6 +253,20 @@ class TestDeviceTrackerOwnTracks(unittest.TestCase): # Left clean zone state self.assertFalse(owntracks.REGIONS_ENTERED[USER]) + def test_event_with_spaces(self): + """Test the entry event.""" + message = REGION_ENTER_MESSAGE.copy() + message['desc'] = "inner 2" + self.send_message(EVENT_TOPIC, message) + self.assert_location_state('inner_2') + + message = REGION_LEAVE_MESSAGE.copy() + message['desc'] = "inner 2" + self.send_message(EVENT_TOPIC, message) + + # Left clean zone state + self.assertFalse(owntracks.REGIONS_ENTERED[USER]) + def test_event_entry_exit_inaccurate(self): """Test the event for inaccurate exit.""" self.send_message(EVENT_TOPIC, REGION_ENTER_MESSAGE)