Home Assistant Unofficial Reference 2024.12.1
__init__.py
Go to the documentation of this file.
1 """SFR Box."""
2 
3 from __future__ import annotations
4 
5 import asyncio
6 from typing import TYPE_CHECKING
7 
8 from sfrbox_api.bridge import SFRBox
9 from sfrbox_api.exceptions import SFRBoxAuthenticationError, SFRBoxError
10 
11 from homeassistant.config_entries import ConfigEntry
12 from homeassistant.const import CONF_HOST, CONF_PASSWORD, CONF_USERNAME
13 from homeassistant.core import HomeAssistant
14 from homeassistant.exceptions import ConfigEntryAuthFailed, ConfigEntryNotReady
15 from homeassistant.helpers import device_registry as dr
16 from homeassistant.helpers.httpx_client import get_async_client
17 
18 from .const import DOMAIN, PLATFORMS, PLATFORMS_WITH_AUTH
19 from .coordinator import SFRDataUpdateCoordinator
20 from .models import DomainData
21 
22 
23 async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
24  """Set up SFR box as config entry."""
25  box = SFRBox(ip=entry.data[CONF_HOST], client=get_async_client(hass))
26  platforms = PLATFORMS
27  if (username := entry.data.get(CONF_USERNAME)) and (
28  password := entry.data.get(CONF_PASSWORD)
29  ):
30  try:
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
37 
38  data = DomainData(
39  box=box,
40  dsl=SFRDataUpdateCoordinator(hass, box, "dsl", lambda b: b.dsl_get_info()),
41  ftth=SFRDataUpdateCoordinator(hass, box, "ftth", lambda b: b.ftth_get_info()),
43  hass, box, "system", lambda b: b.system_get_info()
44  ),
45  wan=SFRDataUpdateCoordinator(hass, box, "wan", lambda b: b.wan_get_info()),
46  )
47  # Preload system information
48  await data.system.async_config_entry_first_refresh()
49  system_info = data.system.data
50  if TYPE_CHECKING:
51  assert system_info is not None
52 
53  # Preload other coordinators (based on net infrastructure)
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)
60 
61  hass.data.setdefault(DOMAIN, {})[entry.entry_id] = data
62 
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)},
67  name="SFR Box",
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]}",
72  )
73 
74  await hass.config_entries.async_forward_entry_setups(entry, platforms)
75 
76  return True
77 
78 
79 async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
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)
83  return unload_ok
bool async_unload_entry(HomeAssistant hass, ConfigEntry entry)
Definition: __init__.py:79
bool async_setup_entry(HomeAssistant hass, ConfigEntry entry)
Definition: __init__.py:23
httpx.AsyncClient get_async_client(HomeAssistant hass, bool verify_ssl=True)
Definition: httpx_client.py:41