1 """The IKEA Idasen Desk integration."""
3 from __future__
import annotations
7 from attr
import dataclass
8 from bleak.exc
import BleakError
9 from idasen_ha.errors
import AuthFailedError
17 EVENT_HOMEASSISTANT_STOP,
25 from .const
import DOMAIN
26 from .coordinator
import IdasenDeskCoordinator
28 PLATFORMS: list[Platform] = [Platform.BUTTON, Platform.COVER, Platform.SENSOR]
30 _LOGGER = logging.getLogger(__name__)
35 """Data for the Idasen Desk integration."""
38 device_info: DeviceInfo
39 coordinator: IdasenDeskCoordinator
43 """Set up IKEA Idasen from a config entry."""
44 address: str = entry.data[CONF_ADDRESS].upper()
49 connections={(dr.CONNECTION_BLUETOOTH, address)},
51 hass.data.setdefault(DOMAIN, {})[entry.entry_id] =
DeskData(
52 address, device_info, coordinator
56 if not await coordinator.async_connect():
58 except (AuthFailedError, TimeoutError, BleakError, Exception)
as ex:
61 await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS)
62 entry.async_on_unload(entry.add_update_listener(_async_update_listener))
65 def _async_bluetooth_callback(
66 service_info: bluetooth.BluetoothServiceInfoBleak,
67 change: bluetooth.BluetoothChange,
69 """Update from a Bluetooth callback to ensure that a new BLEDevice is fetched."""
70 _LOGGER.debug(
"Bluetooth callback triggered")
71 hass.async_create_task(coordinator.async_connect_if_expected())
73 entry.async_on_unload(
74 bluetooth.async_register_callback(
76 _async_bluetooth_callback,
78 bluetooth.BluetoothScanningMode.ACTIVE,
83 """Close the connection."""
84 await coordinator.async_disconnect()
86 entry.async_on_unload(
87 hass.bus.async_listen_once(EVENT_HOMEASSISTANT_STOP, _async_stop)
93 """Handle options update."""
94 data: DeskData = hass.data[DOMAIN][entry.entry_id]
95 if entry.title != data.device_info[ATTR_NAME]:
96 await hass.config_entries.async_reload(entry.entry_id)
100 """Unload a config entry."""
101 if unload_ok := await hass.config_entries.async_unload_platforms(entry, PLATFORMS):
102 data: DeskData = hass.data[DOMAIN].pop(entry.entry_id)
103 await data.coordinator.async_disconnect()
104 bluetooth.async_rediscover_address(hass, data.address)
None _async_stop(HomeAssistant hass, bool restart)
None _async_update_listener(HomeAssistant hass, ConfigEntry entry)
bool async_unload_entry(HomeAssistant hass, ConfigEntry entry)
bool async_setup_entry(HomeAssistant hass, ConfigEntry entry)