Home Assistant Unofficial Reference 2024.12.1
entity_registry.py
Go to the documentation of this file.
1 """Recorder entity registry helper."""
2 
3 import logging
4 from typing import TYPE_CHECKING
5 
6 from homeassistant.core import Event, HomeAssistant, callback
7 from homeassistant.helpers import entity_registry as er
8 from homeassistant.helpers.start import async_at_start
9 
10 from .core import Recorder
11 from .util import filter_unique_constraint_integrity_error, get_instance, session_scope
12 
13 _LOGGER = logging.getLogger(__name__)
14 
15 
16 @callback
17 def async_setup(hass: HomeAssistant) -> None:
18  """Set up the entity hooks."""
19 
20  @callback
21  def _async_entity_id_changed(
22  event: Event[er.EventEntityRegistryUpdatedData],
23  ) -> None:
24  instance = get_instance(hass)
25  if TYPE_CHECKING:
26  assert event.data["action"] == "update" and "old_entity_id" in event.data
27  old_entity_id = event.data["old_entity_id"]
28  new_entity_id = event.data["entity_id"]
29  instance.async_update_statistics_metadata(
30  old_entity_id, new_statistic_id=new_entity_id
31  )
32  instance.async_update_states_metadata(
33  old_entity_id, new_entity_id=new_entity_id
34  )
35 
36  @callback
37  def entity_registry_changed_filter(
38  event_data: er.EventEntityRegistryUpdatedData,
39  ) -> bool:
40  """Handle entity_id changed filter."""
41  return event_data["action"] == "update" and "old_entity_id" in event_data
42 
43  @callback
44  def _setup_entity_registry_event_handler(hass: HomeAssistant) -> None:
45  """Subscribe to event registry events."""
46  hass.bus.async_listen(
47  er.EVENT_ENTITY_REGISTRY_UPDATED,
48  _async_entity_id_changed,
49  event_filter=entity_registry_changed_filter,
50  )
51 
52  async_at_start(hass, _setup_entity_registry_event_handler)
53 
54 
56  instance: Recorder,
57  entity_id: str,
58  new_entity_id: str,
59 ) -> None:
60  """Update the states metadata table when an entity is renamed."""
61  states_meta_manager = instance.states_meta_manager
62  if not states_meta_manager.active:
63  _LOGGER.warning(
64  "Cannot rename entity_id `%s` to `%s` "
65  "because the states meta manager is not yet active",
66  entity_id,
67  new_entity_id,
68  )
69  return
70 
71  with session_scope(
72  session=instance.get_session(),
73  exception_filter=filter_unique_constraint_integrity_error(instance, "state"),
74  ) as session:
75  if not states_meta_manager.update_metadata(session, entity_id, new_entity_id):
76  _LOGGER.warning(
77  "Cannot migrate history for entity_id `%s` to `%s` "
78  "because the new entity_id is already in use",
79  entity_id,
80  new_entity_id,
81  )
None update_states_metadata(Recorder instance, str entity_id, str new_entity_id)
Callable[[Exception], bool] filter_unique_constraint_integrity_error(Recorder instance, str row_type)
Definition: util.py:948
Recorder get_instance(HomeAssistant hass)
Definition: recorder.py:74
Generator[Session] session_scope(*HomeAssistant|None hass=None, Session|None session=None, Callable[[Exception], bool]|None exception_filter=None, bool read_only=False)
Definition: recorder.py:86
CALLBACK_TYPE async_at_start(HomeAssistant hass, Callable[[HomeAssistant], Coroutine[Any, Any, None]|None] at_start_cb)
Definition: start.py:61