1 """Support for alarm control panels that can be controlled through IFTTT."""
3 from __future__
import annotations
7 import voluptuous
as vol
10 PLATFORM_SCHEMA
as ALARM_CONTROL_PANEL_PLATFORM_SCHEMA,
11 AlarmControlPanelEntity,
12 AlarmControlPanelEntityFeature,
13 AlarmControlPanelState,
28 from .
import ATTR_EVENT, DOMAIN, SERVICE_PUSH_ALARM_STATE, SERVICE_TRIGGER
30 _LOGGER = logging.getLogger(__name__)
33 AlarmControlPanelState.DISARMED,
34 AlarmControlPanelState.ARMED_NIGHT,
35 AlarmControlPanelState.ARMED_AWAY,
36 AlarmControlPanelState.ARMED_HOME,
39 DATA_IFTTT_ALARM =
"ifttt_alarm"
42 CONF_EVENT_AWAY =
"event_arm_away"
43 CONF_EVENT_HOME =
"event_arm_home"
44 CONF_EVENT_NIGHT =
"event_arm_night"
45 CONF_EVENT_DISARM =
"event_disarm"
47 DEFAULT_EVENT_AWAY =
"alarm_arm_away"
48 DEFAULT_EVENT_HOME =
"alarm_arm_home"
49 DEFAULT_EVENT_NIGHT =
"alarm_arm_night"
50 DEFAULT_EVENT_DISARM =
"alarm_disarm"
52 CONF_CODE_ARM_REQUIRED =
"code_arm_required"
54 PLATFORM_SCHEMA = ALARM_CONTROL_PANEL_PLATFORM_SCHEMA.extend(
56 vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string,
57 vol.Optional(CONF_CODE): cv.string,
58 vol.Optional(CONF_CODE_ARM_REQUIRED, default=
True): cv.boolean,
59 vol.Optional(CONF_EVENT_AWAY, default=DEFAULT_EVENT_AWAY): cv.string,
60 vol.Optional(CONF_EVENT_HOME, default=DEFAULT_EVENT_HOME): cv.string,
61 vol.Optional(CONF_EVENT_NIGHT, default=DEFAULT_EVENT_NIGHT): cv.string,
62 vol.Optional(CONF_EVENT_DISARM, default=DEFAULT_EVENT_DISARM): cv.string,
63 vol.Optional(CONF_OPTIMISTIC, default=
False): cv.boolean,
67 PUSH_ALARM_STATE_SERVICE_SCHEMA = vol.Schema(
68 {vol.Required(ATTR_ENTITY_ID): cv.entity_ids, vol.Required(ATTR_STATE): cv.string}
75 add_entities: AddEntitiesCallback,
76 discovery_info: DiscoveryInfoType |
None =
None,
78 """Set up a control panel managed through IFTTT."""
79 if DATA_IFTTT_ALARM
not in hass.data:
80 hass.data[DATA_IFTTT_ALARM] = []
82 name: str = config[CONF_NAME]
83 code: str |
None = config.get(CONF_CODE)
84 code_arm_required: bool = config[CONF_CODE_ARM_REQUIRED]
85 event_away: str = config[CONF_EVENT_AWAY]
86 event_home: str = config[CONF_EVENT_HOME]
87 event_night: str = config[CONF_EVENT_NIGHT]
88 event_disarm: str = config[CONF_EVENT_DISARM]
89 optimistic: bool = config[CONF_OPTIMISTIC]
101 hass.data[DATA_IFTTT_ALARM].append(alarmpanel)
104 async
def push_state_update(service: ServiceCall) ->
None:
105 """Set the service state as device state attribute."""
106 entity_ids = service.data.get(ATTR_ENTITY_ID)
107 state = service.data.get(ATTR_STATE)
108 devices = hass.data[DATA_IFTTT_ALARM]
110 devices = [d
for d
in devices
if d.entity_id
in entity_ids]
112 for device
in devices:
113 device.push_alarm_state(state)
114 device.async_schedule_update_ha_state()
116 hass.services.register(
118 SERVICE_PUSH_ALARM_STATE,
120 schema=PUSH_ALARM_STATE_SERVICE_SCHEMA,
125 """Representation of an alarm control panel controlled through IFTTT."""
127 _attr_assumed_state =
True
128 _attr_supported_features = (
129 AlarmControlPanelEntityFeature.ARM_HOME
130 | AlarmControlPanelEntityFeature.ARM_AWAY
131 | AlarmControlPanelEntityFeature.ARM_NIGHT
138 code_arm_required: bool,
145 """Initialize the alarm control panel."""
157 """Return one or more digits/characters."""
158 if self.
_code_code
is None:
160 if isinstance(self.
_code_code, str)
and self.
_code_code.isdigit():
161 return CodeFormat.NUMBER
162 return CodeFormat.TEXT
165 """Send disarm command."""
171 """Send arm away command."""
177 """Send arm home command."""
183 """Send arm night command."""
189 """Call the IFTTT trigger service to change the alarm state."""
190 data = {ATTR_EVENT: event}
192 self.
hasshass.services.call(DOMAIN, SERVICE_TRIGGER, data)
193 _LOGGER.debug(
"Called IFTTT integration to trigger event %s", event)
198 """Push the alarm state to the given value."""
199 value = AlarmControlPanelState(value)
200 if value
in ALLOWED_STATES:
201 _LOGGER.debug(
"Pushed the alarm state to %s", value)
205 return self.
_code_code
is None or self.
_code_code == code
None push_alarm_state(self, str value)
None alarm_arm_home(self, str|None code=None)
CodeFormat|None code_format(self)
None set_alarm_state(self, str event, AlarmControlPanelState state)
None alarm_arm_away(self, str|None code=None)
None alarm_disarm(self, str|None code=None)
None __init__(self, str name, str|None code, bool code_arm_required, str event_away, str event_home, str event_night, str event_disarm, bool optimistic)
bool _check_code(self, str|None code)
None alarm_arm_night(self, str|None code=None)
None add_entities(AsusWrtRouter router, AddEntitiesCallback async_add_entities, set[str] tracked)
None setup_platform(HomeAssistant hass, ConfigType config, AddEntitiesCallback add_entities, DiscoveryInfoType|None discovery_info=None)