1 """Support for Google Maps location sharing."""
3 from __future__
import annotations
5 from datetime
import timedelta
8 from locationsharinglib
import Service
9 from locationsharinglib.locationsharinglibexceptions
import InvalidCookies
10 import voluptuous
as vol
13 PLATFORM_SCHEMA
as DEVICE_TRACKER_PLATFORM_SCHEMA,
18 ATTR_BATTERY_CHARGING,
30 _LOGGER = logging.getLogger(__name__)
32 ATTR_ADDRESS =
"address"
33 ATTR_FULL_NAME =
"full_name"
34 ATTR_LAST_SEEN =
"last_seen"
35 ATTR_NICKNAME =
"nickname"
37 CONF_MAX_GPS_ACCURACY =
"max_gps_accuracy"
39 CREDENTIALS_FILE =
".google_maps_location_sharing.cookies"
43 PLATFORM_SCHEMA = DEVICE_TRACKER_PLATFORM_SCHEMA.extend(
45 vol.Required(CONF_USERNAME): cv.string,
46 vol.Optional(CONF_MAX_GPS_ACCURACY, default=100000): vol.Coerce(float),
55 discovery_info: DiscoveryInfoType |
None =
None,
57 """Set up the Google Maps Location sharing scanner."""
59 return scanner.success_init
63 """Representation of an Google Maps location sharing account."""
66 self, hass: HomeAssistant, config: ConfigType, see: SeeCallback
68 """Initialize the scanner."""
73 self._prev_seen: dict[str, str] = {}
75 credfile = f
"{hass.config.path(CREDENTIALS_FILE)}.{slugify(self.username)}"
84 except InvalidCookies:
86 "The cookie file provided does not provide a valid session. Please"
87 " create another one and try again"
92 for person
in self.
serviceservice.get_all_people():
94 dev_id = f
"google_maps_{slugify(person.id)}"
96 _LOGGER.warning(
"No location(s) shared with this account")
105 "Ignoring %s update because expected GPS "
106 "accuracy %s is not met: %s"
114 last_seen = dt_util.as_utc(person.datetime)
115 if last_seen < self._prev_seen.
get(dev_id, last_seen):
117 "Ignoring %s update because timestamp is older than last timestamp",
120 _LOGGER.debug(
"%s < %s", last_seen, self._prev_seen[dev_id])
122 if last_seen == self._prev_seen.
get(dev_id):
124 "Ignoring %s update because timestamp "
125 "is the same as the last timestamp %s",
130 self._prev_seen[dev_id] = last_seen
133 ATTR_ADDRESS: person.address,
134 ATTR_FULL_NAME: person.full_name,
136 ATTR_LAST_SEEN: last_seen,
137 ATTR_NICKNAME: person.nickname,
138 ATTR_BATTERY_CHARGING: person.charging,
139 ATTR_BATTERY_LEVEL: person.battery_level,
143 gps=(person.latitude, person.longitude),
144 picture=person.picture_url,
145 source_type=SourceType.GPS,
146 gps_accuracy=person.accuracy,
None __init__(self, HomeAssistant hass, ConfigType config, SeeCallback see)
def _update_info(self, now=None)
web.Response get(self, web.Request request, str config_key)
bool setup_scanner(HomeAssistant hass, ConfigType config, SeeCallback see, DiscoveryInfoType|None discovery_info=None)