3 from __future__
import annotations
6 from typing
import TYPE_CHECKING
8 from sfrbox_api.bridge
import SFRBox
9 from sfrbox_api.exceptions
import SFRBoxAuthenticationError, SFRBoxError
18 from .const
import DOMAIN, PLATFORMS, PLATFORMS_WITH_AUTH
19 from .coordinator
import SFRDataUpdateCoordinator
20 from .models
import DomainData
24 """Set up SFR box as config entry."""
27 if (username := entry.data.get(CONF_USERNAME))
and (
28 password := entry.data.get(CONF_PASSWORD)
31 await box.authenticate(username=username, password=password)
32 except SFRBoxAuthenticationError
as err:
33 raise ConfigEntryAuthFailed
from err
34 except SFRBoxError
as err:
35 raise ConfigEntryNotReady
from err
36 platforms = PLATFORMS_WITH_AUTH
43 hass, box,
"system",
lambda b: b.system_get_info()
48 await data.system.async_config_entry_first_refresh()
49 system_info = data.system.data
51 assert system_info
is not None
54 tasks = [data.wan.async_config_entry_first_refresh()]
55 if (net_infra := system_info.net_infra) ==
"adsl":
56 tasks.append(data.dsl.async_config_entry_first_refresh())
57 elif net_infra ==
"ftth":
58 tasks.append(data.ftth.async_config_entry_first_refresh())
59 await asyncio.gather(*tasks)
61 hass.data.setdefault(DOMAIN, {})[entry.entry_id] = data
63 device_registry = dr.async_get(hass)
64 device_registry.async_get_or_create(
65 config_entry_id=entry.entry_id,
66 identifiers={(DOMAIN, system_info.mac_addr)},
68 model=system_info.product_id,
69 model_id=system_info.product_id,
70 sw_version=system_info.version_mainfirmware,
71 configuration_url=f
"http://{entry.data[CONF_HOST]}",
74 await hass.config_entries.async_forward_entry_setups(entry, platforms)
80 """Unload a config entry."""
81 if unload_ok := await hass.config_entries.async_unload_platforms(entry, PLATFORMS):
82 hass.data[DOMAIN].pop(entry.entry_id)
bool async_unload_entry(HomeAssistant hass, ConfigEntry entry)
bool async_setup_entry(HomeAssistant hass, ConfigEntry entry)
httpx.AsyncClient get_async_client(HomeAssistant hass, bool verify_ssl=True)