Tune logbook performance to accomodate recent changes (#39348)
This commit is contained in:
parent
ad0d3b4848
commit
dda4cf4d58
4 changed files with 48 additions and 17 deletions
|
@ -12,14 +12,15 @@ def async_describe_events(hass, async_describe_event): # type: ignore
|
|||
@callback
|
||||
def async_describe_logbook_event(event): # type: ignore
|
||||
"""Describe a logbook event."""
|
||||
data = event.data
|
||||
message = "has been triggered"
|
||||
if ATTR_SOURCE in event.data:
|
||||
message = f"{message} by {event.data[ATTR_SOURCE]}"
|
||||
if ATTR_SOURCE in data:
|
||||
message = f"{message} by {data[ATTR_SOURCE]}"
|
||||
return {
|
||||
"name": event.data.get(ATTR_NAME),
|
||||
"name": data.get(ATTR_NAME),
|
||||
"message": message,
|
||||
"source": event.data.get(ATTR_SOURCE),
|
||||
"entity_id": event.data.get(ATTR_ENTITY_ID),
|
||||
"source": data.get(ATTR_SOURCE),
|
||||
"entity_id": data.get(ATTR_ENTITY_ID),
|
||||
}
|
||||
|
||||
async_describe_event(
|
||||
|
|
|
@ -3,6 +3,7 @@ from datetime import timedelta
|
|||
from itertools import groupby
|
||||
import json
|
||||
import logging
|
||||
import re
|
||||
|
||||
import sqlalchemy
|
||||
from sqlalchemy.orm import aliased
|
||||
|
@ -50,6 +51,9 @@ from homeassistant.helpers.integration_platform import (
|
|||
from homeassistant.loader import bind_hass
|
||||
import homeassistant.util.dt as dt_util
|
||||
|
||||
ENTITY_ID_JSON_EXTRACT = re.compile('"entity_id": "([^"]+)"')
|
||||
DOMAIN_JSON_EXTRACT = re.compile('"domain": "([^"]+)"')
|
||||
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
|
||||
ATTR_MESSAGE = "message"
|
||||
|
@ -485,20 +489,17 @@ def _keep_event(hass, event, entities_filter):
|
|||
entity_id = event.entity_id
|
||||
elif event.event_type in HOMEASSISTANT_EVENTS:
|
||||
entity_id = f"{HA_DOMAIN}."
|
||||
elif event.event_type in hass.data[DOMAIN] and ATTR_ENTITY_ID not in event.data:
|
||||
# If the entity_id isn't described, use the domain that describes
|
||||
# the event for filtering.
|
||||
domain = hass.data[DOMAIN][event.event_type][0]
|
||||
if domain is None:
|
||||
return False
|
||||
entity_id = f"{domain}."
|
||||
elif event.event_type == EVENT_CALL_SERVICE:
|
||||
return False
|
||||
else:
|
||||
event_data = event.data
|
||||
entity_id = event_data.get(ATTR_ENTITY_ID)
|
||||
entity_id = event.data_entity_id
|
||||
if not entity_id:
|
||||
domain = event_data.get(ATTR_DOMAIN)
|
||||
if event.event_type in hass.data[DOMAIN]:
|
||||
# If the entity_id isn't described, use the domain that describes
|
||||
# the event for filtering.
|
||||
domain = hass.data[DOMAIN][event.event_type][0]
|
||||
else:
|
||||
domain = event.data_domain
|
||||
if domain is None:
|
||||
return False
|
||||
entity_id = f"{domain}."
|
||||
|
@ -689,6 +690,24 @@ class LazyEventPartialState:
|
|||
self.context_user_id = self._row.context_user_id
|
||||
self.time_fired_minute = self._row.time_fired.minute
|
||||
|
||||
@property
|
||||
def data_entity_id(self):
|
||||
"""Extract the entity id from the decoded data or json."""
|
||||
if self._event_data:
|
||||
return self._event_data.get(ATTR_ENTITY_ID)
|
||||
|
||||
result = ENTITY_ID_JSON_EXTRACT.search(self._row.event_data)
|
||||
return result and result.group(1)
|
||||
|
||||
@property
|
||||
def data_domain(self):
|
||||
"""Extract the domain from the decoded data or json."""
|
||||
if self._event_data:
|
||||
return self._event_data.get(ATTR_DOMAIN)
|
||||
|
||||
result = DOMAIN_JSON_EXTRACT.search(self._row.event_data)
|
||||
return result and result.group(1)
|
||||
|
||||
@property
|
||||
def attributes(self):
|
||||
"""State attributes."""
|
||||
|
|
|
@ -12,10 +12,11 @@ def async_describe_events(hass, async_describe_event):
|
|||
@callback
|
||||
def async_describe_logbook_event(event):
|
||||
"""Describe the logbook event."""
|
||||
data = event.data
|
||||
return {
|
||||
"name": event.data.get(ATTR_NAME),
|
||||
"name": data.get(ATTR_NAME),
|
||||
"message": "started",
|
||||
"entity_id": event.data.get(ATTR_ENTITY_ID),
|
||||
"entity_id": data.get(ATTR_ENTITY_ID),
|
||||
}
|
||||
|
||||
async_describe_event(DOMAIN, EVENT_SCRIPT_STARTED, async_describe_logbook_event)
|
||||
|
|
|
@ -2084,6 +2084,16 @@ async def test_logbook_context_from_template(hass, hass_client):
|
|||
class MockLazyEventPartialState(ha.Event):
|
||||
"""Minimal mock of a Lazy event."""
|
||||
|
||||
@property
|
||||
def data_entity_id(self):
|
||||
"""Lookup entity id."""
|
||||
return self.data.get(ATTR_ENTITY_ID)
|
||||
|
||||
@property
|
||||
def data_domain(self):
|
||||
"""Lookup domain."""
|
||||
return self.data.get(ATTR_DOMAIN)
|
||||
|
||||
@property
|
||||
def time_fired_minute(self):
|
||||
"""Minute the event was fired."""
|
||||
|
|
Loading…
Add table
Reference in a new issue