mirror of
https://github.com/home-assistant/core.git
synced 2026-04-02 08:26:41 +01:00
Move DataUpdateCoordinator to separate module in senz (#164916)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -2,16 +2,14 @@
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
from datetime import timedelta
|
||||
from http import HTTPStatus
|
||||
import logging
|
||||
|
||||
from aiohttp import ClientResponseError
|
||||
from httpx import HTTPStatusError, RequestError
|
||||
import jwt
|
||||
from pysenz import SENZAPI, Thermostat
|
||||
from pysenz import SENZAPI
|
||||
|
||||
from homeassistant.config_entries import ConfigEntry
|
||||
from homeassistant.const import Platform
|
||||
from homeassistant.core import HomeAssistant
|
||||
from homeassistant.exceptions import ConfigEntryAuthFailed, ConfigEntryNotReady
|
||||
@@ -21,12 +19,10 @@ from homeassistant.helpers.config_entry_oauth2_flow import (
|
||||
OAuth2Session,
|
||||
async_get_config_entry_implementation,
|
||||
)
|
||||
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed
|
||||
|
||||
from .api import SENZConfigEntryAuth
|
||||
from .const import DOMAIN
|
||||
|
||||
UPDATE_INTERVAL = timedelta(seconds=30)
|
||||
from .coordinator import SENZConfigEntry, SENZDataUpdateCoordinator
|
||||
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
|
||||
@@ -34,9 +30,6 @@ CONFIG_SCHEMA = cv.config_entry_only_config_schema(DOMAIN)
|
||||
|
||||
PLATFORMS = [Platform.CLIMATE, Platform.SENSOR]
|
||||
|
||||
type SENZDataUpdateCoordinator = DataUpdateCoordinator[dict[str, Thermostat]]
|
||||
type SENZConfigEntry = ConfigEntry[SENZDataUpdateCoordinator]
|
||||
|
||||
|
||||
async def async_setup_entry(hass: HomeAssistant, entry: SENZConfigEntry) -> bool:
|
||||
"""Set up SENZ from a config entry."""
|
||||
@@ -51,14 +44,6 @@ async def async_setup_entry(hass: HomeAssistant, entry: SENZConfigEntry) -> bool
|
||||
auth = SENZConfigEntryAuth(httpx_client.get_async_client(hass), session)
|
||||
senz_api = SENZAPI(auth)
|
||||
|
||||
async def update_thermostats() -> dict[str, Thermostat]:
|
||||
"""Fetch SENZ thermostats data."""
|
||||
try:
|
||||
thermostats = await senz_api.get_thermostats()
|
||||
except RequestError as err:
|
||||
raise UpdateFailed from err
|
||||
return {thermostat.serial_number: thermostat for thermostat in thermostats}
|
||||
|
||||
try:
|
||||
account = await senz_api.get_account()
|
||||
except HTTPStatusError as err:
|
||||
@@ -92,13 +77,11 @@ async def async_setup_entry(hass: HomeAssistant, entry: SENZConfigEntry) -> bool
|
||||
translation_key="config_entry_auth_failed",
|
||||
) from err
|
||||
|
||||
coordinator: SENZDataUpdateCoordinator = DataUpdateCoordinator(
|
||||
coordinator = SENZDataUpdateCoordinator(
|
||||
hass,
|
||||
_LOGGER,
|
||||
config_entry=entry,
|
||||
entry,
|
||||
name=account.username,
|
||||
update_interval=UPDATE_INTERVAL,
|
||||
update_method=update_thermostats,
|
||||
senz_api=senz_api,
|
||||
)
|
||||
|
||||
await coordinator.async_config_entry_first_refresh()
|
||||
|
||||
@@ -20,8 +20,8 @@ from homeassistant.helpers.device_registry import DeviceInfo
|
||||
from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback
|
||||
from homeassistant.helpers.update_coordinator import CoordinatorEntity
|
||||
|
||||
from . import SENZConfigEntry, SENZDataUpdateCoordinator
|
||||
from .const import DOMAIN
|
||||
from .coordinator import SENZConfigEntry, SENZDataUpdateCoordinator
|
||||
|
||||
|
||||
async def async_setup_entry(
|
||||
|
||||
51
homeassistant/components/senz/coordinator.py
Normal file
51
homeassistant/components/senz/coordinator.py
Normal file
@@ -0,0 +1,51 @@
|
||||
"""Data update coordinator for SENZ."""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
from datetime import timedelta
|
||||
import logging
|
||||
|
||||
from httpx import RequestError
|
||||
from pysenz import SENZAPI, Thermostat
|
||||
|
||||
from homeassistant.config_entries import ConfigEntry
|
||||
from homeassistant.core import HomeAssistant
|
||||
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed
|
||||
|
||||
UPDATE_INTERVAL = timedelta(seconds=30)
|
||||
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
|
||||
type SENZConfigEntry = ConfigEntry[SENZDataUpdateCoordinator]
|
||||
|
||||
|
||||
class SENZDataUpdateCoordinator(DataUpdateCoordinator[dict[str, Thermostat]]):
|
||||
"""Class to manage fetching SENZ data."""
|
||||
|
||||
config_entry: SENZConfigEntry
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
hass: HomeAssistant,
|
||||
config_entry: SENZConfigEntry,
|
||||
*,
|
||||
name: str,
|
||||
senz_api: SENZAPI,
|
||||
) -> None:
|
||||
"""Initialize the coordinator."""
|
||||
super().__init__(
|
||||
hass,
|
||||
_LOGGER,
|
||||
config_entry=config_entry,
|
||||
name=name,
|
||||
update_interval=UPDATE_INTERVAL,
|
||||
)
|
||||
self._senz_api = senz_api
|
||||
|
||||
async def _async_update_data(self) -> dict[str, Thermostat]:
|
||||
"""Fetch data from SENZ."""
|
||||
try:
|
||||
thermostats = await self._senz_api.get_thermostats()
|
||||
except RequestError as err:
|
||||
raise UpdateFailed from err
|
||||
return {thermostat.serial_number: thermostat for thermostat in thermostats}
|
||||
@@ -5,7 +5,7 @@ from typing import Any
|
||||
from homeassistant.components.diagnostics import async_redact_data
|
||||
from homeassistant.core import HomeAssistant
|
||||
|
||||
from . import SENZConfigEntry
|
||||
from .coordinator import SENZConfigEntry
|
||||
|
||||
TO_REDACT = [
|
||||
"access_token",
|
||||
|
||||
@@ -19,8 +19,8 @@ from homeassistant.helpers.device_registry import DeviceInfo
|
||||
from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback
|
||||
from homeassistant.helpers.update_coordinator import CoordinatorEntity
|
||||
|
||||
from . import SENZConfigEntry, SENZDataUpdateCoordinator
|
||||
from .const import DOMAIN
|
||||
from .coordinator import SENZConfigEntry, SENZDataUpdateCoordinator
|
||||
|
||||
|
||||
@dataclass(kw_only=True, frozen=True)
|
||||
|
||||
@@ -52,7 +52,8 @@ async def test_set_target(
|
||||
with (
|
||||
patch("homeassistant.components.senz.PLATFORMS", [Platform.CLIMATE]),
|
||||
patch(
|
||||
"homeassistant.components.senz.Thermostat.manual", return_value=None
|
||||
"homeassistant.components.senz.coordinator.Thermostat.manual",
|
||||
return_value=None,
|
||||
) as mock_manual,
|
||||
):
|
||||
await setup_integration(hass, mock_config_entry)
|
||||
@@ -75,7 +76,7 @@ async def test_set_target_fail(
|
||||
with (
|
||||
patch("homeassistant.components.senz.PLATFORMS", [Platform.CLIMATE]),
|
||||
patch(
|
||||
"homeassistant.components.senz.Thermostat.manual",
|
||||
"homeassistant.components.senz.coordinator.Thermostat.manual",
|
||||
side_effect=RequestError("API error"),
|
||||
) as mock_manual,
|
||||
):
|
||||
@@ -109,10 +110,12 @@ async def test_set_hvac_mode(
|
||||
with (
|
||||
patch("homeassistant.components.senz.PLATFORMS", [Platform.CLIMATE]),
|
||||
patch(
|
||||
"homeassistant.components.senz.Thermostat.manual", return_value=None
|
||||
"homeassistant.components.senz.coordinator.Thermostat.manual",
|
||||
return_value=None,
|
||||
) as mock_manual,
|
||||
patch(
|
||||
"homeassistant.components.senz.Thermostat.auto", return_value=None
|
||||
"homeassistant.components.senz.coordinator.Thermostat.auto",
|
||||
return_value=None,
|
||||
) as mock_auto,
|
||||
):
|
||||
await setup_integration(hass, mock_config_entry)
|
||||
@@ -136,7 +139,7 @@ async def test_set_hvac_mode_fail(
|
||||
with (
|
||||
patch("homeassistant.components.senz.PLATFORMS", [Platform.CLIMATE]),
|
||||
patch(
|
||||
"homeassistant.components.senz.Thermostat.manual",
|
||||
"homeassistant.components.senz.coordinator.Thermostat.manual",
|
||||
side_effect=RequestError("API error"),
|
||||
) as mock_manual,
|
||||
):
|
||||
|
||||
Reference in New Issue
Block a user