diff --git a/.coveragerc b/.coveragerc index b091b3765798ba38540099401dc0d15ee5846dae..0f95db71ec7e9a48c397b0abe4a1c0ce45427db2 100644 --- a/.coveragerc +++ b/.coveragerc @@ -263,6 +263,7 @@ omit = homeassistant/components/alarm_control_panel/alarmdotcom.py homeassistant/components/alarm_control_panel/concord232.py homeassistant/components/alarm_control_panel/egardia.py + homeassistant/components/alarm_control_panel/ialarm.py homeassistant/components/alarm_control_panel/manual_mqtt.py homeassistant/components/alarm_control_panel/nx584.py homeassistant/components/alarm_control_panel/simplisafe.py diff --git a/homeassistant/components/alarm_control_panel/ialarm.py b/homeassistant/components/alarm_control_panel/ialarm.py new file mode 100644 index 0000000000000000000000000000000000000000..3fb6e2dcb903e6b8fce5203df0d085b73c41d9d7 --- /dev/null +++ b/homeassistant/components/alarm_control_panel/ialarm.py @@ -0,0 +1,107 @@ +""" +Interfaces with iAlarm control panels. + +For more details about this platform, please refer to the documentation at +https://home-assistant.io/components/alarm_control_panel.ialarm/ +""" +import logging + +import voluptuous as vol + +import homeassistant.helpers.config_validation as cv +import homeassistant.components.alarm_control_panel as alarm +from homeassistant.components.alarm_control_panel import PLATFORM_SCHEMA +from homeassistant.const import ( + CONF_PASSWORD, CONF_USERNAME, CONF_HOST, STATE_ALARM_ARMED_AWAY, + STATE_ALARM_ARMED_HOME, STATE_ALARM_DISARMED, CONF_NAME) + +REQUIREMENTS = ['pyialarm==0.2'] + +_LOGGER = logging.getLogger(__name__) + +DEFAULT_NAME = 'iAlarm' + + +def no_application_protocol(value): + """Validate that value is without the application protocol.""" + protocol_separator = "://" + if not value or protocol_separator in value: + raise vol.Invalid( + 'Invalid host, {} is not allowed'.format(protocol_separator)) + + return value + + +PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ + vol.Required(CONF_PASSWORD): cv.string, + vol.Required(CONF_USERNAME): cv.string, + vol.Required(CONF_HOST): vol.All(cv.string, no_application_protocol), + vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, +}) + + +def setup_platform(hass, config, add_devices, discovery_info=None): + """Set up an iAlarm control panel.""" + name = config.get(CONF_NAME) + username = config.get(CONF_USERNAME) + password = config.get(CONF_PASSWORD) + host = config.get(CONF_HOST) + + url = 'http://{}'.format(host) + ialarm = IAlarmPanel(name, username, password, url) + add_devices([ialarm], True) + + +class IAlarmPanel(alarm.AlarmControlPanel): + """Represent an iAlarm status.""" + + def __init__(self, name, username, password, url): + """Initialize the iAlarm status.""" + from pyialarm import IAlarm + + self._name = name + self._username = username + self._password = password + self._url = url + self._state = None + self._client = IAlarm(username, password, url) + + @property + def name(self): + """Return the name of the device.""" + return self._name + + @property + def state(self): + """Return the state of the device.""" + return self._state + + def update(self): + """Return the state of the device.""" + status = self._client.get_status() + _LOGGER.debug('iAlarm status: %s', status) + if status: + status = int(status) + + if status == self._client.DISARMED: + state = STATE_ALARM_DISARMED + elif status == self._client.ARMED_AWAY: + state = STATE_ALARM_ARMED_AWAY + elif status == self._client.ARMED_STAY: + state = STATE_ALARM_ARMED_HOME + else: + state = None + + self._state = state + + def alarm_disarm(self, code=None): + """Send disarm command.""" + self._client.disarm() + + def alarm_arm_away(self, code=None): + """Send arm away command.""" + self._client.arm_away() + + def alarm_arm_home(self, code=None): + """Send arm home command.""" + self._client.arm_stay() diff --git a/requirements_all.txt b/requirements_all.txt index 42f9d175377a5dfc8cf8cbb1813d269e5a5cae48..3b96c8557f1393efd44dccf7b75df66a5d2e1198 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -682,6 +682,9 @@ pyhomematic==0.1.35 # homeassistant.components.sensor.hydroquebec pyhydroquebec==1.3.1 +# homeassistant.components.alarm_control_panel.ialarm +pyialarm==0.2 + # homeassistant.components.device_tracker.icloud pyicloud==0.9.1