Home Assistant Unofficial Reference 2024.12.1
common.py
Go to the documentation of this file.
1 """Common vera code."""
2 
3 from __future__ import annotations
4 
5 from collections import defaultdict
6 from datetime import datetime
7 from typing import NamedTuple
8 
9 import pyvera as pv
10 
11 from homeassistant.config_entries import ConfigEntry
12 from homeassistant.const import Platform
13 from homeassistant.core import CALLBACK_TYPE, HomeAssistant
14 from homeassistant.helpers.event import call_later
15 
16 from .const import DOMAIN
17 
18 
19 class ControllerData(NamedTuple):
20  """Controller data."""
21 
22  controller: pv.VeraController
23  devices: defaultdict[Platform, list[pv.VeraDevice]]
24  scenes: list[pv.VeraScene]
25  config_entry: ConfigEntry
26 
27 
28 def get_configured_platforms(controller_data: ControllerData) -> set[Platform]:
29  """Get configured platforms for a controller."""
30  platforms: list[Platform] = list(controller_data.devices)
31 
32  if controller_data.scenes:
33  platforms.append(Platform.SCENE)
34 
35  return set(platforms)
36 
37 
39  hass: HomeAssistant, config_entry: ConfigEntry
40 ) -> ControllerData:
41  """Get controller data from hass data."""
42  return hass.data[DOMAIN][config_entry.entry_id]
43 
44 
46  hass: HomeAssistant, config_entry: ConfigEntry, data: ControllerData
47 ) -> None:
48  """Set controller data in hass data."""
49  hass.data[DOMAIN][config_entry.entry_id] = data
50 
51 
52 class SubscriptionRegistry(pv.AbstractSubscriptionRegistry):
53  """Manages polling for data from vera."""
54 
55  def __init__(self, hass: HomeAssistant) -> None:
56  """Initialize the object."""
57  super().__init__()
58  self._hass_hass = hass
59  self._cancel_poll_cancel_poll: CALLBACK_TYPE | None = None
60 
61  def start(self) -> None:
62  """Start polling for data."""
63  self.stopstop()
64  self._schedule_poll_schedule_poll(1)
65 
66  def stop(self) -> None:
67  """Stop polling for data."""
68  if self._cancel_poll_cancel_poll:
69  self._cancel_poll_cancel_poll()
70  self._cancel_poll_cancel_poll = None
71 
72  def _schedule_poll(self, delay: float) -> None:
73  self._cancel_poll_cancel_poll = call_later(self._hass_hass, delay, self._run_poll_server_run_poll_server)
74 
75  def _run_poll_server(self, now: datetime) -> None:
76  delay = 1
77 
78  # Long poll for changes. The downstream API instructs the endpoint to wait a
79  # a minimum of 200ms before returning data and a maximum of 9s before timing out.
80  if not self.poll_server_once():
81  # If an error was encountered, wait a bit longer before trying again.
82  delay = 60
83 
84  self._schedule_poll_schedule_poll(delay)
None set_controller_data(HomeAssistant hass, ConfigEntry config_entry, ControllerData data)
Definition: common.py:47
set[Platform] get_configured_platforms(ControllerData controller_data)
Definition: common.py:28
ControllerData get_controller_data(HomeAssistant hass, ConfigEntry config_entry)
Definition: common.py:40