Home Assistant Unofficial Reference 2024.12.1
rest_api.py
Go to the documentation of this file.
1 """Event parser and human readable log generator."""
2 
3 from __future__ import annotations
4 
5 from collections.abc import Callable
6 from datetime import timedelta
7 from http import HTTPStatus
8 from typing import Any
9 
10 from aiohttp import web
11 import voluptuous as vol
12 
13 from homeassistant.components.http import KEY_HASS, HomeAssistantView
14 from homeassistant.components.recorder import get_instance
16 from homeassistant.core import HomeAssistant, callback
17 from homeassistant.exceptions import InvalidEntityFormatError
18 from homeassistant.helpers import config_validation as cv
19 from homeassistant.helpers.typing import ConfigType
20 import homeassistant.util.dt as dt_util
21 
22 from .helpers import async_determine_event_types
23 from .processor import EventProcessor
24 
25 
26 @callback
28  hass: HomeAssistant,
29  conf: ConfigType,
30  filters: Filters | None,
31  entities_filter: Callable[[str], bool] | None,
32 ) -> None:
33  """Set up the logbook rest API."""
34  hass.http.register_view(LogbookView(conf, filters, entities_filter))
35 
36 
37 class LogbookView(HomeAssistantView):
38  """Handle logbook view requests."""
39 
40  url = "/api/logbook"
41  name = "api:logbook"
42  extra_urls = ["/api/logbook/{datetime}"]
43 
44  def __init__(
45  self,
46  config: dict[str, Any],
47  filters: Filters | None,
48  entities_filter: Callable[[str], bool] | None,
49  ) -> None:
50  """Initialize the logbook view."""
51  self.configconfig = config
52  self.filtersfilters = filters
53  self.entities_filterentities_filter = entities_filter
54 
55  async def get(
56  self, request: web.Request, datetime: str | None = None
57  ) -> web.Response:
58  """Retrieve logbook entries."""
59  if datetime:
60  if (datetime_dt := dt_util.parse_datetime(datetime)) is None:
61  return self.json_message("Invalid datetime", HTTPStatus.BAD_REQUEST)
62  else:
63  datetime_dt = dt_util.start_of_local_day()
64 
65  if (period_str := request.query.get("period")) is None:
66  period: int = 1
67  else:
68  period = int(period_str)
69 
70  if entity_ids_str := request.query.get("entity"):
71  try:
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>"
77  ) from ex
78  else:
79  entity_ids = None
80 
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)
84  else:
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)
88  end_day = end_day_dt
89 
90  hass = request.app[KEY_HASS]
91 
92  context_id = request.query.get("context_id")
93 
94  if entity_ids and context_id:
95  return self.json_message(
96  "Can't combine entity with context_id", HTTPStatus.BAD_REQUEST
97  )
98 
99  event_types = async_determine_event_types(hass, entity_ids, None)
100  event_processor = EventProcessor(
101  hass,
102  event_types,
103  entity_ids,
104  None,
105  context_id,
106  timestamp=False,
107  include_entity_name=True,
108  )
109 
110  def json_events() -> web.Response:
111  """Fetch events and generate JSON."""
112  return self.json(event_processor.get_events(start_day, end_day))
113 
114  return await get_instance(hass).async_add_executor_job(json_events)
web.Response get(self, web.Request request, str|None datetime=None)
Definition: rest_api.py:57
None __init__(self, dict[str, Any] config, Filters|None filters, Callable[[str], bool]|None entities_filter)
Definition: rest_api.py:49
tuple[EventType[Any]|str,...] async_determine_event_types(HomeAssistant hass, list[str]|None entity_ids, list[str]|None device_ids)
Definition: helpers.py:67
None async_setup(HomeAssistant hass, ConfigType conf, Filters|None filters, Callable[[str], bool]|None entities_filter)
Definition: rest_api.py:32
Recorder get_instance(HomeAssistant hass)
Definition: recorder.py:74