Files
HomeAssistance/custom_components/teamtracker/coordinator.py
T
2026-06-05 22:34:31 -04:00

123 lines
4.4 KiB
Python

""" TeamTracker Data Coordinator """
import locale
import logging
from async_timeout import timeout
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import CONF_NAME
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed
from .const import (
CONF_API_LANGUAGE,
CONF_CONFERENCE_ID,
CONF_LEAGUE_ID,
CONF_LEAGUE_PATH,
CONF_SPORT_PATH,
CONF_TEAM_ID,
DEFAULT_TIMEOUT,
)
from .parser_factory import get_parser
from .provider_factory import get_provider
_LOGGER = logging.getLogger(__name__)
class TeamTrackerCoordinator(DataUpdateCoordinator):
"""Class to manage fetching TeamTracker data."""
def __init__(self, hass, config, entry: ConfigEntry=None):
"""Initialize."""
self.name = config[CONF_NAME]
self.team_id = config[CONF_TEAM_ID]
self.league_id = config[CONF_LEAGUE_ID]
self.league_path = config[CONF_LEAGUE_PATH]
self.sport_path = config[CONF_SPORT_PATH]
self.conference_id = ""
if CONF_CONFERENCE_ID in config.keys():
if len(config[CONF_CONFERENCE_ID]) > 0:
self.conference_id = config[CONF_CONFERENCE_ID]
self.config = config
self.hass = hass
self.entry = entry #None if setup from YAML
self.provider = get_provider(self.sport_path, self.league_path, self.team_id, self)
self.parser = get_parser(self.provider.data_format, self)
self.parser.setup(self.name, self.sport_path, self.league_path, self.league_id, self.team_id)
self.update_interval = self.provider.DEFAULT_REFRESH_RATE
super().__init__(hass, _LOGGER, name=self.name, update_interval=self.provider.DEFAULT_REFRESH_RATE)
_LOGGER.debug(
"%s: Using default refresh rate (%s)", self.name, self.update_interval
)
#
# Return the language to use for the API
#
def get_lang(self):
"""Return language to use for API."""
try:
lang = self.hass.config.language
except:
lang, _ = locale.getlocale()
lang = lang or "en_US"
# Override language if is set in the configuration or options
if CONF_API_LANGUAGE in self.config.keys():
lang = self.config[CONF_API_LANGUAGE].lower()
if self.entry and self.entry.options and CONF_API_LANGUAGE in self.entry.options and len(self.entry.options[CONF_API_LANGUAGE])>=2:
lang = self.entry.options[CONF_API_LANGUAGE].lower()
return lang
#
# Set team info from service call
#
def update_team_info(self, sport_path, league_path, team_id, conference_id=""):
"""update team information when call_api service is called."""
self.sport_path = sport_path
self.league_path = league_path
self.league_id = "XXX"
self.team_id = team_id
self.conference_id = conference_id
self.parser.setup(self.name, self.sport_path, self.league_path, self.league_id, self.team_id)
#
# DataUpdateCoordinator Call Tree
#
# _async_update_data() - Top-level method called from HA to update sensor
# Gets response from provider, parses it, and updates the refresh rate if appropriate
#
async def _async_update_data(self):
"""Top-level method called from HA to update sensor, controls refresh rate."""
async with timeout(DEFAULT_TIMEOUT):
try:
response = await self.provider.async_update_sport_data()
values = self.parser.parse_response(response, self.get_lang())
# update the interval based on flag
if values.private_fast_refresh:
refresh_rate = self.provider.RAPID_REFRESH_RATE
else:
refresh_rate = self.provider.DEFAULT_REFRESH_RATE
if self.update_interval != refresh_rate:
self.update_interval = refresh_rate
_LOGGER.debug(
"%s: Updating to refresh rate (%s)", self.name, self.update_interval
)
except Exception as error:
_LOGGER.debug("%s: Error updating data: %s", self.name, error)
_LOGGER.debug("%s: Error type: %s", self.name, type(error).__name__)
_LOGGER.debug("%s: Additional information: %s", self.name, str(error))
raise UpdateFailed(error) from error
return values