Added Alexa Music
This commit is contained in:
@@ -0,0 +1,99 @@
|
||||
"""Optimized DataUpdateCoordinator for Alexa Media Player.
|
||||
|
||||
Optimizations:
|
||||
- Debouncer for request coalescing
|
||||
- Type-safe runtime data integration
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
from datetime import timedelta
|
||||
import logging
|
||||
from typing import TYPE_CHECKING, Any, Callable
|
||||
|
||||
from homeassistant.helpers.debounce import Debouncer
|
||||
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator
|
||||
|
||||
from .const import DOMAIN, SCAN_INTERVAL
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from homeassistant.core import HomeAssistant
|
||||
|
||||
from .runtime_data import AlexaRuntimeData
|
||||
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
|
||||
# Debounce cooldown in seconds - prevents API hammering during push bursts
|
||||
REQUEST_REFRESH_DEBOUNCE_COOLDOWN = 1.5
|
||||
|
||||
|
||||
class AlexaMediaCoordinator(DataUpdateCoordinator[dict[str, Any]]):
|
||||
"""Coordinator for Alexa Media Player.
|
||||
|
||||
Features:
|
||||
- Debounced refresh requests to avoid API hammering
|
||||
- Type-safe integration with runtime_data
|
||||
"""
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
hass: HomeAssistant,
|
||||
runtime_data: AlexaRuntimeData | None,
|
||||
update_method: Callable,
|
||||
scan_interval: float | None = None,
|
||||
) -> None:
|
||||
"""Initialize the coordinator.
|
||||
|
||||
Args:
|
||||
hass: Home Assistant instance
|
||||
runtime_data: Runtime data for this config entry
|
||||
update_method: Async method to fetch data
|
||||
scan_interval: Polling interval in seconds (default: SCAN_INTERVAL)
|
||||
"""
|
||||
self.runtime_data = runtime_data
|
||||
self._scan_interval = scan_interval or SCAN_INTERVAL.total_seconds()
|
||||
|
||||
# Calculate update interval based on HTTP2 status
|
||||
http2_enabled = runtime_data.http2 is not None if runtime_data else False
|
||||
update_interval = timedelta(
|
||||
seconds=self._scan_interval * 10 if http2_enabled else self._scan_interval
|
||||
)
|
||||
|
||||
# Initialize debouncer for request coalescing
|
||||
# This prevents multiple rapid refresh requests from hammering the API
|
||||
debouncer = Debouncer(
|
||||
hass,
|
||||
_LOGGER,
|
||||
cooldown=REQUEST_REFRESH_DEBOUNCE_COOLDOWN,
|
||||
immediate=True,
|
||||
)
|
||||
|
||||
super().__init__(
|
||||
hass,
|
||||
_LOGGER,
|
||||
name=DOMAIN,
|
||||
config_entry=(
|
||||
runtime_data.config_entry
|
||||
if runtime_data and runtime_data.config_entry
|
||||
else None
|
||||
),
|
||||
update_method=update_method,
|
||||
update_interval=update_interval,
|
||||
request_refresh_debouncer=debouncer,
|
||||
)
|
||||
|
||||
def set_http2_status(self, enabled: bool) -> None:
|
||||
"""Update polling interval based on HTTP2 connection status.
|
||||
|
||||
When HTTP2 is enabled, we can poll less frequently since we get push updates.
|
||||
"""
|
||||
new_interval = timedelta(
|
||||
seconds=self._scan_interval * 10 if enabled else self._scan_interval
|
||||
)
|
||||
if self.update_interval != new_interval:
|
||||
self.update_interval = new_interval
|
||||
_LOGGER.debug(
|
||||
"Updated polling interval: %s (HTTP2: %s)",
|
||||
new_interval,
|
||||
enabled,
|
||||
)
|
||||
Reference in New Issue
Block a user