core/homeassistant/components/squeezebox/coordinator.py

73 lines
2.3 KiB
Python

"""DataUpdateCoordinator for the Squeezebox integration."""
from asyncio import timeout
from datetime import timedelta
import logging
import re
from pysqueezebox import Server
from homeassistant.core import HomeAssistant
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed
from homeassistant.util import dt as dt_util
from .const import (
SENSOR_UPDATE_INTERVAL,
STATUS_API_TIMEOUT,
STATUS_SENSOR_LASTSCAN,
STATUS_SENSOR_NEEDSRESTART,
STATUS_SENSOR_RESCAN,
)
_LOGGER = logging.getLogger(__name__)
class LMSStatusDataUpdateCoordinator(DataUpdateCoordinator):
"""LMS Status custom coordinator."""
def __init__(self, hass: HomeAssistant, lms: Server) -> None:
"""Initialize my coordinator."""
super().__init__(
hass,
_LOGGER,
name=lms.name,
update_interval=timedelta(seconds=SENSOR_UPDATE_INTERVAL),
always_update=False,
)
self.lms = lms
self.newversion_regex = re.compile("<.*$")
async def _async_update_data(self) -> dict:
"""Fetch data fromn LMS status call.
Then we process only a subset to make then nice for HA
"""
async with timeout(STATUS_API_TIMEOUT):
data = await self.lms.async_status()
if not data:
raise UpdateFailed("No data from status poll")
_LOGGER.debug("Raw serverstatus %s=%s", self.lms.name, data)
return self._prepare_status_data(data)
def _prepare_status_data(self, data: dict) -> dict:
"""Sensors that need the data changing for HA presentation."""
# Binary sensors
# rescan bool are we rescanning alter poll not present if false
data[STATUS_SENSOR_RESCAN] = STATUS_SENSOR_RESCAN in data
# needsrestart bool pending lms plugin updates not present if false
data[STATUS_SENSOR_NEEDSRESTART] = STATUS_SENSOR_NEEDSRESTART in data
# Sensors that need special handling
# 'lastscan': '1718431678', epoc -> ISO 8601 not always present
data[STATUS_SENSOR_LASTSCAN] = (
dt_util.utc_from_timestamp(int(data[STATUS_SENSOR_LASTSCAN]))
if STATUS_SENSOR_LASTSCAN in data
else None
)
_LOGGER.debug("Processed serverstatus %s=%s", self.lms.name, data)
return data