diff --git a/homeassistant/components/risco/binary_sensor.py b/homeassistant/components/risco/binary_sensor.py index 978e6d11eb6..f3c35071111 100644 --- a/homeassistant/components/risco/binary_sensor.py +++ b/homeassistant/components/risco/binary_sensor.py @@ -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) diff --git a/homeassistant/components/risco/manifest.json b/homeassistant/components/risco/manifest.json index af8bdc960f2..2e360cd0c43 100644 --- a/homeassistant/components/risco/manifest.json +++ b/homeassistant/components/risco/manifest.json @@ -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" diff --git a/homeassistant/components/risco/services.yaml b/homeassistant/components/risco/services.yaml new file mode 100644 index 00000000000..8b6c8c06f01 --- /dev/null +++ b/homeassistant/components/risco/services.yaml @@ -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" diff --git a/requirements_all.txt b/requirements_all.txt index 1e7f3270e43..af78e8aeaf6 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -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 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 17c7385ff29..4356d0bc2a9 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -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 diff --git a/tests/components/risco/test_binary_sensor.py b/tests/components/risco/test_binary_sensor.py index 689b2e17c28..ab7934e523c 100644 --- a/tests/components/risco/test_binary_sensor.py +++ b/tests/components/risco/test_binary_sensor.py @@ -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)