Tune logbook performance to accomodate recent changes (#39348)

This commit is contained in:
J. Nick Koston 2020-08-30 02:20:31 -05:00 committed by GitHub
parent ad0d3b4848
commit dda4cf4d58
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 48 additions and 17 deletions

View File

@ -12,14 +12,15 @@ def async_describe_events(hass, async_describe_event): # type: ignore
@callback @callback
def async_describe_logbook_event(event): # type: ignore def async_describe_logbook_event(event): # type: ignore
"""Describe a logbook event.""" """Describe a logbook event."""
data = event.data
message = "has been triggered" message = "has been triggered"
if ATTR_SOURCE in event.data: if ATTR_SOURCE in data:
message = f"{message} by {event.data[ATTR_SOURCE]}" message = f"{message} by {data[ATTR_SOURCE]}"
return { return {
"name": event.data.get(ATTR_NAME), "name": data.get(ATTR_NAME),
"message": message, "message": message,
"source": event.data.get(ATTR_SOURCE), "source": data.get(ATTR_SOURCE),
"entity_id": event.data.get(ATTR_ENTITY_ID), "entity_id": data.get(ATTR_ENTITY_ID),
} }
async_describe_event( async_describe_event(

View File

@ -3,6 +3,7 @@ from datetime import timedelta
from itertools import groupby from itertools import groupby
import json import json
import logging import logging
import re
import sqlalchemy import sqlalchemy
from sqlalchemy.orm import aliased from sqlalchemy.orm import aliased
@ -50,6 +51,9 @@ from homeassistant.helpers.integration_platform import (
from homeassistant.loader import bind_hass from homeassistant.loader import bind_hass
import homeassistant.util.dt as dt_util 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__) _LOGGER = logging.getLogger(__name__)
ATTR_MESSAGE = "message" ATTR_MESSAGE = "message"
@ -485,20 +489,17 @@ def _keep_event(hass, event, entities_filter):
entity_id = event.entity_id entity_id = event.entity_id
elif event.event_type in HOMEASSISTANT_EVENTS: elif event.event_type in HOMEASSISTANT_EVENTS:
entity_id = f"{HA_DOMAIN}." 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: elif event.event_type == EVENT_CALL_SERVICE:
return False return False
else: else:
event_data = event.data entity_id = event.data_entity_id
entity_id = event_data.get(ATTR_ENTITY_ID)
if not 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: if domain is None:
return False return False
entity_id = f"{domain}." entity_id = f"{domain}."
@ -689,6 +690,24 @@ class LazyEventPartialState:
self.context_user_id = self._row.context_user_id self.context_user_id = self._row.context_user_id
self.time_fired_minute = self._row.time_fired.minute 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 @property
def attributes(self): def attributes(self):
"""State attributes.""" """State attributes."""

View File

@ -12,10 +12,11 @@ def async_describe_events(hass, async_describe_event):
@callback @callback
def async_describe_logbook_event(event): def async_describe_logbook_event(event):
"""Describe the logbook event.""" """Describe the logbook event."""
data = event.data
return { return {
"name": event.data.get(ATTR_NAME), "name": data.get(ATTR_NAME),
"message": "started", "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) async_describe_event(DOMAIN, EVENT_SCRIPT_STARTED, async_describe_logbook_event)

View File

@ -2084,6 +2084,16 @@ async def test_logbook_context_from_template(hass, hass_client):
class MockLazyEventPartialState(ha.Event): class MockLazyEventPartialState(ha.Event):
"""Minimal mock of a Lazy 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 @property
def time_fired_minute(self): def time_fired_minute(self):
"""Minute the event was fired.""" """Minute the event was fired."""