From 22cbd7474ad7ba71873f07a14d19931dddcceded Mon Sep 17 00:00:00 2001 From: Andre Basche Date: Sun, 7 May 2023 00:28:24 +0200 Subject: [PATCH] Fix performance issues --- pyhon/appliance.py | 22 +++++++++++++++++++--- pyhon/commands.py | 13 ++++++++----- pyhon/helper.py | 14 +------------- setup.py | 2 +- 4 files changed, 29 insertions(+), 22 deletions(-) diff --git a/pyhon/appliance.py b/pyhon/appliance.py index 0bc2814..c2d8cd9 100644 --- a/pyhon/appliance.py +++ b/pyhon/appliance.py @@ -1,12 +1,12 @@ import importlib import logging from contextlib import suppress +from datetime import datetime, timedelta from typing import Optional, Dict, Any from typing import TYPE_CHECKING from pyhon import helper, exceptions from pyhon.commands import HonCommand -from pyhon.parameter.base import HonParameter from pyhon.parameter.fixed import HonParameterFixed if TYPE_CHECKING: @@ -16,6 +16,8 @@ _LOGGER = logging.getLogger(__name__) class HonAppliance: + _MINIMAL_UPDATE_INTERVAL = 5 # seconds + def __init__( self, api: Optional["HonAPI"], info: Dict[str, Any], zone: int = 0 ) -> None: @@ -30,6 +32,7 @@ class HonAppliance: self._attributes: Dict = {} self._zone: int = zone self._additional_data: Dict[str, Any] = {} + self._last_update = None try: self._extra = importlib.import_module( @@ -205,7 +208,12 @@ class HonAppliance: self._statistics = await self.api.load_statistics(self) async def update(self): - await self.load_attributes() + now = datetime.now() + if not self._last_update or self._last_update < now - timedelta( + seconds=self._MINIMAL_UPDATE_INTERVAL + ): + self._last_update = now + await self.load_attributes() @property def command_parameters(self): @@ -216,12 +224,20 @@ class HonAppliance: result = {} for name, command in self._commands.items(): for key in command.setting_keys: - setting = command.settings.get(key, HonParameter(key, {}, name)) + setting = command.settings.get(key) result[f"{name}.{key}"] = setting if self._extra: return self._extra.settings(result) return result + @property + def available_settings(self): + result = [] + for name, command in self._commands.items(): + for key in command.setting_keys: + result.append(f"{name}.{key}") + return result + @property def data(self): result = { diff --git a/pyhon/commands.py b/pyhon/commands.py index 9ed5d30..7e59c2a 100644 --- a/pyhon/commands.py +++ b/pyhon/commands.py @@ -29,6 +29,7 @@ class HonCommand: self._protocol_type: str = attributes.pop("protocolType", "") self._parameters: Dict[str, HonParameter] = {} self._data: Dict[str, Any] = {} + self._available_settings: Dict[str, HonParameter] = {} self._load_parameters(attributes) def __repr__(self) -> str: @@ -46,6 +47,10 @@ class HonCommand: def parameters(self) -> Dict[str, HonParameter]: return self._parameters + @property + def settings(self) -> Dict[str, HonParameter]: + return self._parameters + @property def parameter_groups(self) -> Dict[str, Dict[str, Union[str, float]]]: result: Dict[str, Dict[str, Union[str, float]]] = {} @@ -76,10 +81,8 @@ class HonCommand: self._data[name] = data return if self._category_name: - if not self._categories: - self._parameters["program"] = HonParameterProgram( - "program", self, "custom" - ) + name = "program" if "PROGRAM" in self._category_name else "category" + self._parameters[name] = HonParameterProgram(name, self, "custom") async def send(self) -> bool: params = self.parameter_groups["parameters"] @@ -119,7 +122,7 @@ class HonCommand: return first @property - def settings(self) -> Dict[str, HonParameter]: + def available_settings(self) -> Dict[str, HonParameter]: result: Dict[str, HonParameter] = {} for command in self.categories.values(): for name, parameter in command.parameters.items(): diff --git a/pyhon/helper.py b/pyhon/helper.py index 9ee8c75..2472499 100644 --- a/pyhon/helper.py +++ b/pyhon/helper.py @@ -1,6 +1,3 @@ -from pyhon.parameter.base import HonParameter - - def key_print(data, key="", start=True): result = "" if isinstance(data, list): @@ -47,21 +44,12 @@ def pretty_print(data, key="", intend=0, is_list=False, whitespace=" "): return result -def get_parameter(command, parameter): - if programs := command.categories: - for program in programs.values(): - if data := program.settings.get(parameter): - return data - return command.settings.get(parameter) - - def create_command(commands, concat=False): result = {} for name, command in commands.items(): if not concat: result[name] = {} - for parameter in command.setting_keys: - data = get_parameter(command, parameter) + for parameter, data in command.available_settings.items(): if data.typology == "enum": value = data.values elif data.typology == "range": diff --git a/setup.py b/setup.py index 4d35641..4f5c66b 100644 --- a/setup.py +++ b/setup.py @@ -7,7 +7,7 @@ with open("README.md", "r") as f: setup( name="pyhOn", - version="0.10.0", + version="0.10.1", author="Andre Basche", description="Control hOn devices with python", long_description=long_description,