Home Assistant Unofficial Reference 2024.12.1
switch.py
Go to the documentation of this file.
1 """Support for AdGuard Home switches."""
2 
3 from __future__ import annotations
4 
5 from collections.abc import Callable, Coroutine
6 from dataclasses import dataclass
7 from datetime import timedelta
8 from typing import Any
9 
10 from adguardhome import AdGuardHome, AdGuardHomeError
11 
12 from homeassistant.components.switch import SwitchEntity, SwitchEntityDescription
13 from homeassistant.core import HomeAssistant
14 from homeassistant.helpers.entity_platform import AddEntitiesCallback
15 
16 from . import AdGuardConfigEntry, AdGuardData
17 from .const import DOMAIN, LOGGER
18 from .entity import AdGuardHomeEntity
19 
20 SCAN_INTERVAL = timedelta(seconds=10)
21 PARALLEL_UPDATES = 1
22 
23 
24 @dataclass(frozen=True, kw_only=True)
26  """Describes AdGuard Home switch entity."""
27 
28  is_on_fn: Callable[[AdGuardHome], Callable[[], Coroutine[Any, Any, bool]]]
29  turn_on_fn: Callable[[AdGuardHome], Callable[[], Coroutine[Any, Any, None]]]
30  turn_off_fn: Callable[[AdGuardHome], Callable[[], Coroutine[Any, Any, None]]]
31 
32 
33 SWITCHES: tuple[AdGuardHomeSwitchEntityDescription, ...] = (
35  key="protection",
36  translation_key="protection",
37  is_on_fn=lambda adguard: adguard.protection_enabled,
38  turn_on_fn=lambda adguard: adguard.enable_protection,
39  turn_off_fn=lambda adguard: adguard.disable_protection,
40  ),
42  key="parental",
43  translation_key="parental",
44  is_on_fn=lambda adguard: adguard.parental.enabled,
45  turn_on_fn=lambda adguard: adguard.parental.enable,
46  turn_off_fn=lambda adguard: adguard.parental.disable,
47  ),
49  key="safesearch",
50  translation_key="safe_search",
51  is_on_fn=lambda adguard: adguard.safesearch.enabled,
52  turn_on_fn=lambda adguard: adguard.safesearch.enable,
53  turn_off_fn=lambda adguard: adguard.safesearch.disable,
54  ),
56  key="safebrowsing",
57  translation_key="safe_browsing",
58  is_on_fn=lambda adguard: adguard.safebrowsing.enabled,
59  turn_on_fn=lambda adguard: adguard.safebrowsing.enable,
60  turn_off_fn=lambda adguard: adguard.safebrowsing.disable,
61  ),
63  key="filtering",
64  translation_key="filtering",
65  is_on_fn=lambda adguard: adguard.filtering.enabled,
66  turn_on_fn=lambda adguard: adguard.filtering.enable,
67  turn_off_fn=lambda adguard: adguard.filtering.disable,
68  ),
70  key="querylog",
71  translation_key="query_log",
72  is_on_fn=lambda adguard: adguard.querylog.enabled,
73  turn_on_fn=lambda adguard: adguard.querylog.enable,
74  turn_off_fn=lambda adguard: adguard.querylog.disable,
75  ),
76 )
77 
78 
80  hass: HomeAssistant,
81  entry: AdGuardConfigEntry,
82  async_add_entities: AddEntitiesCallback,
83 ) -> None:
84  """Set up AdGuard Home switch based on a config entry."""
85  data = entry.runtime_data
86 
88  [AdGuardHomeSwitch(data, entry, description) for description in SWITCHES],
89  True,
90  )
91 
92 
94  """Defines a AdGuard Home switch."""
95 
96  entity_description: AdGuardHomeSwitchEntityDescription
97 
98  def __init__(
99  self,
100  data: AdGuardData,
101  entry: AdGuardConfigEntry,
102  description: AdGuardHomeSwitchEntityDescription,
103  ) -> None:
104  """Initialize AdGuard Home switch."""
105  super().__init__(data, entry)
106  self.entity_descriptionentity_description = description
107  self._attr_unique_id_attr_unique_id = "_".join(
108  [
109  DOMAIN,
110  self.adguardadguard.host,
111  str(self.adguardadguard.port),
112  "switch",
113  description.key,
114  ]
115  )
116 
117  async def async_turn_off(self, **kwargs: Any) -> None:
118  """Turn off the switch."""
119  try:
120  await self.entity_descriptionentity_description.turn_off_fn(self.adguardadguard)()
121  except AdGuardHomeError:
122  LOGGER.error("An error occurred while turning off AdGuard Home switch")
124 
125  async def async_turn_on(self, **kwargs: Any) -> None:
126  """Turn on the switch."""
127  try:
128  await self.entity_descriptionentity_description.turn_on_fn(self.adguardadguard)()
129  except AdGuardHomeError:
130  LOGGER.error("An error occurred while turning on AdGuard Home switch")
131  self._attr_available_attr_available_attr_available_attr_available = False
132 
133  async def _adguard_update(self) -> None:
134  """Update AdGuard Home entity."""
135  self._attr_is_on_attr_is_on = await self.entity_descriptionentity_description.is_on_fn(self.adguardadguard)()
None __init__(self, AdGuardData data, AdGuardConfigEntry entry, AdGuardHomeSwitchEntityDescription description)
Definition: switch.py:103
None async_setup_entry(HomeAssistant hass, AdGuardConfigEntry entry, AddEntitiesCallback async_add_entities)
Definition: switch.py:83