Advertisement
Bart274

smanos.py

Feb 29th, 2016
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 7.80 KB | None | 0 0
  1. """
  2. Support for manual alarms.
  3.  
  4. For more details about this platform, please refer to the documentation at
  5. https://home-assistant.io/components/alarm_control_panel.manual/
  6. """
  7. import datetime
  8. import logging
  9.  
  10. import requests
  11.  
  12. import homeassistant.components.alarm_control_panel as alarm
  13. import homeassistant.util.dt as dt_util
  14. from homeassistant.const import (
  15.     STATE_ALARM_ARMED_AWAY, STATE_ALARM_ARMED_HOME, STATE_ALARM_DISARMED,
  16.     STATE_ALARM_PENDING, STATE_ALARM_TRIGGERED)
  17. from homeassistant.helpers.event import track_point_in_time
  18. from homeassistant.helpers.event import track_utc_time_change
  19. from homeassistant.helpers.event import track_state_change
  20. from homeassistant.helpers.event import track_time_change
  21.  
  22. DEPENDENCIES = ['sensor']
  23.  
  24. _LOGGER = logging.getLogger(__name__)
  25.  
  26. DEFAULT_ALARM_NAME = 'Smanos'
  27. DEFAULT_PENDING_TIME = 300
  28. DEFAULT_TRIGGER_TIME = 300
  29.  
  30. BASE_URL = ***REDACTED***
  31.  
  32. def setup_platform(hass, config, add_devices, discovery_info=None):
  33.     """Setup the manual alarm platform."""
  34.     smanos = SmanosAlarm(hass)
  35.    
  36.     add_devices([smanos])
  37.    
  38.     def update(now):
  39.         smanos.update()
  40.    
  41.     def updatepending(now):
  42.         smanos.updatepending(now)
  43.    
  44.     track_utc_time_change(
  45.         hass, update,
  46.         second=0
  47.     )
  48.    
  49.     track_utc_time_change(
  50.         hass, updatepending,
  51.         minute=range(0, 60, 3),
  52.         second=0
  53.     )
  54.    
  55.     track_state_change(hass, 'group.bartsharon',
  56.                        smanos.check_state_change)
  57.                        
  58.     each_time = dt_util.parse_time('7:00')
  59.     track_time_change(hass, smanos.disarm_in_morning,
  60.                       hour=each_time.hour,
  61.                       minute=each_time.minute,
  62.                       second=each_time.second)
  63.                      
  64.     each_time = dt_util.parse_time('22:30')
  65.     track_time_change(hass, smanos.arm_in_evening,
  66.                       hour=each_time.hour,
  67.                       minute=each_time.minute,
  68.                       second=each_time.second)
  69.  
  70.  
  71. # pylint: disable=too-many-arguments, too-many-instance-attributes
  72. # pylint: disable=abstract-method
  73. class SmanosAlarm(alarm.AlarmControlPanel):
  74.     """
  75.    Represents an alarm status.
  76.  
  77.    When armed, will be pending for 'pending_time', after that armed.
  78.    When triggered, will be pending for 'trigger_time'. After that will be
  79.    triggered for 'trigger_time', after that we return to disarmed.
  80.    """
  81.  
  82.     def __init__(self, hass):
  83.         """Initalize the manual alarm panel."""
  84.         self._state = STATE_ALARM_DISARMED
  85.         self._hass = hass
  86.         self._name = DEFAULT_ALARM_NAME
  87.         self._code = None
  88.         self._pending_time = datetime.timedelta(seconds=DEFAULT_PENDING_TIME)
  89.         self._trigger_time = datetime.timedelta(seconds=DEFAULT_TRIGGER_TIME)
  90.         self._state_ts = None
  91.         self._notifyasked = False
  92.  
  93.     @property
  94.     def should_poll(self):
  95.         """No polling needed."""
  96.         return False
  97.  
  98.     @property
  99.     def name(self):
  100.         """Return the name of the device."""
  101.         return self._name
  102.  
  103.     @property
  104.     def state(self):
  105.         """Return the state of the device."""
  106.         return self._state
  107.  
  108.     @property
  109.     def code_format(self):
  110.         """One or more characters."""
  111.         return None
  112.        
  113.     def check_state_change(self, entity, old_state, new_state):
  114.         if new_state.state == 'home':
  115.             self.alarm_disarm()
  116.         else:
  117.             self.alarm_arm_away()
  118.            
  119.     def clickpopup(self):
  120.         requests.get(BASE_URL + 'AlarmPopup')
  121.        
  122.     def disarm_in_morning(self, now):
  123.         state_1 = self._hass.states.get('group.bartsharon')
  124.         if state_1.state == 'home':
  125.             self.alarm_disarm()
  126.    
  127.     def arm_in_evening(self, now):
  128.         state_1 = self._hass.states.get('group.bartsharon')
  129.         if state_1.state == 'home':
  130.             self.alarm_arm_home()
  131.        
  132.     def update(self):
  133.         if self._state == STATE_ALARM_PENDING:
  134.             return
  135.            
  136.         state_1 = self._hass.states.get('sensor.alarmaan')
  137.         state_2 = self._hass.states.get('sensor.alarmthuis')
  138.         state_3 = self._hass.states.get('sensor.alarmuit')
  139.        
  140.         if state_1.state == '28042066' and state_2.state == '29050071' and state_3.state == '232080102':
  141.             self._state = STATE_ALARM_DISARMED
  142.         elif state_1.state == '28042066' and state_2.state == '232080102' and state_3.state == '44061077':
  143.             self._state = STATE_ALARM_ARMED_HOME
  144.         elif state_1.state == '232080102' and state_2.state == '29050071' and state_3.state == '44061077':
  145.             self._state = STATE_ALARM_ARMED_AWAY
  146.         else:
  147.             requests.get(BASE_URL + 'LaunchAlarm')
  148.             track_point_in_time(self._hass, self.clickpopup,
  149.                                 dt_util.utcnow() + datetime.timedelta(seconds=60))
  150.            
  151.         self._notifyasked = False
  152.            
  153.         self.update_ha_state()
  154.        
  155.     def updatepending(self, now):
  156.         if self._state == STATE_ALARM_PENDING:
  157.             if not self._notifyasked:
  158.                 requests.get(BASE_URL + 'NotifyHass')
  159.                 self._notifyasked = True
  160.             else:
  161.                 state_1 = self._hass.states.get('sensor.alarmaan')
  162.                 state_2 = self._hass.states.get('sensor.alarmthuis')
  163.                 state_3 = self._hass.states.get('sensor.alarmuit')
  164.        
  165.                 if state_1.state == '28042066' and state_2.state == '29050071' and state_3.state == '232080102':
  166.                     self._state = STATE_ALARM_DISARMED
  167.                 elif state_1.state == '28042066' and state_2.state == '232080102' and state_3.state == '44061077':
  168.                     self._state = STATE_ALARM_ARMED_HOME
  169.                 elif state_1.state == '232080102' and state_2.state == '29050071' and state_3.state == '44061077':
  170.                     self._state = STATE_ALARM_ARMED_AWAY
  171.                 else:
  172.                     requests.get(BASE_URL + 'LaunchAlarm')
  173.            
  174.                 self._notifyasked = False
  175.            
  176.                 self.update_ha_state()
  177.            
  178.     def alarm_disarm(self, code=None):
  179.         """Send disarm command."""
  180.         requests.get(BASE_URL + 'AlarmUit')
  181.         self._state = STATE_ALARM_PENDING
  182.         self._notifyasked = False
  183.         self.update_ha_state()
  184.        
  185.         track_point_in_time(
  186.             self._hass, self.updatepending,
  187.             dt_util.utcnow() + datetime.timedelta(seconds=60))
  188.  
  189.     def alarm_arm_home(self, code=None):
  190.         """Send arm home command."""
  191.         requests.get(BASE_URL + 'AlarmThuis')
  192.         self._state = STATE_ALARM_PENDING
  193.         self._notifyasked = False
  194.         self.update_ha_state()
  195.         track_point_in_time(
  196.             self._hass, self.updatepending,
  197.             dt_util.utcnow() + datetime.timedelta(seconds=60))
  198.        
  199.     def alarm_arm_away(self, code=None):
  200.         """Send arm away command."""
  201.         requests.get(BASE_URL + 'AlarmAan')
  202.         self._state = STATE_ALARM_PENDING
  203.         self._notifyasked = False
  204.         self.update_ha_state()
  205.         track_point_in_time(
  206.             self._hass, self.updatepending,
  207.             dt_util.utcnow() + datetime.timedelta(seconds=60))
  208.  
  209.     def alarm_trigger(self, code=None):
  210.         """Send alarm trigger command. No code needed."""
  211.         self._state = STATE_ALARM_TRIGGERED
  212.         self._state_ts = dt_util.utcnow()
  213.         self.update_ha_state()
  214.  
  215.         if self._trigger_time:
  216.             track_point_in_time(
  217.                 self._hass, self.update_ha_state,
  218.                 self._state_ts + self._pending_time)
  219.  
  220.             track_point_in_time(
  221.                 self._hass, self.update_ha_state,
  222.                 self._state_ts + self._pending_time + self._trigger_time)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement