mirror of https://github.com/home-assistant/core
78 lines
2.7 KiB
Python
78 lines
2.7 KiB
Python
"""Migrate lifx devices to their own config entry."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from homeassistant.config_entries import ConfigEntry
|
|
from homeassistant.core import HomeAssistant, callback
|
|
from homeassistant.helpers import device_registry as dr, entity_registry as er
|
|
|
|
from .const import _LOGGER, DOMAIN
|
|
from .discovery import async_init_discovery_flow
|
|
|
|
|
|
@callback
|
|
def async_migrate_legacy_entries(
|
|
hass: HomeAssistant,
|
|
discovered_hosts_by_serial: dict[str, str],
|
|
existing_serials: set[str],
|
|
legacy_entry: ConfigEntry,
|
|
) -> int:
|
|
"""Migrate the legacy config entries to have an entry per device."""
|
|
_LOGGER.debug(
|
|
"Migrating legacy entries: discovered_hosts_by_serial=%s, existing_serials=%s",
|
|
discovered_hosts_by_serial,
|
|
existing_serials,
|
|
)
|
|
|
|
device_registry = dr.async_get(hass)
|
|
for dev_entry in dr.async_entries_for_config_entry(
|
|
device_registry, legacy_entry.entry_id
|
|
):
|
|
for domain, serial in dev_entry.identifiers:
|
|
if (
|
|
domain == DOMAIN
|
|
and serial not in existing_serials
|
|
and (host := discovered_hosts_by_serial.get(serial))
|
|
):
|
|
async_init_discovery_flow(hass, host, serial)
|
|
|
|
remaining_devices = dr.async_entries_for_config_entry(
|
|
dr.async_get(hass), legacy_entry.entry_id
|
|
)
|
|
_LOGGER.debug("The following devices remain: %s", remaining_devices)
|
|
return len(remaining_devices)
|
|
|
|
|
|
@callback
|
|
def async_migrate_entities_devices(
|
|
hass: HomeAssistant, legacy_entry_id: str, new_entry: ConfigEntry
|
|
) -> None:
|
|
"""Move entities and devices to the new config entry."""
|
|
migrated_devices = []
|
|
device_registry = dr.async_get(hass)
|
|
for dev_entry in dr.async_entries_for_config_entry(
|
|
device_registry, legacy_entry_id
|
|
):
|
|
for domain, value in dev_entry.identifiers:
|
|
if domain == DOMAIN and value == new_entry.unique_id:
|
|
_LOGGER.debug(
|
|
"Migrating device with %s to %s",
|
|
dev_entry.identifiers,
|
|
new_entry.unique_id,
|
|
)
|
|
migrated_devices.append(dev_entry.id)
|
|
device_registry.async_update_device(
|
|
dev_entry.id,
|
|
add_config_entry_id=new_entry.entry_id,
|
|
remove_config_entry_id=legacy_entry_id,
|
|
)
|
|
|
|
entity_registry = er.async_get(hass)
|
|
for reg_entity in er.async_entries_for_config_entry(
|
|
entity_registry, legacy_entry_id
|
|
):
|
|
if reg_entity.device_id in migrated_devices:
|
|
entity_registry.async_update_entity(
|
|
reg_entity.entity_id, config_entry_id=new_entry.entry_id
|
|
)
|