Move modern_forms coordinator to separate module (#117610)

This commit is contained in:
epenet 2024-05-17 15:19:40 +02:00 committed by GitHub
parent 658c1f3d97
commit 081bf1cc39
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
12 changed files with 87 additions and 75 deletions

View file

@ -3,36 +3,25 @@
from __future__ import annotations from __future__ import annotations
from collections.abc import Callable, Coroutine from collections.abc import Callable, Coroutine
from datetime import timedelta
import logging import logging
from typing import Any, Concatenate, ParamSpec, TypeVar from typing import Any, Concatenate, ParamSpec, TypeVar
from aiomodernforms import ( from aiomodernforms import ModernFormsConnectionError, ModernFormsError
ModernFormsConnectionError,
ModernFormsDevice,
ModernFormsError,
)
from aiomodernforms.models import Device as ModernFormsDeviceState
from homeassistant.config_entries import ConfigEntry from homeassistant.config_entries import ConfigEntry
from homeassistant.const import CONF_HOST, Platform from homeassistant.const import CONF_HOST, Platform
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.helpers.aiohttp_client import async_get_clientsession
from homeassistant.helpers.device_registry import DeviceInfo from homeassistant.helpers.device_registry import DeviceInfo
from homeassistant.helpers.update_coordinator import ( from homeassistant.helpers.update_coordinator import CoordinatorEntity
CoordinatorEntity,
DataUpdateCoordinator,
UpdateFailed,
)
from .const import DOMAIN from .const import DOMAIN
from .coordinator import ModernFormsDataUpdateCoordinator
_ModernFormsDeviceEntityT = TypeVar( _ModernFormsDeviceEntityT = TypeVar(
"_ModernFormsDeviceEntityT", bound="ModernFormsDeviceEntity" "_ModernFormsDeviceEntityT", bound="ModernFormsDeviceEntity"
) )
_P = ParamSpec("_P") _P = ParamSpec("_P")
SCAN_INTERVAL = timedelta(seconds=5)
PLATFORMS = [ PLATFORMS = [
Platform.BINARY_SENSOR, Platform.BINARY_SENSOR,
Platform.FAN, Platform.FAN,
@ -99,37 +88,6 @@ def modernforms_exception_handler(
return handler return handler
class ModernFormsDataUpdateCoordinator(DataUpdateCoordinator[ModernFormsDeviceState]): # pylint: disable=hass-enforce-coordinator-module
"""Class to manage fetching Modern Forms data from single endpoint."""
def __init__(
self,
hass: HomeAssistant,
*,
host: str,
) -> None:
"""Initialize global Modern Forms data updater."""
self.modern_forms = ModernFormsDevice(
host, session=async_get_clientsession(hass)
)
super().__init__(
hass,
_LOGGER,
name=DOMAIN,
update_interval=SCAN_INTERVAL,
)
async def _async_update_data(self) -> ModernFormsDevice:
"""Fetch data from Modern Forms."""
try:
return await self.modern_forms.update(
full_update=not self.last_update_success
)
except ModernFormsError as error:
raise UpdateFailed(f"Invalid response from API: {error}") from error
class ModernFormsDeviceEntity(CoordinatorEntity[ModernFormsDataUpdateCoordinator]): class ModernFormsDeviceEntity(CoordinatorEntity[ModernFormsDataUpdateCoordinator]):
"""Defines a Modern Forms device entity.""" """Defines a Modern Forms device entity."""

View file

@ -8,8 +8,9 @@ from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.util import dt as dt_util from homeassistant.util import dt as dt_util
from . import ModernFormsDataUpdateCoordinator, ModernFormsDeviceEntity from . import ModernFormsDeviceEntity
from .const import CLEAR_TIMER, DOMAIN from .const import CLEAR_TIMER, DOMAIN
from .coordinator import ModernFormsDataUpdateCoordinator
async def async_setup_entry( async def async_setup_entry(

View file

@ -0,0 +1,49 @@
"""Coordinator for the Modern Forms integration."""
from __future__ import annotations
from datetime import timedelta
import logging
from aiomodernforms import ModernFormsDevice, ModernFormsError
from aiomodernforms.models import Device as ModernFormsDeviceState
from homeassistant.core import HomeAssistant
from homeassistant.helpers.aiohttp_client import async_get_clientsession
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed
from .const import DOMAIN
SCAN_INTERVAL = timedelta(seconds=5)
_LOGGER = logging.getLogger(__name__)
class ModernFormsDataUpdateCoordinator(DataUpdateCoordinator[ModernFormsDeviceState]):
"""Class to manage fetching Modern Forms data from single endpoint."""
def __init__(
self,
hass: HomeAssistant,
*,
host: str,
) -> None:
"""Initialize global Modern Forms data updater."""
self.modern_forms = ModernFormsDevice(
host, session=async_get_clientsession(hass)
)
super().__init__(
hass,
_LOGGER,
name=DOMAIN,
update_interval=SCAN_INTERVAL,
)
async def _async_update_data(self) -> ModernFormsDevice:
"""Fetch data from Modern Forms."""
try:
return await self.modern_forms.update(
full_update=not self.last_update_success
)
except ModernFormsError as error:
raise UpdateFailed(f"Invalid response from API: {error}") from error

View file

@ -18,11 +18,7 @@ from homeassistant.util.percentage import (
) )
from homeassistant.util.scaling import int_states_in_range from homeassistant.util.scaling import int_states_in_range
from . import ( from . import ModernFormsDeviceEntity, modernforms_exception_handler
ModernFormsDataUpdateCoordinator,
ModernFormsDeviceEntity,
modernforms_exception_handler,
)
from .const import ( from .const import (
ATTR_SLEEP_TIME, ATTR_SLEEP_TIME,
CLEAR_TIMER, CLEAR_TIMER,
@ -32,6 +28,7 @@ from .const import (
SERVICE_CLEAR_FAN_SLEEP_TIMER, SERVICE_CLEAR_FAN_SLEEP_TIMER,
SERVICE_SET_FAN_SLEEP_TIMER, SERVICE_SET_FAN_SLEEP_TIMER,
) )
from .coordinator import ModernFormsDataUpdateCoordinator
async def async_setup_entry( async def async_setup_entry(

View file

@ -17,11 +17,7 @@ from homeassistant.util.percentage import (
ranged_value_to_percentage, ranged_value_to_percentage,
) )
from . import ( from . import ModernFormsDeviceEntity, modernforms_exception_handler
ModernFormsDataUpdateCoordinator,
ModernFormsDeviceEntity,
modernforms_exception_handler,
)
from .const import ( from .const import (
ATTR_SLEEP_TIME, ATTR_SLEEP_TIME,
CLEAR_TIMER, CLEAR_TIMER,
@ -31,6 +27,7 @@ from .const import (
SERVICE_CLEAR_LIGHT_SLEEP_TIMER, SERVICE_CLEAR_LIGHT_SLEEP_TIMER,
SERVICE_SET_LIGHT_SLEEP_TIMER, SERVICE_SET_LIGHT_SLEEP_TIMER,
) )
from .coordinator import ModernFormsDataUpdateCoordinator
BRIGHTNESS_RANGE = (1, 255) BRIGHTNESS_RANGE = (1, 255)

View file

@ -11,8 +11,9 @@ from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.helpers.typing import StateType from homeassistant.helpers.typing import StateType
from homeassistant.util import dt as dt_util from homeassistant.util import dt as dt_util
from . import ModernFormsDataUpdateCoordinator, ModernFormsDeviceEntity from . import ModernFormsDeviceEntity
from .const import CLEAR_TIMER, DOMAIN from .const import CLEAR_TIMER, DOMAIN
from .coordinator import ModernFormsDataUpdateCoordinator
async def async_setup_entry( async def async_setup_entry(

View file

@ -9,12 +9,9 @@ from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.entity_platform import AddEntitiesCallback
from . import ( from . import ModernFormsDeviceEntity, modernforms_exception_handler
ModernFormsDataUpdateCoordinator,
ModernFormsDeviceEntity,
modernforms_exception_handler,
)
from .const import DOMAIN from .const import DOMAIN
from .coordinator import ModernFormsDataUpdateCoordinator
async def async_setup_entry( async def async_setup_entry(

View file

@ -102,7 +102,7 @@ async def test_full_zeroconf_flow_implementation(
@patch( @patch(
"homeassistant.components.modern_forms.ModernFormsDevice.update", "homeassistant.components.modern_forms.coordinator.ModernFormsDevice.update",
side_effect=ModernFormsConnectionError, side_effect=ModernFormsConnectionError,
) )
async def test_connection_error( async def test_connection_error(
@ -123,7 +123,7 @@ async def test_connection_error(
@patch( @patch(
"homeassistant.components.modern_forms.ModernFormsDevice.update", "homeassistant.components.modern_forms.coordinator.ModernFormsDevice.update",
side_effect=ModernFormsConnectionError, side_effect=ModernFormsConnectionError,
) )
async def test_zeroconf_connection_error( async def test_zeroconf_connection_error(
@ -151,7 +151,7 @@ async def test_zeroconf_connection_error(
@patch( @patch(
"homeassistant.components.modern_forms.ModernFormsDevice.update", "homeassistant.components.modern_forms.coordinator.ModernFormsDevice.update",
side_effect=ModernFormsConnectionError, side_effect=ModernFormsConnectionError,
) )
async def test_zeroconf_confirm_connection_error( async def test_zeroconf_confirm_connection_error(

View file

@ -191,7 +191,9 @@ async def test_fan_error(
aioclient_mock.post("http://192.168.1.123:80/mf", text="", status=400) aioclient_mock.post("http://192.168.1.123:80/mf", text="", status=400)
with patch("homeassistant.components.modern_forms.ModernFormsDevice.update"): with patch(
"homeassistant.components.modern_forms.coordinator.ModernFormsDevice.update"
):
await hass.services.async_call( await hass.services.async_call(
FAN_DOMAIN, FAN_DOMAIN,
SERVICE_TURN_OFF, SERVICE_TURN_OFF,
@ -211,9 +213,11 @@ async def test_fan_connection_error(
await init_integration(hass, aioclient_mock) await init_integration(hass, aioclient_mock)
with ( with (
patch("homeassistant.components.modern_forms.ModernFormsDevice.update"),
patch( patch(
"homeassistant.components.modern_forms.ModernFormsDevice.fan", "homeassistant.components.modern_forms.coordinator.ModernFormsDevice.update"
),
patch(
"homeassistant.components.modern_forms.coordinator.ModernFormsDevice.fan",
side_effect=ModernFormsConnectionError, side_effect=ModernFormsConnectionError,
), ),
): ):

View file

@ -15,7 +15,7 @@ from tests.test_util.aiohttp import AiohttpClientMocker
@patch( @patch(
"homeassistant.components.modern_forms.ModernFormsDevice.update", "homeassistant.components.modern_forms.coordinator.ModernFormsDevice.update",
side_effect=ModernFormsConnectionError, side_effect=ModernFormsConnectionError,
) )
async def test_config_entry_not_ready( async def test_config_entry_not_ready(

View file

@ -119,7 +119,9 @@ async def test_light_error(
aioclient_mock.post("http://192.168.1.123:80/mf", text="", status=400) aioclient_mock.post("http://192.168.1.123:80/mf", text="", status=400)
with patch("homeassistant.components.modern_forms.ModernFormsDevice.update"): with patch(
"homeassistant.components.modern_forms.coordinator.ModernFormsDevice.update"
):
await hass.services.async_call( await hass.services.async_call(
LIGHT_DOMAIN, LIGHT_DOMAIN,
SERVICE_TURN_OFF, SERVICE_TURN_OFF,
@ -139,9 +141,11 @@ async def test_light_connection_error(
await init_integration(hass, aioclient_mock) await init_integration(hass, aioclient_mock)
with ( with (
patch("homeassistant.components.modern_forms.ModernFormsDevice.update"),
patch( patch(
"homeassistant.components.modern_forms.ModernFormsDevice.light", "homeassistant.components.modern_forms.coordinator.ModernFormsDevice.update"
),
patch(
"homeassistant.components.modern_forms.coordinator.ModernFormsDevice.light",
side_effect=ModernFormsConnectionError, side_effect=ModernFormsConnectionError,
), ),
): ):

View file

@ -110,7 +110,9 @@ async def test_switch_error(
aioclient_mock.clear_requests() aioclient_mock.clear_requests()
aioclient_mock.post("http://192.168.1.123:80/mf", text="", status=400) aioclient_mock.post("http://192.168.1.123:80/mf", text="", status=400)
with patch("homeassistant.components.modern_forms.ModernFormsDevice.update"): with patch(
"homeassistant.components.modern_forms.coordinator.ModernFormsDevice.update"
):
await hass.services.async_call( await hass.services.async_call(
SWITCH_DOMAIN, SWITCH_DOMAIN,
SERVICE_TURN_ON, SERVICE_TURN_ON,
@ -131,9 +133,11 @@ async def test_switch_connection_error(
await init_integration(hass, aioclient_mock) await init_integration(hass, aioclient_mock)
with ( with (
patch("homeassistant.components.modern_forms.ModernFormsDevice.update"),
patch( patch(
"homeassistant.components.modern_forms.ModernFormsDevice.away", "homeassistant.components.modern_forms.coordinator.ModernFormsDevice.update"
),
patch(
"homeassistant.components.modern_forms.coordinator.ModernFormsDevice.away",
side_effect=ModernFormsConnectionError, side_effect=ModernFormsConnectionError,
), ),
): ):