core/homeassistant/components/risco/binary_sensor.py

132 lines
4.2 KiB
Python
Raw Normal View History

"""Support for Risco alarm zones."""
from __future__ import annotations
from collections.abc import Mapping
from typing import Any
from pyrisco.common import Zone
from homeassistant.components.binary_sensor import (
2021-12-16 13:41:20 +00:00
BinarySensorDeviceClass,
BinarySensorEntity,
)
from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from . import LocalData, RiscoDataUpdateCoordinator, is_local
from .const import DATA_COORDINATOR, DOMAIN
from .entity import RiscoCloudZoneEntity, RiscoLocalZoneEntity
async def async_setup_entry(
hass: HomeAssistant,
config_entry: ConfigEntry,
async_add_entities: AddEntitiesCallback,
) -> None:
"""Set up the Risco alarm control panel."""
if is_local(config_entry):
local_data: LocalData = hass.data[DOMAIN][config_entry.entry_id]
async_add_entities(
RiscoLocalBinarySensor(local_data.system.id, zone_id, zone)
for zone_id, zone in local_data.system.zones.items()
)
async_add_entities(
RiscoLocalAlarmedBinarySensor(local_data.system.id, zone_id, zone)
for zone_id, zone in local_data.system.zones.items()
)
async_add_entities(
RiscoLocalArmedBinarySensor(local_data.system.id, zone_id, zone)
for zone_id, zone in local_data.system.zones.items()
)
else:
coordinator: RiscoDataUpdateCoordinator = hass.data[DOMAIN][
config_entry.entry_id
][DATA_COORDINATOR]
async_add_entities(
RiscoCloudBinarySensor(coordinator, zone_id, zone)
for zone_id, zone in coordinator.data.zones.items()
)
class RiscoCloudBinarySensor(RiscoCloudZoneEntity, BinarySensorEntity):
"""Representation of a Risco cloud zone as a binary sensor."""
_attr_device_class = BinarySensorDeviceClass.MOTION
def __init__(
self, coordinator: RiscoDataUpdateCoordinator, zone_id: int, zone: Zone
) -> None:
"""Init the zone."""
super().__init__(
coordinator=coordinator, name=None, suffix="", zone_id=zone_id, zone=zone
)
@property
def is_on(self) -> bool | None:
"""Return true if sensor is on."""
return self._zone.triggered
class RiscoLocalBinarySensor(RiscoLocalZoneEntity, BinarySensorEntity):
"""Representation of a Risco local zone as a binary sensor."""
_attr_device_class = BinarySensorDeviceClass.MOTION
def __init__(self, system_id: str, zone_id: int, zone: Zone) -> None:
"""Init the zone."""
super().__init__(
system_id=system_id, name=None, suffix="", zone_id=zone_id, zone=zone
)
@property
def extra_state_attributes(self) -> Mapping[str, Any] | None:
"""Return the state attributes."""
return {
**(super().extra_state_attributes or {}),
"groups": self._zone.groups,
}
@property
def is_on(self) -> bool | None:
"""Return true if sensor is on."""
return self._zone.triggered
class RiscoLocalAlarmedBinarySensor(RiscoLocalZoneEntity, BinarySensorEntity):
"""Representation whether a zone in Risco local is currently triggering an alarm."""
def __init__(self, system_id: str, zone_id: int, zone: Zone) -> None:
"""Init the zone."""
super().__init__(
system_id=system_id,
name="Alarmed",
suffix="_alarmed",
zone_id=zone_id,
zone=zone,
)
@property
def is_on(self) -> bool | None:
"""Return true if sensor is on."""
return self._zone.alarmed
class RiscoLocalArmedBinarySensor(RiscoLocalZoneEntity, BinarySensorEntity):
"""Representation whether a zone in Risco local is currently armed."""
def __init__(self, system_id: str, zone_id: int, zone: Zone) -> None:
"""Init the zone."""
super().__init__(
system_id=system_id,
name="Armed",
suffix="_armed",
zone_id=zone_id,
zone=zone,
)
@property
def is_on(self) -> bool | None:
"""Return true if sensor is on."""
return self._zone.armed