From a94514b00dc18b1e439ed3ac2515ef2c220aa2d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Hjelseth=20H=C3=B8yer?= Date: Thu, 23 Sep 2021 22:19:46 +0200 Subject: [PATCH] Add Surepetcare entity class (#56430) --- .coveragerc | 1 + .../components/surepetcare/entity.py | 46 +++++++++++++++++++ .../components/surepetcare/sensor.py | 45 ++++++------------ tests/components/surepetcare/test_sensor.py | 6 +-- 4 files changed, 64 insertions(+), 34 deletions(-) create mode 100644 homeassistant/components/surepetcare/entity.py diff --git a/.coveragerc b/.coveragerc index 4caa8fd768c..70e81b377ca 100644 --- a/.coveragerc +++ b/.coveragerc @@ -1006,6 +1006,7 @@ omit = homeassistant/components/suez_water/* homeassistant/components/supervisord/sensor.py homeassistant/components/surepetcare/__init__.py + homeassistant/components/surepetcare/entity.py homeassistant/components/surepetcare/binary_sensor.py homeassistant/components/surepetcare/sensor.py homeassistant/components/swiss_hydrological_data/sensor.py diff --git a/homeassistant/components/surepetcare/entity.py b/homeassistant/components/surepetcare/entity.py new file mode 100644 index 00000000000..8b88282ce96 --- /dev/null +++ b/homeassistant/components/surepetcare/entity.py @@ -0,0 +1,46 @@ +"""Entity for Surepetcare.""" +from __future__ import annotations + +from abc import abstractmethod + +from surepy.entities import SurepyEntity + +from homeassistant.core import callback +from homeassistant.helpers.update_coordinator import CoordinatorEntity + +from . import SurePetcareDataCoordinator + + +class SurePetcareEntity(CoordinatorEntity): + """An implementation for Sure Petcare Entities.""" + + def __init__( + self, + surepetcare_id: int, + coordinator: SurePetcareDataCoordinator, + ) -> None: + """Initialize a Sure Petcare entity.""" + super().__init__(coordinator) + + self._id = surepetcare_id + + surepy_entity: SurepyEntity = coordinator.data[surepetcare_id] + + if surepy_entity.name: + self._device_name = surepy_entity.name.capitalize() + else: + self._device_name = surepy_entity.type.name.capitalize().replace("_", " ") + + self._device_id = f"{surepy_entity.household_id}-{surepetcare_id}" + self._update_attr(coordinator.data[surepetcare_id]) + + @abstractmethod + @callback + def _update_attr(self, surepy_entity: SurepyEntity) -> None: + """Update the state and attributes.""" + + @callback + def _handle_coordinator_update(self) -> None: + """Get the latest data and update the state.""" + self._update_attr(self.coordinator.data[self._id]) + self.async_write_ha_state() diff --git a/homeassistant/components/surepetcare/sensor.py b/homeassistant/components/surepetcare/sensor.py index a52c1d7d0ed..01d4e9f83aa 100644 --- a/homeassistant/components/surepetcare/sensor.py +++ b/homeassistant/components/surepetcare/sensor.py @@ -11,12 +11,10 @@ from homeassistant.config_entries import ConfigEntry from homeassistant.const import ATTR_VOLTAGE, DEVICE_CLASS_BATTERY, PERCENTAGE from homeassistant.core import HomeAssistant, callback from homeassistant.helpers.entity_platform import AddEntitiesCallback -from homeassistant.helpers.update_coordinator import ( - CoordinatorEntity, - DataUpdateCoordinator, -) +from . import SurePetcareDataCoordinator from .const import DOMAIN, SURE_BATT_VOLTAGE_DIFF, SURE_BATT_VOLTAGE_LOW +from .entity import SurePetcareEntity _LOGGER = logging.getLogger(__name__) @@ -28,7 +26,7 @@ async def async_setup_entry( entities: list[SureBattery] = [] - coordinator: DataUpdateCoordinator = hass.data[DOMAIN][entry.entry_id] + coordinator: SurePetcareDataCoordinator = hass.data[DOMAIN][entry.entry_id] for surepy_entity in coordinator.data.values(): @@ -43,38 +41,24 @@ async def async_setup_entry( async_add_entities(entities) -class SureBattery(CoordinatorEntity, SensorEntity): +class SureBattery(SurePetcareEntity, SensorEntity): """A sensor implementation for Sure Petcare Entities.""" - def __init__(self, _id: int, coordinator: DataUpdateCoordinator) -> None: - """Initialize a Sure Petcare sensor.""" - super().__init__(coordinator) + _attr_device_class = DEVICE_CLASS_BATTERY + _attr_native_unit_of_measurement = PERCENTAGE - self._id = _id + def __init__( + self, surepetcare_id: int, coordinator: SurePetcareDataCoordinator + ) -> None: + """Initialize a Sure Petcare battery sensor.""" + super().__init__(surepetcare_id, coordinator) - surepy_entity: SurepyEntity = coordinator.data[_id] - - self._attr_device_class = DEVICE_CLASS_BATTERY - if surepy_entity.name: - self._attr_name = f"{surepy_entity.type.name.capitalize()} {surepy_entity.name.capitalize()} Battery Level" - else: - self._attr_name = f"{surepy_entity.type.name.capitalize()} Battery Level" - self._attr_native_unit_of_measurement = PERCENTAGE - self._attr_unique_id = ( - f"{surepy_entity.household_id}-{surepy_entity.id}-battery" - ) - self._update_attr() + self._attr_name = f"{self._device_name} Battery Level" + self._attr_unique_id = f"{self._device_id}-battery" @callback - def _handle_coordinator_update(self) -> None: - """Get the latest data and update the state.""" - self._update_attr() - self.async_write_ha_state() - - @callback - def _update_attr(self) -> None: + def _update_attr(self, surepy_entity: SurepyEntity) -> None: """Update the state and attributes.""" - surepy_entity = self.coordinator.data[self._id] state = surepy_entity.raw_data()["status"] try: @@ -94,4 +78,3 @@ class SureBattery(CoordinatorEntity, SensorEntity): } else: self._attr_extra_state_attributes = {} - _LOGGER.debug("%s -> state: %s", self.name, state) diff --git a/tests/components/surepetcare/test_sensor.py b/tests/components/surepetcare/test_sensor.py index cbf69bb97dc..9edc28dc6dc 100644 --- a/tests/components/surepetcare/test_sensor.py +++ b/tests/components/surepetcare/test_sensor.py @@ -6,9 +6,9 @@ from homeassistant.setup import async_setup_component from . import HOUSEHOLD_ID, MOCK_CONFIG EXPECTED_ENTITY_IDS = { - "sensor.pet_flap_pet_flap_battery_level": f"{HOUSEHOLD_ID}-13576-battery", - "sensor.cat_flap_cat_flap_battery_level": f"{HOUSEHOLD_ID}-13579-battery", - "sensor.feeder_feeder_battery_level": f"{HOUSEHOLD_ID}-12345-battery", + "sensor.pet_flap_battery_level": f"{HOUSEHOLD_ID}-13576-battery", + "sensor.cat_flap_battery_level": f"{HOUSEHOLD_ID}-13579-battery", + "sensor.feeder_battery_level": f"{HOUSEHOLD_ID}-12345-battery", }