From d019c25ae407aecc8fd32942c24ba3ef552afa44 Mon Sep 17 00:00:00 2001 From: epenet <6771947+epenet@users.noreply.github.com> Date: Thu, 16 May 2024 16:06:50 +0200 Subject: [PATCH] Move pvpc coordinator to separate module (#117559) --- .../pvpc_hourly_pricing/__init__.py | 54 +---------------- .../pvpc_hourly_pricing/coordinator.py | 59 +++++++++++++++++++ .../components/pvpc_hourly_pricing/sensor.py | 2 +- .../pvpc_hourly_pricing/conftest.py | 2 +- 4 files changed, 63 insertions(+), 54 deletions(-) create mode 100644 homeassistant/components/pvpc_hourly_pricing/coordinator.py diff --git a/homeassistant/components/pvpc_hourly_pricing/__init__.py b/homeassistant/components/pvpc_hourly_pricing/__init__.py index 6ef16ea29b6..a92f159d172 100644 --- a/homeassistant/components/pvpc_hourly_pricing/__init__.py +++ b/homeassistant/components/pvpc_hourly_pricing/__init__.py @@ -1,24 +1,15 @@ """The pvpc_hourly_pricing integration to collect Spain official electric prices.""" -from datetime import timedelta -import logging - -from aiopvpc import BadApiTokenAuthError, EsiosApiData, PVPCData - from homeassistant.config_entries import ConfigEntry from homeassistant.const import CONF_API_TOKEN, Platform from homeassistant.core import HomeAssistant -from homeassistant.exceptions import ConfigEntryAuthFailed from homeassistant.helpers import config_validation as cv -from homeassistant.helpers.aiohttp_client import async_get_clientsession import homeassistant.helpers.entity_registry as er -from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed -from homeassistant.util import dt as dt_util -from .const import ATTR_POWER, ATTR_POWER_P3, ATTR_TARIFF, DOMAIN +from .const import ATTR_POWER, ATTR_POWER_P3, DOMAIN +from .coordinator import ElecPricesDataUpdateCoordinator from .helpers import get_enabled_sensor_keys -_LOGGER = logging.getLogger(__name__) PLATFORMS: list[Platform] = [Platform.SENSOR] CONFIG_SCHEMA = cv.removed(DOMAIN, raise_if_present=False) @@ -58,44 +49,3 @@ async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: if unload_ok: hass.data[DOMAIN].pop(entry.entry_id) return unload_ok - - -class ElecPricesDataUpdateCoordinator(DataUpdateCoordinator[EsiosApiData]): # pylint: disable=hass-enforce-coordinator-module - """Class to manage fetching Electricity prices data from API.""" - - def __init__( - self, hass: HomeAssistant, entry: ConfigEntry, sensor_keys: set[str] - ) -> None: - """Initialize.""" - self.api = PVPCData( - session=async_get_clientsession(hass), - tariff=entry.data[ATTR_TARIFF], - local_timezone=hass.config.time_zone, - power=entry.data[ATTR_POWER], - power_valley=entry.data[ATTR_POWER_P3], - api_token=entry.data.get(CONF_API_TOKEN), - sensor_keys=tuple(sensor_keys), - ) - super().__init__( - hass, _LOGGER, name=DOMAIN, update_interval=timedelta(minutes=30) - ) - self._entry = entry - - @property - def entry_id(self) -> str: - """Return entry ID.""" - return self._entry.entry_id - - async def _async_update_data(self) -> EsiosApiData: - """Update electricity prices from the ESIOS API.""" - try: - api_data = await self.api.async_update_all(self.data, dt_util.utcnow()) - except BadApiTokenAuthError as exc: - raise ConfigEntryAuthFailed from exc - if ( - not api_data - or not api_data.sensors - or not any(api_data.availability.values()) - ): - raise UpdateFailed - return api_data diff --git a/homeassistant/components/pvpc_hourly_pricing/coordinator.py b/homeassistant/components/pvpc_hourly_pricing/coordinator.py new file mode 100644 index 00000000000..171e516abdc --- /dev/null +++ b/homeassistant/components/pvpc_hourly_pricing/coordinator.py @@ -0,0 +1,59 @@ +"""The pvpc_hourly_pricing integration to collect Spain official electric prices.""" + +from datetime import timedelta +import logging + +from aiopvpc import BadApiTokenAuthError, EsiosApiData, PVPCData + +from homeassistant.config_entries import ConfigEntry +from homeassistant.const import CONF_API_TOKEN +from homeassistant.core import HomeAssistant +from homeassistant.exceptions import ConfigEntryAuthFailed +from homeassistant.helpers.aiohttp_client import async_get_clientsession +from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed +from homeassistant.util import dt as dt_util + +from .const import ATTR_POWER, ATTR_POWER_P3, ATTR_TARIFF, DOMAIN + +_LOGGER = logging.getLogger(__name__) + + +class ElecPricesDataUpdateCoordinator(DataUpdateCoordinator[EsiosApiData]): + """Class to manage fetching Electricity prices data from API.""" + + def __init__( + self, hass: HomeAssistant, entry: ConfigEntry, sensor_keys: set[str] + ) -> None: + """Initialize.""" + self.api = PVPCData( + session=async_get_clientsession(hass), + tariff=entry.data[ATTR_TARIFF], + local_timezone=hass.config.time_zone, + power=entry.data[ATTR_POWER], + power_valley=entry.data[ATTR_POWER_P3], + api_token=entry.data.get(CONF_API_TOKEN), + sensor_keys=tuple(sensor_keys), + ) + super().__init__( + hass, _LOGGER, name=DOMAIN, update_interval=timedelta(minutes=30) + ) + self._entry = entry + + @property + def entry_id(self) -> str: + """Return entry ID.""" + return self._entry.entry_id + + async def _async_update_data(self) -> EsiosApiData: + """Update electricity prices from the ESIOS API.""" + try: + api_data = await self.api.async_update_all(self.data, dt_util.utcnow()) + except BadApiTokenAuthError as exc: + raise ConfigEntryAuthFailed from exc + if ( + not api_data + or not api_data.sensors + or not any(api_data.availability.values()) + ): + raise UpdateFailed + return api_data diff --git a/homeassistant/components/pvpc_hourly_pricing/sensor.py b/homeassistant/components/pvpc_hourly_pricing/sensor.py index 246a8b65892..9d9fe5b9661 100644 --- a/homeassistant/components/pvpc_hourly_pricing/sensor.py +++ b/homeassistant/components/pvpc_hourly_pricing/sensor.py @@ -23,8 +23,8 @@ from homeassistant.helpers.event import async_track_time_change from homeassistant.helpers.typing import StateType from homeassistant.helpers.update_coordinator import CoordinatorEntity -from . import ElecPricesDataUpdateCoordinator from .const import DOMAIN +from .coordinator import ElecPricesDataUpdateCoordinator from .helpers import make_sensor_unique_id _LOGGER = logging.getLogger(__name__) diff --git a/tests/components/pvpc_hourly_pricing/conftest.py b/tests/components/pvpc_hourly_pricing/conftest.py index 5a09d1f3487..f0bf71e2d5a 100644 --- a/tests/components/pvpc_hourly_pricing/conftest.py +++ b/tests/components/pvpc_hourly_pricing/conftest.py @@ -4,7 +4,7 @@ from http import HTTPStatus import pytest -from homeassistant.components.pvpc_hourly_pricing import ATTR_TARIFF, DOMAIN +from homeassistant.components.pvpc_hourly_pricing.const import ATTR_TARIFF, DOMAIN from homeassistant.const import ATTR_UNIT_OF_MEASUREMENT, CURRENCY_EURO, UnitOfEnergy from tests.common import load_fixture