Add (un)bypass services to Risco (#39292)

* Add (un)bypass services to Risco

* Simplify service registration
This commit is contained in:
On Freund 2020-08-28 04:39:27 +03:00 committed by GitHub
parent a83c778c4f
commit 24db31fa28
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 67 additions and 3 deletions

View file

@ -3,13 +3,23 @@ from homeassistant.components.binary_sensor import (
DEVICE_CLASS_MOTION,
BinarySensorEntity,
)
from homeassistant.helpers import entity_platform
from .const import DATA_COORDINATOR, DOMAIN
from .entity import RiscoEntity
SERVICE_BYPASS_ZONE = "bypass_zone"
SERVICE_UNBYPASS_ZONE = "unbypass_zone"
async def async_setup_entry(hass, config_entry, async_add_entities):
"""Set up the Risco alarm control panel."""
platform = entity_platform.current_platform.get()
platform.async_register_entity_service(SERVICE_BYPASS_ZONE, {}, "async_bypass_zone")
platform.async_register_entity_service(
SERVICE_UNBYPASS_ZONE, {}, "async_unbypass_zone"
)
coordinator = hass.data[DOMAIN][config_entry.entry_id][DATA_COORDINATOR]
entities = [
RiscoBinarySensor(coordinator, zone_id, zone)
@ -64,3 +74,16 @@ class RiscoBinarySensor(BinarySensorEntity, RiscoEntity):
def device_class(self):
"""Return the class of this sensor, from DEVICE_CLASSES."""
return DEVICE_CLASS_MOTION
async def _bypass(self, bypass):
alarm = await self._risco.bypass_zone(self._zone_id, bypass)
self._zone = alarm.zones[self._zone_id]
self.async_write_ha_state()
async def async_bypass_zone(self):
"""Bypass this zone."""
await self._bypass(True)
async def async_unbypass_zone(self):
"""Unbypass this zone."""
await self._bypass(False)

View file

@ -4,7 +4,7 @@
"config_flow": true,
"documentation": "https://www.home-assistant.io/integrations/risco",
"requirements": [
"pyrisco==0.2.1"
"pyrisco==0.2.3"
],
"codeowners": [
"@OnFreund"

View file

@ -0,0 +1,15 @@
# Describes the format for available Risco services
bypass_zone:
description: Bypass a Risco Zone
fields:
entity_id:
description: Entity ID of the zone to bypass
example: "binary_sensor.living_room_motion"
unbypass_zone:
description: Unbypass a Risco Zone
fields:
entity_id:
description: Entity ID of the zone to unbypass
example: "binary_sensor.living_room_motion"

View file

@ -1582,7 +1582,7 @@ pyrecswitch==1.0.2
pyrepetier==3.0.5
# homeassistant.components.risco
pyrisco==0.2.1
pyrisco==0.2.3
# homeassistant.components.sabnzbd
pysabnzbd==1.1.0

View file

@ -757,7 +757,7 @@ pyps4-2ndscreen==1.1.1
pyqwikswitch==0.93
# homeassistant.components.risco
pyrisco==0.2.1
pyrisco==0.2.3
# homeassistant.components.acer_projector
# homeassistant.components.zha

View file

@ -163,3 +163,29 @@ async def test_states(hass, two_zone_alarm):
await _check_state(hass, two_zone_alarm, True, False, SECOND_ENTITY_ID, 1)
await _check_state(hass, two_zone_alarm, False, True, SECOND_ENTITY_ID, 1)
await _check_state(hass, two_zone_alarm, False, False, SECOND_ENTITY_ID, 1)
async def test_bypass(hass, two_zone_alarm):
"""Test bypassing a zone."""
await _setup_risco(hass)
with patch("homeassistant.components.risco.RiscoAPI.bypass_zone") as mock:
data = {"entity_id": FIRST_ENTITY_ID}
await hass.services.async_call(
DOMAIN, "bypass_zone", service_data=data, blocking=True
)
mock.assert_awaited_once_with(0, True)
async def test_unbypass(hass, two_zone_alarm):
"""Test unbypassing a zone."""
await _setup_risco(hass)
with patch("homeassistant.components.risco.RiscoAPI.bypass_zone") as mock:
data = {"entity_id": FIRST_ENTITY_ID}
await hass.services.async_call(
DOMAIN, "unbypass_zone", service_data=data, blocking=True
)
mock.assert_awaited_once_with(0, False)