Use class for attributes
This commit is contained in:
parent
310d1bafd7
commit
f6139db0b5
@ -9,6 +9,7 @@ from typing import Optional, Dict, Any
|
|||||||
from typing import TYPE_CHECKING
|
from typing import TYPE_CHECKING
|
||||||
|
|
||||||
from pyhon import helper
|
from pyhon import helper
|
||||||
|
from pyhon.attributes import HonAttribute
|
||||||
from pyhon.commands import HonCommand
|
from pyhon.commands import HonCommand
|
||||||
from pyhon.parameter.base import HonParameter
|
from pyhon.parameter.base import HonParameter
|
||||||
from pyhon.parameter.fixed import HonParameterFixed
|
from pyhon.parameter.fixed import HonParameterFixed
|
||||||
@ -61,7 +62,7 @@ class HonAppliance:
|
|||||||
if item in self.data:
|
if item in self.data:
|
||||||
return self.data[item]
|
return self.data[item]
|
||||||
if item in self.attributes["parameters"]:
|
if item in self.attributes["parameters"]:
|
||||||
return self.attributes["parameters"].get(item)
|
return self.attributes["parameters"][item].value
|
||||||
return self.info[item]
|
return self.info[item]
|
||||||
|
|
||||||
def get(self, item, default=None):
|
def get(self, item, default=None):
|
||||||
@ -241,7 +242,10 @@ class HonAppliance:
|
|||||||
async def load_attributes(self):
|
async def load_attributes(self):
|
||||||
self._attributes = await self.api.load_attributes(self)
|
self._attributes = await self.api.load_attributes(self)
|
||||||
for name, values in self._attributes.pop("shadow").get("parameters").items():
|
for name, values in self._attributes.pop("shadow").get("parameters").items():
|
||||||
self._attributes.setdefault("parameters", {})[name] = values["parNewVal"]
|
if name in self._attributes.get("parameters", {}):
|
||||||
|
self._attributes["parameters"][name].update(values)
|
||||||
|
else:
|
||||||
|
self._attributes.setdefault("parameters", {})[name] = HonAttribute(values)
|
||||||
if self._extra:
|
if self._extra:
|
||||||
self._attributes = self._extra.attributes(self._attributes)
|
self._attributes = self._extra.attributes(self._attributes)
|
||||||
|
|
||||||
@ -326,7 +330,7 @@ class HonAppliance:
|
|||||||
command: HonCommand = self.commands.get(command_name)
|
command: HonCommand = self.commands.get(command_name)
|
||||||
for key, value in self.attributes.get("parameters", {}).items():
|
for key, value in self.attributes.get("parameters", {}).items():
|
||||||
if isinstance(value, str) and (new := command.parameters.get(key)):
|
if isinstance(value, str) and (new := command.parameters.get(key)):
|
||||||
self.attributes["parameters"][key] = str(new.intern_value)
|
self.attributes["parameters"][key].value = str(new.intern_value)
|
||||||
|
|
||||||
def sync_command(self, main, target=None) -> None:
|
def sync_command(self, main, target=None) -> None:
|
||||||
base: HonCommand = self.commands.get(main)
|
base: HonCommand = self.commands.get(main)
|
||||||
|
@ -4,7 +4,7 @@ class ApplianceBase:
|
|||||||
|
|
||||||
def attributes(self, data):
|
def attributes(self, data):
|
||||||
program_name = "No Program"
|
program_name = "No Program"
|
||||||
if program := int(data["parameters"].get("prCode", "0")):
|
if program := int(str(data.get("parameters", {}).get("prCode", "0"))):
|
||||||
if start_cmd := self.parent.settings.get("startProgram.program"):
|
if start_cmd := self.parent.settings.get("startProgram.program"):
|
||||||
if ids := start_cmd.ids:
|
if ids := start_cmd.ids:
|
||||||
program_name = ids.get(program, program_name)
|
program_name = ids.get(program, program_name)
|
||||||
|
@ -5,6 +5,6 @@ class Appliance(ApplianceBase):
|
|||||||
def attributes(self, data):
|
def attributes(self, data):
|
||||||
data = super().attributes(data)
|
data = super().attributes(data)
|
||||||
if data["lastConnEvent"]["category"] == "DISCONNECTED":
|
if data["lastConnEvent"]["category"] == "DISCONNECTED":
|
||||||
data["parameters"]["machMode"] = "0"
|
data["parameters"]["machMode"].value = "0"
|
||||||
data["active"] = bool(data.get("activity"))
|
data["active"] = bool(data.get("activity"))
|
||||||
return data
|
return data
|
||||||
|
@ -5,10 +5,10 @@ class Appliance(ApplianceBase):
|
|||||||
def attributes(self, data):
|
def attributes(self, data):
|
||||||
data = super().attributes(data)
|
data = super().attributes(data)
|
||||||
if data["lastConnEvent"]["category"] == "DISCONNECTED":
|
if data["lastConnEvent"]["category"] == "DISCONNECTED":
|
||||||
data["parameters"]["temp"] = "0"
|
data["parameters"]["temp"].value = "0"
|
||||||
data["parameters"]["onOffStatus"] = "0"
|
data["parameters"]["onOffStatus"].value = "0"
|
||||||
data["parameters"]["remoteCtrValid"] = "0"
|
data["parameters"]["remoteCtrValid"].value = "0"
|
||||||
data["parameters"]["remainingTimeMM"] = "0"
|
data["parameters"]["remainingTimeMM"].value = "0"
|
||||||
|
|
||||||
data["active"] = data["parameters"]["onOffStatus"] == "1"
|
data["active"] = data["parameters"]["onOffStatus"] == "1"
|
||||||
|
|
||||||
|
@ -6,7 +6,7 @@ class Appliance(ApplianceBase):
|
|||||||
def attributes(self, data):
|
def attributes(self, data):
|
||||||
data = super().attributes(data)
|
data = super().attributes(data)
|
||||||
if data["lastConnEvent"]["category"] == "DISCONNECTED":
|
if data["lastConnEvent"]["category"] == "DISCONNECTED":
|
||||||
data["parameters"]["machMode"] = "0"
|
data["parameters"]["machMode"].value = "0"
|
||||||
data["active"] = bool(data.get("activity"))
|
data["active"] = bool(data.get("activity"))
|
||||||
data["pause"] = data["parameters"]["machMode"] == "3"
|
data["pause"] = data["parameters"]["machMode"] == "3"
|
||||||
return data
|
return data
|
||||||
|
@ -5,7 +5,7 @@ class Appliance(ApplianceBase):
|
|||||||
def attributes(self, data):
|
def attributes(self, data):
|
||||||
data = super().attributes(data)
|
data = super().attributes(data)
|
||||||
if data["lastConnEvent"]["category"] == "DISCONNECTED":
|
if data["lastConnEvent"]["category"] == "DISCONNECTED":
|
||||||
data["parameters"]["machMode"] = "0"
|
data["parameters"]["machMode"].value = "0"
|
||||||
data["active"] = bool(data.get("activity"))
|
data["active"] = bool(data.get("activity"))
|
||||||
data["pause"] = data["parameters"]["machMode"] == "3"
|
data["pause"] = data["parameters"]["machMode"] == "3"
|
||||||
return data
|
return data
|
||||||
|
@ -5,7 +5,7 @@ class Appliance(ApplianceBase):
|
|||||||
def attributes(self, data):
|
def attributes(self, data):
|
||||||
data = super().attributes(data)
|
data = super().attributes(data)
|
||||||
if data["lastConnEvent"]["category"] == "DISCONNECTED":
|
if data["lastConnEvent"]["category"] == "DISCONNECTED":
|
||||||
data["parameters"]["machMode"] = "0"
|
data["parameters"]["machMode"].value = "0"
|
||||||
data["active"] = bool(data.get("activity"))
|
data["active"] = bool(data.get("activity"))
|
||||||
data["pause"] = data["parameters"]["machMode"] == "3"
|
data["pause"] = data["parameters"]["machMode"] == "3"
|
||||||
return data
|
return data
|
||||||
|
37
pyhon/attributes.py
Normal file
37
pyhon/attributes.py
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
from datetime import datetime
|
||||||
|
from typing import Optional
|
||||||
|
|
||||||
|
from pyhon.helper import str_to_float
|
||||||
|
|
||||||
|
|
||||||
|
class HonAttribute:
|
||||||
|
def __init__(self, data):
|
||||||
|
self._value: str = ""
|
||||||
|
self._last_update: Optional[datetime] = None
|
||||||
|
self.update(data)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def value(self) -> float | str:
|
||||||
|
try:
|
||||||
|
return str_to_float(self._value)
|
||||||
|
except ValueError:
|
||||||
|
return self._value
|
||||||
|
|
||||||
|
@value.setter
|
||||||
|
def value(self, value) -> None:
|
||||||
|
self._value = value
|
||||||
|
|
||||||
|
@property
|
||||||
|
def last_update(self) -> Optional[datetime]:
|
||||||
|
return self._last_update
|
||||||
|
|
||||||
|
def update(self, data):
|
||||||
|
self._value = data.get("parNewVal", "")
|
||||||
|
if last_update := data.get("lastUpdate"):
|
||||||
|
try:
|
||||||
|
self._last_update = datetime.fromisoformat(last_update)
|
||||||
|
except ValueError:
|
||||||
|
self._last_update = None
|
||||||
|
|
||||||
|
def __str__(self) -> str:
|
||||||
|
return self._value
|
@ -73,3 +73,10 @@ def create_rules(commands, concat=False):
|
|||||||
else:
|
else:
|
||||||
result[f"{name}.{parameter}"] = value
|
result[f"{name}.{parameter}"] = value
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
|
||||||
|
def str_to_float(string: str | float) -> float:
|
||||||
|
try:
|
||||||
|
return int(string)
|
||||||
|
except ValueError:
|
||||||
|
return float(str(string).replace(",", "."))
|
||||||
|
@ -1,15 +1,9 @@
|
|||||||
from typing import Dict, Any, List
|
from typing import Dict, Any, List
|
||||||
|
|
||||||
|
from pyhon.helper import str_to_float
|
||||||
from pyhon.parameter.base import HonParameter
|
from pyhon.parameter.base import HonParameter
|
||||||
|
|
||||||
|
|
||||||
def str_to_float(string: str | float) -> float:
|
|
||||||
try:
|
|
||||||
return int(string)
|
|
||||||
except ValueError:
|
|
||||||
return float(str(string).replace(",", "."))
|
|
||||||
|
|
||||||
|
|
||||||
class HonParameterRange(HonParameter):
|
class HonParameterRange(HonParameter):
|
||||||
def __init__(self, key: str, attributes: Dict[str, Any], group: str) -> None:
|
def __init__(self, key: str, attributes: Dict[str, Any], group: str) -> None:
|
||||||
super().__init__(key, attributes, group)
|
super().__init__(key, attributes, group)
|
||||||
|
Loading…
Reference in New Issue
Block a user