From 6a7a44c9987598fec19adcce194548b949c5104c Mon Sep 17 00:00:00 2001 From: Marc Mueller <30130371+cdce8p@users.noreply.github.com> Date: Tue, 16 Apr 2024 08:02:27 +0200 Subject: [PATCH] Add dataclass to store AdGuard data (#115668) * Add dataclass to store AdGuard data * Unify version call --- homeassistant/components/adguard/__init__.py | 17 +++++++++--- homeassistant/components/adguard/const.py | 3 -- homeassistant/components/adguard/entity.py | 14 +++++----- homeassistant/components/adguard/sensor.py | 25 ++++++----------- homeassistant/components/adguard/switch.py | 29 ++++++++++---------- 5 files changed, 43 insertions(+), 45 deletions(-) diff --git a/homeassistant/components/adguard/__init__.py b/homeassistant/components/adguard/__init__.py index b3cbb3300bf..874a4cae963 100644 --- a/homeassistant/components/adguard/__init__.py +++ b/homeassistant/components/adguard/__init__.py @@ -2,6 +2,8 @@ from __future__ import annotations +from dataclasses import dataclass + from adguardhome import AdGuardHome, AdGuardHomeConnectionError import voluptuous as vol @@ -24,7 +26,6 @@ from homeassistant.helpers.aiohttp_client import async_get_clientsession from .const import ( CONF_FORCE, - DATA_ADGUARD_CLIENT, DOMAIN, SERVICE_ADD_URL, SERVICE_DISABLE_URL, @@ -44,6 +45,14 @@ SERVICE_REFRESH_SCHEMA = vol.Schema( PLATFORMS = [Platform.SENSOR, Platform.SWITCH] +@dataclass +class AdGuardData: + """Adguard data type.""" + + client: AdGuardHome + version: str + + async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Set up AdGuard Home from a config entry.""" session = async_get_clientsession(hass, entry.data[CONF_VERIFY_SSL]) @@ -57,13 +66,13 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: session=session, ) - hass.data.setdefault(DOMAIN, {})[entry.entry_id] = {DATA_ADGUARD_CLIENT: adguard} - try: - await adguard.version() + version = await adguard.version() except AdGuardHomeConnectionError as exception: raise ConfigEntryNotReady from exception + hass.data.setdefault(DOMAIN, {})[entry.entry_id] = AdGuardData(adguard, version) + await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS) async def add_url(call: ServiceCall) -> None: diff --git a/homeassistant/components/adguard/const.py b/homeassistant/components/adguard/const.py index 7b6827c19d4..5af739a8f0b 100644 --- a/homeassistant/components/adguard/const.py +++ b/homeassistant/components/adguard/const.py @@ -6,9 +6,6 @@ DOMAIN = "adguard" LOGGER = logging.getLogger(__package__) -DATA_ADGUARD_CLIENT = "adguard_client" -DATA_ADGUARD_VERSION = "adguard_version" - CONF_FORCE = "force" SERVICE_ADD_URL = "add_url" diff --git a/homeassistant/components/adguard/entity.py b/homeassistant/components/adguard/entity.py index 8cb71a861e8..a4e16f1b995 100644 --- a/homeassistant/components/adguard/entity.py +++ b/homeassistant/components/adguard/entity.py @@ -2,13 +2,14 @@ from __future__ import annotations -from adguardhome import AdGuardHome, AdGuardHomeError +from adguardhome import AdGuardHomeError from homeassistant.config_entries import SOURCE_HASSIO, ConfigEntry from homeassistant.helpers.device_registry import DeviceEntryType, DeviceInfo from homeassistant.helpers.entity import Entity -from .const import DATA_ADGUARD_VERSION, DOMAIN, LOGGER +from . import AdGuardData +from .const import DOMAIN, LOGGER class AdGuardHomeEntity(Entity): @@ -19,12 +20,13 @@ class AdGuardHomeEntity(Entity): def __init__( self, - adguard: AdGuardHome, + data: AdGuardData, entry: ConfigEntry, ) -> None: """Initialize the AdGuard Home entity.""" self._entry = entry - self.adguard = adguard + self.data = data + self.adguard = data.client async def async_update(self) -> None: """Update AdGuard Home entity.""" @@ -68,8 +70,6 @@ class AdGuardHomeEntity(Entity): }, manufacturer="AdGuard Team", name="AdGuard Home", - sw_version=self.hass.data[DOMAIN][self._entry.entry_id].get( - DATA_ADGUARD_VERSION - ), + sw_version=self.data.version, configuration_url=config_url, ) diff --git a/homeassistant/components/adguard/sensor.py b/homeassistant/components/adguard/sensor.py index 1e95a07bffa..ce112f49531 100644 --- a/homeassistant/components/adguard/sensor.py +++ b/homeassistant/components/adguard/sensor.py @@ -7,16 +7,16 @@ from dataclasses import dataclass from datetime import timedelta from typing import Any -from adguardhome import AdGuardHome, AdGuardHomeConnectionError +from adguardhome import AdGuardHome from homeassistant.components.sensor import SensorEntity, SensorEntityDescription from homeassistant.config_entries import ConfigEntry from homeassistant.const import PERCENTAGE, UnitOfTime from homeassistant.core import HomeAssistant -from homeassistant.exceptions import PlatformNotReady from homeassistant.helpers.entity_platform import AddEntitiesCallback -from .const import DATA_ADGUARD_CLIENT, DATA_ADGUARD_VERSION, DOMAIN +from . import AdGuardData +from .const import DOMAIN from .entity import AdGuardHomeEntity SCAN_INTERVAL = timedelta(seconds=300) @@ -89,17 +89,10 @@ async def async_setup_entry( async_add_entities: AddEntitiesCallback, ) -> None: """Set up AdGuard Home sensor based on a config entry.""" - adguard = hass.data[DOMAIN][entry.entry_id][DATA_ADGUARD_CLIENT] - - try: - version = await adguard.version() - except AdGuardHomeConnectionError as exception: - raise PlatformNotReady from exception - - hass.data[DOMAIN][entry.entry_id][DATA_ADGUARD_VERSION] = version + data: AdGuardData = hass.data[DOMAIN][entry.entry_id] async_add_entities( - [AdGuardHomeSensor(adguard, entry, description) for description in SENSORS], + [AdGuardHomeSensor(data, entry, description) for description in SENSORS], True, ) @@ -111,18 +104,18 @@ class AdGuardHomeSensor(AdGuardHomeEntity, SensorEntity): def __init__( self, - adguard: AdGuardHome, + data: AdGuardData, entry: ConfigEntry, description: AdGuardHomeEntityDescription, ) -> None: """Initialize AdGuard Home sensor.""" - super().__init__(adguard, entry) + super().__init__(data, entry) self.entity_description = description self._attr_unique_id = "_".join( [ DOMAIN, - adguard.host, - str(adguard.port), + self.adguard.host, + str(self.adguard.port), "sensor", description.key, ] diff --git a/homeassistant/components/adguard/switch.py b/homeassistant/components/adguard/switch.py index ae4bee85d23..e084ed2f349 100644 --- a/homeassistant/components/adguard/switch.py +++ b/homeassistant/components/adguard/switch.py @@ -7,15 +7,15 @@ from dataclasses import dataclass from datetime import timedelta from typing import Any -from adguardhome import AdGuardHome, AdGuardHomeConnectionError, AdGuardHomeError +from adguardhome import AdGuardHome, AdGuardHomeError from homeassistant.components.switch import SwitchEntity, SwitchEntityDescription from homeassistant.config_entries import ConfigEntry from homeassistant.core import HomeAssistant -from homeassistant.exceptions import PlatformNotReady from homeassistant.helpers.entity_platform import AddEntitiesCallback -from .const import DATA_ADGUARD_CLIENT, DATA_ADGUARD_VERSION, DOMAIN, LOGGER +from . import AdGuardData +from .const import DOMAIN, LOGGER from .entity import AdGuardHomeEntity SCAN_INTERVAL = timedelta(seconds=10) @@ -83,17 +83,10 @@ async def async_setup_entry( async_add_entities: AddEntitiesCallback, ) -> None: """Set up AdGuard Home switch based on a config entry.""" - adguard = hass.data[DOMAIN][entry.entry_id][DATA_ADGUARD_CLIENT] - - try: - version = await adguard.version() - except AdGuardHomeConnectionError as exception: - raise PlatformNotReady from exception - - hass.data[DOMAIN][entry.entry_id][DATA_ADGUARD_VERSION] = version + data: AdGuardData = hass.data[DOMAIN][entry.entry_id] async_add_entities( - [AdGuardHomeSwitch(adguard, entry, description) for description in SWITCHES], + [AdGuardHomeSwitch(data, entry, description) for description in SWITCHES], True, ) @@ -105,15 +98,21 @@ class AdGuardHomeSwitch(AdGuardHomeEntity, SwitchEntity): def __init__( self, - adguard: AdGuardHome, + data: AdGuardData, entry: ConfigEntry, description: AdGuardHomeSwitchEntityDescription, ) -> None: """Initialize AdGuard Home switch.""" - super().__init__(adguard, entry) + super().__init__(data, entry) self.entity_description = description self._attr_unique_id = "_".join( - [DOMAIN, adguard.host, str(adguard.port), "switch", description.key] + [ + DOMAIN, + self.adguard.host, + str(self.adguard.port), + "switch", + description.key, + ] ) async def async_turn_off(self, **kwargs: Any) -> None: -- GitLab