123 lines
4.4 KiB
Python
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 |