From f26ac465b5ce0e4ca36caf770c38d31c078fb2d0 Mon Sep 17 00:00:00 2001 From: Joost Lekkerkerker Date: Sun, 21 Apr 2024 23:38:32 +0200 Subject: [PATCH] Introduce base entity for totalconnect (#115936) --- .../totalconnect/alarm_control_panel.py | 6 ++-- .../components/totalconnect/binary_sensor.py | 33 +++++------------ .../components/totalconnect/entity.py | 35 +++++++++++++++++++ 3 files changed, 46 insertions(+), 28 deletions(-) create mode 100644 homeassistant/components/totalconnect/entity.py diff --git a/homeassistant/components/totalconnect/alarm_control_panel.py b/homeassistant/components/totalconnect/alarm_control_panel.py index 436e3198650..fcafd47037d 100644 --- a/homeassistant/components/totalconnect/alarm_control_panel.py +++ b/homeassistant/components/totalconnect/alarm_control_panel.py @@ -23,10 +23,10 @@ from homeassistant.exceptions import HomeAssistantError from homeassistant.helpers import entity_platform from homeassistant.helpers.device_registry import DeviceInfo from homeassistant.helpers.entity_platform import AddEntitiesCallback -from homeassistant.helpers.update_coordinator import CoordinatorEntity from . import TotalConnectDataUpdateCoordinator from .const import DOMAIN +from .entity import TotalConnectEntity SERVICE_ALARM_ARM_AWAY_INSTANT = "arm_away_instant" SERVICE_ALARM_ARM_HOME_INSTANT = "arm_home_instant" @@ -70,9 +70,7 @@ async def async_setup_entry( ) -class TotalConnectAlarm( - CoordinatorEntity[TotalConnectDataUpdateCoordinator], alarm.AlarmControlPanelEntity -): +class TotalConnectAlarm(TotalConnectEntity, alarm.AlarmControlPanelEntity): """Represent an TotalConnect status.""" _attr_supported_features = ( diff --git a/homeassistant/components/totalconnect/binary_sensor.py b/homeassistant/components/totalconnect/binary_sensor.py index 696f0dbcf6f..18340d5d6d3 100644 --- a/homeassistant/components/totalconnect/binary_sensor.py +++ b/homeassistant/components/totalconnect/binary_sensor.py @@ -15,12 +15,11 @@ from homeassistant.components.binary_sensor import ( from homeassistant.config_entries import ConfigEntry from homeassistant.const import EntityCategory from homeassistant.core import HomeAssistant -from homeassistant.helpers.device_registry import DeviceInfo from homeassistant.helpers.entity_platform import AddEntitiesCallback -from homeassistant.helpers.update_coordinator import CoordinatorEntity from . import TotalConnectDataUpdateCoordinator from .const import DOMAIN +from .entity import TotalConnectEntity, TotalConnectZoneEntity LOW_BATTERY = "low_battery" TAMPER = "tamper" @@ -129,7 +128,7 @@ async def async_setup_entry( for zone in location.zones.values(): sensors.append( TotalConnectZoneBinarySensor( - coordinator, SECURITY_BINARY_SENSOR, location_id, zone + coordinator, SECURITY_BINARY_SENSOR, zone, location_id ) ) @@ -138,8 +137,8 @@ async def async_setup_entry( TotalConnectZoneBinarySensor( coordinator, description, - location_id, zone, + location_id, ) for description in NO_BUTTON_BINARY_SENSORS ) @@ -147,10 +146,8 @@ async def async_setup_entry( async_add_entities(sensors) -class TotalConnectZoneBinarySensor( - CoordinatorEntity[TotalConnectDataUpdateCoordinator], BinarySensorEntity -): - """Represent an TotalConnect zone.""" +class TotalConnectZoneBinarySensor(TotalConnectZoneEntity, BinarySensorEntity): + """Represent a TotalConnect zone.""" entity_description: TotalConnectZoneBinarySensorEntityDescription @@ -158,28 +155,18 @@ class TotalConnectZoneBinarySensor( self, coordinator: TotalConnectDataUpdateCoordinator, entity_description: TotalConnectZoneBinarySensorEntityDescription, - location_id: str, zone: TotalConnectZone, + location_id: str, ) -> None: """Initialize the TotalConnect status.""" - super().__init__(coordinator) + super().__init__(coordinator, zone, location_id, entity_description.key) self.entity_description = entity_description - self._location_id = location_id - self._zone = zone self._attr_name = f"{zone.description}{entity_description.name}" - self._attr_unique_id = f"{location_id}_{zone.zoneid}_{entity_description.key}" - self._attr_is_on = None self._attr_extra_state_attributes = { "zone_id": zone.zoneid, - "location_id": self._location_id, + "location_id": location_id, "partition": zone.partition, } - identifier = zone.sensor_serial_number or f"zone_{zone.zoneid}" - self._attr_device_info = DeviceInfo( - name=zone.description, - identifiers={(DOMAIN, identifier)}, - serial_number=zone.sensor_serial_number, - ) @property def is_on(self) -> bool: @@ -194,9 +181,7 @@ class TotalConnectZoneBinarySensor( return super().device_class -class TotalConnectAlarmBinarySensor( - CoordinatorEntity[TotalConnectDataUpdateCoordinator], BinarySensorEntity -): +class TotalConnectAlarmBinarySensor(TotalConnectEntity, BinarySensorEntity): """Represent a TotalConnect alarm device binary sensors.""" entity_description: TotalConnectAlarmBinarySensorEntityDescription diff --git a/homeassistant/components/totalconnect/entity.py b/homeassistant/components/totalconnect/entity.py new file mode 100644 index 00000000000..e7ab4b3575c --- /dev/null +++ b/homeassistant/components/totalconnect/entity.py @@ -0,0 +1,35 @@ +"""Base class for TotalConnect entities.""" + +from total_connect_client.zone import TotalConnectZone + +from homeassistant.helpers.device_registry import DeviceInfo +from homeassistant.helpers.update_coordinator import CoordinatorEntity + +from . import DOMAIN, TotalConnectDataUpdateCoordinator + + +class TotalConnectEntity(CoordinatorEntity[TotalConnectDataUpdateCoordinator]): + """Represent a TotalConnect entity.""" + + +class TotalConnectZoneEntity(TotalConnectEntity): + """Represent a TotalConnect zone.""" + + def __init__( + self, + coordinator: TotalConnectDataUpdateCoordinator, + zone: TotalConnectZone, + location_id: str, + key: str, + ) -> None: + """Initialize the TotalConnect zone.""" + super().__init__(coordinator) + self._location_id = location_id + self._zone = zone + self._attr_unique_id = f"{location_id}_{zone.zoneid}_{key}" + identifier = zone.sensor_serial_number or f"zone_{zone.zoneid}" + self._attr_device_info = DeviceInfo( + identifiers={(DOMAIN, identifier)}, + name=zone.description, + serial_number=zone.sensor_serial_number, + )