From c8e3e2ce1b908a1c0d362750197d03389f3111c3 Mon Sep 17 00:00:00 2001 From: epenet <6771947+epenet@users.noreply.github.com> Date: Mon, 23 Sep 2024 12:42:22 +0200 Subject: [PATCH] Move rainmachine base entity to separate module (#126513) --- .../components/rainmachine/__init__.py | 65 +------------- .../components/rainmachine/binary_sensor.py | 4 +- .../components/rainmachine/button.py | 4 +- .../components/rainmachine/entity.py | 84 +++++++++++++++++++ homeassistant/components/rainmachine/model.py | 12 --- .../components/rainmachine/select.py | 4 +- .../components/rainmachine/sensor.py | 4 +- .../components/rainmachine/switch.py | 9 +- .../components/rainmachine/update.py | 4 +- 9 files changed, 97 insertions(+), 93 deletions(-) create mode 100644 homeassistant/components/rainmachine/entity.py delete mode 100644 homeassistant/components/rainmachine/model.py diff --git a/homeassistant/components/rainmachine/__init__.py b/homeassistant/components/rainmachine/__init__.py index f2e97aa7c24..4d486c9c6aa 100644 --- a/homeassistant/components/rainmachine/__init__.py +++ b/homeassistant/components/rainmachine/__init__.py @@ -31,8 +31,7 @@ from homeassistant.helpers import ( device_registry as dr, entity_registry as er, ) -from homeassistant.helpers.device_registry import DeviceInfo -from homeassistant.helpers.update_coordinator import CoordinatorEntity, UpdateFailed +from homeassistant.helpers.update_coordinator import UpdateFailed from homeassistant.util.dt import as_timestamp, utcnow from homeassistant.util.network import is_ip_address @@ -54,7 +53,6 @@ from .const import ( LOGGER, ) from .coordinator import RainMachineDataUpdateCoordinator -from .model import RainMachineEntityDescription DEFAULT_SSL = True @@ -528,64 +526,3 @@ async def async_reload_entry( ) -> None: """Handle an options update.""" await hass.config_entries.async_reload(entry.entry_id) - - -class RainMachineEntity(CoordinatorEntity[RainMachineDataUpdateCoordinator]): - """Define a generic RainMachine entity.""" - - _attr_has_entity_name = True - - def __init__( - self, - entry: RainMachineConfigEntry, - data: RainMachineData, - description: RainMachineEntityDescription, - ) -> None: - """Initialize.""" - super().__init__(data.coordinators[description.api_category]) - - self._attr_extra_state_attributes = {} - self._attr_unique_id = f"{data.controller.mac}_{description.key}" - self._entry = entry - self._data = data - self._version_coordinator = data.coordinators[DATA_API_VERSIONS] - self.entity_description = description - - @property - def device_info(self) -> DeviceInfo: - """Return device information about this controller.""" - return DeviceInfo( - identifiers={(DOMAIN, self._data.controller.mac)}, - configuration_url=( - f"https://{self._entry.data[CONF_IP_ADDRESS]}:" - f"{self._entry.data[CONF_PORT]}" - ), - connections={(dr.CONNECTION_NETWORK_MAC, self._data.controller.mac)}, - name=self._data.controller.name.capitalize(), - manufacturer="RainMachine", - model=( - f"Version {self._version_coordinator.data['hwVer']} " - f"(API: {self._version_coordinator.data['apiVer']})" - ), - sw_version=self._version_coordinator.data["swVer"], - ) - - @callback - def _handle_coordinator_update(self) -> None: - """Respond to a DataUpdateCoordinator update.""" - self.update_from_latest_data() - self.async_write_ha_state() - - async def async_added_to_hass(self) -> None: - """When entity is added to hass.""" - await super().async_added_to_hass() - self.async_on_remove( - self._version_coordinator.async_add_listener( - self._handle_coordinator_update, self.coordinator_context - ) - ) - self.update_from_latest_data() - - @callback - def update_from_latest_data(self) -> None: - """Update the state.""" diff --git a/homeassistant/components/rainmachine/binary_sensor.py b/homeassistant/components/rainmachine/binary_sensor.py index 574f458ec47..4ba9b58d596 100644 --- a/homeassistant/components/rainmachine/binary_sensor.py +++ b/homeassistant/components/rainmachine/binary_sensor.py @@ -11,9 +11,9 @@ from homeassistant.const import EntityCategory from homeassistant.core import HomeAssistant, callback from homeassistant.helpers.entity_platform import AddEntitiesCallback -from . import RainMachineConfigEntry, RainMachineEntity +from . import RainMachineConfigEntry from .const import DATA_PROVISION_SETTINGS, DATA_RESTRICTIONS_CURRENT -from .model import RainMachineEntityDescription +from .entity import RainMachineEntity, RainMachineEntityDescription from .util import ( EntityDomainReplacementStrategy, async_finish_entity_domain_replacements, diff --git a/homeassistant/components/rainmachine/button.py b/homeassistant/components/rainmachine/button.py index 7087e5e5b8e..2f68c6a8a9c 100644 --- a/homeassistant/components/rainmachine/button.py +++ b/homeassistant/components/rainmachine/button.py @@ -19,9 +19,9 @@ from homeassistant.exceptions import HomeAssistantError from homeassistant.helpers.dispatcher import async_dispatcher_send from homeassistant.helpers.entity_platform import AddEntitiesCallback -from . import RainMachineConfigEntry, RainMachineEntity +from . import RainMachineConfigEntry from .const import DATA_PROVISION_SETTINGS -from .model import RainMachineEntityDescription +from .entity import RainMachineEntity, RainMachineEntityDescription @dataclass(frozen=True, kw_only=True) diff --git a/homeassistant/components/rainmachine/entity.py b/homeassistant/components/rainmachine/entity.py new file mode 100644 index 00000000000..1289d3e808e --- /dev/null +++ b/homeassistant/components/rainmachine/entity.py @@ -0,0 +1,84 @@ +"""Support for RainMachine devices.""" + +from __future__ import annotations + +from dataclasses import dataclass + +from homeassistant.const import CONF_IP_ADDRESS, CONF_PORT +from homeassistant.core import callback +from homeassistant.helpers import device_registry as dr +from homeassistant.helpers.device_registry import DeviceInfo +from homeassistant.helpers.entity import EntityDescription +from homeassistant.helpers.update_coordinator import CoordinatorEntity + +from . import RainMachineConfigEntry, RainMachineData +from .const import DATA_API_VERSIONS, DOMAIN +from .coordinator import RainMachineDataUpdateCoordinator + + +@dataclass(frozen=True, kw_only=True) +class RainMachineEntityDescription(EntityDescription): + """Describe a RainMachine entity.""" + + api_category: str + + +class RainMachineEntity(CoordinatorEntity[RainMachineDataUpdateCoordinator]): + """Define a generic RainMachine entity.""" + + _attr_has_entity_name = True + + def __init__( + self, + entry: RainMachineConfigEntry, + data: RainMachineData, + description: RainMachineEntityDescription, + ) -> None: + """Initialize.""" + super().__init__(data.coordinators[description.api_category]) + + self._attr_extra_state_attributes = {} + self._attr_unique_id = f"{data.controller.mac}_{description.key}" + self._entry = entry + self._data = data + self._version_coordinator = data.coordinators[DATA_API_VERSIONS] + self.entity_description = description + + @property + def device_info(self) -> DeviceInfo: + """Return device information about this controller.""" + return DeviceInfo( + identifiers={(DOMAIN, self._data.controller.mac)}, + configuration_url=( + f"https://{self._entry.data[CONF_IP_ADDRESS]}:" + f"{self._entry.data[CONF_PORT]}" + ), + connections={(dr.CONNECTION_NETWORK_MAC, self._data.controller.mac)}, + name=self._data.controller.name.capitalize(), + manufacturer="RainMachine", + model=( + f"Version {self._version_coordinator.data['hwVer']} " + f"(API: {self._version_coordinator.data['apiVer']})" + ), + sw_version=self._version_coordinator.data["swVer"], + ) + + @callback + def _handle_coordinator_update(self) -> None: + """Respond to a DataUpdateCoordinator update.""" + self.update_from_latest_data() + self.async_write_ha_state() + + async def async_added_to_hass(self) -> None: + """When entity is added to hass.""" + await super().async_added_to_hass() + self.async_on_remove( + self._version_coordinator.async_add_listener( + self._handle_coordinator_update, self.coordinator_context + ) + ) + self.update_from_latest_data() + + @callback + def update_from_latest_data(self) -> None: + """Update the state.""" diff --git a/homeassistant/components/rainmachine/model.py b/homeassistant/components/rainmachine/model.py deleted file mode 100644 index ee5567112cf..00000000000 --- a/homeassistant/components/rainmachine/model.py +++ /dev/null @@ -1,12 +0,0 @@ -"""Define RainMachine data models.""" - -from dataclasses import dataclass - -from homeassistant.helpers.entity import EntityDescription - - -@dataclass(frozen=True, kw_only=True) -class RainMachineEntityDescription(EntityDescription): - """Describe a RainMachine entity.""" - - api_category: str diff --git a/homeassistant/components/rainmachine/select.py b/homeassistant/components/rainmachine/select.py index 73de33cc8ed..1d9225a5bb2 100644 --- a/homeassistant/components/rainmachine/select.py +++ b/homeassistant/components/rainmachine/select.py @@ -14,9 +14,9 @@ from homeassistant.exceptions import HomeAssistantError from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.util.unit_system import US_CUSTOMARY_SYSTEM, UnitSystem -from . import RainMachineConfigEntry, RainMachineData, RainMachineEntity +from . import RainMachineConfigEntry, RainMachineData from .const import DATA_RESTRICTIONS_UNIVERSAL -from .model import RainMachineEntityDescription +from .entity import RainMachineEntity, RainMachineEntityDescription from .util import key_exists diff --git a/homeassistant/components/rainmachine/sensor.py b/homeassistant/components/rainmachine/sensor.py index 5363000a8ac..64f9ecf3990 100644 --- a/homeassistant/components/rainmachine/sensor.py +++ b/homeassistant/components/rainmachine/sensor.py @@ -20,9 +20,9 @@ from homeassistant.core import HomeAssistant, callback from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.util.dt import utc_from_timestamp, utcnow -from . import RainMachineConfigEntry, RainMachineData, RainMachineEntity +from . import RainMachineConfigEntry, RainMachineData from .const import DATA_PROGRAMS, DATA_PROVISION_SETTINGS, DATA_ZONES -from .model import RainMachineEntityDescription +from .entity import RainMachineEntity, RainMachineEntityDescription from .util import ( RUN_STATE_MAP, EntityDomainReplacementStrategy, diff --git a/homeassistant/components/rainmachine/switch.py b/homeassistant/components/rainmachine/switch.py index 8368db47d61..2a065f18976 100644 --- a/homeassistant/components/rainmachine/switch.py +++ b/homeassistant/components/rainmachine/switch.py @@ -20,12 +20,7 @@ from homeassistant.helpers import config_validation as cv, entity_platform from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.typing import VolDictType -from . import ( - RainMachineConfigEntry, - RainMachineData, - RainMachineEntity, - async_update_programs_and_zones, -) +from . import RainMachineConfigEntry, RainMachineData, async_update_programs_and_zones from .const import ( CONF_ALLOW_INACTIVE_ZONES_TO_RUN, CONF_DEFAULT_ZONE_RUN_TIME, @@ -37,7 +32,7 @@ from .const import ( DATA_ZONES, DEFAULT_ZONE_RUN, ) -from .model import RainMachineEntityDescription +from .entity import RainMachineEntity, RainMachineEntityDescription from .util import RUN_STATE_MAP, key_exists ATTR_ACTIVITY_TYPE = "activity_type" diff --git a/homeassistant/components/rainmachine/update.py b/homeassistant/components/rainmachine/update.py index a7c11061718..dbb91b70c85 100644 --- a/homeassistant/components/rainmachine/update.py +++ b/homeassistant/components/rainmachine/update.py @@ -16,9 +16,9 @@ from homeassistant.core import HomeAssistant, callback from homeassistant.exceptions import HomeAssistantError from homeassistant.helpers.entity_platform import AddEntitiesCallback -from . import RainMachineConfigEntry, RainMachineEntity +from . import RainMachineConfigEntry from .const import DATA_MACHINE_FIRMWARE_UPDATE_STATUS -from .model import RainMachineEntityDescription +from .entity import RainMachineEntity, RainMachineEntityDescription class UpdateStates(Enum):