Add elkm1 bypass and trigger services (#41584)

This commit is contained in:
Glenn Waters 2020-10-12 22:41:19 -04:00 committed by GitHub
parent 7e6432dad6
commit f7d3f3a1ed
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 107 additions and 29 deletions

View File

@ -47,11 +47,6 @@ SYNC_TIMEOUT = 120
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)
SERVICE_ALARM_DISPLAY_MESSAGE = "alarm_display_message"
SERVICE_ALARM_ARM_VACATION = "alarm_arm_vacation"
SERVICE_ALARM_ARM_HOME_INSTANT = "alarm_arm_home_instant"
SERVICE_ALARM_ARM_NIGHT_INSTANT = "alarm_arm_night_instant"
SUPPORTED_DOMAINS = [ SUPPORTED_DOMAINS = [
"alarm_control_panel", "alarm_control_panel",
"climate", "climate",

View File

@ -14,7 +14,6 @@ from homeassistant.components.alarm_control_panel.const import (
SUPPORT_ALARM_ARM_NIGHT, SUPPORT_ALARM_ARM_NIGHT,
) )
from homeassistant.const import ( from homeassistant.const import (
ATTR_CODE,
ATTR_ENTITY_ID, ATTR_ENTITY_ID,
STATE_ALARM_ARMED_AWAY, STATE_ALARM_ARMED_AWAY,
STATE_ALARM_ARMED_HOME, STATE_ALARM_ARMED_HOME,
@ -28,26 +27,13 @@ from homeassistant.helpers import entity_platform
import homeassistant.helpers.config_validation as cv import homeassistant.helpers.config_validation as cv
from homeassistant.helpers.restore_state import RestoreEntity from homeassistant.helpers.restore_state import RestoreEntity
from . import ( from . import ElkAttachedEntity, create_elk_entities
SERVICE_ALARM_ARM_HOME_INSTANT,
SERVICE_ALARM_ARM_NIGHT_INSTANT,
SERVICE_ALARM_ARM_VACATION,
SERVICE_ALARM_DISPLAY_MESSAGE,
ElkAttachedEntity,
create_elk_entities,
)
from .const import ( from .const import (
ATTR_CHANGED_BY_ID, ATTR_CHANGED_BY_ID,
ATTR_CHANGED_BY_KEYPAD, ATTR_CHANGED_BY_KEYPAD,
ATTR_CHANGED_BY_TIME, ATTR_CHANGED_BY_TIME,
DOMAIN, DOMAIN,
) ELK_USER_CODE_SERVICE_SCHEMA,
ELK_ALARM_SERVICE_SCHEMA = vol.Schema(
{
vol.Required(ATTR_ENTITY_ID, default=[]): cv.entity_ids,
vol.Required(ATTR_CODE): vol.All(vol.Coerce(int), vol.Range(0, 999999)),
}
) )
DISPLAY_MESSAGE_SERVICE_SCHEMA = vol.Schema( DISPLAY_MESSAGE_SERVICE_SCHEMA = vol.Schema(
@ -63,6 +49,13 @@ DISPLAY_MESSAGE_SERVICE_SCHEMA = vol.Schema(
} }
) )
SERVICE_ALARM_DISPLAY_MESSAGE = "alarm_display_message"
SERVICE_ALARM_ARM_VACATION = "alarm_arm_vacation"
SERVICE_ALARM_ARM_HOME_INSTANT = "alarm_arm_home_instant"
SERVICE_ALARM_ARM_NIGHT_INSTANT = "alarm_arm_night_instant"
SERVICE_ALARM_BYPASS = "alarm_bypass"
SERVICE_ALARM_CLEAR_BYPASS = "alarm_clear_bypass"
async def async_setup_entry(hass, config_entry, async_add_entities): async def async_setup_entry(hass, config_entry, async_add_entities):
"""Set up the ElkM1 alarm platform.""" """Set up the ElkM1 alarm platform."""
@ -85,17 +78,17 @@ async def async_setup_entry(hass, config_entry, async_add_entities):
platform.async_register_entity_service( platform.async_register_entity_service(
SERVICE_ALARM_ARM_VACATION, SERVICE_ALARM_ARM_VACATION,
ELK_ALARM_SERVICE_SCHEMA, ELK_USER_CODE_SERVICE_SCHEMA,
"async_alarm_arm_vacation", "async_alarm_arm_vacation",
) )
platform.async_register_entity_service( platform.async_register_entity_service(
SERVICE_ALARM_ARM_HOME_INSTANT, SERVICE_ALARM_ARM_HOME_INSTANT,
ELK_ALARM_SERVICE_SCHEMA, ELK_USER_CODE_SERVICE_SCHEMA,
"async_alarm_arm_home_instant", "async_alarm_arm_home_instant",
) )
platform.async_register_entity_service( platform.async_register_entity_service(
SERVICE_ALARM_ARM_NIGHT_INSTANT, SERVICE_ALARM_ARM_NIGHT_INSTANT,
ELK_ALARM_SERVICE_SCHEMA, ELK_USER_CODE_SERVICE_SCHEMA,
"async_alarm_arm_night_instant", "async_alarm_arm_night_instant",
) )
platform.async_register_entity_service( platform.async_register_entity_service(
@ -103,6 +96,16 @@ async def async_setup_entry(hass, config_entry, async_add_entities):
DISPLAY_MESSAGE_SERVICE_SCHEMA, DISPLAY_MESSAGE_SERVICE_SCHEMA,
"async_display_message", "async_display_message",
) )
platform.async_register_entity_service(
SERVICE_ALARM_BYPASS,
ELK_USER_CODE_SERVICE_SCHEMA,
"async_bypass",
)
platform.async_register_entity_service(
SERVICE_ALARM_CLEAR_BYPASS,
ELK_USER_CODE_SERVICE_SCHEMA,
"async_clear_bypass",
)
class ElkArea(ElkAttachedEntity, AlarmControlPanelEntity, RestoreEntity): class ElkArea(ElkAttachedEntity, AlarmControlPanelEntity, RestoreEntity):
@ -261,3 +264,11 @@ class ElkArea(ElkAttachedEntity, AlarmControlPanelEntity, RestoreEntity):
async def async_display_message(self, clear, beep, timeout, line1, line2): async def async_display_message(self, clear, beep, timeout, line1, line2):
"""Display a message on all keypads for the area.""" """Display a message on all keypads for the area."""
self._element.display_message(clear, beep, timeout, line1, line2) self._element.display_message(clear, beep, timeout, line1, line2)
async def async_bypass(self, code=None):
"""Bypass all zones in area."""
self._element.bypass(code)
async def async_clear_bypass(self, code=None):
"""Clear bypass for all zones in area."""
self._element.clear_bypass(code)

View File

@ -1,6 +1,9 @@
"""Support the ElkM1 Gold and ElkM1 EZ8 alarm/integration panels.""" """Support the ElkM1 Gold and ElkM1 EZ8 alarm/integration panels."""
from elkm1_lib.const import Max from elkm1_lib.const import Max
import voluptuous as vol
from homeassistant.const import ATTR_CODE
DOMAIN = "elkm1" DOMAIN = "elkm1"
@ -37,3 +40,7 @@ ELK_ELEMENTS = {
ATTR_CHANGED_BY_KEYPAD = "changed_by_keypad" ATTR_CHANGED_BY_KEYPAD = "changed_by_keypad"
ATTR_CHANGED_BY_ID = "changed_by_id" ATTR_CHANGED_BY_ID = "changed_by_id"
ATTR_CHANGED_BY_TIME = "changed_by_time" ATTR_CHANGED_BY_TIME = "changed_by_time"
ELK_USER_CODE_SERVICE_SCHEMA = {
vol.Required(ATTR_CODE): vol.All(vol.Coerce(int), vol.Range(0, 999999))
}

View File

@ -2,7 +2,7 @@
"domain": "elkm1", "domain": "elkm1",
"name": "Elk-M1 Control", "name": "Elk-M1 Control",
"documentation": "https://www.home-assistant.io/integrations/elkm1", "documentation": "https://www.home-assistant.io/integrations/elkm1",
"requirements": ["elkm1-lib==0.8.1"], "requirements": ["elkm1-lib==0.8.2"],
"codeowners": ["@gwww", "@bdraco"], "codeowners": ["@gwww", "@bdraco"],
"config_flow": true "config_flow": true
} }

View File

@ -8,10 +8,14 @@ from elkm1_lib.const import (
from elkm1_lib.util import pretty_const, username from elkm1_lib.util import pretty_const, username
from homeassistant.const import VOLT from homeassistant.const import VOLT
from homeassistant.exceptions import HomeAssistantError
from homeassistant.helpers import entity_platform
from . import ElkAttachedEntity, create_elk_entities from . import ElkAttachedEntity, create_elk_entities
from .const import DOMAIN from .const import DOMAIN, ELK_USER_CODE_SERVICE_SCHEMA
SERVICE_SENSOR_ZONE_BYPASS = "sensor_zone_bypass"
SERVICE_SENSOR_ZONE_TRIGGER = "sensor_zone_trigger"
UNDEFINED_TEMPATURE = -40 UNDEFINED_TEMPATURE = -40
@ -27,6 +31,19 @@ async def async_setup_entry(hass, config_entry, async_add_entities):
create_elk_entities(elk_data, elk.zones, "zone", ElkZone, entities) create_elk_entities(elk_data, elk.zones, "zone", ElkZone, entities)
async_add_entities(entities, True) async_add_entities(entities, True)
platform = entity_platform.current_platform.get()
platform.async_register_entity_service(
SERVICE_SENSOR_ZONE_BYPASS,
ELK_USER_CODE_SERVICE_SCHEMA,
"async_zone_bypass",
)
platform.async_register_entity_service(
SERVICE_SENSOR_ZONE_TRIGGER,
{},
"async_zone_trigger",
)
def temperature_to_state(temperature, undefined_temperature): def temperature_to_state(temperature, undefined_temperature):
"""Convert temperature to a state.""" """Convert temperature to a state."""
@ -46,6 +63,18 @@ class ElkSensor(ElkAttachedEntity):
"""Return the state of the sensor.""" """Return the state of the sensor."""
return self._state return self._state
async def async_zone_bypass(self, code=None):
"""Bypass zone."""
if not isinstance(self, ElkZone):
raise HomeAssistantError("supported only on ElkM1 Zone sensors")
self._element.bypass(code)
async def async_zone_trigger(self):
"""Trigger zone."""
if not isinstance(self, ElkZone):
raise HomeAssistantError("supported only on ElkM1 Zone sensors")
self._element.trigger()
class ElkCounter(ElkSensor): class ElkCounter(ElkSensor):
"""Representation of an Elk-M1 Counter.""" """Representation of an Elk-M1 Counter."""
@ -180,7 +209,6 @@ class ElkZone(ElkSensor):
).name.lower() ).name.lower()
attrs["definition"] = ZoneType(self._element.definition).name.lower() attrs["definition"] = ZoneType(self._element.definition).name.lower()
attrs["area"] = self._element.area + 1 attrs["area"] = self._element.area + 1
attrs["bypassed"] = self._element.bypassed
attrs["triggered_alarm"] = self._element.triggered_alarm attrs["triggered_alarm"] = self._element.triggered_alarm
return attrs return attrs

