Home Assistant Unofficial Reference 2024.12.1
entity.py
Go to the documentation of this file.
1 """An entity class for mobile_app."""
2 
3 from __future__ import annotations
4 
5 from typing import Any
6 
7 from homeassistant.config_entries import ConfigEntry
8 from homeassistant.const import ATTR_ICON, CONF_NAME, CONF_UNIQUE_ID, STATE_UNAVAILABLE
9 from homeassistant.core import State, callback
10 from homeassistant.helpers.dispatcher import async_dispatcher_connect
11 from homeassistant.helpers.restore_state import RestoreEntity
12 
13 from .const import (
14  ATTR_SENSOR_ATTRIBUTES,
15  ATTR_SENSOR_DEVICE_CLASS,
16  ATTR_SENSOR_DISABLED,
17  ATTR_SENSOR_ENTITY_CATEGORY,
18  ATTR_SENSOR_ICON,
19  ATTR_SENSOR_STATE,
20  ATTR_SENSOR_STATE_CLASS,
21  SIGNAL_SENSOR_UPDATE,
22 )
23 from .helpers import device_info
24 
25 
27  """Representation of a mobile app entity."""
28 
29  _attr_should_poll = False
30 
31  def __init__(self, config: dict, entry: ConfigEntry) -> None:
32  """Initialize the entity."""
33  self._config_config = config
34  self._entry_entry = entry
35  self._registration_registration = entry.data
36  self._attr_unique_id_attr_unique_id = config[CONF_UNIQUE_ID]
37  self._attr_entity_registry_enabled_default_attr_entity_registry_enabled_default = not config.get(
38  ATTR_SENSOR_DISABLED
39  )
40  self._attr_name_attr_name = config[CONF_NAME]
41  self._async_update_attr_from_config_async_update_attr_from_config()
42 
43  @callback
44  def _async_update_attr_from_config(self) -> None:
45  """Update the entity from the config."""
46  config = self._config_config
47  self._attr_device_class_attr_device_class = config.get(ATTR_SENSOR_DEVICE_CLASS)
48  self._attr_state_class_attr_state_class = config.get(ATTR_SENSOR_STATE_CLASS)
49  self._attr_extra_state_attributes_attr_extra_state_attributes = config[ATTR_SENSOR_ATTRIBUTES]
50  self._attr_icon_attr_icon = config[ATTR_SENSOR_ICON]
51  self._attr_entity_category_attr_entity_category = config.get(ATTR_SENSOR_ENTITY_CATEGORY)
52  self._attr_available_attr_available = config.get(ATTR_SENSOR_STATE) != STATE_UNAVAILABLE
53 
54  async def async_added_to_hass(self) -> None:
55  """Register callbacks."""
56  self.async_on_removeasync_on_remove(
58  self.hasshass,
59  f"{SIGNAL_SENSOR_UPDATE}-{self._attr_unique_id}",
60  self._handle_update_handle_update,
61  )
62  )
63 
64  if (state := await self.async_get_last_stateasync_get_last_state()) is None:
65  return
66 
67  await self.async_restore_last_stateasync_restore_last_state(state)
68 
69  async def async_restore_last_state(self, last_state: State) -> None:
70  """Restore previous state."""
71  config = self._config_config
72  config[ATTR_SENSOR_STATE] = last_state.state
73  config[ATTR_SENSOR_ATTRIBUTES] = {
74  **last_state.attributes,
75  **self._config_config[ATTR_SENSOR_ATTRIBUTES],
76  }
77  if ATTR_ICON in last_state.attributes:
78  config[ATTR_SENSOR_ICON] = last_state.attributes[ATTR_ICON]
79 
80  @property
81  def device_info(self):
82  """Return device registry information for this entity."""
83  return device_info(self._registration_registration)
84 
85  @callback
86  def _handle_update(self, data: dict[str, Any]) -> None:
87  """Handle async event updates."""
88  self._config_config.update(data)
89  self._async_update_attr_from_config_async_update_attr_from_config()
90  self.async_write_ha_stateasync_write_ha_state()
None async_restore_last_state(self, State last_state)
Definition: entity.py:69
None __init__(self, dict config, ConfigEntry entry)
Definition: entity.py:31
None _handle_update(self, dict[str, Any] data)
Definition: entity.py:86
None async_on_remove(self, CALLBACK_TYPE func)
Definition: entity.py:1331
Callable[[], None] async_dispatcher_connect(HomeAssistant hass, str signal, Callable[..., Any] target)
Definition: dispatcher.py:103