Allow adding unique device ID to mobile app registration (#30457)
* Allow adding unique device ID to mobile app registration * Remove unknown data * Better fix
This commit is contained in:
parent
6e909ab3f1
commit
2f362b44c4
5 changed files with 34 additions and 16 deletions
|
@ -1,7 +1,7 @@
|
||||||
"""Config flow for Mobile App."""
|
"""Config flow for Mobile App."""
|
||||||
from homeassistant import config_entries
|
from homeassistant import config_entries
|
||||||
|
|
||||||
from .const import ATTR_DEVICE_NAME, DOMAIN
|
from .const import ATTR_DEVICE_ID, ATTR_DEVICE_NAME, DOMAIN
|
||||||
|
|
||||||
|
|
||||||
@config_entries.HANDLERS.register(DOMAIN)
|
@config_entries.HANDLERS.register(DOMAIN)
|
||||||
|
@ -23,6 +23,8 @@ class MobileAppFlowHandler(config_entries.ConfigFlow):
|
||||||
|
|
||||||
async def async_step_registration(self, user_input=None):
|
async def async_step_registration(self, user_input=None):
|
||||||
"""Handle a flow initialized during registration."""
|
"""Handle a flow initialized during registration."""
|
||||||
|
await self.async_set_unique_id(user_input[ATTR_DEVICE_ID])
|
||||||
|
|
||||||
return self.async_create_entry(
|
return self.async_create_entry(
|
||||||
title=user_input[ATTR_DEVICE_NAME], data=user_input
|
title=user_input[ATTR_DEVICE_NAME], data=user_input
|
||||||
)
|
)
|
||||||
|
|
|
@ -25,6 +25,7 @@ ATTR_DEVICE_ID = "device_id"
|
||||||
ATTR_DEVICE_NAME = "device_name"
|
ATTR_DEVICE_NAME = "device_name"
|
||||||
ATTR_MANUFACTURER = "manufacturer"
|
ATTR_MANUFACTURER = "manufacturer"
|
||||||
ATTR_MODEL = "model"
|
ATTR_MODEL = "model"
|
||||||
|
ATTR_MODEL_ID = "model_id"
|
||||||
ATTR_OS_NAME = "os_name"
|
ATTR_OS_NAME = "os_name"
|
||||||
ATTR_OS_VERSION = "os_version"
|
ATTR_OS_VERSION = "os_version"
|
||||||
ATTR_PUSH_TOKEN = "push_token"
|
ATTR_PUSH_TOKEN = "push_token"
|
||||||
|
|
|
@ -21,6 +21,7 @@ from .const import (
|
||||||
ATTR_DEVICE_NAME,
|
ATTR_DEVICE_NAME,
|
||||||
ATTR_MANUFACTURER,
|
ATTR_MANUFACTURER,
|
||||||
ATTR_MODEL,
|
ATTR_MODEL,
|
||||||
|
ATTR_MODEL_ID,
|
||||||
ATTR_OS_NAME,
|
ATTR_OS_NAME,
|
||||||
ATTR_OS_VERSION,
|
ATTR_OS_VERSION,
|
||||||
ATTR_SUPPORTS_ENCRYPTION,
|
ATTR_SUPPORTS_ENCRYPTION,
|
||||||
|
@ -40,18 +41,23 @@ class RegistrationsView(HomeAssistantView):
|
||||||
name = "api:mobile_app:register"
|
name = "api:mobile_app:register"
|
||||||
|
|
||||||
@RequestDataValidator(
|
@RequestDataValidator(
|
||||||
{
|
vol.Schema(
|
||||||
vol.Optional(ATTR_APP_DATA, default={}): dict,
|
{
|
||||||
vol.Required(ATTR_APP_ID): cv.string,
|
vol.Optional(ATTR_APP_DATA, default={}): dict,
|
||||||
vol.Required(ATTR_APP_NAME): cv.string,
|
vol.Required(ATTR_APP_ID): cv.string,
|
||||||
vol.Required(ATTR_APP_VERSION): cv.string,
|
vol.Required(ATTR_APP_NAME): cv.string,
|
||||||
vol.Required(ATTR_DEVICE_NAME): cv.string,
|
vol.Required(ATTR_APP_VERSION): cv.string,
|
||||||
vol.Required(ATTR_MANUFACTURER): cv.string,
|
vol.Required(ATTR_DEVICE_NAME): cv.string,
|
||||||
vol.Required(ATTR_MODEL): cv.string,
|
vol.Required(ATTR_MANUFACTURER): cv.string,
|
||||||
vol.Required(ATTR_OS_NAME): cv.string,
|
vol.Required(ATTR_MODEL): cv.string,
|
||||||
vol.Optional(ATTR_OS_VERSION): cv.string,
|
vol.Optional(ATTR_MODEL_ID): cv.string, # Added in 0.104
|
||||||
vol.Required(ATTR_SUPPORTS_ENCRYPTION, default=False): cv.boolean,
|
vol.Required(ATTR_OS_NAME): cv.string,
|
||||||
}
|
vol.Optional(ATTR_OS_VERSION): cv.string,
|
||||||
|
vol.Required(ATTR_SUPPORTS_ENCRYPTION, default=False): cv.boolean,
|
||||||
|
},
|
||||||
|
# To allow future apps to send more data
|
||||||
|
extra=vol.REMOVE_EXTRA,
|
||||||
|
)
|
||||||
)
|
)
|
||||||
async def post(self, request: Request, data: Dict) -> Response:
|
async def post(self, request: Request, data: Dict) -> Response:
|
||||||
"""Handle the POST request for registration."""
|
"""Handle the POST request for registration."""
|
||||||
|
@ -64,7 +70,13 @@ class RegistrationsView(HomeAssistantView):
|
||||||
CONF_CLOUDHOOK_URL
|
CONF_CLOUDHOOK_URL
|
||||||
] = await hass.components.cloud.async_create_cloudhook(webhook_id)
|
] = await hass.components.cloud.async_create_cloudhook(webhook_id)
|
||||||
|
|
||||||
data[ATTR_DEVICE_ID] = str(uuid.uuid4()).replace("-", "")
|
model_id = data.get(ATTR_MODEL_ID)
|
||||||
|
|
||||||
|
if model_id is None:
|
||||||
|
data[ATTR_DEVICE_ID] = str(uuid.uuid4()).replace("-", "")
|
||||||
|
|
||||||
|
else:
|
||||||
|
data[ATTR_DEVICE_ID] = f"{data[ATTR_APP_ID]}-{model_id}"
|
||||||
|
|
||||||
data[CONF_WEBHOOK_ID] = webhook_id
|
data[CONF_WEBHOOK_ID] = webhook_id
|
||||||
|
|
||||||
|
@ -73,9 +85,10 @@ class RegistrationsView(HomeAssistantView):
|
||||||
|
|
||||||
data[CONF_USER_ID] = request["hass_user"].id
|
data[CONF_USER_ID] = request["hass_user"].id
|
||||||
|
|
||||||
ctx = {"source": "registration"}
|
|
||||||
await hass.async_create_task(
|
await hass.async_create_task(
|
||||||
hass.config_entries.flow.async_init(DOMAIN, context=ctx, data=data)
|
hass.config_entries.flow.async_init(
|
||||||
|
DOMAIN, data=data, context={"source": "registration"}
|
||||||
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
remote_ui_url = None
|
remote_ui_url = None
|
||||||
|
|
|
@ -17,6 +17,7 @@ REGISTER = {
|
||||||
"device_name": "Test 1",
|
"device_name": "Test 1",
|
||||||
"manufacturer": "mobile_app",
|
"manufacturer": "mobile_app",
|
||||||
"model": "Test",
|
"model": "Test",
|
||||||
|
"model_id": "mock-model-id",
|
||||||
"os_name": "Linux",
|
"os_name": "Linux",
|
||||||
"os_version": "1.0",
|
"os_version": "1.0",
|
||||||
"supports_encryption": True,
|
"supports_encryption": True,
|
||||||
|
|
|
@ -33,6 +33,7 @@ async def test_registration(hass, hass_client):
|
||||||
|
|
||||||
entries = hass.config_entries.async_entries(DOMAIN)
|
entries = hass.config_entries.async_entries(DOMAIN)
|
||||||
|
|
||||||
|
assert entries[0].unique_id == "io.homeassistant.mobile_app_test-mock-model-id"
|
||||||
assert entries[0].data["app_data"] == REGISTER["app_data"]
|
assert entries[0].data["app_data"] == REGISTER["app_data"]
|
||||||
assert entries[0].data["app_id"] == REGISTER["app_id"]
|
assert entries[0].data["app_id"] == REGISTER["app_id"]
|
||||||
assert entries[0].data["app_name"] == REGISTER["app_name"]
|
assert entries[0].data["app_name"] == REGISTER["app_name"]
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue