Home Assistant Unofficial Reference 2024.12.1
entity.py
Go to the documentation of this file.
1 """Support for RainMachine devices."""
2 
3 from __future__ import annotations
4 
5 from dataclasses import dataclass
6 
7 from homeassistant.const import CONF_IP_ADDRESS, CONF_PORT
8 from homeassistant.core import callback
9 from homeassistant.helpers import device_registry as dr
10 from homeassistant.helpers.device_registry import DeviceInfo
11 from homeassistant.helpers.entity import EntityDescription
12 from homeassistant.helpers.update_coordinator import CoordinatorEntity
13 
14 from . import RainMachineConfigEntry, RainMachineData
15 from .const import DATA_API_VERSIONS, DOMAIN
16 from .coordinator import RainMachineDataUpdateCoordinator
17 
18 
19 @dataclass(frozen=True, kw_only=True)
21  """Describe a RainMachine entity."""
22 
23  api_category: str
24 
25 
26 class RainMachineEntity(CoordinatorEntity[RainMachineDataUpdateCoordinator]):
27  """Define a generic RainMachine entity."""
28 
29  _attr_has_entity_name = True
30 
31  def __init__(
32  self,
33  entry: RainMachineConfigEntry,
34  data: RainMachineData,
35  description: RainMachineEntityDescription,
36  ) -> None:
37  """Initialize."""
38  super().__init__(data.coordinators[description.api_category])
39 
40  self._attr_extra_state_attributes_attr_extra_state_attributes = {}
41  self._attr_unique_id_attr_unique_id = f"{data.controller.mac}_{description.key}"
42  self._entry_entry = entry
43  self._data_data = data
44  self._version_coordinator_version_coordinator = data.coordinators[DATA_API_VERSIONS]
45  self.entity_descriptionentity_description = description
46 
47  @property
48  def device_info(self) -> DeviceInfo:
49  """Return device information about this controller."""
50  return DeviceInfo(
51  identifiers={(DOMAIN, self._data_data.controller.mac)},
52  configuration_url=(
53  f"https://{self._entry.data[CONF_IP_ADDRESS]}:"
54  f"{self._entry.data[CONF_PORT]}"
55  ),
56  connections={(dr.CONNECTION_NETWORK_MAC, self._data_data.controller.mac)},
57  name=self._data_data.controller.name.capitalize(),
58  manufacturer="RainMachine",
59  model=(
60  f"Version {self._version_coordinator.data['hwVer']} "
61  f"(API: {self._version_coordinator.data['apiVer']})"
62  ),
63  sw_version=self._version_coordinator_version_coordinator.data["swVer"],
64  )
65 
66  @callback
67  def _handle_coordinator_update(self) -> None:
68  """Respond to a DataUpdateCoordinator update."""
69  self.update_from_latest_dataupdate_from_latest_data()
70  self.async_write_ha_state()
71 
72  async def async_added_to_hass(self) -> None:
73  """When entity is added to hass."""
74  await super().async_added_to_hass()
75  self.async_on_remove(
76  self._version_coordinator_version_coordinator.async_add_listener(
77  self._handle_coordinator_update_handle_coordinator_update, self.coordinator_context
78  )
79  )
80  self.update_from_latest_dataupdate_from_latest_data()
81 
82  @callback
83  def update_from_latest_data(self) -> None:
84  """Update the state."""
None __init__(self, RainMachineConfigEntry entry, RainMachineData data, RainMachineEntityDescription description)
Definition: entity.py:36
Callable[[], None] async_add_listener(self, CALLBACK_TYPE update_callback, Any context=None)