Home Assistant Unofficial Reference 2024.12.1
coordinator.py
Go to the documentation of this file.
1 """Data coordinator for receiving LD2410B updates."""
2 
3 from datetime import datetime
4 import logging
5 import time
6 
7 from ld2410_ble import LD2410BLE, LD2410BLEState
8 
9 from homeassistant.core import CALLBACK_TYPE, HassJob, HomeAssistant, callback
10 from homeassistant.helpers.event import async_call_later
11 from homeassistant.helpers.update_coordinator import DataUpdateCoordinator
12 
13 from .const import DOMAIN
14 
15 _LOGGER = logging.getLogger(__name__)
16 
17 NEVER_TIME = -86400.0
18 DEBOUNCE_SECONDS = 1.0
19 
20 
22  """Data coordinator for receiving LD2410B updates."""
23 
24  def __init__(self, hass: HomeAssistant, ld2410_ble: LD2410BLE) -> None:
25  """Initialise the coordinator."""
26  super().__init__(
27  hass,
28  _LOGGER,
29  name=DOMAIN,
30  )
31  self._ld2410_ble_ld2410_ble = ld2410_ble
32  ld2410_ble.register_callback(self._async_handle_update_async_handle_update)
33  ld2410_ble.register_disconnected_callback(self._async_handle_disconnect_async_handle_disconnect)
34  self.connectedconnected = False
35  self._last_update_time_last_update_time = NEVER_TIME
36  self._debounce_cancel_debounce_cancel: CALLBACK_TYPE | None = None
37  self._debounced_update_job_debounced_update_job = HassJob(
38  self._async_handle_debounced_update_async_handle_debounced_update,
39  f"LD2410 {ld2410_ble.address} BLE debounced update",
40  )
41 
42  @callback
43  def _async_handle_debounced_update(self, _now: datetime) -> None:
44  """Handle debounced update."""
45  self._debounce_cancel_debounce_cancel = None
46  self._last_update_time_last_update_time = time.monotonic()
47  self.async_set_updated_dataasync_set_updated_data(None)
48 
49  @callback
50  def _async_handle_update(self, state: LD2410BLEState) -> None:
51  """Just trigger the callbacks."""
52  self.connectedconnected = True
53  previous_last_updated_time = self._last_update_time_last_update_time
54  self._last_update_time_last_update_time = time.monotonic()
55  if self._last_update_time_last_update_time - previous_last_updated_time >= DEBOUNCE_SECONDS:
56  self.async_set_updated_dataasync_set_updated_data(None)
57  return
58  if self._debounce_cancel_debounce_cancel is None:
59  self._debounce_cancel_debounce_cancel = async_call_later(
60  self.hasshass, DEBOUNCE_SECONDS, self._debounced_update_job_debounced_update_job
61  )
62 
63  @callback
64  def _async_handle_disconnect(self) -> None:
65  """Trigger the callbacks for disconnected."""
66  self.connectedconnected = False
67  self.async_update_listenersasync_update_listeners()
68 
69  async def async_shutdown(self) -> None:
70  """Shutdown the coordinator."""
71  if self._debounce_cancel_debounce_cancel is not None:
72  self._debounce_cancel_debounce_cancel()
73  self._debounce_cancel_debounce_cancel = None
74  await super().async_shutdown()
None __init__(self, HomeAssistant hass, LD2410BLE ld2410_ble)
Definition: coordinator.py:24
CALLBACK_TYPE async_call_later(HomeAssistant hass, float|timedelta delay, HassJob[[datetime], Coroutine[Any, Any, None]|None]|Callable[[datetime], Coroutine[Any, Any, None]|None] action)
Definition: event.py:1597