1 """The myUplink integration."""
3 from __future__
import annotations
5 from http
import HTTPStatus
7 from aiohttp
import ClientError, ClientResponseError
8 from myuplink
import MyUplinkAPI, get_manufacturer, get_model, get_system_name
16 config_entry_oauth2_flow,
17 device_registry
as dr,
21 from .api
import AsyncConfigEntryAuth
22 from .const
import DOMAIN, OAUTH2_SCOPES
23 from .coordinator
import MyUplinkDataCoordinator
25 PLATFORMS: list[Platform] = [
26 Platform.BINARY_SENSOR,
34 type MyUplinkConfigEntry = ConfigEntry[MyUplinkDataCoordinator]
38 hass: HomeAssistant, config_entry: MyUplinkConfigEntry
40 """Set up myUplink from a config entry."""
43 await config_entry_oauth2_flow.async_get_config_entry_implementation(
47 session = config_entry_oauth2_flow.OAuth2Session(hass, config_entry, implementation)
51 await auth.async_get_access_token()
52 except ClientResponseError
as err:
53 if err.status
in {HTTPStatus.UNAUTHORIZED, HTTPStatus.FORBIDDEN}:
54 raise ConfigEntryAuthFailed
from err
55 raise ConfigEntryNotReady
from err
56 except ClientError
as err:
57 raise ConfigEntryNotReady
from err
59 if set(config_entry.data[
"token"][
"scope"].split(
" ")) != set(OAUTH2_SCOPES):
63 api = MyUplinkAPI(auth)
65 await coordinator.async_config_entry_first_refresh()
66 config_entry.runtime_data = coordinator
71 await hass.config_entries.async_forward_entry_setups(config_entry, PLATFORMS)
77 """Unload a config entry."""
78 return await hass.config_entries.async_unload_platforms(entry, PLATFORMS)
83 hass: HomeAssistant, config_entry: ConfigEntry, coordinator: MyUplinkDataCoordinator
85 """Update all devices."""
86 device_registry = dr.async_get(hass)
88 for system
in coordinator.data.systems:
89 devices_in_system = [x.id
for x
in system.devices]
90 for device_id, device
in coordinator.data.devices.items():
91 if device_id
in devices_in_system:
92 device_registry.async_get_or_create(
93 config_entry_id=config_entry.entry_id,
94 identifiers={(DOMAIN, device_id)},
95 name=get_system_name(system),
96 manufacturer=get_manufacturer(device),
97 model=get_model(device),
98 sw_version=device.firmwareCurrent,
99 serial_number=device.product_serial_number,
104 hass: HomeAssistant, config_entry: MyUplinkConfigEntry, device_entry: DeviceEntry
106 """Remove myuplink config entry from a device."""
108 myuplink_data = config_entry.runtime_data
109 return not device_entry.identifiers.intersection(
110 (DOMAIN, device_id)
for device_id
in myuplink_data.data.devices
bool async_unload_entry(HomeAssistant hass, ConfigEntry entry)
bool async_remove_config_entry_device(HomeAssistant hass, MyUplinkConfigEntry config_entry, DeviceEntry device_entry)
None create_devices(HomeAssistant hass, ConfigEntry config_entry, MyUplinkDataCoordinator coordinator)
bool async_setup_entry(HomeAssistant hass, MyUplinkConfigEntry config_entry)