Home Assistant Unofficial Reference 2024.12.1
coordinator.py
Go to the documentation of this file.
1 """DataUpdateCoordinator for the Homeassistant Analytics integration."""
2 
3 from __future__ import annotations
4 
5 from dataclasses import dataclass
6 from datetime import timedelta
7 from typing import TYPE_CHECKING
8 
9 from python_homeassistant_analytics import (
10  CustomIntegration,
11  HomeassistantAnalyticsClient,
12  HomeassistantAnalyticsConnectionError,
13  HomeassistantAnalyticsNotModifiedError,
14 )
15 from python_homeassistant_analytics.models import Addon
16 
17 from homeassistant.core import HomeAssistant
18 from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed
19 
20 from .const import (
21  CONF_TRACKED_ADDONS,
22  CONF_TRACKED_CUSTOM_INTEGRATIONS,
23  CONF_TRACKED_INTEGRATIONS,
24  DOMAIN,
25  LOGGER,
26 )
27 
28 if TYPE_CHECKING:
29  from . import AnalyticsInsightsConfigEntry
30 
31 
32 @dataclass(frozen=True)
34  """Analytics data class."""
35 
36  active_installations: int
37  reports_integrations: int
38  addons: dict[str, int]
39  core_integrations: dict[str, int]
40  custom_integrations: dict[str, int]
41 
42 
44  """A Homeassistant Analytics Data Update Coordinator."""
45 
46  config_entry: AnalyticsInsightsConfigEntry
47 
48  def __init__(
49  self, hass: HomeAssistant, client: HomeassistantAnalyticsClient
50  ) -> None:
51  """Initialize the Homeassistant Analytics data coordinator."""
52  super().__init__(
53  hass,
54  LOGGER,
55  name=DOMAIN,
56  update_interval=timedelta(hours=12),
57  )
58  self._client_client = client
59  self._tracked_addons_tracked_addons = self.config_entryconfig_entry.options.get(CONF_TRACKED_ADDONS, [])
60  self._tracked_integrations_tracked_integrations = self.config_entryconfig_entry.options[
61  CONF_TRACKED_INTEGRATIONS
62  ]
63  self._tracked_custom_integrations_tracked_custom_integrations = self.config_entryconfig_entry.options[
64  CONF_TRACKED_CUSTOM_INTEGRATIONS
65  ]
66 
67  async def _async_update_data(self) -> AnalyticsData:
68  try:
69  addons_data = await self._client_client.get_addons()
70  data = await self._client_client.get_current_analytics()
71  custom_data = await self._client_client.get_custom_integrations()
72  except HomeassistantAnalyticsConnectionError as err:
73  raise UpdateFailed(
74  "Error communicating with Homeassistant Analytics"
75  ) from err
76  except HomeassistantAnalyticsNotModifiedError:
77  return self.datadata
78  addons = {
79  addon: get_addon_value(addons_data, addon) for addon in self._tracked_addons_tracked_addons
80  }
81  core_integrations = {
82  integration: data.integrations.get(integration, 0)
83  for integration in self._tracked_integrations_tracked_integrations
84  }
85  custom_integrations = {
86  integration: get_custom_integration_value(custom_data, integration)
87  for integration in self._tracked_custom_integrations_tracked_custom_integrations
88  }
89  return AnalyticsData(
90  data.active_installations,
91  data.reports_integrations,
92  addons,
93  core_integrations,
94  custom_integrations,
95  )
96 
97 
98 def get_addon_value(data: dict[str, Addon], name_slug: str) -> int:
99  """Get addon value."""
100  if name_slug in data:
101  return data[name_slug].total
102  return 0
103 
104 
106  data: dict[str, CustomIntegration], domain: str
107 ) -> int:
108  """Get custom integration value."""
109  if domain in data:
110  return data[domain].total
111  return 0
None __init__(self, HomeAssistant hass, HomeassistantAnalyticsClient client)
Definition: coordinator.py:50
int get_addon_value(dict[str, Addon] data, str name_slug)
Definition: coordinator.py:98
int get_custom_integration_value(dict[str, CustomIntegration] data, str domain)
Definition: coordinator.py:107