Home Assistant Unofficial Reference 2024.12.1
coordinator.py
Go to the documentation of this file.
1 """Coordinator for speedtestdotnet."""
2 
3 from datetime import timedelta
4 import logging
5 from typing import Any, cast
6 
7 import speedtest
8 
9 from homeassistant.config_entries import ConfigEntry
10 from homeassistant.core import HomeAssistant
11 from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed
12 
13 from .const import CONF_SERVER_ID, DEFAULT_SCAN_INTERVAL, DEFAULT_SERVER, DOMAIN
14 
15 _LOGGER = logging.getLogger(__name__)
16 
17 
19  """Get the latest data from speedtest.net."""
20 
21  config_entry: ConfigEntry
22 
23  def __init__(
24  self, hass: HomeAssistant, config_entry: ConfigEntry, api: speedtest.Speedtest
25  ) -> None:
26  """Initialize the data object."""
27  self.hasshasshass = hass
28  self.config_entryconfig_entryconfig_entry = config_entry
29  self.apiapi = api
30  self.servers: dict[str, dict] = {DEFAULT_SERVER: {}}
31  super().__init__(
32  self.hasshasshass,
33  _LOGGER,
34  name=DOMAIN,
35  update_interval=timedelta(minutes=DEFAULT_SCAN_INTERVAL),
36  )
37 
38  def update_servers(self) -> None:
39  """Update list of test servers."""
40  test_servers = self.apiapi.get_servers()
41  test_servers_list = [
42  server for servers in test_servers.values() for server in servers
43  ]
44  for server in sorted(
45  test_servers_list,
46  key=lambda server: (
47  server["country"],
48  server["name"],
49  server["sponsor"],
50  ),
51  ):
52  self.servers[
53  f"{server['country']} - {server['sponsor']} - {server['name']}"
54  ] = server
55 
56  def update_data(self) -> dict[str, Any]:
57  """Get the latest data from speedtest.net."""
58  self.update_serversupdate_servers()
59  self.apiapi.closest.clear()
60  if self.config_entryconfig_entryconfig_entry.options.get(CONF_SERVER_ID):
61  server_id = self.config_entryconfig_entryconfig_entry.options.get(CONF_SERVER_ID)
62  self.apiapi.get_servers(servers=[server_id])
63 
64  best_server = self.apiapi.get_best_server()
65  _LOGGER.debug(
66  "Executing speedtest.net speed test with server_id: %s",
67  best_server["id"],
68  )
69  self.apiapi.download()
70  self.apiapi.upload()
71  return cast(dict[str, Any], self.apiapi.results.dict())
72 
73  async def _async_update_data(self) -> dict[str, Any]:
74  """Update Speedtest data."""
75  try:
76  return await self.hasshasshass.async_add_executor_job(self.update_dataupdate_data)
77  except speedtest.NoMatchedServers as err:
78  raise UpdateFailed("Selected server is not found.") from err
79  except speedtest.SpeedtestException as err:
80  raise UpdateFailed(err) from err
None __init__(self, HomeAssistant hass, ConfigEntry config_entry, speedtest.Speedtest api)
Definition: coordinator.py:25