core/homeassistant/components/totalconnect/binary_sensor.py

189 lines
6.4 KiB
Python

"""Interfaces with TotalConnect sensors."""
import logging
from homeassistant.components.binary_sensor import (
BinarySensorDeviceClass,
BinarySensorEntity,
BinarySensorEntityDescription,
)
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import EntityCategory
from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from .const import DOMAIN
LOW_BATTERY = "low_battery"
TAMPER = "tamper"
POWER = "power"
ZONE = "zone"
_LOGGER = logging.getLogger(__name__)
async def async_setup_entry(
hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback
) -> None:
"""Set up TotalConnect device sensors based on a config entry."""
sensors: list = []
client_locations = hass.data[DOMAIN][entry.entry_id].client.locations
for location_id, location in client_locations.items():
sensors.append(TotalConnectAlarmLowBatteryBinarySensor(location))
sensors.append(TotalConnectAlarmTamperBinarySensor(location))
sensors.append(TotalConnectAlarmPowerBinarySensor(location))
for zone in location.zones.values():
sensors.append(TotalConnectZoneSecurityBinarySensor(location_id, zone))
if not zone.is_type_button():
sensors.append(TotalConnectLowBatteryBinarySensor(location_id, zone))
sensors.append(TotalConnectTamperBinarySensor(location_id, zone))
async_add_entities(sensors, True)
class TotalConnectZoneBinarySensor(BinarySensorEntity):
"""Represent an TotalConnect zone."""
def __init__(self, location_id, zone):
"""Initialize the TotalConnect status."""
self._location_id = location_id
self._zone = zone
self._attr_name = f"{zone.description}{self.entity_description.name}"
self._attr_unique_id = (
f"{location_id}_{zone.zoneid}_{self.entity_description.key}"
)
self._attr_is_on = None
self._attr_extra_state_attributes = {
"zone_id": self._zone.zoneid,
"location_id": self._location_id,
"partition": self._zone.partition,
}
class TotalConnectZoneSecurityBinarySensor(TotalConnectZoneBinarySensor):
"""Represent an TotalConnect security zone."""
entity_description: BinarySensorEntityDescription = BinarySensorEntityDescription(
key=ZONE, name=""
)
@property
def device_class(self):
"""Return the class of this zone."""
if self._zone.is_type_fire():
return BinarySensorDeviceClass.SMOKE
if self._zone.is_type_carbon_monoxide():
return BinarySensorDeviceClass.GAS
if self._zone.is_type_motion():
return BinarySensorDeviceClass.MOTION
if self._zone.is_type_medical():
return BinarySensorDeviceClass.SAFETY
# "security" type is a generic category so test for it last
if self._zone.is_type_security():
return BinarySensorDeviceClass.DOOR
_LOGGER.error(
"TotalConnect zone %s reported an unexpected device class",
self._zone.zoneid,
)
return None
def update(self):
"""Return the state of the device."""
if self._zone.is_faulted() or self._zone.is_triggered():
self._attr_is_on = True
else:
self._attr_is_on = False
class TotalConnectLowBatteryBinarySensor(TotalConnectZoneBinarySensor):
"""Represent an TotalConnect zone low battery status."""
entity_description: BinarySensorEntityDescription = BinarySensorEntityDescription(
key=LOW_BATTERY,
device_class=BinarySensorDeviceClass.BATTERY,
entity_category=EntityCategory.DIAGNOSTIC,
name=" low battery",
)
def update(self):
"""Return the state of the device."""
self._attr_is_on = self._zone.is_low_battery()
class TotalConnectTamperBinarySensor(TotalConnectZoneBinarySensor):
"""Represent an TotalConnect zone tamper status."""
entity_description: BinarySensorEntityDescription = BinarySensorEntityDescription(
key=TAMPER,
device_class=BinarySensorDeviceClass.TAMPER,
entity_category=EntityCategory.DIAGNOSTIC,
name=f" {TAMPER}",
)
def update(self):
"""Return the state of the device."""
self._attr_is_on = self._zone.is_tampered()
class TotalConnectAlarmBinarySensor(BinarySensorEntity):
"""Represent an TotalConnect alarm device binary sensors."""
def __init__(self, location):
"""Initialize the TotalConnect alarm device binary sensor."""
self._location = location
self._attr_name = f"{location.location_name}{self.entity_description.name}"
self._attr_unique_id = f"{location.location_id}_{self.entity_description.key}"
self._attr_is_on = None
self._attr_extra_state_attributes = {
"location_id": self._location.location_id,
}
class TotalConnectAlarmLowBatteryBinarySensor(TotalConnectAlarmBinarySensor):
"""Represent an TotalConnect Alarm low battery status."""
entity_description: BinarySensorEntityDescription = BinarySensorEntityDescription(
key=LOW_BATTERY,
device_class=BinarySensorDeviceClass.BATTERY,
entity_category=EntityCategory.DIAGNOSTIC,
name=" low battery",
)
def update(self):
"""Return the state of the device."""
self._attr_is_on = self._location.is_low_battery()
class TotalConnectAlarmTamperBinarySensor(TotalConnectAlarmBinarySensor):
"""Represent an TotalConnect alarm tamper status."""
entity_description: BinarySensorEntityDescription = BinarySensorEntityDescription(
key=TAMPER,
device_class=BinarySensorDeviceClass.TAMPER,
entity_category=EntityCategory.DIAGNOSTIC,
name=f" {TAMPER}",
)
def update(self):
"""Return the state of the device."""
self._attr_is_on = self._location.is_cover_tampered()
class TotalConnectAlarmPowerBinarySensor(TotalConnectAlarmBinarySensor):
"""Represent an TotalConnect alarm power status."""
entity_description: BinarySensorEntityDescription = BinarySensorEntityDescription(
key=POWER,
device_class=BinarySensorDeviceClass.POWER,
entity_category=EntityCategory.DIAGNOSTIC,
name=f" {POWER}",
)
def update(self):
"""Return the state of the device."""
self._attr_is_on = not self._location.is_ac_loss()