Mobile App: Update Location schema updates & device ID generation (#21849)
* Update location schema * Generate a random device ID at registration time for later use with device_tracker.see * Remove host name from device_tracker.see payload * Drop consider_home from the payload * Remove stale consider_home in schema * Remove source_type
This commit is contained in:
parent
5ef602bc2e
commit
673c8907e3
3 changed files with 61 additions and 17 deletions
|
@ -1,7 +1,10 @@
|
|||
"""Constants for mobile_app."""
|
||||
import voluptuous as vol
|
||||
|
||||
from homeassistant.components.device_tracker import SERVICE_SEE_PAYLOAD_SCHEMA
|
||||
from homeassistant.components.device_tracker import (ATTR_BATTERY,
|
||||
ATTR_GPS,
|
||||
ATTR_GPS_ACCURACY,
|
||||
ATTR_LOCATION_NAME)
|
||||
from homeassistant.const import (ATTR_DOMAIN, ATTR_SERVICE, ATTR_SERVICE_DATA)
|
||||
from homeassistant.helpers import config_validation as cv
|
||||
|
||||
|
@ -23,6 +26,7 @@ ATTR_APP_DATA = 'app_data'
|
|||
ATTR_APP_ID = 'app_id'
|
||||
ATTR_APP_NAME = 'app_name'
|
||||
ATTR_APP_VERSION = 'app_version'
|
||||
ATTR_DEVICE_ID = 'device_id'
|
||||
ATTR_DEVICE_NAME = 'device_name'
|
||||
ATTR_MANUFACTURER = 'manufacturer'
|
||||
ATTR_MODEL = 'model'
|
||||
|
@ -36,6 +40,11 @@ ATTR_EVENT_TYPE = 'event_type'
|
|||
ATTR_TEMPLATE = 'template'
|
||||
ATTR_TEMPLATE_VARIABLES = 'variables'
|
||||
|
||||
ATTR_SPEED = 'speed'
|
||||
ATTR_ALTITUDE = 'altitude'
|
||||
ATTR_COURSE = 'course'
|
||||
ATTR_VERTICAL_ACCURACY = 'vertical_accuracy'
|
||||
|
||||
ATTR_WEBHOOK_DATA = 'data'
|
||||
ATTR_WEBHOOK_ENCRYPTED = 'encrypted'
|
||||
ATTR_WEBHOOK_ENCRYPTED_DATA = 'encrypted_data'
|
||||
|
@ -104,10 +113,21 @@ RENDER_TEMPLATE_SCHEMA = vol.Schema({
|
|||
}
|
||||
})
|
||||
|
||||
UPDATE_LOCATION_SCHEMA = vol.Schema({
|
||||
vol.Optional(ATTR_LOCATION_NAME): cv.string,
|
||||
vol.Required(ATTR_GPS): cv.gps,
|
||||
vol.Required(ATTR_GPS_ACCURACY): cv.positive_int,
|
||||
vol.Optional(ATTR_BATTERY): cv.positive_int,
|
||||
vol.Optional(ATTR_SPEED): cv.positive_int,
|
||||
vol.Optional(ATTR_ALTITUDE): cv.positive_int,
|
||||
vol.Optional(ATTR_COURSE): cv.positive_int,
|
||||
vol.Optional(ATTR_VERTICAL_ACCURACY): cv.positive_int,
|
||||
})
|
||||
|
||||
WEBHOOK_SCHEMAS = {
|
||||
WEBHOOK_TYPE_CALL_SERVICE: CALL_SERVICE_SCHEMA,
|
||||
WEBHOOK_TYPE_FIRE_EVENT: FIRE_EVENT_SCHEMA,
|
||||
WEBHOOK_TYPE_RENDER_TEMPLATE: RENDER_TEMPLATE_SCHEMA,
|
||||
WEBHOOK_TYPE_UPDATE_LOCATION: SERVICE_SEE_PAYLOAD_SCHEMA,
|
||||
WEBHOOK_TYPE_UPDATE_LOCATION: UPDATE_LOCATION_SCHEMA,
|
||||
WEBHOOK_TYPE_UPDATE_REGISTRATION: UPDATE_REGISTRATION_SCHEMA,
|
||||
}
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
"""Provides an HTTP API for mobile_app."""
|
||||
import uuid
|
||||
from typing import Dict
|
||||
|
||||
from aiohttp.web import Response, Request
|
||||
|
@ -15,10 +16,11 @@ from homeassistant.helpers.storage import Store
|
|||
from homeassistant.helpers.typing import HomeAssistantType
|
||||
from homeassistant.loader import get_component
|
||||
|
||||
from .const import (ATTR_APP_COMPONENT, ATTR_SUPPORTS_ENCRYPTION,
|
||||
CONF_CLOUDHOOK_URL, CONF_SECRET, CONF_USER_ID,
|
||||
DATA_REGISTRATIONS, DOMAIN, ERR_INVALID_COMPONENT,
|
||||
ERR_SAVE_FAILURE, REGISTRATION_SCHEMA)
|
||||
from .const import (ATTR_APP_COMPONENT, ATTR_DEVICE_ID,
|
||||
ATTR_SUPPORTS_ENCRYPTION, CONF_CLOUDHOOK_URL, CONF_SECRET,
|
||||
CONF_USER_ID, DATA_REGISTRATIONS, DOMAIN,
|
||||
ERR_INVALID_COMPONENT, ERR_SAVE_FAILURE,
|
||||
REGISTRATION_SCHEMA)
|
||||
|
||||
from .helpers import error_response, supports_encryption, savable_state
|
||||
|
||||
|
@ -66,6 +68,8 @@ class RegistrationsView(HomeAssistantView):
|
|||
data[CONF_CLOUDHOOK_URL] = \
|
||||
await async_create_cloudhook(hass, webhook_id)
|
||||
|
||||
data[ATTR_DEVICE_ID] = str(uuid.uuid4()).replace("-", "")
|
||||
|
||||
data[CONF_WEBHOOK_ID] = webhook_id
|
||||
|
||||
if data[ATTR_SUPPORTS_ENCRYPTION] and supports_encryption():
|
||||
|
|
|
@ -6,7 +6,9 @@ from typing import Dict
|
|||
from aiohttp.web import HTTPBadRequest, Response, Request
|
||||
import voluptuous as vol
|
||||
|
||||
from homeassistant.components.device_tracker import (DOMAIN as DT_DOMAIN,
|
||||
from homeassistant.components.device_tracker import (ATTR_ATTRIBUTES,
|
||||
ATTR_DEV_ID,
|
||||
DOMAIN as DT_DOMAIN,
|
||||
SERVICE_SEE as DT_SEE)
|
||||
from homeassistant.components.webhook import async_register as webhook_register
|
||||
|
||||
|
@ -20,15 +22,19 @@ from homeassistant.helpers.discovery import load_platform
|
|||
from homeassistant.helpers.storage import Store
|
||||
from homeassistant.helpers.typing import HomeAssistantType
|
||||
|
||||
from .const import (ATTR_APP_COMPONENT, ATTR_DEVICE_NAME, ATTR_EVENT_DATA,
|
||||
ATTR_EVENT_TYPE, ATTR_SUPPORTS_ENCRYPTION, ATTR_TEMPLATE,
|
||||
ATTR_TEMPLATE_VARIABLES, ATTR_WEBHOOK_DATA,
|
||||
ATTR_WEBHOOK_ENCRYPTED, ATTR_WEBHOOK_ENCRYPTED_DATA,
|
||||
ATTR_WEBHOOK_TYPE, CONF_SECRET, DATA_DELETED_IDS,
|
||||
DATA_REGISTRATIONS, DOMAIN, ERR_ENCRYPTION_REQUIRED,
|
||||
WEBHOOK_PAYLOAD_SCHEMA, WEBHOOK_SCHEMAS,
|
||||
WEBHOOK_TYPE_CALL_SERVICE, WEBHOOK_TYPE_FIRE_EVENT,
|
||||
WEBHOOK_TYPE_RENDER_TEMPLATE, WEBHOOK_TYPE_UPDATE_LOCATION,
|
||||
from .const import (ATTR_ALTITUDE, ATTR_APP_COMPONENT, ATTR_BATTERY,
|
||||
ATTR_COURSE, ATTR_DEVICE_ID, ATTR_DEVICE_NAME,
|
||||
ATTR_EVENT_DATA, ATTR_EVENT_TYPE, ATTR_GPS,
|
||||
ATTR_GPS_ACCURACY, ATTR_LOCATION_NAME, ATTR_SPEED,
|
||||
ATTR_SUPPORTS_ENCRYPTION, ATTR_TEMPLATE,
|
||||
ATTR_TEMPLATE_VARIABLES, ATTR_VERTICAL_ACCURACY,
|
||||
ATTR_WEBHOOK_DATA, ATTR_WEBHOOK_ENCRYPTED,
|
||||
ATTR_WEBHOOK_ENCRYPTED_DATA, ATTR_WEBHOOK_TYPE,
|
||||
CONF_SECRET, DATA_DELETED_IDS, DATA_REGISTRATIONS, DOMAIN,
|
||||
ERR_ENCRYPTION_REQUIRED, WEBHOOK_PAYLOAD_SCHEMA,
|
||||
WEBHOOK_SCHEMAS, WEBHOOK_TYPE_CALL_SERVICE,
|
||||
WEBHOOK_TYPE_FIRE_EVENT, WEBHOOK_TYPE_RENDER_TEMPLATE,
|
||||
WEBHOOK_TYPE_UPDATE_LOCATION,
|
||||
WEBHOOK_TYPE_UPDATE_REGISTRATION)
|
||||
|
||||
from .helpers import (_decrypt_payload, empty_okay_response, error_response,
|
||||
|
@ -145,9 +151,23 @@ async def handle_webhook(store: Store, hass: HomeAssistantType,
|
|||
headers=headers)
|
||||
|
||||
if webhook_type == WEBHOOK_TYPE_UPDATE_LOCATION:
|
||||
see_payload = {
|
||||
ATTR_DEV_ID: registration[ATTR_DEVICE_ID],
|
||||
ATTR_LOCATION_NAME: data.get(ATTR_LOCATION_NAME),
|
||||
ATTR_GPS: data.get(ATTR_GPS),
|
||||
ATTR_GPS_ACCURACY: data.get(ATTR_GPS_ACCURACY),
|
||||
ATTR_BATTERY: data.get(ATTR_BATTERY),
|
||||
ATTR_ATTRIBUTES: {
|
||||
ATTR_SPEED: data.get(ATTR_SPEED),
|
||||
ATTR_ALTITUDE: data.get(ATTR_ALTITUDE),
|
||||
ATTR_COURSE: data.get(ATTR_COURSE),
|
||||
ATTR_VERTICAL_ACCURACY: data.get(ATTR_VERTICAL_ACCURACY),
|
||||
}
|
||||
}
|
||||
|
||||
try:
|
||||
await hass.services.async_call(DT_DOMAIN,
|
||||
DT_SEE, data,
|
||||
DT_SEE, see_payload,
|
||||
blocking=True, context=context)
|
||||
# noqa: E722 pylint: disable=broad-except
|
||||
except (vol.Invalid, ServiceNotFound, Exception) as ex:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue