Home Assistant Unofficial Reference 2024.12.1
common.py
Go to the documentation of this file.
1 """Common code for GogoGate2 component."""
2 
3 from __future__ import annotations
4 
5 from collections.abc import Mapping
6 from datetime import timedelta
7 import logging
8 from typing import Any, NamedTuple
9 
10 from ismartgate import (
11  AbstractGateApi,
12  GogoGate2Api,
13  GogoGate2InfoResponse,
14  ISmartGateApi,
15  ISmartGateInfoResponse,
16 )
17 from ismartgate.common import AbstractDoor
18 
19 from homeassistant.config_entries import ConfigEntry
20 from homeassistant.const import (
21  CONF_DEVICE,
22  CONF_IP_ADDRESS,
23  CONF_PASSWORD,
24  CONF_USERNAME,
25 )
26 from homeassistant.core import HomeAssistant
27 from homeassistant.helpers.httpx_client import get_async_client
28 from homeassistant.helpers.update_coordinator import UpdateFailed
29 
30 from .const import DATA_UPDATE_COORDINATOR, DEVICE_TYPE_ISMARTGATE, DOMAIN
31 from .coordinator import DeviceDataUpdateCoordinator
32 
33 _LOGGER = logging.getLogger(__name__)
34 
35 
36 class StateData(NamedTuple):
37  """State data for a cover entity."""
38 
39  config_unique_id: str
40  unique_id: str | None
41  door: AbstractDoor | None
42 
43 
45  hass: HomeAssistant, config_entry: ConfigEntry
46 ) -> DeviceDataUpdateCoordinator:
47  """Get an update coordinator."""
48  hass.data.setdefault(DOMAIN, {})
49  hass.data[DOMAIN].setdefault(config_entry.entry_id, {})
50  config_entry_data = hass.data[DOMAIN][config_entry.entry_id]
51 
52  if DATA_UPDATE_COORDINATOR not in config_entry_data:
53  api = get_api(hass, config_entry.data)
54 
55  async def async_update_data() -> GogoGate2InfoResponse | ISmartGateInfoResponse:
56  try:
57  return await api.async_info()
58  except Exception as exception:
59  raise UpdateFailed(
60  f"Error communicating with API: {exception}"
61  ) from exception
62 
63  config_entry_data[DATA_UPDATE_COORDINATOR] = DeviceDataUpdateCoordinator(
64  hass,
65  _LOGGER,
66  api,
67  # Name of the data. For logging purposes.
68  name="gogogate2",
69  update_method=async_update_data,
70  # Polling interval. Will only be polled if there are subscribers.
71  update_interval=timedelta(seconds=5),
72  )
73 
74  return config_entry_data[DATA_UPDATE_COORDINATOR]
75 
76 
77 def cover_unique_id(config_entry: ConfigEntry, door: AbstractDoor) -> str:
78  """Generate a cover entity unique id."""
79  return f"{config_entry.unique_id}_{door.door_id}"
80 
81 
83  config_entry: ConfigEntry, door: AbstractDoor, sensor_type: str
84 ) -> str:
85  """Generate a cover entity unique id."""
86  return f"{config_entry.unique_id}_{door.door_id}_{sensor_type}"
87 
88 
89 def get_api(hass: HomeAssistant, config_data: Mapping[str, Any]) -> AbstractGateApi:
90  """Get an api object for config data."""
91  gate_class = GogoGate2Api
92 
93  if config_data[CONF_DEVICE] == DEVICE_TYPE_ISMARTGATE:
94  gate_class = ISmartGateApi
95 
96  return gate_class(
97  config_data[CONF_IP_ADDRESS],
98  config_data[CONF_USERNAME],
99  config_data[CONF_PASSWORD],
100  httpx_async_client=get_async_client(hass),
101  )
str sensor_unique_id(ConfigEntry config_entry, AbstractDoor door, str sensor_type)
Definition: common.py:84
AbstractGateApi get_api(HomeAssistant hass, Mapping[str, Any] config_data)
Definition: common.py:89
DeviceDataUpdateCoordinator get_data_update_coordinator(HomeAssistant hass, ConfigEntry config_entry)
Definition: common.py:46
str cover_unique_id(ConfigEntry config_entry, AbstractDoor door)
Definition: common.py:77
httpx.AsyncClient get_async_client(HomeAssistant hass, bool verify_ssl=True)
Definition: httpx_client.py:41