mirror of
https://github.com/home-assistant/core.git
synced 2026-08-14 09:13:06 +01:00
90 lines
3.2 KiB
Python
90 lines
3.2 KiB
Python
"""Repairs platform for the template integration."""
|
|
|
|
import voluptuous as vol
|
|
|
|
from homeassistant.components.repairs import (
|
|
ConfirmRepairFlow,
|
|
RepairsFlow,
|
|
RepairsFlowResult,
|
|
)
|
|
from homeassistant.config_entries import ConfigEntry
|
|
from homeassistant.const import CONF_DEVICE_ID
|
|
from homeassistant.core import HomeAssistant
|
|
from homeassistant.helpers import device_registry as dr
|
|
from homeassistant.helpers.selector import DeviceSelector
|
|
|
|
|
|
class CompositeDeviceIdRepairFlow(RepairsFlow):
|
|
"""Handler to select a device again after the linked device was split."""
|
|
|
|
def __init__(self, entry: ConfigEntry) -> None:
|
|
"""Initialize the flow."""
|
|
self._entry_id = entry.entry_id
|
|
|
|
async def async_step_init(
|
|
self, user_input: dict[str, str] | None = None
|
|
) -> RepairsFlowResult:
|
|
"""Handle the first step of the fix flow."""
|
|
# The flow manager passes {"issue_id": ...} as user_input to this step;
|
|
# delegate so the form step can tell rendering from an (empty) submission
|
|
return await self.async_step_select_device()
|
|
|
|
async def async_step_select_device(
|
|
self, user_input: dict[str, str] | None = None
|
|
) -> RepairsFlowResult:
|
|
"""Handle the device selection step."""
|
|
entry = self.hass.config_entries.async_get_entry(self._entry_id)
|
|
if entry is None:
|
|
return self.async_abort(reason="entry_removed")
|
|
|
|
device_registry = dr.async_get(self.hass)
|
|
errors: dict[str, str] = {}
|
|
if user_input is not None:
|
|
device_id = user_input.get(CONF_DEVICE_ID)
|
|
if (
|
|
device_id is None
|
|
or device_registry.async_is_composite_device_id(device_id) is False
|
|
):
|
|
options = {**entry.options}
|
|
if device_id:
|
|
options[CONF_DEVICE_ID] = device_id
|
|
else:
|
|
options.pop(CONF_DEVICE_ID, None)
|
|
self.hass.config_entries.async_update_entry(entry, options=options)
|
|
await self.hass.config_entries.async_reload(entry.entry_id)
|
|
return self.async_create_entry(data={})
|
|
# A composite or unknown device id was submitted
|
|
errors[CONF_DEVICE_ID] = "invalid_device"
|
|
|
|
return self.async_show_form(
|
|
step_id="select_device",
|
|
data_schema=vol.Schema(
|
|
{
|
|
vol.Optional(
|
|
CONF_DEVICE_ID,
|
|
description={
|
|
"suggested_value": entry.options.get(CONF_DEVICE_ID)
|
|
},
|
|
): DeviceSelector(),
|
|
}
|
|
),
|
|
description_placeholders={"name": entry.title},
|
|
errors=errors,
|
|
)
|
|
|
|
|
|
async def async_create_fix_flow(
|
|
hass: HomeAssistant,
|
|
issue_id: str,
|
|
data: dict[str, str | int | float | None] | None,
|
|
) -> RepairsFlow:
|
|
"""Create a fix flow."""
|
|
if (
|
|
issue_id.startswith("composite_device_id_")
|
|
and data is not None
|
|
and (entry := hass.config_entries.async_get_entry(str(data["entry_id"])))
|
|
is not None
|
|
):
|
|
return CompositeDeviceIdRepairFlow(entry)
|
|
return ConfirmRepairFlow()
|