Add Pi-hole enable and disable services (#27055)
* Add service to disable pihole * Add service to enable pihole * Redefine optional string validator * code review changes * Change service parameter to timedelta * code review changes
This commit is contained in:
parent
5bd3d4aa0b
commit
245e51df7a
3 changed files with 55 additions and 1 deletions
|
@ -5,7 +5,13 @@ import voluptuous as vol
|
||||||
from hole import Hole
|
from hole import Hole
|
||||||
from hole.exceptions import HoleError
|
from hole.exceptions import HoleError
|
||||||
|
|
||||||
from homeassistant.const import CONF_HOST, CONF_NAME, CONF_SSL, CONF_VERIFY_SSL
|
from homeassistant.const import (
|
||||||
|
CONF_HOST,
|
||||||
|
CONF_NAME,
|
||||||
|
CONF_API_KEY,
|
||||||
|
CONF_SSL,
|
||||||
|
CONF_VERIFY_SSL,
|
||||||
|
)
|
||||||
from homeassistant.components.sensor import DOMAIN as SENSOR_DOMAIN
|
from homeassistant.components.sensor import DOMAIN as SENSOR_DOMAIN
|
||||||
from homeassistant.helpers import config_validation as cv
|
from homeassistant.helpers import config_validation as cv
|
||||||
from homeassistant.helpers.aiohttp_client import async_get_clientsession
|
from homeassistant.helpers.aiohttp_client import async_get_clientsession
|
||||||
|
@ -21,6 +27,9 @@ from .const import (
|
||||||
DEFAULT_SSL,
|
DEFAULT_SSL,
|
||||||
DEFAULT_VERIFY_SSL,
|
DEFAULT_VERIFY_SSL,
|
||||||
MIN_TIME_BETWEEN_UPDATES,
|
MIN_TIME_BETWEEN_UPDATES,
|
||||||
|
SERVICE_DISABLE,
|
||||||
|
SERVICE_DISABLE_ATTR_DURATION,
|
||||||
|
SERVICE_ENABLE,
|
||||||
)
|
)
|
||||||
|
|
||||||
LOGGER = logging.getLogger(__name__)
|
LOGGER = logging.getLogger(__name__)
|
||||||
|
@ -31,6 +40,7 @@ CONFIG_SCHEMA = vol.Schema(
|
||||||
{
|
{
|
||||||
vol.Optional(CONF_HOST, default=DEFAULT_HOST): cv.string,
|
vol.Optional(CONF_HOST, default=DEFAULT_HOST): cv.string,
|
||||||
vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string,
|
vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string,
|
||||||
|
vol.Optional(CONF_API_KEY): cv.string,
|
||||||
vol.Optional(CONF_SSL, default=DEFAULT_SSL): cv.boolean,
|
vol.Optional(CONF_SSL, default=DEFAULT_SSL): cv.boolean,
|
||||||
vol.Optional(CONF_LOCATION, default=DEFAULT_LOCATION): cv.string,
|
vol.Optional(CONF_LOCATION, default=DEFAULT_LOCATION): cv.string,
|
||||||
vol.Optional(CONF_VERIFY_SSL, default=DEFAULT_VERIFY_SSL): cv.boolean,
|
vol.Optional(CONF_VERIFY_SSL, default=DEFAULT_VERIFY_SSL): cv.boolean,
|
||||||
|
@ -40,6 +50,14 @@ CONFIG_SCHEMA = vol.Schema(
|
||||||
extra=vol.ALLOW_EXTRA,
|
extra=vol.ALLOW_EXTRA,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
SERVICE_DISABLE_SCHEMA = vol.Schema(
|
||||||
|
{
|
||||||
|
vol.Required(SERVICE_DISABLE_ATTR_DURATION): vol.All(
|
||||||
|
cv.time_period_str, cv.positive_timedelta
|
||||||
|
)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
async def async_setup(hass, config):
|
async def async_setup(hass, config):
|
||||||
"""Set up the pi_hole integration."""
|
"""Set up the pi_hole integration."""
|
||||||
|
@ -50,6 +68,7 @@ async def async_setup(hass, config):
|
||||||
use_tls = conf[CONF_SSL]
|
use_tls = conf[CONF_SSL]
|
||||||
verify_tls = conf[CONF_VERIFY_SSL]
|
verify_tls = conf[CONF_VERIFY_SSL]
|
||||||
location = conf[CONF_LOCATION]
|
location = conf[CONF_LOCATION]
|
||||||
|
api_key = conf.get(CONF_API_KEY)
|
||||||
|
|
||||||
LOGGER.debug("Setting up %s integration with host %s", DOMAIN, host)
|
LOGGER.debug("Setting up %s integration with host %s", DOMAIN, host)
|
||||||
|
|
||||||
|
@ -62,6 +81,7 @@ async def async_setup(hass, config):
|
||||||
location=location,
|
location=location,
|
||||||
tls=use_tls,
|
tls=use_tls,
|
||||||
verify_tls=verify_tls,
|
verify_tls=verify_tls,
|
||||||
|
api_token=api_key,
|
||||||
),
|
),
|
||||||
name,
|
name,
|
||||||
)
|
)
|
||||||
|
@ -70,6 +90,28 @@ async def async_setup(hass, config):
|
||||||
|
|
||||||
hass.data[DOMAIN] = pi_hole
|
hass.data[DOMAIN] = pi_hole
|
||||||
|
|
||||||
|
async def handle_disable(call):
|
||||||
|
if api_key is None:
|
||||||
|
raise vol.Invalid("Pi-hole api_key must be provided in configuration")
|
||||||
|
|
||||||
|
duration = call.data[SERVICE_DISABLE_ATTR_DURATION].total_seconds()
|
||||||
|
|
||||||
|
LOGGER.debug("Disabling %s %s for %d seconds", DOMAIN, host, duration)
|
||||||
|
await pi_hole.api.disable(duration)
|
||||||
|
|
||||||
|
async def handle_enable(call):
|
||||||
|
if api_key is None:
|
||||||
|
raise vol.Invalid("Pi-hole api_key must be provided in configuration")
|
||||||
|
|
||||||
|
LOGGER.debug("Enabling %s %s", DOMAIN, host)
|
||||||
|
await pi_hole.api.enable()
|
||||||
|
|
||||||
|
hass.services.async_register(
|
||||||
|
DOMAIN, SERVICE_DISABLE, handle_disable, schema=SERVICE_DISABLE_SCHEMA
|
||||||
|
)
|
||||||
|
|
||||||
|
hass.services.async_register(DOMAIN, SERVICE_ENABLE, handle_enable)
|
||||||
|
|
||||||
hass.async_create_task(async_load_platform(hass, SENSOR_DOMAIN, DOMAIN, {}, config))
|
hass.async_create_task(async_load_platform(hass, SENSOR_DOMAIN, DOMAIN, {}, config))
|
||||||
|
|
||||||
return True
|
return True
|
||||||
|
|
|
@ -12,6 +12,10 @@ DEFAULT_NAME = "Pi-Hole"
|
||||||
DEFAULT_SSL = False
|
DEFAULT_SSL = False
|
||||||
DEFAULT_VERIFY_SSL = True
|
DEFAULT_VERIFY_SSL = True
|
||||||
|
|
||||||
|
SERVICE_DISABLE = "disable"
|
||||||
|
SERVICE_ENABLE = "enable"
|
||||||
|
SERVICE_DISABLE_ATTR_DURATION = "duration"
|
||||||
|
|
||||||
ATTR_BLOCKED_DOMAINS = "domains_blocked"
|
ATTR_BLOCKED_DOMAINS = "domains_blocked"
|
||||||
|
|
||||||
MIN_TIME_BETWEEN_UPDATES = timedelta(minutes=5)
|
MIN_TIME_BETWEEN_UPDATES = timedelta(minutes=5)
|
||||||
|
|
8
homeassistant/components/pi_hole/services.yaml
Normal file
8
homeassistant/components/pi_hole/services.yaml
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
disable:
|
||||||
|
description: Disable Pi-hole for an amount of time
|
||||||
|
fields:
|
||||||
|
duration:
|
||||||
|
description: Time that the Pi-hole should be disabled for
|
||||||
|
example: "00:00:15"
|
||||||
|
enable:
|
||||||
|
description: Enable Pi-hole
|
Loading…
Add table
Add a link
Reference in a new issue