87 lines
2.7 KiB
Python
87 lines
2.7 KiB
Python
"""Services for the Netgear LTE integration."""
|
|
from typing import TYPE_CHECKING
|
|
|
|
import voluptuous as vol
|
|
|
|
from homeassistant.const import CONF_HOST
|
|
from homeassistant.core import HomeAssistant, ServiceCall
|
|
from homeassistant.helpers import config_validation as cv
|
|
|
|
from .const import (
|
|
ATTR_AUTOCONNECT,
|
|
ATTR_FAILOVER,
|
|
ATTR_HOST,
|
|
ATTR_SMS_ID,
|
|
AUTOCONNECT_MODES,
|
|
DOMAIN,
|
|
FAILOVER_MODES,
|
|
LOGGER,
|
|
)
|
|
|
|
if TYPE_CHECKING:
|
|
from . import LTEData, ModemData
|
|
|
|
SERVICE_DELETE_SMS = "delete_sms"
|
|
SERVICE_SET_OPTION = "set_option"
|
|
SERVICE_CONNECT_LTE = "connect_lte"
|
|
SERVICE_DISCONNECT_LTE = "disconnect_lte"
|
|
|
|
DELETE_SMS_SCHEMA = vol.Schema(
|
|
{
|
|
vol.Optional(ATTR_HOST): cv.string,
|
|
vol.Required(ATTR_SMS_ID): vol.All(cv.ensure_list, [cv.positive_int]),
|
|
}
|
|
)
|
|
|
|
SET_OPTION_SCHEMA = vol.Schema(
|
|
vol.All(
|
|
cv.has_at_least_one_key(ATTR_FAILOVER, ATTR_AUTOCONNECT),
|
|
{
|
|
vol.Optional(ATTR_HOST): cv.string,
|
|
vol.Optional(ATTR_FAILOVER): vol.In(FAILOVER_MODES),
|
|
vol.Optional(ATTR_AUTOCONNECT): vol.In(AUTOCONNECT_MODES),
|
|
},
|
|
)
|
|
)
|
|
|
|
CONNECT_LTE_SCHEMA = vol.Schema({vol.Optional(ATTR_HOST): cv.string})
|
|
|
|
DISCONNECT_LTE_SCHEMA = vol.Schema({vol.Optional(ATTR_HOST): cv.string})
|
|
|
|
|
|
async def async_setup_services(hass: HomeAssistant) -> None:
|
|
"""Set up services for Netgear LTE integration."""
|
|
|
|
async def service_handler(call: ServiceCall) -> None:
|
|
"""Apply a service."""
|
|
host = call.data.get(ATTR_HOST)
|
|
data: LTEData = hass.data[DOMAIN]
|
|
modem_data: ModemData = data.get_modem_data({CONF_HOST: host})
|
|
|
|
if not modem_data:
|
|
LOGGER.error("%s: host %s unavailable", call.service, host)
|
|
return
|
|
|
|
if call.service == SERVICE_DELETE_SMS:
|
|
for sms_id in call.data[ATTR_SMS_ID]:
|
|
await modem_data.modem.delete_sms(sms_id)
|
|
elif call.service == SERVICE_SET_OPTION:
|
|
if failover := call.data.get(ATTR_FAILOVER):
|
|
await modem_data.modem.set_failover_mode(failover)
|
|
if autoconnect := call.data.get(ATTR_AUTOCONNECT):
|
|
await modem_data.modem.set_autoconnect_mode(autoconnect)
|
|
elif call.service == SERVICE_CONNECT_LTE:
|
|
await modem_data.modem.connect_lte()
|
|
elif call.service == SERVICE_DISCONNECT_LTE:
|
|
await modem_data.modem.disconnect_lte()
|
|
|
|
service_schemas = {
|
|
SERVICE_DELETE_SMS: DELETE_SMS_SCHEMA,
|
|
SERVICE_SET_OPTION: SET_OPTION_SCHEMA,
|
|
SERVICE_CONNECT_LTE: CONNECT_LTE_SCHEMA,
|
|
SERVICE_DISCONNECT_LTE: DISCONNECT_LTE_SCHEMA,
|
|
}
|
|
|
|
for service, schema in service_schemas.items():
|
|
hass.services.async_register(DOMAIN, service, service_handler, schema=schema)
|