Fix performance issues

This commit is contained in:
Andre Basche 2023-05-07 00:28:24 +02:00
parent dd61b24eed
commit 22cbd7474a
4 changed files with 29 additions and 22 deletions

View file

@ -1,12 +1,12 @@
import importlib import importlib
import logging import logging
from contextlib import suppress from contextlib import suppress
from datetime import datetime, timedelta
from typing import Optional, Dict, Any from typing import Optional, Dict, Any
from typing import TYPE_CHECKING from typing import TYPE_CHECKING
from pyhon import helper, exceptions from pyhon import helper, exceptions
from pyhon.commands import HonCommand from pyhon.commands import HonCommand
from pyhon.parameter.base import HonParameter
from pyhon.parameter.fixed import HonParameterFixed from pyhon.parameter.fixed import HonParameterFixed
if TYPE_CHECKING: if TYPE_CHECKING:
@ -16,6 +16,8 @@ _LOGGER = logging.getLogger(__name__)
class HonAppliance: class HonAppliance:
_MINIMAL_UPDATE_INTERVAL = 5 # seconds
def __init__( def __init__(
self, api: Optional["HonAPI"], info: Dict[str, Any], zone: int = 0 self, api: Optional["HonAPI"], info: Dict[str, Any], zone: int = 0
) -> None: ) -> None:
@ -30,6 +32,7 @@ class HonAppliance:
self._attributes: Dict = {} self._attributes: Dict = {}
self._zone: int = zone self._zone: int = zone
self._additional_data: Dict[str, Any] = {} self._additional_data: Dict[str, Any] = {}
self._last_update = None
try: try:
self._extra = importlib.import_module( self._extra = importlib.import_module(
@ -205,6 +208,11 @@ class HonAppliance:
self._statistics = await self.api.load_statistics(self) self._statistics = await self.api.load_statistics(self)
async def update(self): async def update(self):
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() await self.load_attributes()
@property @property
@ -216,12 +224,20 @@ class HonAppliance:
result = {} result = {}
for name, command in self._commands.items(): for name, command in self._commands.items():
for key in command.setting_keys: for key in command.setting_keys:
setting = command.settings.get(key, HonParameter(key, {}, name)) setting = command.settings.get(key)
result[f"{name}.{key}"] = setting result[f"{name}.{key}"] = setting
if self._extra: if self._extra:
return self._extra.settings(result) return self._extra.settings(result)
return 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 @property
def data(self): def data(self):
result = { result = {

View file

@ -29,6 +29,7 @@ class HonCommand:
self._protocol_type: str = attributes.pop("protocolType", "") self._protocol_type: str = attributes.pop("protocolType", "")
self._parameters: Dict[str, HonParameter] = {} self._parameters: Dict[str, HonParameter] = {}
self._data: Dict[str, Any] = {} self._data: Dict[str, Any] = {}
self._available_settings: Dict[str, HonParameter] = {}
self._load_parameters(attributes) self._load_parameters(attributes)
def __repr__(self) -> str: def __repr__(self) -> str:
@ -46,6 +47,10 @@ class HonCommand:
def parameters(self) -> Dict[str, HonParameter]: def parameters(self) -> Dict[str, HonParameter]:
return self._parameters return self._parameters
@property
def settings(self) -> Dict[str, HonParameter]:
return self._parameters
@property @property
def parameter_groups(self) -> Dict[str, Dict[str, Union[str, float]]]: def parameter_groups(self) -> Dict[str, Dict[str, Union[str, float]]]:
result: 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 self._data[name] = data
return return
if self._category_name: if self._category_name:
if not self._categories: name = "program" if "PROGRAM" in self._category_name else "category"
self._parameters["program"] = HonParameterProgram( self._parameters[name] = HonParameterProgram(name, self, "custom")
"program", self, "custom"
)
async def send(self) -> bool: async def send(self) -> bool:
params = self.parameter_groups["parameters"] params = self.parameter_groups["parameters"]
@ -119,7 +122,7 @@ class HonCommand:
return first return first
@property @property
def settings(self) -> Dict[str, HonParameter]: def available_settings(self) -> Dict[str, HonParameter]:
result: Dict[str, HonParameter] = {} result: Dict[str, HonParameter] = {}
for command in self.categories.values(): for command in self.categories.values():
for name, parameter in command.parameters.items(): for name, parameter in command.parameters.items():

View file

@ -1,6 +1,3 @@
from pyhon.parameter.base import HonParameter
def key_print(data, key="", start=True): def key_print(data, key="", start=True):
result = "" result = ""
if isinstance(data, list): if isinstance(data, list):
@ -47,21 +44,12 @@ def pretty_print(data, key="", intend=0, is_list=False, whitespace=" "):
return result 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): def create_command(commands, concat=False):
result = {} result = {}
for name, command in commands.items(): for name, command in commands.items():
if not concat: if not concat:
result[name] = {} result[name] = {}
for parameter in command.setting_keys: for parameter, data in command.available_settings.items():
data = get_parameter(command, parameter)
if data.typology == "enum": if data.typology == "enum":
value = data.values value = data.values
elif data.typology == "range": elif data.typology == "range":

View file

@ -7,7 +7,7 @@ with open("README.md", "r") as f:
setup( setup(
name="pyhOn", name="pyhOn",
version="0.10.0", version="0.10.1",
author="Andre Basche", author="Andre Basche",
description="Control hOn devices with python", description="Control hOn devices with python",
long_description=long_description, long_description=long_description,