1 """Event parser and human readable log generator."""
3 from __future__
import annotations
5 from collections.abc
import Callable
6 from datetime
import timedelta
7 from http
import HTTPStatus
10 from aiohttp
import web
11 import voluptuous
as vol
22 from .helpers
import async_determine_event_types
23 from .processor
import EventProcessor
30 filters: Filters |
None,
31 entities_filter: Callable[[str], bool] |
None,
33 """Set up the logbook rest API."""
34 hass.http.register_view(
LogbookView(conf, filters, entities_filter))
38 """Handle logbook view requests."""
42 extra_urls = [
"/api/logbook/{datetime}"]
46 config: dict[str, Any],
47 filters: Filters |
None,
48 entities_filter: Callable[[str], bool] |
None,
50 """Initialize the logbook view."""
56 self, request: web.Request, datetime: str |
None =
None
58 """Retrieve logbook entries."""
60 if (datetime_dt := dt_util.parse_datetime(datetime))
is None:
61 return self.json_message(
"Invalid datetime", HTTPStatus.BAD_REQUEST)
63 datetime_dt = dt_util.start_of_local_day()
65 if (period_str := request.query.get(
"period"))
is None:
68 period =
int(period_str)
70 if entity_ids_str := request.query.get(
"entity"):
72 entity_ids = cv.entity_ids(entity_ids_str)
73 except vol.Invalid
as ex:
75 f
"Invalid entity id(s) encountered: {entity_ids_str}. "
76 "Format should be <domain>.<object_id>"
81 if (end_time_str := request.query.get(
"end_time"))
is None:
82 start_day = dt_util.as_utc(datetime_dt) -
timedelta(days=period - 1)
83 end_day = start_day +
timedelta(days=period)
85 start_day = datetime_dt
86 if (end_day_dt := dt_util.parse_datetime(end_time_str))
is None:
87 return self.json_message(
"Invalid end_time", HTTPStatus.BAD_REQUEST)
90 hass = request.app[KEY_HASS]
92 context_id = request.query.get(
"context_id")
94 if entity_ids
and context_id:
95 return self.json_message(
96 "Can't combine entity with context_id", HTTPStatus.BAD_REQUEST
107 include_entity_name=
True,
110 def json_events() -> web.Response:
111 """Fetch events and generate JSON."""
112 return self.json(event_processor.get_events(start_day, end_day))
114 return await
get_instance(hass).async_add_executor_job(json_events)
web.Response get(self, web.Request request, str|None datetime=None)
None __init__(self, dict[str, Any] config, Filters|None filters, Callable[[str], bool]|None entities_filter)
tuple[EventType[Any]|str,...] async_determine_event_types(HomeAssistant hass, list[str]|None entity_ids, list[str]|None device_ids)
None async_setup(HomeAssistant hass, ConfigType conf, Filters|None filters, Callable[[str], bool]|None entities_filter)
Recorder get_instance(HomeAssistant hass)