Home Assistant Unofficial Reference 2024.12.1
coordinator.py
Go to the documentation of this file.
1 """DataUpdateCoordinator for LaCrosse View."""
2 
3 from __future__ import annotations
4 
5 from datetime import timedelta
6 import logging
7 from time import time
8 
9 from lacrosse_view import HTTPError, LaCrosse, Location, LoginError, Sensor
10 
11 from homeassistant.config_entries import ConfigEntry
12 from homeassistant.core import HomeAssistant
13 from homeassistant.exceptions import ConfigEntryAuthFailed, ConfigEntryNotReady
14 from homeassistant.helpers.update_coordinator import DataUpdateCoordinator
15 
16 from .const import SCAN_INTERVAL
17 
18 _LOGGER = logging.getLogger(__name__)
19 
20 
22  """DataUpdateCoordinator for LaCrosse View."""
23 
24  username: str
25  password: str
26  name: str
27  id: str
28  hass: HomeAssistant
29 
30  def __init__(
31  self,
32  hass: HomeAssistant,
33  api: LaCrosse,
34  entry: ConfigEntry,
35  ) -> None:
36  """Initialize DataUpdateCoordinator for LaCrosse View."""
37  self.apiapi = api
38  self.last_updatelast_update = time()
39  self.usernameusername = entry.data["username"]
40  self.passwordpassword = entry.data["password"]
41  self.hasshasshass = hass
42  self.namenamename = entry.data["name"]
43  self.idid = entry.data["id"]
44  super().__init__(
45  hass,
46  _LOGGER,
47  name="LaCrosse View",
48  update_interval=timedelta(seconds=SCAN_INTERVAL),
49  )
50 
51  async def _async_update_data(self) -> list[Sensor]:
52  """Get the data for LaCrosse View."""
53  now = int(time())
54 
55  if self.last_updatelast_update < now - 59 * 60: # Get new token once in a hour
56  _LOGGER.debug("Refreshing token")
57  self.last_updatelast_update = now
58  try:
59  await self.apiapi.login(self.usernameusername, self.passwordpassword)
60  except LoginError as error:
61  raise ConfigEntryAuthFailed from error
62 
63  try:
64  # Fetch last hour of data
65  sensors = await self.apiapi.get_sensors(
66  location=Location(id=self.idid, name=self.namenamename),
67  tz=self.hasshasshass.config.time_zone,
68  start=str(now - 3600),
69  end=str(now),
70  )
71  except HTTPError as error:
72  raise ConfigEntryNotReady from error
73 
74  _LOGGER.debug("Got data: %s", sensors)
75 
76  # Verify that we have permission to read the sensors
77  for sensor in sensors:
78  if not sensor.permissions.get("read", False):
80  f"This account does not have permission to read {sensor.name}"
81  )
82 
83  return sensors
None __init__(self, HomeAssistant hass, LaCrosse api, ConfigEntry entry)
Definition: coordinator.py:35
bool time(HomeAssistant hass, dt_time|str|None before=None, dt_time|str|None after=None, str|Container[str]|None weekday=None)
Definition: condition.py:802