1 """Support for GPSLogger."""
3 from http
import HTTPStatus
5 from aiohttp
import web
6 import voluptuous
as vol
28 PLATFORMS = [Platform.DEVICE_TRACKER]
30 TRACKER_UPDATE = f
"{DOMAIN}_tracker_update"
33 DEFAULT_ACCURACY = 200
37 def _id(value: str) -> str:
38 """Coerce id by removing '-'."""
39 return value.replace(
"-",
"")
42 WEBHOOK_SCHEMA = vol.Schema(
44 vol.Required(ATTR_DEVICE): _id,
45 vol.Required(ATTR_LATITUDE): cv.latitude,
46 vol.Required(ATTR_LONGITUDE): cv.longitude,
47 vol.Optional(ATTR_ACCURACY, default=DEFAULT_ACCURACY): vol.Coerce(float),
48 vol.Optional(ATTR_ACTIVITY): cv.string,
49 vol.Optional(ATTR_ALTITUDE): vol.Coerce(float),
50 vol.Optional(ATTR_BATTERY, default=DEFAULT_BATTERY): vol.Coerce(float),
51 vol.Optional(ATTR_DIRECTION): vol.Coerce(float),
52 vol.Optional(ATTR_PROVIDER): cv.string,
53 vol.Optional(ATTR_SPEED): vol.Coerce(float),
59 hass: HomeAssistant, webhook_id: str, request: web.Request
61 """Handle incoming webhook with GPSLogger request."""
64 except vol.MultipleInvalid
as error:
66 text=error.error_message, status=HTTPStatus.UNPROCESSABLE_ENTITY
70 ATTR_SPEED: data.get(ATTR_SPEED),
71 ATTR_DIRECTION: data.get(ATTR_DIRECTION),
72 ATTR_ALTITUDE: data.get(ATTR_ALTITUDE),
73 ATTR_PROVIDER: data.get(ATTR_PROVIDER),
74 ATTR_ACTIVITY: data.get(ATTR_ACTIVITY),
77 device = data[ATTR_DEVICE]
83 (data[ATTR_LATITUDE], data[ATTR_LONGITUDE]),
89 return web.Response(text=f
"Setting location for {device}")
93 """Configure based on config entry."""
94 hass.data.setdefault(DOMAIN, {
"devices": set(),
"unsub_device_tracker": {}})
95 webhook.async_register(
96 hass, DOMAIN,
"GPSLogger", entry.data[CONF_WEBHOOK_ID], handle_webhook
99 await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS)
105 """Unload a config entry."""
106 webhook.async_unregister(hass, entry.data[CONF_WEBHOOK_ID])
107 hass.data[DOMAIN][
"unsub_device_tracker"].pop(entry.entry_id)()
108 return await hass.config_entries.async_unload_platforms(entry, PLATFORMS)
111 async_remove_entry = config_entry_flow.webhook_async_remove_entry
web.Response handle_webhook(HomeAssistant hass, str webhook_id, web.Request request)
bool async_unload_entry(HomeAssistant hass, ConfigEntry entry)
bool async_setup_entry(HomeAssistant hass, ConfigEntry entry)
None async_dispatcher_send(HomeAssistant hass, str signal, *Any args)