From 8bbb3960487aa79df4a2dd53ee38170f1027f7ab Mon Sep 17 00:00:00 2001 From: Joost Lekkerkerker Date: Tue, 27 Jun 2023 17:48:36 +0200 Subject: [PATCH] Move freedompro coordinator to separate file (#95360) * Move coordinator to separate file for freedompro * Move coordinator to separate file for freedompro --- .../components/freedompro/__init__.py | 44 +--------------- .../components/freedompro/binary_sensor.py | 2 +- .../components/freedompro/climate.py | 2 +- .../components/freedompro/coordinator.py | 51 +++++++++++++++++++ homeassistant/components/freedompro/cover.py | 2 +- homeassistant/components/freedompro/fan.py | 2 +- homeassistant/components/freedompro/light.py | 2 +- homeassistant/components/freedompro/lock.py | 2 +- homeassistant/components/freedompro/sensor.py | 2 +- homeassistant/components/freedompro/switch.py | 2 +- tests/components/freedompro/conftest.py | 8 +-- .../freedompro/test_binary_sensor.py | 4 +- tests/components/freedompro/test_climate.py | 4 +- tests/components/freedompro/test_cover.py | 10 ++-- tests/components/freedompro/test_fan.py | 10 ++-- tests/components/freedompro/test_init.py | 2 +- tests/components/freedompro/test_lock.py | 8 +-- tests/components/freedompro/test_sensor.py | 2 +- tests/components/freedompro/test_switch.py | 8 +-- 19 files changed, 89 insertions(+), 78 deletions(-) create mode 100644 homeassistant/components/freedompro/coordinator.py diff --git a/homeassistant/components/freedompro/__init__.py b/homeassistant/components/freedompro/__init__.py index 5e1f8e0b577..78871bc99bf 100644 --- a/homeassistant/components/freedompro/__init__.py +++ b/homeassistant/components/freedompro/__init__.py @@ -1,19 +1,15 @@ """Support for freedompro.""" from __future__ import annotations -from datetime import timedelta import logging -from typing import Any, Final - -from pyfreedompro import get_list, get_states +from typing import Final from homeassistant.config_entries import ConfigEntry from homeassistant.const import CONF_API_KEY, Platform from homeassistant.core import HomeAssistant -from homeassistant.helpers import aiohttp_client -from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed from .const import DOMAIN +from .coordinator import FreedomproDataUpdateCoordinator _LOGGER = logging.getLogger(__name__) @@ -58,39 +54,3 @@ async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: async def update_listener(hass: HomeAssistant, config_entry: ConfigEntry) -> None: """Update listener.""" await hass.config_entries.async_reload(config_entry.entry_id) - - -class FreedomproDataUpdateCoordinator(DataUpdateCoordinator[list[dict[str, Any]]]): - """Class to manage fetching Freedompro data API.""" - - def __init__(self, hass, api_key): - """Initialize.""" - self._hass = hass - self._api_key = api_key - self._devices: list[dict[str, Any]] | None = None - - update_interval = timedelta(minutes=1) - super().__init__(hass, _LOGGER, name=DOMAIN, update_interval=update_interval) - - async def _async_update_data(self): - if self._devices is None: - result = await get_list( - aiohttp_client.async_get_clientsession(self._hass), self._api_key - ) - if result["state"]: - self._devices = result["devices"] - else: - raise UpdateFailed() - - result = await get_states( - aiohttp_client.async_get_clientsession(self._hass), self._api_key - ) - - for device in self._devices: - dev = next( - (dev for dev in result if dev["uid"] == device["uid"]), - None, - ) - if dev is not None and "state" in dev: - device["state"] = dev["state"] - return self._devices diff --git a/homeassistant/components/freedompro/binary_sensor.py b/homeassistant/components/freedompro/binary_sensor.py index e648f35d730..3de80c58de8 100644 --- a/homeassistant/components/freedompro/binary_sensor.py +++ b/homeassistant/components/freedompro/binary_sensor.py @@ -11,8 +11,8 @@ from homeassistant.helpers.entity import DeviceInfo from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.update_coordinator import CoordinatorEntity -from . import FreedomproDataUpdateCoordinator from .const import DOMAIN +from .coordinator import FreedomproDataUpdateCoordinator DEVICE_CLASS_MAP = { "smokeSensor": BinarySensorDeviceClass.SMOKE, diff --git a/homeassistant/components/freedompro/climate.py b/homeassistant/components/freedompro/climate.py index 058b32f932a..bbbb6ba47a2 100644 --- a/homeassistant/components/freedompro/climate.py +++ b/homeassistant/components/freedompro/climate.py @@ -22,8 +22,8 @@ from homeassistant.helpers.entity import DeviceInfo from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.update_coordinator import CoordinatorEntity -from . import FreedomproDataUpdateCoordinator from .const import DOMAIN +from .coordinator import FreedomproDataUpdateCoordinator _LOGGER = logging.getLogger(__name__) diff --git a/homeassistant/components/freedompro/coordinator.py b/homeassistant/components/freedompro/coordinator.py new file mode 100644 index 00000000000..c896f5ec203 --- /dev/null +++ b/homeassistant/components/freedompro/coordinator.py @@ -0,0 +1,51 @@ +"""Freedompro data update coordinator.""" +from __future__ import annotations + +from datetime import timedelta +import logging +from typing import Any + +from pyfreedompro import get_list, get_states + +from homeassistant.helpers import aiohttp_client +from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed + +from .const import DOMAIN + +_LOGGER = logging.getLogger(__name__) + + +class FreedomproDataUpdateCoordinator(DataUpdateCoordinator[list[dict[str, Any]]]): + """Class to manage fetching Freedompro data API.""" + + def __init__(self, hass, api_key): + """Initialize.""" + self._hass = hass + self._api_key = api_key + self._devices: list[dict[str, Any]] | None = None + + update_interval = timedelta(minutes=1) + super().__init__(hass, _LOGGER, name=DOMAIN, update_interval=update_interval) + + async def _async_update_data(self): + if self._devices is None: + result = await get_list( + aiohttp_client.async_get_clientsession(self._hass), self._api_key + ) + if result["state"]: + self._devices = result["devices"] + else: + raise UpdateFailed() + + result = await get_states( + aiohttp_client.async_get_clientsession(self._hass), self._api_key + ) + + for device in self._devices: + dev = next( + (dev for dev in result if dev["uid"] == device["uid"]), + None, + ) + if dev is not None and "state" in dev: + device["state"] = dev["state"] + return self._devices diff --git a/homeassistant/components/freedompro/cover.py b/homeassistant/components/freedompro/cover.py index 03670d06e67..8be0ccc3af2 100644 --- a/homeassistant/components/freedompro/cover.py +++ b/homeassistant/components/freedompro/cover.py @@ -18,8 +18,8 @@ from homeassistant.helpers.entity import DeviceInfo from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.update_coordinator import CoordinatorEntity -from . import FreedomproDataUpdateCoordinator from .const import DOMAIN +from .coordinator import FreedomproDataUpdateCoordinator DEVICE_CLASS_MAP = { "windowCovering": CoverDeviceClass.BLIND, diff --git a/homeassistant/components/freedompro/fan.py b/homeassistant/components/freedompro/fan.py index 0a360f637e2..d9791852136 100644 --- a/homeassistant/components/freedompro/fan.py +++ b/homeassistant/components/freedompro/fan.py @@ -15,8 +15,8 @@ from homeassistant.helpers.entity import DeviceInfo from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.update_coordinator import CoordinatorEntity -from . import FreedomproDataUpdateCoordinator from .const import DOMAIN +from .coordinator import FreedomproDataUpdateCoordinator async def async_setup_entry( diff --git a/homeassistant/components/freedompro/light.py b/homeassistant/components/freedompro/light.py index 4221331adf0..793f24d39ef 100644 --- a/homeassistant/components/freedompro/light.py +++ b/homeassistant/components/freedompro/light.py @@ -20,8 +20,8 @@ from homeassistant.helpers.entity import DeviceInfo from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.update_coordinator import CoordinatorEntity -from . import FreedomproDataUpdateCoordinator from .const import DOMAIN +from .coordinator import FreedomproDataUpdateCoordinator async def async_setup_entry( diff --git a/homeassistant/components/freedompro/lock.py b/homeassistant/components/freedompro/lock.py index 099baab7126..2cf464ecdd3 100644 --- a/homeassistant/components/freedompro/lock.py +++ b/homeassistant/components/freedompro/lock.py @@ -13,8 +13,8 @@ from homeassistant.helpers.entity import DeviceInfo from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.update_coordinator import CoordinatorEntity -from . import FreedomproDataUpdateCoordinator from .const import DOMAIN +from .coordinator import FreedomproDataUpdateCoordinator async def async_setup_entry( diff --git a/homeassistant/components/freedompro/sensor.py b/homeassistant/components/freedompro/sensor.py index f95e0436ab4..e784b1d7581 100644 --- a/homeassistant/components/freedompro/sensor.py +++ b/homeassistant/components/freedompro/sensor.py @@ -13,8 +13,8 @@ from homeassistant.helpers.entity import DeviceInfo from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.update_coordinator import CoordinatorEntity -from . import FreedomproDataUpdateCoordinator from .const import DOMAIN +from .coordinator import FreedomproDataUpdateCoordinator DEVICE_CLASS_MAP = { "temperatureSensor": SensorDeviceClass.TEMPERATURE, diff --git a/homeassistant/components/freedompro/switch.py b/homeassistant/components/freedompro/switch.py index d1f8e33765a..52eadf68f7b 100644 --- a/homeassistant/components/freedompro/switch.py +++ b/homeassistant/components/freedompro/switch.py @@ -13,8 +13,8 @@ from homeassistant.helpers.entity import DeviceInfo from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.update_coordinator import CoordinatorEntity -from . import FreedomproDataUpdateCoordinator from .const import DOMAIN +from .coordinator import FreedomproDataUpdateCoordinator async def async_setup_entry( diff --git a/tests/components/freedompro/conftest.py b/tests/components/freedompro/conftest.py index 80e13edb803..30e7968e2fe 100644 --- a/tests/components/freedompro/conftest.py +++ b/tests/components/freedompro/conftest.py @@ -28,13 +28,13 @@ def mock_setup_entry() -> Generator[AsyncMock, None, None]: def mock_freedompro(): """Mock freedompro get_list and get_states.""" with patch( - "homeassistant.components.freedompro.get_list", + "homeassistant.components.freedompro.coordinator.get_list", return_value={ "state": True, "devices": DEVICES, }, ), patch( - "homeassistant.components.freedompro.get_states", + "homeassistant.components.freedompro.coordinator.get_states", return_value=DEVICES_STATE, ): yield @@ -72,13 +72,13 @@ async def init_integration_no_state(hass) -> MockConfigEntry: ) with patch( - "homeassistant.components.freedompro.get_list", + "homeassistant.components.freedompro.coordinator.get_list", return_value={ "state": True, "devices": DEVICES, }, ), patch( - "homeassistant.components.freedompro.get_states", + "homeassistant.components.freedompro.coordinator.get_states", return_value=[], ): entry.add_to_hass(hass) diff --git a/tests/components/freedompro/test_binary_sensor.py b/tests/components/freedompro/test_binary_sensor.py index 70acd5eb320..8a3605782a2 100644 --- a/tests/components/freedompro/test_binary_sensor.py +++ b/tests/components/freedompro/test_binary_sensor.py @@ -74,7 +74,7 @@ async def test_binary_sensor_get_state( assert state.state == STATE_OFF with patch( - "homeassistant.components.freedompro.get_states", + "homeassistant.components.freedompro.coordinator.get_states", return_value=[], ): async_fire_time_changed(hass, utcnow() + timedelta(hours=2)) @@ -100,7 +100,7 @@ async def test_binary_sensor_get_state( elif states_response[0]["type"] == "contactSensor": states_response[0]["state"]["contactSensorState"] = True with patch( - "homeassistant.components.freedompro.get_states", + "homeassistant.components.freedompro.coordinator.get_states", return_value=states_response, ): async_fire_time_changed(hass, utcnow() + timedelta(hours=2)) diff --git a/tests/components/freedompro/test_climate.py b/tests/components/freedompro/test_climate.py index ffb67fb27ac..ae7c39ed4ba 100644 --- a/tests/components/freedompro/test_climate.py +++ b/tests/components/freedompro/test_climate.py @@ -66,7 +66,7 @@ async def test_climate_get_state(hass: HomeAssistant, init_integration) -> None: states_response[0]["state"]["currentTemperature"] = 20 states_response[0]["state"]["targetTemperature"] = 21 with patch( - "homeassistant.components.freedompro.get_states", + "homeassistant.components.freedompro.coordinator.get_states", return_value=states_response, ): async_fire_time_changed(hass, utcnow() + timedelta(hours=2)) @@ -174,7 +174,7 @@ async def test_climate_set_temperature(hass: HomeAssistant, init_integration) -> states_response[0]["state"]["currentTemperature"] = 20 states_response[0]["state"]["targetTemperature"] = 21 with patch( - "homeassistant.components.freedompro.get_states", + "homeassistant.components.freedompro.coordinator.get_states", return_value=states_response, ): async_fire_time_changed(hass, utcnow() + timedelta(hours=2)) diff --git a/tests/components/freedompro/test_cover.py b/tests/components/freedompro/test_cover.py index 0943f6db13c..b29e6499fec 100644 --- a/tests/components/freedompro/test_cover.py +++ b/tests/components/freedompro/test_cover.py @@ -66,7 +66,7 @@ async def test_cover_get_state( states_response = get_states_response_for_uid(uid) states_response[0]["state"]["position"] = 100 with patch( - "homeassistant.components.freedompro.get_states", + "homeassistant.components.freedompro.coordinator.get_states", return_value=states_response, ): async_fire_time_changed(hass, utcnow() + timedelta(hours=2)) @@ -127,7 +127,7 @@ async def test_cover_set_position( states_response = get_states_response_for_uid(uid) states_response[0]["state"]["position"] = 33 with patch( - "homeassistant.components.freedompro.get_states", + "homeassistant.components.freedompro.coordinator.get_states", return_value=states_response, ): async_fire_time_changed(hass, utcnow() + timedelta(hours=2)) @@ -164,7 +164,7 @@ async def test_cover_close( states_response = get_states_response_for_uid(uid) states_response[0]["state"]["position"] = 100 with patch( - "homeassistant.components.freedompro.get_states", + "homeassistant.components.freedompro.coordinator.get_states", return_value=states_response, ): await async_update_entity(hass, entity_id) @@ -191,7 +191,7 @@ async def test_cover_close( states_response[0]["state"]["position"] = 0 with patch( - "homeassistant.components.freedompro.get_states", + "homeassistant.components.freedompro.coordinator.get_states", return_value=states_response, ): async_fire_time_changed(hass, utcnow() + timedelta(hours=2)) @@ -245,7 +245,7 @@ async def test_cover_open( states_response = get_states_response_for_uid(uid) states_response[0]["state"]["position"] = 100 with patch( - "homeassistant.components.freedompro.get_states", + "homeassistant.components.freedompro.coordinator.get_states", return_value=states_response, ): async_fire_time_changed(hass, utcnow() + timedelta(hours=2)) diff --git a/tests/components/freedompro/test_fan.py b/tests/components/freedompro/test_fan.py index db72021a900..159b495e0f8 100644 --- a/tests/components/freedompro/test_fan.py +++ b/tests/components/freedompro/test_fan.py @@ -49,7 +49,7 @@ async def test_fan_get_state(hass: HomeAssistant, init_integration) -> None: states_response[0]["state"]["on"] = True states_response[0]["state"]["rotationSpeed"] = 50 with patch( - "homeassistant.components.freedompro.get_states", + "homeassistant.components.freedompro.coordinator.get_states", return_value=states_response, ): async_fire_time_changed(hass, utcnow() + timedelta(hours=2)) @@ -78,7 +78,7 @@ async def test_fan_set_off(hass: HomeAssistant, init_integration) -> None: states_response[0]["state"]["on"] = True states_response[0]["state"]["rotationSpeed"] = 50 with patch( - "homeassistant.components.freedompro.get_states", + "homeassistant.components.freedompro.coordinator.get_states", return_value=states_response, ): await async_update_entity(hass, entity_id) @@ -107,7 +107,7 @@ async def test_fan_set_off(hass: HomeAssistant, init_integration) -> None: states_response[0]["state"]["on"] = False states_response[0]["state"]["rotationSpeed"] = 0 with patch( - "homeassistant.components.freedompro.get_states", + "homeassistant.components.freedompro.coordinator.get_states", return_value=states_response, ): await async_update_entity(hass, entity_id) @@ -149,7 +149,7 @@ async def test_fan_set_on(hass: HomeAssistant, init_integration) -> None: states_response[0]["state"]["on"] = True states_response[0]["state"]["rotationSpeed"] = 50 with patch( - "homeassistant.components.freedompro.get_states", + "homeassistant.components.freedompro.coordinator.get_states", return_value=states_response, ): async_fire_time_changed(hass, utcnow() + timedelta(hours=2)) @@ -189,7 +189,7 @@ async def test_fan_set_percent(hass: HomeAssistant, init_integration) -> None: states_response[0]["state"]["on"] = True states_response[0]["state"]["rotationSpeed"] = 40 with patch( - "homeassistant.components.freedompro.get_states", + "homeassistant.components.freedompro.coordinator.get_states", return_value=states_response, ): async_fire_time_changed(hass, utcnow() + timedelta(hours=2)) diff --git a/tests/components/freedompro/test_init.py b/tests/components/freedompro/test_init.py index 955d793c41c..5e1b050a4e7 100644 --- a/tests/components/freedompro/test_init.py +++ b/tests/components/freedompro/test_init.py @@ -33,7 +33,7 @@ async def test_config_not_ready(hass: HomeAssistant) -> None: ) with patch( - "homeassistant.components.freedompro.get_list", + "homeassistant.components.freedompro.coordinator.get_list", return_value={ "state": False, }, diff --git a/tests/components/freedompro/test_lock.py b/tests/components/freedompro/test_lock.py index eb94b36ed3f..ae208194d2a 100644 --- a/tests/components/freedompro/test_lock.py +++ b/tests/components/freedompro/test_lock.py @@ -46,7 +46,7 @@ async def test_lock_get_state(hass: HomeAssistant, init_integration) -> None: states_response = get_states_response_for_uid(uid) states_response[0]["state"]["lock"] = 1 with patch( - "homeassistant.components.freedompro.get_states", + "homeassistant.components.freedompro.coordinator.get_states", return_value=states_response, ): async_fire_time_changed(hass, utcnow() + timedelta(hours=2)) @@ -73,7 +73,7 @@ async def test_lock_set_unlock(hass: HomeAssistant, init_integration) -> None: states_response = get_states_response_for_uid(uid) states_response[0]["state"]["lock"] = 1 with patch( - "homeassistant.components.freedompro.get_states", + "homeassistant.components.freedompro.coordinator.get_states", return_value=states_response, ): await async_update_entity(hass, entity_id) @@ -101,7 +101,7 @@ async def test_lock_set_unlock(hass: HomeAssistant, init_integration) -> None: states_response = get_states_response_for_uid(uid) states_response[0]["state"]["lock"] = 0 with patch( - "homeassistant.components.freedompro.get_states", + "homeassistant.components.freedompro.coordinator.get_states", return_value=states_response, ): async_fire_time_changed(hass, utcnow() + timedelta(hours=2)) @@ -138,7 +138,7 @@ async def test_lock_set_lock(hass: HomeAssistant, init_integration) -> None: states_response = get_states_response_for_uid(uid) states_response[0]["state"]["lock"] = 1 with patch( - "homeassistant.components.freedompro.get_states", + "homeassistant.components.freedompro.coordinator.get_states", return_value=states_response, ): async_fire_time_changed(hass, utcnow() + timedelta(hours=2)) diff --git a/tests/components/freedompro/test_sensor.py b/tests/components/freedompro/test_sensor.py index 65db6025c3f..89acfb3cc32 100644 --- a/tests/components/freedompro/test_sensor.py +++ b/tests/components/freedompro/test_sensor.py @@ -58,7 +58,7 @@ async def test_sensor_get_state( elif states_response[0]["type"] == "humiditySensor": states_response[0]["state"]["currentRelativeHumidity"] = "1" with patch( - "homeassistant.components.freedompro.get_states", + "homeassistant.components.freedompro.coordinator.get_states", return_value=states_response, ): async_fire_time_changed(hass, utcnow() + timedelta(hours=2)) diff --git a/tests/components/freedompro/test_switch.py b/tests/components/freedompro/test_switch.py index b9ffd5895c1..03647e4389d 100644 --- a/tests/components/freedompro/test_switch.py +++ b/tests/components/freedompro/test_switch.py @@ -34,7 +34,7 @@ async def test_switch_get_state(hass: HomeAssistant, init_integration) -> None: states_response = get_states_response_for_uid(uid) states_response[0]["state"]["on"] = True with patch( - "homeassistant.components.freedompro.get_states", + "homeassistant.components.freedompro.coordinator.get_states", return_value=states_response, ): async_fire_time_changed(hass, utcnow() + timedelta(hours=2)) @@ -61,7 +61,7 @@ async def test_switch_set_off(hass: HomeAssistant, init_integration) -> None: states_response = get_states_response_for_uid(uid) states_response[0]["state"]["on"] = True with patch( - "homeassistant.components.freedompro.get_states", + "homeassistant.components.freedompro.coordinator.get_states", return_value=states_response, ): await async_update_entity(hass, entity_id) @@ -91,7 +91,7 @@ async def test_switch_set_off(hass: HomeAssistant, init_integration) -> None: states_response = get_states_response_for_uid(uid) states_response[0]["state"]["on"] = False with patch( - "homeassistant.components.freedompro.get_states", + "homeassistant.components.freedompro.coordinator.get_states", return_value=states_response, ): async_fire_time_changed(hass, utcnow() + timedelta(hours=2)) @@ -130,7 +130,7 @@ async def test_switch_set_on(hass: HomeAssistant, init_integration) -> None: states_response = get_states_response_for_uid(uid) states_response[0]["state"]["on"] = True with patch( - "homeassistant.components.freedompro.get_states", + "homeassistant.components.freedompro.coordinator.get_states", return_value=states_response, ): async_fire_time_changed(hass, utcnow() + timedelta(hours=2))