View File

@ -1,3 +1,23 @@
alarm_bypass:
description: Bypass all zones for the area.
fields:
entity_id:
description: Name of alarm control panel to bypass.
example: "alarm_control_panel.main"
code:
description: An code to authorize the bypass of the alarm control panel.
example: 4242
alarm_clear_bypass:
description: Remove bypass on all zones for the area.
fields:
entity_id:
description: Name of alarm control panel to clear bypass.
example: "alarm_control_panel.main"
code:
description: An code to authorize the bypass clear of the alarm control panel.
example: 4242
alarm_arm_home_instant: alarm_arm_home_instant:
description: Arm the ElkM1 in home instant mode. description: Arm the ElkM1 in home instant mode.
fields: fields:
@ -63,3 +83,20 @@ speak_word:
number: number:
description: Word number to speak. description: Word number to speak.
example: 142 example: 142
sensor_zone_bypass:
description: Bypass zone.
fields:
entity_id:
description: Name of zone to bypass.
example: "sensor.window42"
code:
description: An code to authorize the bypass of the zone.
example: 4242
sensor_zone_trigger:
description: Trigger zone.
fields:
entity_id:
description: Name of zone to trigger.
example: "sensor.motion42"

View File

@ -541,7 +541,7 @@ elgato==0.2.0
eliqonline==1.2.2 eliqonline==1.2.2
# homeassistant.components.elkm1 # homeassistant.components.elkm1
elkm1-lib==0.8.1 elkm1-lib==0.8.2
# homeassistant.components.mobile_app # homeassistant.components.mobile_app
emoji==0.5.4 emoji==0.5.4

View File

@ -281,7 +281,7 @@ eebrightbox==0.0.4
elgato==0.2.0 elgato==0.2.0
# homeassistant.components.elkm1 # homeassistant.components.elkm1
elkm1-lib==0.8.1 elkm1-lib==0.8.2
# homeassistant.components.mobile_app # homeassistant.components.mobile_app
emoji==0.5.4 emoji==0.5.4