Home Assistant Unofficial Reference 2024.12.1
coordinator.py
Go to the documentation of this file.
1 """Coordinator for 17Track."""
2 
3 from dataclasses import dataclass
4 from typing import Any
5 
6 from pyseventeentrack import Client as SeventeenTrackClient
7 from pyseventeentrack.errors import SeventeenTrackError
8 from pyseventeentrack.package import Package
9 
10 from homeassistant.config_entries import ConfigEntry
11 from homeassistant.core import HomeAssistant
12 from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed
13 from homeassistant.util import slugify
14 
15 from .const import (
16  CONF_SHOW_ARCHIVED,
17  CONF_SHOW_DELIVERED,
18  DEFAULT_SCAN_INTERVAL,
19  DOMAIN,
20  LOGGER,
21 )
22 
23 
24 @dataclass
26  """Class for handling the data retrieval."""
27 
28  summary: dict[str, dict[str, Any]]
29  live_packages: dict[str, Package]
30 
31 
33  """Class to manage fetching 17Track data."""
34 
35  config_entry: ConfigEntry
36 
37  def __init__(self, hass: HomeAssistant, client: SeventeenTrackClient) -> None:
38  """Initialize."""
39  super().__init__(
40  hass,
41  LOGGER,
42  name=DOMAIN,
43  update_interval=DEFAULT_SCAN_INTERVAL,
44  )
45  self.show_deliveredshow_delivered = self.config_entryconfig_entry.options[CONF_SHOW_DELIVERED]
46  self.account_idaccount_id = client.profile.account_id
47 
48  self.show_archivedshow_archived = self.config_entryconfig_entry.options[CONF_SHOW_ARCHIVED]
49  self.clientclient = client
50 
51  async def _async_update_data(self) -> SeventeenTrackData:
52  """Fetch data from 17Track API."""
53 
54  try:
55  summary = await self.clientclient.profile.summary(
56  show_archived=self.show_archivedshow_archived
57  )
58 
59  live_packages = set(
60  await self.clientclient.profile.packages(show_archived=self.show_archivedshow_archived)
61  )
62 
63  except SeventeenTrackError as err:
64  raise UpdateFailed(err) from err
65 
66  summary_dict = {}
67  live_packages_dict = {}
68 
69  for status, quantity in summary.items():
70  summary_dict[slugify(status)] = {
71  "quantity": quantity,
72  "packages": [],
73  "status_name": status,
74  }
75 
76  for package in live_packages:
77  live_packages_dict[package.tracking_number] = package
78  summary_value = summary_dict.get(slugify(package.status))
79  if summary_value:
80  summary_value["packages"].append(package)
81 
82  return SeventeenTrackData(
83  summary=summary_dict, live_packages=live_packages_dict
84  )
None __init__(self, HomeAssistant hass, SeventeenTrackClient client)
Definition: coordinator.py:37