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
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(

View file

@ -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."""

View file

@ -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)

View file

@ -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."""