Home Assistant Unofficial Reference 2024.12.1
__init__.py
Go to the documentation of this file.
1 """Support for AdGuard Home."""
2 
3 from __future__ import annotations
4 
5 from dataclasses import dataclass
6 
7 from adguardhome import AdGuardHome, AdGuardHomeConnectionError
8 import voluptuous as vol
9 
10 from homeassistant.config_entries import ConfigEntry, ConfigEntryState
11 from homeassistant.const import (
12  CONF_HOST,
13  CONF_NAME,
14  CONF_PASSWORD,
15  CONF_PORT,
16  CONF_SSL,
17  CONF_URL,
18  CONF_USERNAME,
19  CONF_VERIFY_SSL,
20  Platform,
21 )
22 from homeassistant.core import HomeAssistant, ServiceCall
23 from homeassistant.exceptions import ConfigEntryNotReady
24 from homeassistant.helpers import config_validation as cv
25 from homeassistant.helpers.aiohttp_client import async_get_clientsession
26 
27 from .const import (
28  CONF_FORCE,
29  DOMAIN,
30  SERVICE_ADD_URL,
31  SERVICE_DISABLE_URL,
32  SERVICE_ENABLE_URL,
33  SERVICE_REFRESH,
34  SERVICE_REMOVE_URL,
35 )
36 
37 SERVICE_URL_SCHEMA = vol.Schema({vol.Required(CONF_URL): cv.url})
38 SERVICE_ADD_URL_SCHEMA = vol.Schema(
39  {vol.Required(CONF_NAME): cv.string, vol.Required(CONF_URL): cv.url}
40 )
41 SERVICE_REFRESH_SCHEMA = vol.Schema(
42  {vol.Optional(CONF_FORCE, default=False): cv.boolean}
43 )
44 
45 PLATFORMS = [Platform.SENSOR, Platform.SWITCH]
46 type AdGuardConfigEntry = ConfigEntry[AdGuardData]
47 
48 
49 @dataclass
51  """Adguard data type."""
52 
53  client: AdGuardHome
54  version: str
55 
56 
57 async def async_setup_entry(hass: HomeAssistant, entry: AdGuardConfigEntry) -> bool:
58  """Set up AdGuard Home from a config entry."""
59  session = async_get_clientsession(hass, entry.data[CONF_VERIFY_SSL])
60  adguard = AdGuardHome(
61  entry.data[CONF_HOST],
62  port=entry.data[CONF_PORT],
63  username=entry.data[CONF_USERNAME],
64  password=entry.data[CONF_PASSWORD],
65  tls=entry.data[CONF_SSL],
66  verify_ssl=entry.data[CONF_VERIFY_SSL],
67  session=session,
68  )
69 
70  try:
71  version = await adguard.version()
72  except AdGuardHomeConnectionError as exception:
73  raise ConfigEntryNotReady from exception
74 
75  entry.runtime_data = AdGuardData(adguard, version)
76 
77  await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS)
78 
79  async def add_url(call: ServiceCall) -> None:
80  """Service call to add a new filter subscription to AdGuard Home."""
81  await adguard.filtering.add_url(
82  allowlist=False, name=call.data[CONF_NAME], url=call.data[CONF_URL]
83  )
84 
85  async def remove_url(call: ServiceCall) -> None:
86  """Service call to remove a filter subscription from AdGuard Home."""
87  await adguard.filtering.remove_url(allowlist=False, url=call.data[CONF_URL])
88 
89  async def enable_url(call: ServiceCall) -> None:
90  """Service call to enable a filter subscription in AdGuard Home."""
91  await adguard.filtering.enable_url(allowlist=False, url=call.data[CONF_URL])
92 
93  async def disable_url(call: ServiceCall) -> None:
94  """Service call to disable a filter subscription in AdGuard Home."""
95  await adguard.filtering.disable_url(allowlist=False, url=call.data[CONF_URL])
96 
97  async def refresh(call: ServiceCall) -> None:
98  """Service call to refresh the filter subscriptions in AdGuard Home."""
99  await adguard.filtering.refresh(allowlist=False, force=call.data[CONF_FORCE])
100 
101  hass.services.async_register(
102  DOMAIN, SERVICE_ADD_URL, add_url, schema=SERVICE_ADD_URL_SCHEMA
103  )
104  hass.services.async_register(
105  DOMAIN, SERVICE_REMOVE_URL, remove_url, schema=SERVICE_URL_SCHEMA
106  )
107  hass.services.async_register(
108  DOMAIN, SERVICE_ENABLE_URL, enable_url, schema=SERVICE_URL_SCHEMA
109  )
110  hass.services.async_register(
111  DOMAIN, SERVICE_DISABLE_URL, disable_url, schema=SERVICE_URL_SCHEMA
112  )
113  hass.services.async_register(
114  DOMAIN, SERVICE_REFRESH, refresh, schema=SERVICE_REFRESH_SCHEMA
115  )
116 
117  return True
118 
119 
120 async def async_unload_entry(hass: HomeAssistant, entry: AdGuardConfigEntry) -> bool:
121  """Unload AdGuard Home config entry."""
122  unload_ok = await hass.config_entries.async_unload_platforms(entry, PLATFORMS)
123  loaded_entries = [
124  entry
125  for entry in hass.config_entries.async_entries(DOMAIN)
126  if entry.state == ConfigEntryState.LOADED
127  ]
128  if len(loaded_entries) == 1:
129  # This is the last loaded instance of AdGuard, deregister any services
130  hass.services.async_remove(DOMAIN, SERVICE_ADD_URL)
131  hass.services.async_remove(DOMAIN, SERVICE_REMOVE_URL)
132  hass.services.async_remove(DOMAIN, SERVICE_ENABLE_URL)
133  hass.services.async_remove(DOMAIN, SERVICE_DISABLE_URL)
134  hass.services.async_remove(DOMAIN, SERVICE_REFRESH)
135 
136  return unload_ok
bool async_unload_entry(HomeAssistant hass, AdGuardConfigEntry entry)
Definition: __init__.py:120
bool async_setup_entry(HomeAssistant hass, AdGuardConfigEntry entry)
Definition: __init__.py:57
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)