220 lines
7.0 KiB
Python
220 lines
7.0 KiB
Python
"""Support for AdGuard Home switches."""
|
|
from datetime import timedelta
|
|
import logging
|
|
|
|
from adguardhome import AdGuardHomeConnectionError, AdGuardHomeError
|
|
|
|
from homeassistant.components.adguard import AdGuardHomeDeviceEntity
|
|
from homeassistant.components.adguard.const import (
|
|
DATA_ADGUARD_CLIENT,
|
|
DATA_ADGUARD_VERION,
|
|
DOMAIN,
|
|
)
|
|
from homeassistant.config_entries import ConfigEntry
|
|
from homeassistant.exceptions import PlatformNotReady
|
|
from homeassistant.helpers.entity import ToggleEntity
|
|
from homeassistant.helpers.typing import HomeAssistantType
|
|
|
|
_LOGGER = logging.getLogger(__name__)
|
|
|
|
SCAN_INTERVAL = timedelta(seconds=10)
|
|
PARALLEL_UPDATES = 1
|
|
|
|
|
|
async def async_setup_entry(
|
|
hass: HomeAssistantType, entry: ConfigEntry, async_add_entities
|
|
) -> None:
|
|
"""Set up AdGuard Home switch based on a config entry."""
|
|
adguard = hass.data[DOMAIN][DATA_ADGUARD_CLIENT]
|
|
|
|
try:
|
|
version = await adguard.version()
|
|
except AdGuardHomeConnectionError as exception:
|
|
raise PlatformNotReady from exception
|
|
|
|
hass.data[DOMAIN][DATA_ADGUARD_VERION] = version
|
|
|
|
switches = [
|
|
AdGuardHomeProtectionSwitch(adguard),
|
|
AdGuardHomeFilteringSwitch(adguard),
|
|
AdGuardHomeParentalSwitch(adguard),
|
|
AdGuardHomeSafeBrowsingSwitch(adguard),
|
|
AdGuardHomeSafeSearchSwitch(adguard),
|
|
AdGuardHomeQueryLogSwitch(adguard),
|
|
]
|
|
async_add_entities(switches, True)
|
|
|
|
|
|
class AdGuardHomeSwitch(ToggleEntity, AdGuardHomeDeviceEntity):
|
|
"""Defines a AdGuard Home switch."""
|
|
|
|
def __init__(self, adguard, name: str, icon: str, key: str):
|
|
"""Initialize AdGuard Home switch."""
|
|
self._state = False
|
|
self._key = key
|
|
super().__init__(adguard, name, icon)
|
|
|
|
@property
|
|
def unique_id(self) -> str:
|
|
"""Return the unique ID for this sensor."""
|
|
return "_".join(
|
|
[DOMAIN, self.adguard.host, str(self.adguard.port), "switch", self._key]
|
|
)
|
|
|
|
@property
|
|
def is_on(self) -> bool:
|
|
"""Return the state of the switch."""
|
|
return self._state
|
|
|
|
async def async_turn_off(self, **kwargs) -> None:
|
|
"""Turn off the switch."""
|
|
try:
|
|
await self._adguard_turn_off()
|
|
except AdGuardHomeError:
|
|
_LOGGER.error("An error occurred while turning off AdGuard Home switch.")
|
|
self._available = False
|
|
|
|
async def _adguard_turn_off(self) -> None:
|
|
"""Turn off the switch."""
|
|
raise NotImplementedError()
|
|
|
|
async def async_turn_on(self, **kwargs) -> None:
|
|
"""Turn on the switch."""
|
|
try:
|
|
await self._adguard_turn_on()
|
|
except AdGuardHomeError:
|
|
_LOGGER.error("An error occurred while turning on AdGuard Home switch.")
|
|
self._available = False
|
|
|
|
async def _adguard_turn_on(self) -> None:
|
|
"""Turn on the switch."""
|
|
raise NotImplementedError()
|
|
|
|
|
|
class AdGuardHomeProtectionSwitch(AdGuardHomeSwitch):
|
|
"""Defines a AdGuard Home protection switch."""
|
|
|
|
def __init__(self, adguard) -> None:
|
|
"""Initialize AdGuard Home switch."""
|
|
super().__init__(
|
|
adguard, "AdGuard Protection", "mdi:shield-check", "protection"
|
|
)
|
|
|
|
async def _adguard_turn_off(self) -> None:
|
|
"""Turn off the switch."""
|
|
await self.adguard.disable_protection()
|
|
|
|
async def _adguard_turn_on(self) -> None:
|
|
"""Turn on the switch."""
|
|
await self.adguard.enable_protection()
|
|
|
|
async def _adguard_update(self) -> None:
|
|
"""Update AdGuard Home entity."""
|
|
self._state = await self.adguard.protection_enabled()
|
|
|
|
|
|
class AdGuardHomeParentalSwitch(AdGuardHomeSwitch):
|
|
"""Defines a AdGuard Home parental control switch."""
|
|
|
|
def __init__(self, adguard) -> None:
|
|
"""Initialize AdGuard Home switch."""
|
|
super().__init__(
|
|
adguard, "AdGuard Parental Control", "mdi:shield-check", "parental"
|
|
)
|
|
|
|
async def _adguard_turn_off(self) -> None:
|
|
"""Turn off the switch."""
|
|
await self.adguard.parental.disable()
|
|
|
|
async def _adguard_turn_on(self) -> None:
|
|
"""Turn on the switch."""
|
|
await self.adguard.parental.enable()
|
|
|
|
async def _adguard_update(self) -> None:
|
|
"""Update AdGuard Home entity."""
|
|
self._state = await self.adguard.parental.enabled()
|
|
|
|
|
|
class AdGuardHomeSafeSearchSwitch(AdGuardHomeSwitch):
|
|
"""Defines a AdGuard Home safe search switch."""
|
|
|
|
def __init__(self, adguard) -> None:
|
|
"""Initialize AdGuard Home switch."""
|
|
super().__init__(
|
|
adguard, "AdGuard Safe Search", "mdi:shield-check", "safesearch"
|
|
)
|
|
|
|
async def _adguard_turn_off(self) -> None:
|
|
"""Turn off the switch."""
|
|
await self.adguard.safesearch.disable()
|
|
|
|
async def _adguard_turn_on(self) -> None:
|
|
"""Turn on the switch."""
|
|
await self.adguard.safesearch.enable()
|
|
|
|
async def _adguard_update(self) -> None:
|
|
"""Update AdGuard Home entity."""
|
|
self._state = await self.adguard.safesearch.enabled()
|
|
|
|
|
|
class AdGuardHomeSafeBrowsingSwitch(AdGuardHomeSwitch):
|
|
"""Defines a AdGuard Home safe search switch."""
|
|
|
|
def __init__(self, adguard) -> None:
|
|
"""Initialize AdGuard Home switch."""
|
|
super().__init__(
|
|
adguard, "AdGuard Safe Browsing", "mdi:shield-check", "safebrowsing"
|
|
)
|
|
|
|
async def _adguard_turn_off(self) -> None:
|
|
"""Turn off the switch."""
|
|
await self.adguard.safebrowsing.disable()
|
|
|
|
async def _adguard_turn_on(self) -> None:
|
|
"""Turn on the switch."""
|
|
await self.adguard.safebrowsing.enable()
|
|
|
|
async def _adguard_update(self) -> None:
|
|
"""Update AdGuard Home entity."""
|
|
self._state = await self.adguard.safebrowsing.enabled()
|
|
|
|
|
|
class AdGuardHomeFilteringSwitch(AdGuardHomeSwitch):
|
|
"""Defines a AdGuard Home filtering switch."""
|
|
|
|
def __init__(self, adguard) -> None:
|
|
"""Initialize AdGuard Home switch."""
|
|
super().__init__(adguard, "AdGuard Filtering", "mdi:shield-check", "filtering")
|
|
|
|
async def _adguard_turn_off(self) -> None:
|
|
"""Turn off the switch."""
|
|
await self.adguard.filtering.disable()
|
|
|
|
async def _adguard_turn_on(self) -> None:
|
|
"""Turn on the switch."""
|
|
await self.adguard.filtering.enable()
|
|
|
|
async def _adguard_update(self) -> None:
|
|
"""Update AdGuard Home entity."""
|
|
self._state = await self.adguard.filtering.enabled()
|
|
|
|
|
|
class AdGuardHomeQueryLogSwitch(AdGuardHomeSwitch):
|
|
"""Defines a AdGuard Home query log switch."""
|
|
|
|
def __init__(self, adguard) -> None:
|
|
"""Initialize AdGuard Home switch."""
|
|
super().__init__(adguard, "AdGuard Query Log", "mdi:shield-check", "querylog")
|
|
|
|
async def _adguard_turn_off(self) -> None:
|
|
"""Turn off the switch."""
|
|
await self.adguard.querylog.disable()
|
|
|
|
async def _adguard_turn_on(self) -> None:
|
|
"""Turn on the switch."""
|
|
await self.adguard.querylog.enable()
|
|
|
|
async def _adguard_update(self) -> None:
|
|
"""Update AdGuard Home entity."""
|
|
self._state = await self.adguard.querylog.enabled()
|