mirror of
https://github.com/home-assistant/core.git
synced 2025-07-29 18:28:14 +02:00
* Add binary sensors to bosch_alarm * make one device per sensor, remove device class guessing * fix tests * update tests * Apply suggested changes * add binary sensors * make fault sensors diagnostic * update tests * update binary sensors to use base entity * fix strings * fix icons * add state translations for area ready sensors * use constants in tests * apply changes from review * remove fault prefix, use default translation for battery low * update tests
178 lines
6.7 KiB
Python
178 lines
6.7 KiB
Python
"""Support for Bosch Alarm Panel History as a sensor."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from bosch_alarm_mode2 import Panel
|
|
|
|
from homeassistant.components.sensor import Entity
|
|
from homeassistant.helpers.device_registry import DeviceInfo
|
|
|
|
from .const import DOMAIN
|
|
|
|
PARALLEL_UPDATES = 0
|
|
|
|
|
|
class BoschAlarmEntity(Entity):
|
|
"""A base entity for a bosch alarm panel."""
|
|
|
|
_attr_has_entity_name = True
|
|
|
|
def __init__(
|
|
self, panel: Panel, unique_id: str, observe_faults: bool = False
|
|
) -> None:
|
|
"""Set up a entity for a bosch alarm panel."""
|
|
self.panel = panel
|
|
self._observe_faults = observe_faults
|
|
self._attr_should_poll = False
|
|
self._attr_device_info = DeviceInfo(
|
|
identifiers={(DOMAIN, unique_id)},
|
|
name=f"Bosch {panel.model}",
|
|
manufacturer="Bosch Security Systems",
|
|
)
|
|
|
|
@property
|
|
def available(self) -> bool:
|
|
"""Return True if entity is available."""
|
|
return self.panel.connection_status()
|
|
|
|
async def async_added_to_hass(self) -> None:
|
|
"""Observe state changes."""
|
|
self.panel.connection_status_observer.attach(self.schedule_update_ha_state)
|
|
if self._observe_faults:
|
|
self.panel.faults_observer.attach(self.schedule_update_ha_state)
|
|
|
|
async def async_will_remove_from_hass(self) -> None:
|
|
"""Stop observing state changes."""
|
|
self.panel.connection_status_observer.detach(self.schedule_update_ha_state)
|
|
if self._observe_faults:
|
|
self.panel.faults_observer.attach(self.schedule_update_ha_state)
|
|
|
|
|
|
class BoschAlarmAreaEntity(BoschAlarmEntity):
|
|
"""A base entity for area related entities within a bosch alarm panel."""
|
|
|
|
def __init__(
|
|
self,
|
|
panel: Panel,
|
|
area_id: int,
|
|
unique_id: str,
|
|
observe_alarms: bool,
|
|
observe_ready: bool,
|
|
observe_status: bool,
|
|
) -> None:
|
|
"""Set up a area related entity for a bosch alarm panel."""
|
|
super().__init__(panel, unique_id)
|
|
self._area_id = area_id
|
|
self._area_unique_id = f"{unique_id}_area_{area_id}"
|
|
self._observe_alarms = observe_alarms
|
|
self._observe_ready = observe_ready
|
|
self._observe_status = observe_status
|
|
self._area = panel.areas[area_id]
|
|
self._attr_device_info = DeviceInfo(
|
|
identifiers={(DOMAIN, self._area_unique_id)},
|
|
name=self._area.name,
|
|
manufacturer="Bosch Security Systems",
|
|
via_device=(DOMAIN, unique_id),
|
|
)
|
|
|
|
async def async_added_to_hass(self) -> None:
|
|
"""Observe state changes."""
|
|
await super().async_added_to_hass()
|
|
if self._observe_alarms:
|
|
self._area.alarm_observer.attach(self.schedule_update_ha_state)
|
|
if self._observe_ready:
|
|
self._area.ready_observer.attach(self.schedule_update_ha_state)
|
|
if self._observe_status:
|
|
self._area.status_observer.attach(self.schedule_update_ha_state)
|
|
|
|
async def async_will_remove_from_hass(self) -> None:
|
|
"""Stop observing state changes."""
|
|
await super().async_added_to_hass()
|
|
if self._observe_alarms:
|
|
self._area.alarm_observer.detach(self.schedule_update_ha_state)
|
|
if self._observe_ready:
|
|
self._area.ready_observer.detach(self.schedule_update_ha_state)
|
|
if self._observe_status:
|
|
self._area.status_observer.detach(self.schedule_update_ha_state)
|
|
|
|
|
|
class BoschAlarmPointEntity(BoschAlarmEntity):
|
|
"""A base entity for point related entities within a bosch alarm panel."""
|
|
|
|
def __init__(self, panel: Panel, point_id: int, unique_id: str) -> None:
|
|
"""Set up a area related entity for a bosch alarm panel."""
|
|
super().__init__(panel, unique_id)
|
|
self._point_id = point_id
|
|
self._point_unique_id = f"{unique_id}_point_{point_id}"
|
|
self._point = panel.points[point_id]
|
|
self._attr_device_info = DeviceInfo(
|
|
identifiers={(DOMAIN, self._point_unique_id)},
|
|
name=self._point.name,
|
|
manufacturer="Bosch Security Systems",
|
|
via_device=(DOMAIN, unique_id),
|
|
)
|
|
|
|
async def async_added_to_hass(self) -> None:
|
|
"""Observe state changes."""
|
|
await super().async_added_to_hass()
|
|
self._point.status_observer.attach(self.schedule_update_ha_state)
|
|
|
|
async def async_will_remove_from_hass(self) -> None:
|
|
"""Stop observing state changes."""
|
|
await super().async_added_to_hass()
|
|
self._point.status_observer.detach(self.schedule_update_ha_state)
|
|
|
|
|
|
class BoschAlarmDoorEntity(BoschAlarmEntity):
|
|
"""A base entity for area related entities within a bosch alarm panel."""
|
|
|
|
def __init__(self, panel: Panel, door_id: int, unique_id: str) -> None:
|
|
"""Set up a area related entity for a bosch alarm panel."""
|
|
super().__init__(panel, unique_id)
|
|
self._door_id = door_id
|
|
self._door = panel.doors[door_id]
|
|
self._door_unique_id = f"{unique_id}_door_{door_id}"
|
|
self._attr_device_info = DeviceInfo(
|
|
identifiers={(DOMAIN, self._door_unique_id)},
|
|
name=self._door.name,
|
|
manufacturer="Bosch Security Systems",
|
|
via_device=(DOMAIN, unique_id),
|
|
)
|
|
|
|
async def async_added_to_hass(self) -> None:
|
|
"""Observe state changes."""
|
|
await super().async_added_to_hass()
|
|
self._door.status_observer.attach(self.schedule_update_ha_state)
|
|
|
|
async def async_will_remove_from_hass(self) -> None:
|
|
"""Stop observing state changes."""
|
|
await super().async_added_to_hass()
|
|
self._door.status_observer.detach(self.schedule_update_ha_state)
|
|
|
|
|
|
class BoschAlarmOutputEntity(BoschAlarmEntity):
|
|
"""A base entity for area related entities within a bosch alarm panel."""
|
|
|
|
def __init__(self, panel: Panel, output_id: int, unique_id: str) -> None:
|
|
"""Set up a output related entity for a bosch alarm panel."""
|
|
super().__init__(panel, unique_id)
|
|
self._output_id = output_id
|
|
self._output = panel.outputs[output_id]
|
|
self._output_unique_id = f"{unique_id}_output_{output_id}"
|
|
self._attr_device_info = DeviceInfo(
|
|
identifiers={(DOMAIN, self._output_unique_id)},
|
|
name=self._output.name,
|
|
manufacturer="Bosch Security Systems",
|
|
via_device=(DOMAIN, unique_id),
|
|
)
|
|
|
|
async def async_added_to_hass(self) -> None:
|
|
"""Observe state changes."""
|
|
await super().async_added_to_hass()
|
|
self._output.status_observer.attach(self.schedule_update_ha_state)
|
|
|
|
async def async_will_remove_from_hass(self) -> None:
|
|
"""Stop observing state changes."""
|
|
await super().async_added_to_hass()
|
|
self._output.status_observer.detach(self.schedule_update_ha_state)
|