From 2b7bd923d642d8b50c11b55db3c067226ee292c5 Mon Sep 17 00:00:00 2001 From: Yuxin Wang Date: Sun, 17 Aug 2025 22:18:08 -0700 Subject: [PATCH] Add a base entity to APCUPSD integration (#150828) --- .../components/apcupsd/binary_sensor.py | 12 +++------ homeassistant/components/apcupsd/entity.py | 26 +++++++++++++++++++ .../components/apcupsd/quality_scale.yaml | 5 +--- homeassistant/components/apcupsd/sensor.py | 12 +++------ 4 files changed, 33 insertions(+), 22 deletions(-) create mode 100644 homeassistant/components/apcupsd/entity.py diff --git a/homeassistant/components/apcupsd/binary_sensor.py b/homeassistant/components/apcupsd/binary_sensor.py index dfeb56c8d06..394ff4c4088 100644 --- a/homeassistant/components/apcupsd/binary_sensor.py +++ b/homeassistant/components/apcupsd/binary_sensor.py @@ -10,9 +10,9 @@ from homeassistant.components.binary_sensor import ( ) from homeassistant.core import HomeAssistant from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback -from homeassistant.helpers.update_coordinator import CoordinatorEntity from .coordinator import APCUPSdConfigEntry, APCUPSdCoordinator +from .entity import APCUPSdEntity PARALLEL_UPDATES = 0 @@ -40,22 +40,16 @@ async def async_setup_entry( async_add_entities([OnlineStatus(coordinator, _DESCRIPTION)]) -class OnlineStatus(CoordinatorEntity[APCUPSdCoordinator], BinarySensorEntity): +class OnlineStatus(APCUPSdEntity, BinarySensorEntity): """Representation of a UPS online status.""" - _attr_has_entity_name = True - def __init__( self, coordinator: APCUPSdCoordinator, description: BinarySensorEntityDescription, ) -> None: """Initialize the APCUPSd binary device.""" - super().__init__(coordinator, context=description.key.upper()) - - self.entity_description = description - self._attr_unique_id = f"{coordinator.unique_device_id}_{description.key}" - self._attr_device_info = coordinator.device_info + super().__init__(coordinator, description) @property def is_on(self) -> bool | None: diff --git a/homeassistant/components/apcupsd/entity.py b/homeassistant/components/apcupsd/entity.py new file mode 100644 index 00000000000..9ebe51ff876 --- /dev/null +++ b/homeassistant/components/apcupsd/entity.py @@ -0,0 +1,26 @@ +"""Base entity for APCUPSd integration.""" + +from __future__ import annotations + +from homeassistant.helpers.entity import EntityDescription +from homeassistant.helpers.update_coordinator import CoordinatorEntity + +from .coordinator import APCUPSdCoordinator + + +class APCUPSdEntity(CoordinatorEntity[APCUPSdCoordinator]): + """Base entity for APCUPSd integration.""" + + _attr_has_entity_name = True + + def __init__( + self, + coordinator: APCUPSdCoordinator, + description: EntityDescription, + ) -> None: + """Initialize the APCUPSd entity.""" + super().__init__(coordinator, context=description.key.upper()) + + self.entity_description = description + self._attr_unique_id = f"{coordinator.unique_device_id}_{description.key}" + self._attr_device_info = coordinator.device_info diff --git a/homeassistant/components/apcupsd/quality_scale.yaml b/homeassistant/components/apcupsd/quality_scale.yaml index 316f3e97bbe..23b72134d34 100644 --- a/homeassistant/components/apcupsd/quality_scale.yaml +++ b/homeassistant/components/apcupsd/quality_scale.yaml @@ -3,10 +3,7 @@ rules: action-setup: done appropriate-polling: done brands: done - common-modules: - status: done - comment: | - Consider deriving a base entity. + common-modules: done config-flow-test-coverage: done config-flow: done dependency-transparency: done diff --git a/homeassistant/components/apcupsd/sensor.py b/homeassistant/components/apcupsd/sensor.py index 5076b537467..14baed5bfce 100644 --- a/homeassistant/components/apcupsd/sensor.py +++ b/homeassistant/components/apcupsd/sensor.py @@ -23,10 +23,10 @@ from homeassistant.const import ( ) from homeassistant.core import HomeAssistant, callback from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback -from homeassistant.helpers.update_coordinator import CoordinatorEntity from .const import LAST_S_TEST from .coordinator import APCUPSdConfigEntry, APCUPSdCoordinator +from .entity import APCUPSdEntity PARALLEL_UPDATES = 0 @@ -490,22 +490,16 @@ def infer_unit(value: str) -> tuple[str, str | None]: return value, None -class APCUPSdSensor(CoordinatorEntity[APCUPSdCoordinator], SensorEntity): +class APCUPSdSensor(APCUPSdEntity, SensorEntity): """Representation of a sensor entity for APCUPSd status values.""" - _attr_has_entity_name = True - def __init__( self, coordinator: APCUPSdCoordinator, description: SensorEntityDescription, ) -> None: """Initialize the sensor.""" - super().__init__(coordinator=coordinator, context=description.key.upper()) - - self.entity_description = description - self._attr_unique_id = f"{coordinator.unique_device_id}_{description.key}" - self._attr_device_info = coordinator.device_info + super().__init__(coordinator, description) # Initial update of attributes. self._update_attrs()