Simplify coordinator and import OverkizStateType (#63969)

This commit is contained in:
Mick Vleeshouwer 2022-01-12 17:23:20 -08:00 committed by GitHub
parent 090a9f94f0
commit 1cf2f0b944
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 17 additions and 42 deletions

View File

@ -5,6 +5,7 @@ from collections.abc import Callable
from dataclasses import dataclass from dataclasses import dataclass
from pyoverkiz.enums import OverkizCommandParam, OverkizState from pyoverkiz.enums import OverkizCommandParam, OverkizState
from pyoverkiz.types import StateType as OverkizStateType
from homeassistant.components.binary_sensor import ( from homeassistant.components.binary_sensor import (
BinarySensorDeviceClass, BinarySensorDeviceClass,
@ -16,7 +17,7 @@ from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.entity_platform import AddEntitiesCallback
from . import HomeAssistantOverkizData from . import HomeAssistantOverkizData
from .const import DOMAIN, IGNORED_OVERKIZ_DEVICES, OverkizStateType from .const import DOMAIN, IGNORED_OVERKIZ_DEVICES
from .entity import OverkizDescriptiveEntity from .entity import OverkizDescriptiveEntity

View File

@ -2,7 +2,7 @@
from __future__ import annotations from __future__ import annotations
from datetime import timedelta from datetime import timedelta
from typing import Any, Final, Union from typing import Final
from pyoverkiz.enums import UIClass from pyoverkiz.enums import UIClass
from pyoverkiz.enums.ui import UIWidget from pyoverkiz.enums.ui import UIWidget
@ -37,5 +37,3 @@ OVERKIZ_DEVICE_TO_PLATFORM: dict[UIClass | UIWidget, Platform] = {
UIClass.DOOR_LOCK: Platform.LOCK, UIClass.DOOR_LOCK: Platform.LOCK,
UIClass.LIGHT: Platform.LIGHT, UIClass.LIGHT: Platform.LIGHT,
} }
OverkizStateType = Union[str, int, float, bool, dict[Any, Any], list[Any], None]

View File

@ -1,11 +1,8 @@
"""Helpers to help coordinate updates.""" """Helpers to help coordinate updates."""
from __future__ import annotations from __future__ import annotations
from collections.abc import Callable
from datetime import timedelta from datetime import timedelta
import json
import logging import logging
from typing import Any
from aiohttp import ServerDisconnectedError from aiohttp import ServerDisconnectedError
from pyoverkiz.client import OverkizClient from pyoverkiz.client import OverkizClient
@ -16,23 +13,13 @@ from pyoverkiz.exceptions import (
NotAuthenticatedException, NotAuthenticatedException,
TooManyRequestsException, TooManyRequestsException,
) )
from pyoverkiz.models import DataType, Device, Place, State from pyoverkiz.models import Device, Place
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.helpers import device_registry as dr from homeassistant.helpers import device_registry as dr
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed
from .const import DOMAIN, UPDATE_INTERVAL, OverkizStateType from .const import DOMAIN, UPDATE_INTERVAL
DATA_TYPE_TO_PYTHON: dict[DataType, Callable[[Any], OverkizStateType]] = {
DataType.INTEGER: int,
DataType.DATE: int,
DataType.STRING: str,
DataType.FLOAT: float,
DataType.BOOLEAN: bool,
DataType.JSON_ARRAY: json.loads,
DataType.JSON_OBJECT: json.loads,
}
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)
@ -77,7 +64,7 @@ class OverkizDataUpdateCoordinator(DataUpdateCoordinator[dict[str, Device]]):
try: try:
events = await self.client.fetch_events() events = await self.client.fetch_events()
except BadCredentialsException as exception: except BadCredentialsException as exception:
raise UpdateFailed("Invalid authentication") from exception raise UpdateFailed("Invalid authentication.") from exception
except TooManyRequestsException as exception: except TooManyRequestsException as exception:
raise UpdateFailed("Too many requests, try again later.") from exception raise UpdateFailed("Too many requests, try again later.") from exception
except MaintenanceException as exception: except MaintenanceException as exception:
@ -92,7 +79,7 @@ class OverkizDataUpdateCoordinator(DataUpdateCoordinator[dict[str, Device]]):
await self.client.login() await self.client.login()
self.devices = await self._get_devices() self.devices = await self._get_devices()
except BadCredentialsException as exception: except BadCredentialsException as exception:
raise UpdateFailed("Invalid authentication") from exception raise UpdateFailed("Invalid authentication.") from exception
except TooManyRequestsException as exception: except TooManyRequestsException as exception:
raise UpdateFailed("Too many requests, try again later.") from exception raise UpdateFailed("Too many requests, try again later.") from exception
@ -137,7 +124,7 @@ class OverkizDataUpdateCoordinator(DataUpdateCoordinator[dict[str, Device]]):
device_state = state device_state = state
device.states[state.name] = device_state device.states[state.name] = device_state
device_state.value = self._get_state(state) device_state.value = state.value
elif event.name == EventName.EXECUTION_REGISTERED: elif event.name == EventName.EXECUTION_REGISTERED:
if event.exec_id not in self.executions: if event.exec_id not in self.executions:
@ -163,21 +150,6 @@ class OverkizDataUpdateCoordinator(DataUpdateCoordinator[dict[str, Device]]):
_LOGGER.debug("Fetching all devices and state via /setup/devices") _LOGGER.debug("Fetching all devices and state via /setup/devices")
return {d.device_url: d for d in await self.client.get_devices(refresh=True)} return {d.device_url: d for d in await self.client.get_devices(refresh=True)}
@staticmethod
def _get_state(
state: State,
) -> OverkizStateType:
"""Cast string value to the right type."""
data_type = DataType(state.type)
if data_type == DataType.NONE:
return state.value
cast_to_python = DATA_TYPE_TO_PYTHON[data_type]
value = cast_to_python(state.value)
return value
def places_to_area(self, place: Place) -> dict[str, str]: def places_to_area(self, place: Place) -> dict[str, str]:
"""Convert places with sub_places to a flat dictionary.""" """Convert places with sub_places to a flat dictionary."""
areas = {} areas = {}

