From 5db13a90e7e3f5498a2c0d55118abd34e450f42f Mon Sep 17 00:00:00 2001
From: Andre Basche <andre.basche@gmail.com>
Date: Mon, 24 Apr 2023 04:33:00 +0200
Subject: [PATCH] Fix some stuff for hoover appliances

---
 pyhon/__main__.py        |  0
 pyhon/appliance.py       | 11 +++++------
 pyhon/appliances/td.py   |  7 ++++---
 pyhon/commands.py        |  2 +-
 pyhon/helper.py          | 14 +++++++++++++-
 pyhon/hon.py             |  2 +-
 pyhon/parameter/base.py  |  6 +++++-
 pyhon/parameter/fixed.py |  6 +-----
 setup.py                 |  2 +-
 9 files changed, 31 insertions(+), 19 deletions(-)
 mode change 100644 => 100755 pyhon/__main__.py

diff --git a/pyhon/__main__.py b/pyhon/__main__.py
old mode 100644
new mode 100755
diff --git a/pyhon/appliance.py b/pyhon/appliance.py
index 81aa040..e733646 100644
--- a/pyhon/appliance.py
+++ b/pyhon/appliance.py
@@ -6,6 +6,7 @@ from typing import TYPE_CHECKING
 
 from pyhon import helper
 from pyhon.commands import HonCommand
+from pyhon.parameter.base import HonParameter
 from pyhon.parameter.fixed import HonParameterFixed
 
 if TYPE_CHECKING:
@@ -169,7 +170,8 @@ class HonAppliance:
     def settings(self):
         result = {}
         for name, command in self._commands.items():
-            for key, setting in command.settings.items():
+            for key in command.setting_keys:
+                setting = command.settings.get(key, HonParameter(key, {}))
                 result[f"{name}.{key}"] = setting
         if self._extra:
             return self._extra.settings(result)
@@ -187,10 +189,7 @@ class HonAppliance:
 
     async def load_attributes(self):
         self._attributes = await self._api.load_attributes(self)
-        _LOGGER.warning(self._attributes)
-        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"]
 
     async def load_statistics(self):
@@ -221,4 +220,4 @@ class HonAppliance:
             {"commands": helper.create_command(self.commands)},
             whitespace="\u200B \u200B ",
         )
-        return result.replace(self.mac_address, "12-34-56-78-90-ab")
+        return result.replace(self.mac_address, "xx-xx-xx-xx-xx-xx")
diff --git a/pyhon/appliances/td.py b/pyhon/appliances/td.py
index 3ab1385..ef79759 100644
--- a/pyhon/appliances/td.py
+++ b/pyhon/appliances/td.py
@@ -10,12 +10,13 @@ class Appliance:
             data["attributes"]["parameters"]["machMode"] = "0"
         data["active"] = bool(data.get("attributes", {}).get("activity"))
         data["pause"] = data["attributes"]["parameters"]["machMode"] == "3"
-        program = int(data["attributes"]["parameters"]["prCode"])
-        data["programName"] = self.parent.settings["startProgram.program"].ids[program]
+        if program := int(data["attributes"]["parameters"]["prCode"]):
+            ids = self.parent.settings["startProgram.program"].ids
+            data["programName"] = ids.get(program, "")
         return data
 
     def settings(self, settings):
-        dry_level = settings["startProgram.dryLevel"]
+        dry_level = settings.get("startProgram.dryLevel")
         if isinstance(dry_level, HonParameterFixed) and dry_level.value == "11":
             settings.pop("startProgram.dryLevel", None)
         return settings
diff --git a/pyhon/commands.py b/pyhon/commands.py
index 53c7647..f0075f3 100644
--- a/pyhon/commands.py
+++ b/pyhon/commands.py
@@ -24,7 +24,7 @@ class HonCommand:
         self._api: HonAPI = api
         self._appliance: "HonAppliance" = appliance
         self._name: str = name
-        self._programs: Optional[Dict[str, "HonCommand"]] = programs or {}
+        self._programs: Optional[Dict[str, "HonCommand"]] = programs
         self._program_name: str = program_name
         self._description: str = attributes.get("description", "")
         self._parameters: Dict[str, HonParameter] = self._create_parameters(
diff --git a/pyhon/helper.py b/pyhon/helper.py
index c820dd1..bb1c00f 100644
--- a/pyhon/helper.py
+++ b/pyhon/helper.py
@@ -1,3 +1,6 @@
+from pyhon.parameter.base import HonParameter
+
+
 def key_print(data, key="", start=True):
     result = ""
     if isinstance(data, list):
@@ -44,12 +47,21 @@ def pretty_print(data, key="", intend=0, is_list=False, whitespace="  "):
     return result
 
 
+def get_parameter(command, parameter):
+    if programs := command.programs:
+        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, data in command.settings.items():
+        for parameter in command.setting_keys:
+            data = get_parameter(command, parameter)
             if data.typology == "enum":
                 value = data.values
             elif data.typology == "range":
diff --git a/pyhon/hon.py b/pyhon/hon.py
index bffa246..0dfde58 100644
--- a/pyhon/hon.py
+++ b/pyhon/hon.py
@@ -47,7 +47,7 @@ class Hon:
 
     async def _create_appliance(self, appliance_data: Dict[str, Any], zone=0) -> None:
         appliance = HonAppliance(self._api, appliance_data, zone=zone)
-        if appliance.mac_address is None:
+        if appliance.mac_address == "":
             return
         await asyncio.gather(
             *[
diff --git a/pyhon/parameter/base.py b/pyhon/parameter/base.py
index c2c818a..3672d29 100644
--- a/pyhon/parameter/base.py
+++ b/pyhon/parameter/base.py
@@ -1,4 +1,4 @@
-from typing import Dict, Any
+from typing import Dict, Any, List
 
 
 class HonParameter:
@@ -17,6 +17,10 @@ class HonParameter:
     def value(self) -> str | float:
         return self._value if self._value is not None else "0"
 
+    @property
+    def values(self) -> List[str]:
+        return list(str(self.value))
+
     @property
     def category(self) -> str:
         return self._category
diff --git a/pyhon/parameter/fixed.py b/pyhon/parameter/fixed.py
index 6c045ef..52595ed 100644
--- a/pyhon/parameter/fixed.py
+++ b/pyhon/parameter/fixed.py
@@ -1,4 +1,4 @@
-from typing import Dict, Any, List
+from typing import Dict, Any
 
 from pyhon.parameter.base import HonParameter
 
@@ -19,7 +19,3 @@ class HonParameterFixed(HonParameter):
     def value(self, value: str | float) -> None:
         # Fixed values seems being not so fixed as thought
         self._value = value
-
-    @property
-    def values(self) -> List[str]:
-        return list(str(self.value))
diff --git a/setup.py b/setup.py
index 628b6e0..7862ecd 100644
--- a/setup.py
+++ b/setup.py
@@ -7,7 +7,7 @@ with open("README.md", "r") as f:
 
 setup(
     name="pyhOn",
-    version="0.8.6",
+    version="0.9.0",
     author="Andre Basche",
     description="Control hOn devices with python",
     long_description=long_description,