1 """The NextDNS component."""
3 from __future__
import annotations
6 from dataclasses
import dataclass
7 from datetime
import timedelta
9 from aiohttp.client_exceptions
import ClientConnectorError
22 from tenacity
import RetryError
39 UPDATE_INTERVAL_ANALYTICS,
40 UPDATE_INTERVAL_CONNECTION,
41 UPDATE_INTERVAL_SETTINGS,
43 from .coordinator
import (
44 NextDnsConnectionUpdateCoordinator,
45 NextDnsDnssecUpdateCoordinator,
46 NextDnsEncryptionUpdateCoordinator,
47 NextDnsIpVersionsUpdateCoordinator,
48 NextDnsProtocolsUpdateCoordinator,
49 NextDnsSettingsUpdateCoordinator,
50 NextDnsStatusUpdateCoordinator,
51 NextDnsUpdateCoordinator,
54 type NextDnsConfigEntry = ConfigEntry[NextDnsData]
59 """Data for the NextDNS integration."""
61 connection: NextDnsUpdateCoordinator[ConnectionStatus]
62 dnssec: NextDnsUpdateCoordinator[AnalyticsDnssec]
63 encryption: NextDnsUpdateCoordinator[AnalyticsEncryption]
64 ip_versions: NextDnsUpdateCoordinator[AnalyticsIpVersions]
65 protocols: NextDnsUpdateCoordinator[AnalyticsProtocols]
66 settings: NextDnsUpdateCoordinator[Settings]
67 status: NextDnsUpdateCoordinator[AnalyticsStatus]
70 PLATFORMS = [Platform.BINARY_SENSOR, Platform.BUTTON, Platform.SENSOR, Platform.SWITCH]
71 COORDINATORS: list[tuple[str, type[NextDnsUpdateCoordinator], timedelta]] = [
72 (ATTR_CONNECTION, NextDnsConnectionUpdateCoordinator, UPDATE_INTERVAL_CONNECTION),
73 (ATTR_DNSSEC, NextDnsDnssecUpdateCoordinator, UPDATE_INTERVAL_ANALYTICS),
74 (ATTR_ENCRYPTION, NextDnsEncryptionUpdateCoordinator, UPDATE_INTERVAL_ANALYTICS),
75 (ATTR_IP_VERSIONS, NextDnsIpVersionsUpdateCoordinator, UPDATE_INTERVAL_ANALYTICS),
76 (ATTR_PROTOCOLS, NextDnsProtocolsUpdateCoordinator, UPDATE_INTERVAL_ANALYTICS),
77 (ATTR_SETTINGS, NextDnsSettingsUpdateCoordinator, UPDATE_INTERVAL_SETTINGS),
78 (ATTR_STATUS, NextDnsStatusUpdateCoordinator, UPDATE_INTERVAL_ANALYTICS),
83 """Set up NextDNS as config entry."""
84 api_key = entry.data[CONF_API_KEY]
85 profile_id = entry.data[CONF_PROFILE_ID]
89 nextdns = await NextDns.create(websession, api_key)
90 except (ApiError, ClientConnectorError, RetryError, TimeoutError)
as err:
91 raise ConfigEntryNotReady
from err
92 except InvalidApiKeyError
as err:
93 raise ConfigEntryAuthFailed
from err
100 for coordinator_name, coordinator_class, update_interval
in COORDINATORS:
101 coordinator = coordinator_class(hass, nextdns, profile_id, update_interval)
102 tasks.append(coordinator.async_config_entry_first_refresh())
103 coordinators[coordinator_name] = coordinator
105 await asyncio.gather(*tasks)
109 await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS)
115 """Unload a config entry."""
116 return await hass.config_entries.async_unload_platforms(entry, PLATFORMS)
bool async_setup_entry(HomeAssistant hass, NextDnsConfigEntry entry)
bool async_unload_entry(HomeAssistant hass, NextDnsConfigEntry entry)
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)