Home Assistant Unofficial Reference 2024.12.1
coordinator.py
Go to the documentation of this file.
1 """Datacoordinator for InComfort integration."""
2 
3 from dataclasses import dataclass, field
4 from datetime import timedelta
5 import logging
6 from typing import Any
7 
8 from aiohttp import ClientResponseError
9 from incomfortclient import (
10  Gateway as InComfortGateway,
11  Heater as InComfortHeater,
12  IncomfortError,
13 )
14 
15 from homeassistant.const import CONF_HOST
16 from homeassistant.core import HomeAssistant
17 from homeassistant.exceptions import ConfigEntryError
18 from homeassistant.helpers.aiohttp_client import async_get_clientsession
19 from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed
20 
21 _LOGGER = logging.getLogger(__name__)
22 
23 UPDATE_INTERVAL = 30
24 
25 
26 @dataclass
28  """Keep the Intergas InComfort entry data."""
29 
30  client: InComfortGateway
31  heaters: list[InComfortHeater] = field(default_factory=list)
32 
33 
35  hass: HomeAssistant,
36  entry_data: dict[str, Any],
37 ) -> InComfortData:
38  """Validate the configuration."""
39  credentials = dict(entry_data)
40  hostname = credentials.pop(CONF_HOST)
41 
42  client = InComfortGateway(
43  hostname, **credentials, session=async_get_clientsession(hass)
44  )
45  heaters = await client.heaters()
46 
47  return InComfortData(client=client, heaters=heaters)
48 
49 
51  """Data coordinator for InComfort entities."""
52 
53  def __init__(self, hass: HomeAssistant, incomfort_data: InComfortData) -> None:
54  """Initialize coordinator."""
55  super().__init__(
56  hass,
57  _LOGGER,
58  name="InComfort datacoordinator",
59  update_interval=timedelta(seconds=UPDATE_INTERVAL),
60  )
61  self.incomfort_dataincomfort_data = incomfort_data
62 
63  async def _async_update_data(self) -> InComfortData:
64  """Fetch data from API endpoint."""
65  try:
66  for heater in self.incomfort_dataincomfort_data.heaters:
67  await heater.update()
68  except TimeoutError as exc:
69  raise UpdateFailed from exc
70  except IncomfortError as exc:
71  if isinstance(exc.message, ClientResponseError):
72  if exc.message.status == 401:
73  raise ConfigEntryError("Incorrect credentials") from exc
74  raise UpdateFailed from exc
75  return self.incomfort_dataincomfort_data
None __init__(self, HomeAssistant hass, InComfortData incomfort_data)
Definition: coordinator.py:53
InComfortData async_connect_gateway(HomeAssistant hass, dict[str, Any] entry_data)
Definition: coordinator.py:37
aiohttp.ClientSession async_get_clientsession(HomeAssistant hass, bool verify_ssl=True, socket.AddressFamily family=socket.AF_UNSPEC, ssl_util.SSLCipherList ssl_cipher=ssl_util.SSLCipherList.PYTHON_DEFAULT)