View File

@ -6,8 +6,8 @@ from typing import Any
from urllib.parse import urlparse from urllib.parse import urlparse
from pyoverkiz.models import Command, Device from pyoverkiz.models import Command, Device
from pyoverkiz.types import StateType as OverkizStateType
from .const import OverkizStateType
from .coordinator import OverkizDataUpdateCoordinator from .coordinator import OverkizDataUpdateCoordinator
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)

View File

@ -4,7 +4,7 @@
"config_flow": true, "config_flow": true,
"documentation": "https://www.home-assistant.io/integrations/overkiz", "documentation": "https://www.home-assistant.io/integrations/overkiz",
"requirements": [ "requirements": [
"pyoverkiz==1.0.3" "pyoverkiz==1.1.0"
], ],
"dhcp": [ "dhcp": [
{ {

View File

@ -6,6 +6,7 @@ from dataclasses import dataclass
from typing import cast from typing import cast
from pyoverkiz.enums import OverkizAttribute, OverkizState, UIWidget from pyoverkiz.enums import OverkizAttribute, OverkizState, UIWidget
from pyoverkiz.types import StateType as OverkizStateType
from homeassistant.components.sensor import ( from homeassistant.components.sensor import (
SensorDeviceClass, SensorDeviceClass,
@ -32,7 +33,7 @@ from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.helpers.typing import StateType from homeassistant.helpers.typing import StateType
from . import HomeAssistantOverkizData from . import HomeAssistantOverkizData
from .const import DOMAIN, IGNORED_OVERKIZ_DEVICES, OverkizStateType from .const import DOMAIN, IGNORED_OVERKIZ_DEVICES
from .coordinator import OverkizDataUpdateCoordinator from .coordinator import OverkizDataUpdateCoordinator
from .entity import OverkizDescriptiveEntity, OverkizEntity from .entity import OverkizDescriptiveEntity, OverkizEntity
@ -402,6 +403,9 @@ class OverkizStateSensor(OverkizDescriptiveEntity, SensorEntity):
if self.entity_description.native_value: if self.entity_description.native_value:
return self.entity_description.native_value(state.value) return self.entity_description.native_value(state.value)
if isinstance(state.value, (dict, list)):
return None
return state.value return state.value

View File

@ -1740,7 +1740,7 @@ pyotgw==1.1b1
pyotp==2.6.0 pyotp==2.6.0
# homeassistant.components.overkiz # homeassistant.components.overkiz
pyoverkiz==1.0.3 pyoverkiz==1.1.0
# homeassistant.components.openweathermap # homeassistant.components.openweathermap
pyowm==3.2.0 pyowm==3.2.0

View File

@ -1097,7 +1097,7 @@ pyotgw==1.1b1
pyotp==2.6.0 pyotp==2.6.0
# homeassistant.components.overkiz # homeassistant.components.overkiz
pyoverkiz==1.0.3 pyoverkiz==1.1.0
# homeassistant.components.openweathermap # homeassistant.components.openweathermap
pyowm==3.2.0 pyowm==3.2.0