This allows you to get every door, window, smoke, etc zone from your security panel into HA. This uses the live eventing feature of pynx584, which means you get instantaneous signaling into HA when a door opens or something happens, which is handy for automating lights on when doors open after dark, etc. Requires update to pynx584 0.2
105 lines
3.2 KiB
Python
105 lines
3.2 KiB
Python
"""
|
|
homeassistant.components.alarm_control_panel.nx584
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
Support for NX584 alarm control panels.
|
|
|
|
For more details about this platform, please refer to the documentation at
|
|
https://home-assistant.io/components/alarm_control_panel.nx584/
|
|
"""
|
|
import logging
|
|
import requests
|
|
|
|
from homeassistant.const import (STATE_UNKNOWN, STATE_ALARM_DISARMED,
|
|
STATE_ALARM_ARMED_HOME,
|
|
STATE_ALARM_ARMED_AWAY)
|
|
import homeassistant.components.alarm_control_panel as alarm
|
|
|
|
REQUIREMENTS = ['pynx584==0.2']
|
|
|
|
_LOGGER = logging.getLogger(__name__)
|
|
|
|
|
|
def setup_platform(hass, config, add_devices, discovery_info=None):
|
|
""" Setup nx584. """
|
|
host = config.get('host', 'localhost:5007')
|
|
|
|
try:
|
|
add_devices([NX584Alarm(hass, host, config.get('name', 'NX584'))])
|
|
except requests.exceptions.ConnectionError as ex:
|
|
_LOGGER.error('Unable to connect to NX584: %s', str(ex))
|
|
return False
|
|
|
|
|
|
class NX584Alarm(alarm.AlarmControlPanel):
|
|
""" NX584-based alarm panel. """
|
|
def __init__(self, hass, host, name):
|
|
from nx584 import client
|
|
self._hass = hass
|
|
self._host = host
|
|
self._name = name
|
|
self._alarm = client.Client('http://%s' % host)
|
|
# Do an initial list operation so that we will try to actually
|
|
# talk to the API and trigger a requests exception for setup_platform()
|
|
# to catch
|
|
self._alarm.list_zones()
|
|
|
|
@property
|
|
def should_poll(self):
|
|
""" Polling needed. """
|
|
return True
|
|
|
|
@property
|
|
def name(self):
|
|
""" Returns the name of the device. """
|
|
return self._name
|
|
|
|
@property
|
|
def code_format(self):
|
|
""" Characters if code is defined. """
|
|
return '[0-9]{4}([0-9]{2})?'
|
|
|
|
@property
|
|
def state(self):
|
|
""" Returns the state of the device. """
|
|
try:
|
|
part = self._alarm.list_partitions()[0]
|
|
zones = self._alarm.list_zones()
|
|
except requests.exceptions.ConnectionError as ex:
|
|
_LOGGER.error('Unable to connect to %(host)s: %(reason)s',
|
|
dict(host=self._host, reason=ex))
|
|
return STATE_UNKNOWN
|
|
except IndexError:
|
|
_LOGGER.error('nx584 reports no partitions')
|
|
return STATE_UNKNOWN
|
|
|
|
bypassed = False
|
|
for zone in zones:
|
|
if zone['bypassed']:
|
|
_LOGGER.debug('Zone %(zone)s is bypassed, '
|
|
'assuming HOME',
|
|
dict(zone=zone['number']))
|
|
bypassed = True
|
|
break
|
|
|
|
if not part['armed']:
|
|
return STATE_ALARM_DISARMED
|
|
elif bypassed:
|
|
return STATE_ALARM_ARMED_HOME
|
|
else:
|
|
return STATE_ALARM_ARMED_AWAY
|
|
|
|
def alarm_disarm(self, code=None):
|
|
""" Send disarm command. """
|
|
self._alarm.disarm(code)
|
|
|
|
def alarm_arm_home(self, code=None):
|
|
""" Send arm home command. """
|
|
self._alarm.arm('home')
|
|
|
|
def alarm_arm_away(self, code=None):
|
|
""" Send arm away command. """
|
|
self._alarm.arm('auto')
|
|
|
|
def alarm_trigger(self, code=None):
|
|
""" Alarm trigger command. """
|
|
raise NotImplementedError()
|