82 lines
2.3 KiB
Python
82 lines
2.3 KiB
Python
"""Support for Vanderbilt (formerly Siemens) SPC alarm systems."""
|
|
|
|
import logging
|
|
|
|
from pyspcwebgw import SpcWebGateway
|
|
from pyspcwebgw.area import Area
|
|
from pyspcwebgw.zone import Zone
|
|
import voluptuous as vol
|
|
|
|
from homeassistant.const import Platform
|
|
from homeassistant.core import HomeAssistant
|
|
from homeassistant.helpers import aiohttp_client, discovery
|
|
import homeassistant.helpers.config_validation as cv
|
|
from homeassistant.helpers.dispatcher import async_dispatcher_send
|
|
from homeassistant.helpers.typing import ConfigType
|
|
|
|
_LOGGER = logging.getLogger(__name__)
|
|
|
|
CONF_WS_URL = "ws_url"
|
|
CONF_API_URL = "api_url"
|
|
|
|
DOMAIN = "spc"
|
|
DATA_API = "spc_api"
|
|
|
|
SIGNAL_UPDATE_ALARM = "spc_update_alarm_{}"
|
|
SIGNAL_UPDATE_SENSOR = "spc_update_sensor_{}"
|
|
|
|
CONFIG_SCHEMA = vol.Schema(
|
|
{
|
|
DOMAIN: vol.Schema(
|
|
{
|
|
vol.Required(CONF_WS_URL): cv.string,
|
|
vol.Required(CONF_API_URL): cv.string,
|
|
}
|
|
)
|
|
},
|
|
extra=vol.ALLOW_EXTRA,
|
|
)
|
|
|
|
|
|
async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool:
|
|
"""Set up the SPC component."""
|
|
|
|
async def async_upate_callback(spc_object):
|
|
if isinstance(spc_object, Area):
|
|
async_dispatcher_send(hass, SIGNAL_UPDATE_ALARM.format(spc_object.id))
|
|
elif isinstance(spc_object, Zone):
|
|
async_dispatcher_send(hass, SIGNAL_UPDATE_SENSOR.format(spc_object.id))
|
|
|
|
session = aiohttp_client.async_get_clientsession(hass)
|
|
|
|
spc = SpcWebGateway(
|
|
loop=hass.loop,
|
|
session=session,
|
|
api_url=config[DOMAIN].get(CONF_API_URL),
|
|
ws_url=config[DOMAIN].get(CONF_WS_URL),
|
|
async_callback=async_upate_callback,
|
|
)
|
|
|
|
hass.data[DATA_API] = spc
|
|
|
|
if not await spc.async_load_parameters():
|
|
_LOGGER.error("Failed to load area/zone information from SPC")
|
|
return False
|
|
|
|
# add sensor devices for each zone (typically motion/fire/door sensors)
|
|
hass.async_create_task(
|
|
discovery.async_load_platform(hass, Platform.BINARY_SENSOR, DOMAIN, {}, config)
|
|
)
|
|
|
|
# create a separate alarm panel for each area
|
|
hass.async_create_task(
|
|
discovery.async_load_platform(
|
|
hass, Platform.ALARM_CONTROL_PANEL, DOMAIN, {}, config
|
|
)
|
|
)
|
|
|
|
# start listening for incoming events over websocket
|
|
spc.start()
|
|
|
|
return True
|