1 """Support for LG ThinQ Connect device."""
3 from __future__
import annotations
6 from dataclasses
import dataclass, field
9 from thinqconnect
import ThinQApi, ThinQAPIException
10 from thinqconnect.integration
import async_get_ha_bridge_list
16 EVENT_HOMEASSISTANT_STOP,
25 from .const
import CONF_CONNECT_CLIENT_ID, MQTT_SUBSCRIPTION_INTERVAL
26 from .coordinator
import DeviceDataUpdateCoordinator, async_setup_device_coordinator
27 from .mqtt
import ThinQMQTT
30 @dataclass(kw_only=True)
32 """A class that holds runtime data."""
34 coordinators: dict[str, DeviceDataUpdateCoordinator] = field(default_factory=dict)
35 mqtt_client: ThinQMQTT |
None =
None
38 type ThinqConfigEntry = ConfigEntry[ThinqData]
41 Platform.BINARY_SENSOR,
52 _LOGGER = logging.getLogger(__name__)
56 """Set up an entry."""
59 access_token = entry.data[CONF_ACCESS_TOKEN]
60 client_id = entry.data[CONF_CONNECT_CLIENT_ID]
61 country_code = entry.data[CONF_COUNTRY]
65 access_token=access_token,
66 country_code=country_code,
74 await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS)
87 entry: ThinqConfigEntry,
90 """Set up coordinators and register devices."""
93 bridge_list = await async_get_ha_bridge_list(thinq_api)
94 except ThinQAPIException
as exc:
98 _LOGGER.warning(
"No devices registered with the correct profile")
104 for bridge
in bridge_list
106 task_result = await asyncio.gather(*task_list)
107 for coordinator
in task_result:
108 entry.runtime_data.coordinators[coordinator.unique_id] = coordinator
113 """Clean up device registry."""
114 new_device_unique_ids = [
115 coordinator.unique_id
116 for coordinator
in entry.runtime_data.coordinators.values()
118 device_registry = dr.async_get(hass)
119 existing_entries = dr.async_entries_for_config_entry(
120 device_registry, entry.entry_id
124 for old_entry
in existing_entries:
125 old_unique_id = next(iter(old_entry.identifiers))[1]
126 if old_unique_id
not in new_device_unique_ids:
127 device_registry.async_remove_device(old_entry.id)
128 _LOGGER.debug(
"Remove device_registry: device_id=%s", old_entry.id)
132 hass: HomeAssistant, entry: ThinqConfigEntry, thinq_api: ThinQApi, client_id: str
134 """Set up MQTT connection."""
135 mqtt_client =
ThinQMQTT(hass, thinq_api, client_id, entry.runtime_data.coordinators)
136 entry.runtime_data.mqtt_client = mqtt_client
139 result = await mqtt_client.async_connect()
141 _LOGGER.error(
"Failed to set up mqtt connection")
145 await mqtt_client.async_start_subscribes()
147 entry.async_on_unload(
150 mqtt_client.async_refresh_subscribe,
151 MQTT_SUBSCRIPTION_INTERVAL,
152 cancel_on_shutdown=
True,
155 entry.async_on_unload(
156 hass.bus.async_listen_once(
157 EVENT_HOMEASSISTANT_STOP, mqtt_client.async_disconnect
163 """Unload the entry."""
164 if entry.runtime_data.mqtt_client:
165 await entry.runtime_data.mqtt_client.async_disconnect()
167 return await hass.config_entries.async_unload_platforms(entry, PLATFORMS)
DeviceDataUpdateCoordinator async_setup_device_coordinator(HomeAssistant hass, HABridge ha_bridge)
bool async_unload_entry(HomeAssistant hass, ThinqConfigEntry entry)
None async_cleanup_device_registry(HomeAssistant hass, ThinqConfigEntry entry)
None async_setup_mqtt(HomeAssistant hass, ThinqConfigEntry entry, ThinQApi thinq_api, str client_id)
bool async_setup_entry(HomeAssistant hass, ThinqConfigEntry entry)
None async_setup_coordinators(HomeAssistant hass, ThinqConfigEntry entry, ThinQApi thinq_api)
aiohttp.ClientSession async_get_clientsession(HomeAssistant hass, bool verify_ssl=True, socket.AddressFamily family=socket.AF_UNSPEC, ssl_util.SSLCipherList ssl_cipher=ssl_util.SSLCipherList.PYTHON_DEFAULT)
CALLBACK_TYPE async_track_time_interval(HomeAssistant hass, Callable[[datetime], Coroutine[Any, Any, None]|None] action, timedelta interval, *str|None name=None, bool|None cancel_on_shutdown=None)