Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- """
- Support for manual alarms.
- For more details about this platform, please refer to the documentation at
- https://home-assistant.io/components/alarm_control_panel.manual/
- """
- import datetime
- import logging
- import requests
- import homeassistant.components.alarm_control_panel as alarm
- import homeassistant.util.dt as dt_util
- from homeassistant.const import (
- STATE_ALARM_ARMED_AWAY, STATE_ALARM_ARMED_HOME, STATE_ALARM_DISARMED,
- STATE_ALARM_PENDING, STATE_ALARM_TRIGGERED)
- from homeassistant.helpers.event import track_point_in_time
- from homeassistant.helpers.event import track_utc_time_change
- from homeassistant.helpers.event import track_state_change
- from homeassistant.helpers.event import track_time_change
- DEPENDENCIES = ['sensor']
- _LOGGER = logging.getLogger(__name__)
- DEFAULT_ALARM_NAME = 'Smanos'
- DEFAULT_PENDING_TIME = 300
- DEFAULT_TRIGGER_TIME = 300
- BASE_URL = ***REDACTED***
- def setup_platform(hass, config, add_devices, discovery_info=None):
- """Setup the manual alarm platform."""
- smanos = SmanosAlarm(hass)
- add_devices([smanos])
- def update(now):
- smanos.update()
- def updatepending(now):
- smanos.updatepending(now)
- track_utc_time_change(
- hass, update,
- second=0
- )
- track_utc_time_change(
- hass, updatepending,
- minute=range(0, 60, 3),
- second=0
- )
- track_state_change(hass, 'group.bartsharon',
- smanos.check_state_change)
- each_time = dt_util.parse_time('7:00')
- track_time_change(hass, smanos.disarm_in_morning,
- hour=each_time.hour,
- minute=each_time.minute,
- second=each_time.second)
- each_time = dt_util.parse_time('22:30')
- track_time_change(hass, smanos.arm_in_evening,
- hour=each_time.hour,
- minute=each_time.minute,
- second=each_time.second)
- # pylint: disable=too-many-arguments, too-many-instance-attributes
- # pylint: disable=abstract-method
- class SmanosAlarm(alarm.AlarmControlPanel):
- """
- Represents an alarm status.
- When armed, will be pending for 'pending_time', after that armed.
- When triggered, will be pending for 'trigger_time'. After that will be
- triggered for 'trigger_time', after that we return to disarmed.
- """
- def __init__(self, hass):
- """Initalize the manual alarm panel."""
- self._state = STATE_ALARM_DISARMED
- self._hass = hass
- self._name = DEFAULT_ALARM_NAME
- self._code = None
- self._pending_time = datetime.timedelta(seconds=DEFAULT_PENDING_TIME)
- self._trigger_time = datetime.timedelta(seconds=DEFAULT_TRIGGER_TIME)
- self._state_ts = None
- self._notifyasked = False
- @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 state(self):
- """Return the state of the device."""
- return self._state
- @property
- def code_format(self):
- """One or more characters."""
- return None
- def check_state_change(self, entity, old_state, new_state):
- if new_state.state == 'home':
- self.alarm_disarm()
- else:
- self.alarm_arm_away()
- def clickpopup(self):
- requests.get(BASE_URL + 'AlarmPopup')
- def disarm_in_morning(self, now):
- state_1 = self._hass.states.get('group.bartsharon')
- if state_1.state == 'home':
- self.alarm_disarm()
- def arm_in_evening(self, now):
- state_1 = self._hass.states.get('group.bartsharon')
- if state_1.state == 'home':
- self.alarm_arm_home()
- def update(self):
- if self._state == STATE_ALARM_PENDING:
- return
- state_1 = self._hass.states.get('sensor.alarmaan')
- state_2 = self._hass.states.get('sensor.alarmthuis')
- state_3 = self._hass.states.get('sensor.alarmuit')
- if state_1.state == '28042066' and state_2.state == '29050071' and state_3.state == '232080102':
- self._state = STATE_ALARM_DISARMED
- elif state_1.state == '28042066' and state_2.state == '232080102' and state_3.state == '44061077':
- self._state = STATE_ALARM_ARMED_HOME
- elif state_1.state == '232080102' and state_2.state == '29050071' and state_3.state == '44061077':
- self._state = STATE_ALARM_ARMED_AWAY
- else:
- requests.get(BASE_URL + 'LaunchAlarm')
- track_point_in_time(self._hass, self.clickpopup,
- dt_util.utcnow() + datetime.timedelta(seconds=60))
- self._notifyasked = False
- self.update_ha_state()
- def updatepending(self, now):
- if self._state == STATE_ALARM_PENDING:
- if not self._notifyasked:
- requests.get(BASE_URL + 'NotifyHass')
- self._notifyasked = True
- else:
- state_1 = self._hass.states.get('sensor.alarmaan')
- state_2 = self._hass.states.get('sensor.alarmthuis')
- state_3 = self._hass.states.get('sensor.alarmuit')
- if state_1.state == '28042066' and state_2.state == '29050071' and state_3.state == '232080102':
- self._state = STATE_ALARM_DISARMED
- elif state_1.state == '28042066' and state_2.state == '232080102' and state_3.state == '44061077':
- self._state = STATE_ALARM_ARMED_HOME
- elif state_1.state == '232080102' and state_2.state == '29050071' and state_3.state == '44061077':
- self._state = STATE_ALARM_ARMED_AWAY
- else:
- requests.get(BASE_URL + 'LaunchAlarm')
- self._notifyasked = False
- self.update_ha_state()
- def alarm_disarm(self, code=None):
- """Send disarm command."""
- requests.get(BASE_URL + 'AlarmUit')
- self._state = STATE_ALARM_PENDING
- self._notifyasked = False
- self.update_ha_state()
- track_point_in_time(
- self._hass, self.updatepending,
- dt_util.utcnow() + datetime.timedelta(seconds=60))
- def alarm_arm_home(self, code=None):
- """Send arm home command."""
- requests.get(BASE_URL + 'AlarmThuis')
- self._state = STATE_ALARM_PENDING
- self._notifyasked = False
- self.update_ha_state()
- track_point_in_time(
- self._hass, self.updatepending,
- dt_util.utcnow() + datetime.timedelta(seconds=60))
- def alarm_arm_away(self, code=None):
- """Send arm away command."""
- requests.get(BASE_URL + 'AlarmAan')
- self._state = STATE_ALARM_PENDING
- self._notifyasked = False
- self.update_ha_state()
- track_point_in_time(
- self._hass, self.updatepending,
- dt_util.utcnow() + datetime.timedelta(seconds=60))
- def alarm_trigger(self, code=None):
- """Send alarm trigger command. No code needed."""
- self._state = STATE_ALARM_TRIGGERED
- self._state_ts = dt_util.utcnow()
- self.update_ha_state()
- if self._trigger_time:
- track_point_in_time(
- self._hass, self.update_ha_state,
- self._state_ts + self._pending_time)
- track_point_in_time(
- self._hass, self.update_ha_state,
- self._state_ts + self._pending_time + self._trigger_time)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement