Home Assistant Unofficial Reference 2024.12.1
coordinator.py
Go to the documentation of this file.
1 """The FiveM update coordinator."""
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
9 
10 from fivem import FiveM, FiveMServerOfflineError
11 
12 from homeassistant.const import CONF_HOST, CONF_PORT
13 from homeassistant.core import HomeAssistant
14 from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed
15 
16 from .const import (
17  ATTR_PLAYERS_LIST,
18  ATTR_RESOURCES_LIST,
19  DOMAIN,
20  NAME_PLAYERS_MAX,
21  NAME_PLAYERS_ONLINE,
22  NAME_RESOURCES,
23  NAME_STATUS,
24  SCAN_INTERVAL,
25 )
26 
27 _LOGGER = logging.getLogger(__name__)
28 
29 
31  """Class to manage fetching FiveM data."""
32 
33  def __init__(
34  self, hass: HomeAssistant, config_data: Mapping[str, Any], unique_id: str
35  ) -> None:
36  """Initialize server instance."""
37  self.unique_idunique_id = unique_id
38  self.serverserver = None
39  self.versionversion = None
40  self.game_namegame_name: str | None = None
41 
42  self.hosthost = config_data[CONF_HOST]
43 
44  self._fivem_fivem = FiveM(self.hosthost, config_data[CONF_PORT])
45 
46  update_interval = timedelta(seconds=SCAN_INTERVAL)
47 
48  super().__init__(hass, _LOGGER, name=DOMAIN, update_interval=update_interval)
49 
50  async def initialize(self) -> None:
51  """Initialize the FiveM server."""
52  info = await self._fivem_fivem.get_info_raw()
53  self.serverserver = info["server"]
54  self.versionversion = info["version"]
55  self.game_namegame_name = info["vars"]["gamename"]
56 
57  async def _async_update_data(self) -> dict[str, Any]:
58  """Get server data from 3rd party library and update properties."""
59  try:
60  server = await self._fivem_fivem.get_server()
61  except FiveMServerOfflineError as err:
62  raise UpdateFailed from err
63 
64  players_list: list[str] = [player.name for player in server.players]
65  players_list.sort()
66 
67  resources_list = server.resources
68  resources_list.sort()
69 
70  return {
71  NAME_PLAYERS_ONLINE: len(players_list),
72  NAME_PLAYERS_MAX: server.max_players,
73  NAME_RESOURCES: len(resources_list),
74  NAME_STATUS: self.last_update_successlast_update_success,
75  ATTR_PLAYERS_LIST: players_list,
76  ATTR_RESOURCES_LIST: resources_list,
77  }
None __init__(self, HomeAssistant hass, Mapping[str, Any] config_data, str unique_id)
Definition: coordinator.py:35