109 lines
3.3 KiB
Python
109 lines
3.3 KiB
Python
"""
|
|
Support for Vanderbilt (formerly Siemens) SPC alarm systems.
|
|
|
|
For more details about this platform, please refer to the documentation at
|
|
https://home-assistant.io/components/alarm_control_panel.spc/
|
|
"""
|
|
import asyncio
|
|
import logging
|
|
|
|
import homeassistant.components.alarm_control_panel as alarm
|
|
from homeassistant.components.spc import (
|
|
ATTR_DISCOVER_AREAS, DATA_API, DATA_REGISTRY, SpcWebGateway)
|
|
from homeassistant.const import (
|
|
STATE_ALARM_ARMED_AWAY, STATE_ALARM_ARMED_HOME, STATE_ALARM_DISARMED,
|
|
STATE_UNKNOWN)
|
|
|
|
_LOGGER = logging.getLogger(__name__)
|
|
|
|
SPC_AREA_MODE_TO_STATE = {
|
|
'0': STATE_ALARM_DISARMED,
|
|
'1': STATE_ALARM_ARMED_HOME,
|
|
'3': STATE_ALARM_ARMED_AWAY,
|
|
}
|
|
|
|
|
|
def _get_alarm_state(spc_mode):
|
|
"""Get the alarm state."""
|
|
return SPC_AREA_MODE_TO_STATE.get(spc_mode, STATE_UNKNOWN)
|
|
|
|
|
|
@asyncio.coroutine
|
|
def async_setup_platform(hass, config, async_add_devices, discovery_info=None):
|
|
"""Set up the SPC alarm control panel platform."""
|
|
if (discovery_info is None or
|
|
discovery_info[ATTR_DISCOVER_AREAS] is None):
|
|
return
|
|
|
|
api = hass.data[DATA_API]
|
|
devices = [SpcAlarm(api, area)
|
|
for area in discovery_info[ATTR_DISCOVER_AREAS]]
|
|
|
|
async_add_devices(devices)
|
|
|
|
|
|
class SpcAlarm(alarm.AlarmControlPanel):
|
|
"""Representation of the SPC alarm panel."""
|
|
|
|
def __init__(self, api, area):
|
|
"""Initialize the SPC alarm panel."""
|
|
self._area_id = area['id']
|
|
self._name = area['name']
|
|
self._state = _get_alarm_state(area['mode'])
|
|
if self._state == STATE_ALARM_DISARMED:
|
|
self._changed_by = area.get('last_unset_user_name', 'unknown')
|
|
else:
|
|
self._changed_by = area.get('last_set_user_name', 'unknown')
|
|
self._api = api
|
|
|
|
@asyncio.coroutine
|
|
def async_added_to_hass(self):
|
|
"""Call for adding new entities."""
|
|
self.hass.data[DATA_REGISTRY].register_alarm_device(
|
|
self._area_id, self)
|
|
|
|
@asyncio.coroutine
|
|
def async_update_from_spc(self, state, extra):
|
|
"""Update the alarm panel with a new state."""
|
|
self._state = state
|
|
self._changed_by = extra.get('changed_by', 'unknown')
|
|
self.async_schedule_update_ha_state()
|
|
|
|
@property
|
|
def should_poll(self):
|
|
"""No polling needed."""
|
|
return False
|
|
|
|
@property
|
|
def name(self):
|
|
"""Return the name of the device."""
|
|
return self._name
|
|
|
|
@property
|
|
def changed_by(self):
|
|
"""Return the user the last change was triggered by."""
|
|
return self._changed_by
|
|
|
|
@property
|
|
def state(self):
|
|
"""Return the state of the device."""
|
|
return self._state
|
|
|
|
@asyncio.coroutine
|
|
def async_alarm_disarm(self, code=None):
|
|
"""Send disarm command."""
|
|
yield from self._api.send_area_command(
|
|
self._area_id, SpcWebGateway.AREA_COMMAND_UNSET)
|
|
|
|
@asyncio.coroutine
|
|
def async_alarm_arm_home(self, code=None):
|
|
"""Send arm home command."""
|
|
yield from self._api.send_area_command(
|
|
self._area_id, SpcWebGateway.AREA_COMMAND_PART_SET)
|
|
|
|
@asyncio.coroutine
|
|
def async_alarm_arm_away(self, code=None):
|
|
"""Send arm away command."""
|
|
yield from self._api.send_area_command(
|
|
self._area_id, SpcWebGateway.AREA_COMMAND_SET)
|