1 """The Tile component."""
3 from __future__
import annotations
5 from dataclasses
import dataclass
6 from datetime
import timedelta
7 from functools
import partial
9 from pytile
import async_login
10 from pytile.errors
import InvalidAuthError, SessionExpiredError, TileError
11 from pytile.tile
import Tile
22 from .const
import DOMAIN, LOGGER
24 PLATFORMS = [Platform.DEVICE_TRACKER]
25 DEVICE_TYPES = [
"PHONE",
"TILE"]
27 DEFAULT_INIT_TASK_LIMIT = 2
30 CONF_SHOW_INACTIVE =
"show_inactive"
35 """Define an object to be stored in `hass.data`."""
37 coordinators: dict[str, DataUpdateCoordinator[
None]]
38 tiles: dict[str, Tile]
42 """Set up Tile as config entry."""
45 def async_migrate_callback(entity_entry: RegistryEntry) -> dict |
None:
46 """Define a callback to migrate appropriate Tile entities to new unique IDs.
49 New: {username}_{uuid}
51 if entity_entry.unique_id.startswith(entry.data[CONF_USERNAME]):
54 new_unique_id = f
"{entry.data[CONF_USERNAME]}_".join(
55 entity_entry.unique_id.split(f
"{DOMAIN}_")
59 "Migrating entity %s from old unique ID '%s' to new unique ID '%s'",
60 entity_entry.entity_id,
61 entity_entry.unique_id,
65 return {
"new_unique_id": new_unique_id}
71 websession = aiohttp_client.async_create_clientsession(hass)
74 client = await async_login(
75 entry.data[CONF_USERNAME],
76 entry.data[CONF_PASSWORD],
79 tiles = await client.async_get_tiles()
80 except InvalidAuthError
as err:
82 except TileError
as err:
85 async
def async_update_tile(tile: Tile) ->
None:
86 """Update the Tile."""
88 await tile.async_update()
89 except InvalidAuthError
as err:
91 except SessionExpiredError:
92 LOGGER.debug(
"Tile session expired; creating a new one")
93 await client.async_init()
94 except TileError
as err:
95 raise UpdateFailed(f
"Error while retrieving data: {err}")
from err
97 coordinators: dict[str, DataUpdateCoordinator[
None]] = {}
98 coordinator_init_tasks = []
100 for tile_uuid, tile
in tiles.items():
106 update_interval=DEFAULT_UPDATE_INTERVAL,
107 update_method=partial(async_update_tile, tile),
109 coordinator_init_tasks.append(coordinator.async_refresh())
112 DEFAULT_INIT_TASK_LIMIT, *coordinator_init_tasks
114 hass.data.setdefault(DOMAIN, {})
115 hass.data[DOMAIN][entry.entry_id] =
TileData(coordinators=coordinators, tiles=tiles)
117 await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS)
123 """Unload a Tile config entry."""
124 unload_ok = await hass.config_entries.async_unload_platforms(entry, PLATFORMS)
126 hass.data[DOMAIN].pop(entry.entry_id)
None async_migrate_entries(HomeAssistant hass, dict[str, AdapterDetails] adapters, str default_adapter)
bool async_setup_entry(HomeAssistant hass, ConfigEntry entry)
bool async_unload_entry(HomeAssistant hass, ConfigEntry entry)
Any gather_with_limited_concurrency(int limit, *Any tasks, bool return_exceptions=False)