Home Assistant Unofficial Reference 2024.12.1
__init__.py
Go to the documentation of this file.
1 """Queries for logbook."""
2 
3 from __future__ import annotations
4 
5 from collections.abc import Collection
6 from datetime import datetime as dt
7 
8 from sqlalchemy.sql.lambdas import StatementLambdaElement
9 
11 from homeassistant.components.recorder.models import ulid_to_bytes_or_none
12 from homeassistant.helpers.json import json_dumps
13 
14 from .all import all_stmt
15 from .devices import devices_stmt
16 from .entities import entities_stmt
17 from .entities_and_devices import entities_devices_stmt
18 
19 
21  start_day_dt: dt,
22  end_day_dt: dt,
23  event_type_ids: tuple[int, ...],
24  entity_ids: list[str] | None = None,
25  states_metadata_ids: Collection[int] | None = None,
26  device_ids: list[str] | None = None,
27  filters: Filters | None = None,
28  context_id: str | None = None,
29 ) -> StatementLambdaElement:
30  """Generate the logbook statement for a logbook request."""
31  start_day = start_day_dt.timestamp()
32  end_day = end_day_dt.timestamp()
33  # No entities: logbook sends everything for the timeframe
34  # limited by the context_id and the yaml configured filter
35  if not entity_ids and not device_ids:
36  context_id_bin = ulid_to_bytes_or_none(context_id)
37  return all_stmt(
38  start_day,
39  end_day,
40  event_type_ids,
41  filters,
42  context_id_bin,
43  )
44 
45  # sqlalchemy caches object quoting, the
46  # json quotable ones must be a different
47  # object from the non-json ones to prevent
48  # sqlalchemy from quoting them incorrectly
49 
50  # entities and devices: logbook sends everything for the timeframe for the entities and devices
51  if entity_ids and device_ids:
52  return entities_devices_stmt(
53  start_day,
54  end_day,
55  event_type_ids,
56  states_metadata_ids or [],
57  [json_dumps(entity_id) for entity_id in entity_ids],
58  [json_dumps(device_id) for device_id in device_ids],
59  )
60 
61  # entities: logbook sends everything for the timeframe for the entities
62  if entity_ids:
63  return entities_stmt(
64  start_day,
65  end_day,
66  event_type_ids,
67  states_metadata_ids or [],
68  [json_dumps(entity_id) for entity_id in entity_ids],
69  )
70 
71  # devices: logbook sends everything for the timeframe for the devices
72  assert device_ids is not None
73  return devices_stmt(
74  start_day,
75  end_day,
76  event_type_ids,
77  [json_dumps(device_id) for device_id in device_ids],
78  )
StatementLambdaElement all_stmt(float start_day, float end_day, tuple[int,...] event_type_ids, Filters|None filters, bytes|None context_id_bin=None)
Definition: all.py:25
StatementLambdaElement devices_stmt(float start_day, float end_day, tuple[int,...] event_type_ids, list[str] json_quotable_device_ids)
Definition: devices.py:83
StatementLambdaElement entities_devices_stmt(float start_day, float end_day, tuple[int,...] event_type_ids, Collection[int] states_metadata_ids, list[str] json_quoted_entity_ids, list[str] json_quoted_device_ids)
StatementLambdaElement entities_stmt(float start_day, float end_day, tuple[int,...] event_type_ids, Collection[int] states_metadata_ids, list[str] json_quoted_entity_ids)
Definition: entities.py:102
StatementLambdaElement statement_for_request(dt start_day_dt, dt end_day_dt, tuple[int,...] event_type_ids, list[str]|None entity_ids=None, Collection[int]|None states_metadata_ids=None, list[str]|None device_ids=None, Filters|None filters=None, str|None context_id=None)
Definition: __init__.py:29
str json_dumps(Any data)
Definition: json.py:149