Move modern_forms coordinator to separate module (#117610)
This commit is contained in:
parent
658c1f3d97
commit
081bf1cc39
12 changed files with 87 additions and 75 deletions
|
@ -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."""
|
||||||
|
|
||||||
|
|
|
@ -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(
|
||||||
|
|
49
homeassistant/components/modern_forms/coordinator.py
Normal file
49
homeassistant/components/modern_forms/coordinator.py
Normal 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
|
|
@ -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(
|
||||||
|
|
|
@ -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)
|
||||||
|
|
||||||
|
|
|
@ -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(
|
||||||
|
|
|
@ -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(
|
||||||
|
|
|
@ -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(
|
||||||
|
|
|
@ -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,
|
||||||
),
|
),
|
||||||
):
|
):
|
||||||
|
|
|
@ -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(
|
||||||
|
|
|
@ -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,
|
||||||
),
|
),
|
||||||
):
|
):
|
||||||
|
|
|
@ -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,
|
||||||
),
|
),
|
||||||
):
|
):
|
||||||
|
|
Loading…
Add table
Reference in a new issue