72 lines
2.3 KiB
Python
72 lines
2.3 KiB
Python
"""Recorder entity registry helper."""
|
|
import logging
|
|
|
|
from homeassistant.core import Event, HomeAssistant, callback
|
|
from homeassistant.helpers import entity_registry as er
|
|
from homeassistant.helpers.start import async_at_start
|
|
|
|
from .core import Recorder
|
|
from .util import get_instance, session_scope
|
|
|
|
_LOGGER = logging.getLogger(__name__)
|
|
|
|
|
|
@callback
|
|
def async_setup(hass: HomeAssistant) -> None:
|
|
"""Set up the entity hooks."""
|
|
|
|
@callback
|
|
def _async_entity_id_changed(event: Event) -> None:
|
|
instance = get_instance(hass)
|
|
old_entity_id: str = event.data["old_entity_id"]
|
|
new_entity_id: str = event.data["entity_id"]
|
|
instance.async_update_statistics_metadata(
|
|
old_entity_id, new_statistic_id=new_entity_id
|
|
)
|
|
instance.async_update_states_metadata(
|
|
old_entity_id, new_entity_id=new_entity_id
|
|
)
|
|
|
|
@callback
|
|
def entity_registry_changed_filter(event: Event) -> bool:
|
|
"""Handle entity_id changed filter."""
|
|
return event.data["action"] == "update" and "old_entity_id" in event.data
|
|
|
|
@callback
|
|
def _setup_entity_registry_event_handler(hass: HomeAssistant) -> None:
|
|
"""Subscribe to event registry events."""
|
|
hass.bus.async_listen(
|
|
er.EVENT_ENTITY_REGISTRY_UPDATED,
|
|
_async_entity_id_changed,
|
|
event_filter=entity_registry_changed_filter,
|
|
run_immediately=True,
|
|
)
|
|
|
|
async_at_start(hass, _setup_entity_registry_event_handler)
|
|
|
|
|
|
def update_states_metadata(
|
|
instance: Recorder,
|
|
entity_id: str,
|
|
new_entity_id: str,
|
|
) -> None:
|
|
"""Update the states metadata table when an entity is renamed."""
|
|
states_meta_manager = instance.states_meta_manager
|
|
if not states_meta_manager.active:
|
|
_LOGGER.warning(
|
|
"Cannot rename entity_id `%s` to `%s` "
|
|
"because the states meta manager is not yet active",
|
|
entity_id,
|
|
new_entity_id,
|
|
)
|
|
return
|
|
|
|
with session_scope(session=instance.get_session()) as session:
|
|
if not states_meta_manager.update_metadata(session, entity_id, new_entity_id):
|
|
_LOGGER.warning(
|
|
"Cannot migrate history for entity_id `%s` to `%s` "
|
|
"because the new entity_id is already in use",
|
|
entity_id,
|
|
new_entity_id,
|
|
)
|