Extract Plugwise DataUpdateCoordinator into module (#65915)

This commit is contained in:
Franck Nijhof 2022-02-06 18:03:50 +01:00 committed by GitHub
parent 92856bab56
commit 34a636ef0b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 62 additions and 46 deletions

View file

@ -9,7 +9,6 @@ from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers.entity import EntityCategory
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator
from .const import (
COORDINATOR,
@ -22,6 +21,7 @@ from .const import (
NO_NOTIFICATION_ICON,
NOTIFICATION_ICON,
)
from .coordinator import PlugwiseDataUpdateCoordinator
from .entity import PlugwiseEntity
SEVERITIES = ["other", "info", "warning", "error"]
@ -46,9 +46,9 @@ async def async_setup_entry(
) -> None:
"""Set up the Smile binary_sensors from a config entry."""
api: Smile = hass.data[DOMAIN][config_entry.entry_id]["api"]
coordinator: DataUpdateCoordinator = hass.data[DOMAIN][config_entry.entry_id][
COORDINATOR
]
coordinator: PlugwiseDataUpdateCoordinator = hass.data[DOMAIN][
config_entry.entry_id
][COORDINATOR]
entities: list[BinarySensorEntity] = []
is_thermostat = api.single_master_thermostat()
@ -95,7 +95,7 @@ class SmileBinarySensor(PlugwiseEntity, BinarySensorEntity):
def __init__(
self,
api: Smile,
coordinator: DataUpdateCoordinator,
coordinator: PlugwiseDataUpdateCoordinator,
name: str,
dev_id: str,
description: BinarySensorEntityDescription,
@ -151,7 +151,7 @@ class PwNotifySensor(SmileBinarySensor):
def __init__(
self,
api: Smile,
coordinator: DataUpdateCoordinator,
coordinator: PlugwiseDataUpdateCoordinator,
name: str,
dev_id: str,
description: BinarySensorEntityDescription,

View file

@ -19,7 +19,6 @@ from homeassistant.config_entries import ConfigEntry
from homeassistant.const import ATTR_TEMPERATURE, TEMP_CELSIUS
from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator
from .const import (
COORDINATOR,
@ -30,6 +29,7 @@ from .const import (
SCHEDULE_OFF,
SCHEDULE_ON,
)
from .coordinator import PlugwiseDataUpdateCoordinator
from .entity import PlugwiseEntity
HVAC_MODES_HEAT_ONLY = [HVAC_MODE_HEAT, HVAC_MODE_AUTO]
@ -88,7 +88,7 @@ class PwThermostat(PlugwiseEntity, ClimateEntity):
def __init__(
self,
api: Smile,
coordinator: DataUpdateCoordinator,
coordinator: PlugwiseDataUpdateCoordinator,
name: str,
dev_id: str,
loc_id: str,

View file

@ -0,0 +1,36 @@
"""DataUpdateCoordinator for Plugwise."""
from datetime import timedelta
import async_timeout
from plugwise import Smile
from plugwise.exceptions import XMLDataMissingError
from homeassistant.core import HomeAssistant
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed
from .const import DEFAULT_SCAN_INTERVAL, DEFAULT_TIMEOUT, DOMAIN, LOGGER
class PlugwiseDataUpdateCoordinator(DataUpdateCoordinator[bool]):
"""Class to manage fetching Plugwise data from single endpoint."""
def __init__(self, hass: HomeAssistant, api: Smile) -> None:
"""Initialize the coordinator."""
super().__init__(
hass,
LOGGER,
name=api.smile_name or DOMAIN,
update_interval=DEFAULT_SCAN_INTERVAL.get(
str(api.smile_type), timedelta(seconds=60)
),
)
self.api = api
async def _async_update_data(self) -> bool:
"""Fetch data from Plugwise."""
try:
async with async_timeout.timeout(DEFAULT_TIMEOUT):
await self.api.full_update_device()
except XMLDataMissingError as err:
raise UpdateFailed("Smile update failed") from err
return True

View file

@ -11,21 +11,23 @@ from homeassistant.const import (
)
from homeassistant.core import callback
from homeassistant.helpers.entity import DeviceInfo
from homeassistant.helpers.update_coordinator import (
CoordinatorEntity,
DataUpdateCoordinator,
)
from homeassistant.helpers.update_coordinator import CoordinatorEntity
from .const import DOMAIN
from .coordinator import PlugwiseDataUpdateCoordinator
class PlugwiseEntity(CoordinatorEntity):
class PlugwiseEntity(CoordinatorEntity[bool]):
"""Represent a PlugWise Entity."""
_model: str | None = None
def __init__(
self, api: Smile, coordinator: DataUpdateCoordinator, name: str, dev_id: str
self,
api: Smile,
coordinator: PlugwiseDataUpdateCoordinator,
name: str,
dev_id: str,
) -> None:
"""Initialise the gateway."""
super().__init__(coordinator)

View file

@ -3,12 +3,7 @@ from __future__ import annotations
import asyncio
import async_timeout
from plugwise.exceptions import (
InvalidAuthentication,
PlugwiseException,
XMLDataMissingError,
)
from plugwise.exceptions import InvalidAuthentication, PlugwiseException
from plugwise.smile import Smile
from homeassistant.config_entries import ConfigEntry
@ -17,13 +12,10 @@ from homeassistant.core import HomeAssistant
from homeassistant.exceptions import ConfigEntryNotReady
from homeassistant.helpers import device_registry as dr
from homeassistant.helpers.aiohttp_client import async_get_clientsession
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed
from .const import (
COORDINATOR,
DEFAULT_PORT,
DEFAULT_SCAN_INTERVAL,
DEFAULT_TIMEOUT,
DEFAULT_USERNAME,
DOMAIN,
GATEWAY,
@ -32,6 +24,7 @@ from .const import (
PW_TYPE,
SENSOR_PLATFORMS,
)
from .coordinator import PlugwiseDataUpdateCoordinator
async def async_setup_entry_gw(hass: HomeAssistant, entry: ConfigEntry) -> bool:
@ -63,22 +56,7 @@ async def async_setup_entry_gw(hass: HomeAssistant, entry: ConfigEntry) -> bool:
if not connected:
raise ConfigEntryNotReady("Unable to connect to Smile")
async def async_update_data():
"""Update data via API endpoint."""
try:
async with async_timeout.timeout(DEFAULT_TIMEOUT):
await api.full_update_device()
return True
except XMLDataMissingError as err:
raise UpdateFailed("Smile update failed") from err
coordinator = DataUpdateCoordinator(
hass,
LOGGER,
name=f"Smile {api.smile_name}",
update_method=async_update_data,
update_interval=DEFAULT_SCAN_INTERVAL[api.smile_type],
)
coordinator = PlugwiseDataUpdateCoordinator(hass, api)
await coordinator.async_config_entry_first_refresh()
api.get_all_devices()

View file

@ -20,7 +20,6 @@ from homeassistant.const import (
)
from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator
from .const import (
COOL_ICON,
@ -36,6 +35,7 @@ from .const import (
SENSOR_MAP_UOM,
UNIT_LUMEN,
)
from .coordinator import PlugwiseDataUpdateCoordinator
from .entity import PlugwiseEntity
ATTR_TEMPERATURE = [
@ -303,7 +303,7 @@ class SmileSensor(PlugwiseEntity, SensorEntity):
def __init__(
self,
api: Smile,
coordinator: DataUpdateCoordinator,
coordinator: PlugwiseDataUpdateCoordinator,
name: str,
dev_id: str,
sensor: str,
@ -329,7 +329,7 @@ class PwThermostatSensor(SmileSensor):
def __init__(
self,
api: Smile,
coordinator: DataUpdateCoordinator,
coordinator: PlugwiseDataUpdateCoordinator,
name: str,
dev_id: str,
sensor: str,
@ -364,7 +364,7 @@ class PwAuxDeviceSensor(SmileSensor):
def __init__(
self,
api: Smile,
coordinator: DataUpdateCoordinator,
coordinator: PlugwiseDataUpdateCoordinator,
name: str,
dev_id: str,
sensor: str,
@ -406,7 +406,7 @@ class PwPowerSensor(SmileSensor):
def __init__(
self,
api: Smile,
coordinator: DataUpdateCoordinator,
coordinator: PlugwiseDataUpdateCoordinator,
name: str,
dev_id: str,
sensor: str,

View file

@ -10,9 +10,9 @@ from homeassistant.components.switch import SwitchEntity
from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator
from .const import COORDINATOR, DOMAIN, LOGGER, SWITCH_ICON
from .coordinator import PlugwiseDataUpdateCoordinator
from .entity import PlugwiseEntity
@ -60,7 +60,7 @@ class GwSwitch(PlugwiseEntity, SwitchEntity):
def __init__(
self,
api: Smile,
coordinator: DataUpdateCoordinator,
coordinator: PlugwiseDataUpdateCoordinator,
name: str,
dev_id: str,
members: list[str] | None,