Home Assistant Unofficial Reference 2024.12.1
entity.py
Go to the documentation of this file.
1 """Base for Hass.io entities."""
2 
3 from __future__ import annotations
4 
5 from typing import Any
6 
7 from homeassistant.helpers.device_registry import DeviceInfo
8 from homeassistant.helpers.entity import EntityDescription
9 from homeassistant.helpers.update_coordinator import CoordinatorEntity
10 
11 from .const import (
12  ATTR_SLUG,
13  CONTAINER_STATS,
14  CORE_CONTAINER,
15  DATA_KEY_ADDONS,
16  DATA_KEY_CORE,
17  DATA_KEY_HOST,
18  DATA_KEY_OS,
19  DATA_KEY_SUPERVISOR,
20  DOMAIN,
21  KEY_TO_UPDATE_TYPES,
22  SUPERVISOR_CONTAINER,
23 )
24 from .coordinator import HassioDataUpdateCoordinator
25 
26 
27 class HassioAddonEntity(CoordinatorEntity[HassioDataUpdateCoordinator]):
28  """Base entity for a Hass.io add-on."""
29 
30  _attr_has_entity_name = True
31 
32  def __init__(
33  self,
34  coordinator: HassioDataUpdateCoordinator,
35  entity_description: EntityDescription,
36  addon: dict[str, Any],
37  ) -> None:
38  """Initialize base entity."""
39  super().__init__(coordinator)
40  self.entity_descriptionentity_description = entity_description
41  self._addon_slug_addon_slug = addon[ATTR_SLUG]
42  self._attr_unique_id_attr_unique_id = f"{addon[ATTR_SLUG]}_{entity_description.key}"
43  self._attr_device_info_attr_device_info = DeviceInfo(identifiers={(DOMAIN, addon[ATTR_SLUG])})
44 
45  @property
46  def available(self) -> bool:
47  """Return True if entity is available."""
48  return (
49  super().available
50  and DATA_KEY_ADDONS in self.coordinator.data
51  and self.entity_descriptionentity_description.key
52  in self.coordinator.data[DATA_KEY_ADDONS].get(self._addon_slug_addon_slug, {})
53  )
54 
55  async def async_added_to_hass(self) -> None:
56  """Subscribe to updates."""
57  await super().async_added_to_hass()
58  update_types = KEY_TO_UPDATE_TYPES[self.entity_descriptionentity_description.key]
59  self.async_on_remove(
60  self.coordinator.async_enable_container_updates(
61  self._addon_slug_addon_slug, self.entity_id, update_types
62  )
63  )
64  if CONTAINER_STATS in update_types:
65  await self.coordinator.async_request_refresh()
66 
67 
68 class HassioOSEntity(CoordinatorEntity[HassioDataUpdateCoordinator]):
69  """Base Entity for Hass.io OS."""
70 
71  _attr_has_entity_name = True
72 
73  def __init__(
74  self,
75  coordinator: HassioDataUpdateCoordinator,
76  entity_description: EntityDescription,
77  ) -> None:
78  """Initialize base entity."""
79  super().__init__(coordinator)
80  self.entity_descriptionentity_description = entity_description
81  self._attr_unique_id_attr_unique_id = f"home_assistant_os_{entity_description.key}"
82  self._attr_device_info_attr_device_info = DeviceInfo(identifiers={(DOMAIN, "OS")})
83 
84  @property
85  def available(self) -> bool:
86  """Return True if entity is available."""
87  return (
88  super().available
89  and DATA_KEY_OS in self.coordinator.data
90  and self.entity_descriptionentity_description.key in self.coordinator.data[DATA_KEY_OS]
91  )
92 
93 
94 class HassioHostEntity(CoordinatorEntity[HassioDataUpdateCoordinator]):
95  """Base Entity for Hass.io host."""
96 
97  _attr_has_entity_name = True
98 
99  def __init__(
100  self,
101  coordinator: HassioDataUpdateCoordinator,
102  entity_description: EntityDescription,
103  ) -> None:
104  """Initialize base entity."""
105  super().__init__(coordinator)
106  self.entity_descriptionentity_description = entity_description
107  self._attr_unique_id_attr_unique_id = f"home_assistant_host_{entity_description.key}"
108  self._attr_device_info_attr_device_info = DeviceInfo(identifiers={(DOMAIN, "host")})
109 
110  @property
111  def available(self) -> bool:
112  """Return True if entity is available."""
113  return (
114  super().available
115  and DATA_KEY_HOST in self.coordinator.data
116  and self.entity_descriptionentity_description.key in self.coordinator.data[DATA_KEY_HOST]
117  )
118 
119 
120 class HassioSupervisorEntity(CoordinatorEntity[HassioDataUpdateCoordinator]):
121  """Base Entity for Supervisor."""
122 
123  _attr_has_entity_name = True
124 
125  def __init__(
126  self,
127  coordinator: HassioDataUpdateCoordinator,
128  entity_description: EntityDescription,
129  ) -> None:
130  """Initialize base entity."""
131  super().__init__(coordinator)
132  self.entity_descriptionentity_description = entity_description
133  self._attr_unique_id_attr_unique_id = f"home_assistant_supervisor_{entity_description.key}"
134  self._attr_device_info_attr_device_info = DeviceInfo(identifiers={(DOMAIN, "supervisor")})
135 
136  @property
137  def available(self) -> bool:
138  """Return True if entity is available."""
139  return (
140  super().available
141  and DATA_KEY_SUPERVISOR in self.coordinator.data
142  and self.entity_descriptionentity_description.key
143  in self.coordinator.data[DATA_KEY_SUPERVISOR]
144  )
145 
146  async def async_added_to_hass(self) -> None:
147  """Subscribe to updates."""
148  await super().async_added_to_hass()
149  update_types = KEY_TO_UPDATE_TYPES[self.entity_descriptionentity_description.key]
150  self.async_on_remove(
151  self.coordinator.async_enable_container_updates(
152  SUPERVISOR_CONTAINER, self.entity_id, update_types
153  )
154  )
155  if CONTAINER_STATS in update_types:
156  await self.coordinator.async_request_refresh()
157 
158 
159 class HassioCoreEntity(CoordinatorEntity[HassioDataUpdateCoordinator]):
160  """Base Entity for Core."""
161 
162  _attr_has_entity_name = True
163 
164  def __init__(
165  self,
166  coordinator: HassioDataUpdateCoordinator,
167  entity_description: EntityDescription,
168  ) -> None:
169  """Initialize base entity."""
170  super().__init__(coordinator)
171  self.entity_descriptionentity_description = entity_description
172  self._attr_unique_id_attr_unique_id = f"home_assistant_core_{entity_description.key}"
173  self._attr_device_info_attr_device_info = DeviceInfo(identifiers={(DOMAIN, "core")})
174 
175  @property
176  def available(self) -> bool:
177  """Return True if entity is available."""
178  return (
179  super().available
180  and DATA_KEY_CORE in self.coordinator.data
181  and self.entity_descriptionentity_description.key in self.coordinator.data[DATA_KEY_CORE]
182  )
183 
184  async def async_added_to_hass(self) -> None:
185  """Subscribe to updates."""
186  await super().async_added_to_hass()
187  update_types = KEY_TO_UPDATE_TYPES[self.entity_descriptionentity_description.key]
188  self.async_on_remove(
189  self.coordinator.async_enable_container_updates(
190  CORE_CONTAINER, self.entity_id, update_types
191  )
192  )
193  if CONTAINER_STATS in update_types:
194  await self.coordinator.async_request_refresh()
CALLBACK_TYPE async_enable_container_updates(self, str slug, str entity_id, set[str] types)
Definition: coordinator.py:537
None __init__(self, HassioDataUpdateCoordinator coordinator, EntityDescription entity_description, dict[str, Any] addon)
Definition: entity.py:37
None __init__(self, HassioDataUpdateCoordinator coordinator, EntityDescription entity_description)
Definition: entity.py:168
None __init__(self, HassioDataUpdateCoordinator coordinator, EntityDescription entity_description)
Definition: entity.py:103
None __init__(self, HassioDataUpdateCoordinator coordinator, EntityDescription entity_description)
Definition: entity.py:77
None __init__(self, HassioDataUpdateCoordinator coordinator, EntityDescription entity_description)
Definition: entity.py:129
web.Response get(self, web.Request request, str config_key)
Definition: view.py:88