From 8924d657a4282bbc49e2ca1549aa35cdf597cded Mon Sep 17 00:00:00 2001 From: Phil Bruckner Date: Mon, 24 Jun 2019 10:05:34 -0500 Subject: [PATCH] Add show_as_state options to Life360 (#24725) --- homeassistant/components/life360/__init__.py | 7 +++++- homeassistant/components/life360/const.py | 4 ++++ .../components/life360/device_tracker.py | 22 ++++++++++++++++--- 3 files changed, 29 insertions(+), 4 deletions(-) diff --git a/homeassistant/components/life360/__init__.py b/homeassistant/components/life360/__init__.py index a42dcf9b72c..b59ace1d1ff 100644 --- a/homeassistant/components/life360/__init__.py +++ b/homeassistant/components/life360/__init__.py @@ -16,7 +16,8 @@ import homeassistant.helpers.config_validation as cv from .const import ( CONF_AUTHORIZATION, CONF_CIRCLES, CONF_DRIVING_SPEED, CONF_ERROR_THRESHOLD, CONF_MAX_GPS_ACCURACY, CONF_MAX_UPDATE_WAIT, CONF_MEMBERS, - CONF_WARNING_THRESHOLD, DOMAIN) + CONF_SHOW_AS_STATE, CONF_WARNING_THRESHOLD, DOMAIN, SHOW_DRIVING, + SHOW_MOVING) from .helpers import get_api _LOGGER = logging.getLogger(__name__) @@ -25,6 +26,8 @@ DEFAULT_PREFIX = DOMAIN CONF_ACCOUNTS = 'accounts' +SHOW_AS_STATE_OPTS = [SHOW_DRIVING, SHOW_MOVING] + def _excl_incl_list_to_filter_dict(value): return { @@ -108,6 +111,8 @@ LIFE360_SCHEMA = vol.All( vol.All(vol.Any(None, cv.string), _prefix), vol.Optional(CONF_SCAN_INTERVAL, default=DEFAULT_SCAN_INTERVAL): cv.time_period, + vol.Optional(CONF_SHOW_AS_STATE, default=[]): vol.All( + cv.ensure_list, [vol.In(SHOW_AS_STATE_OPTS)]), vol.Optional(CONF_WARNING_THRESHOLD): _THRESHOLD, }), _thresholds diff --git a/homeassistant/components/life360/const.py b/homeassistant/components/life360/const.py index 4c4016c6b40..602c5ee4846 100644 --- a/homeassistant/components/life360/const.py +++ b/homeassistant/components/life360/const.py @@ -8,4 +8,8 @@ CONF_ERROR_THRESHOLD = 'error_threshold' CONF_MAX_GPS_ACCURACY = 'max_gps_accuracy' CONF_MAX_UPDATE_WAIT = 'max_update_wait' CONF_MEMBERS = 'members' +CONF_SHOW_AS_STATE = 'show_as_state' CONF_WARNING_THRESHOLD = 'warning_threshold' + +SHOW_DRIVING = 'driving' +SHOW_MOVING = 'moving' diff --git a/homeassistant/components/life360/device_tracker.py b/homeassistant/components/life360/device_tracker.py index 00201f1aa0d..cf69d8b656a 100644 --- a/homeassistant/components/life360/device_tracker.py +++ b/homeassistant/components/life360/device_tracker.py @@ -8,18 +8,21 @@ import voluptuous as vol from homeassistant.components.device_tracker import CONF_SCAN_INTERVAL from homeassistant.components.device_tracker.const import ( ENTITY_ID_FORMAT as DT_ENTITY_ID_FORMAT) +from homeassistant.components.zone import async_active_zone from homeassistant.const import ( ATTR_BATTERY_CHARGING, ATTR_ENTITY_ID, CONF_PREFIX, LENGTH_FEET, LENGTH_KILOMETERS, LENGTH_METERS, LENGTH_MILES, STATE_UNKNOWN) import homeassistant.helpers.config_validation as cv from homeassistant.helpers.event import track_time_interval +from homeassistant.util.async_ import run_callback_threadsafe from homeassistant.util.distance import convert import homeassistant.util.dt as dt_util from .const import ( CONF_CIRCLES, CONF_DRIVING_SPEED, CONF_ERROR_THRESHOLD, CONF_MAX_GPS_ACCURACY, CONF_MAX_UPDATE_WAIT, CONF_MEMBERS, - CONF_WARNING_THRESHOLD, DOMAIN) + CONF_SHOW_AS_STATE, CONF_WARNING_THRESHOLD, DOMAIN, SHOW_DRIVING, + SHOW_MOVING) _LOGGER = logging.getLogger(__name__) @@ -107,6 +110,7 @@ class Life360Scanner: self._circles_filter = config.get(CONF_CIRCLES) self._members_filter = config.get(CONF_MEMBERS) self._driving_speed = config.get(CONF_DRIVING_SPEED) + self._show_as_state = config[CONF_SHOW_AS_STATE] self._apis = apis self._errs = {} self._error_threshold = config[CONF_ERROR_THRESHOLD] @@ -266,8 +270,20 @@ class Life360Scanner: ATTR_WIFI_ON: _bool_attr_from_int(loc.get('wifiState')), } - self._see(dev_id=dev_id, gps=(lat, lon), gps_accuracy=gps_accuracy, - battery=battery, attributes=attrs, + # If user wants driving or moving to be shown as state, and current + # location is not in a HA zone, then set location name accordingly. + loc_name = None + active_zone = run_callback_threadsafe( + self._hass.loop, async_active_zone, self._hass, lat, lon, + gps_accuracy).result() + if not active_zone: + if SHOW_DRIVING in self._show_as_state and driving is True: + loc_name = SHOW_DRIVING + elif SHOW_MOVING in self._show_as_state and moving is True: + loc_name = SHOW_MOVING + + self._see(dev_id=dev_id, location_name=loc_name, gps=(lat, lon), + gps_accuracy=gps_accuracy, battery=battery, attributes=attrs, picture=member.get('avatar')) def _update_members(self, members, members_updated):