From 8659e025ba2f18f08c7143158d59bb40c54c3d07 Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Wed, 4 Feb 2026 19:57:46 +0100 Subject: [PATCH 01/68] Move the array-style access methods from the smart home data vector into the base data vector This simplifies and shortens access to individual fields. --- luxtronik/data_vector.py | 30 ++++++++++++++++++++++++++++++ luxtronik/shi/vector.py | 20 -------------------- 2 files changed, 30 insertions(+), 20 deletions(-) diff --git a/luxtronik/data_vector.py b/luxtronik/data_vector.py index c1deb7bf..21f3bdc5 100644 --- a/luxtronik/data_vector.py +++ b/luxtronik/data_vector.py @@ -35,8 +35,34 @@ def __iter__(self): @property def data(self): + """ + Return the internal `LuxtronikFieldsDictionary`. + Please check its documentation. + """ return self._data + def __getitem__(self, def_name_or_idx): + """ + Array-style access to method `get`. + Please check its documentation. + """ + return self.get(def_name_or_idx) + + def __setitem__(self, def_name_or_idx, value): + """ + Array-style access to method `set`. + Please check its documentation. + """ + return self.set(def_name_or_idx, value) + + + def __contains__(self, def_field_name_or_idx): + """ + Forward the `LuxtronikFieldsDictionary.__contains__` method. + Please check its documentation. + """ + return def_field_name_or_idx in self._data + def _name_lookup(self, name): """ Try to find the index using the given field name. @@ -94,3 +120,7 @@ def get(self, target): """Get entry by id or name.""" entry = self._lookup(target) return entry + + def set(self, target, value): + "TODO: Placeholder for future changes" + pass diff --git a/luxtronik/shi/vector.py b/luxtronik/shi/vector.py index 723aa4c9..36e7d39b 100644 --- a/luxtronik/shi/vector.py +++ b/luxtronik/shi/vector.py @@ -143,32 +143,12 @@ def empty(cls, version=LUXTRONIK_LATEST_SHI_VERSION, safe=True): obj._init_instance(version, safe) return obj - def __getitem__(self, def_name_or_idx): - return self.get(def_name_or_idx) - - def __setitem__(self, def_name_or_idx, value): - return self.set(def_name_or_idx, value) - def __len__(self): return len(self._data.pairs()) def __iter__(self): return iter([definition for definition, _ in self._data.pairs()]) - def __contains__(self, def_field_name_or_idx): - """ - Check whether the data vector contains a name, index, - or definition matching an added field, or the field itself. - - Args: - def_field_name_or_idx (LuxtronikDefinition | Base | str | int): - Definition object, field object, field name or register index. - - Returns: - True if the searched element was found, otherwise False. - """ - return def_field_name_or_idx in self._data - # properties and access methods ############################################### From f9eab134d9575fd8d844a3c6c2aaa3e1f80387f3 Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Wed, 4 Feb 2026 20:23:05 +0100 Subject: [PATCH 02/68] Support bit-fields within registers In some fields, individual bits are used as the status of various functions. Displaying such combined values is difficult, so they can now be broken down into individual values. --- luxtronik/definitions/__init__.py | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/luxtronik/definitions/__init__.py b/luxtronik/definitions/__init__.py index a4672160..6f5d908a 100644 --- a/luxtronik/definitions/__init__.py +++ b/luxtronik/definitions/__init__.py @@ -39,6 +39,8 @@ class LuxtronikDefinition: "since": "", "until": "", "datatype": "", + "bit_offset": None, + "bit_count": None, "description": "", } @@ -91,8 +93,13 @@ def __init__(self, data_dict, type_name, offset): data_type_valid = self._data_type in self.VALID_DATA_TYPES self._valid &= data_type_valid data_type_valid &= self._data_type != "" - self._num_bits = int(self._data_type.replace('U', '').replace('INT', '')) \ - if data_type_valid else 0 + self._bit_offset = data_dict["bit_offset"] + bit_count = data_dict["bit_count"] + if bit_count: + self._num_bits = bit_count + else: + self._num_bits = int(self._data_type.replace('U', '').replace('INT', '')) \ + if data_type_valid else 0 except Exception as e: self._valid = False self._index = 0 @@ -164,6 +171,10 @@ def writeable(self): def data_type(self): return self._data_type + @property + def bit_offset(self): + return self._bit_offset + @property def num_bits(self): return self._num_bits From b75007e6d6a26b143292f1e14ffb17634696bfa4 Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Wed, 4 Feb 2026 20:24:02 +0100 Subject: [PATCH 03/68] Add bit fields for the heatpump status within the smart home inputs --- luxtronik/definitions/inputs.py | 66 +++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) diff --git a/luxtronik/definitions/inputs.py b/luxtronik/definitions/inputs.py index c266f528..954c8e55 100644 --- a/luxtronik/definitions/inputs.py +++ b/luxtronik/definitions/inputs.py @@ -15,6 +15,7 @@ from typing import Final from luxtronik.datatypes import ( + Bool, BufferType, CelsiusInt16, CelsiusUInt16, @@ -36,6 +37,71 @@ INPUTS_DEFAULT_DATA_TYPE: Final = 'INT16' INPUTS_DEFINITIONS_LIST: Final = [ + { + "index": 0, + "count": 1, + "names": ["heatpump_vd1_status"], + "type": Bool, + "writeable": False, + "datatype": "UINT16", + "bit_offset": 0, + "bit_count": 1, + "unit": "boolean", + "since": "3.90.1", + "description": "Indicates whether VD1 is running" + }, + { + "index": 0, + "count": 1, + "names": ["heatpump_vd2_status"], + "type": Bool, + "writeable": False, + "datatype": "UINT16", + "bit_offset": 1, + "bit_count": 1, + "unit": "boolean", + "since": "3.90.1", + "description": "Indicates whether VD2 is running" + }, + { + "index": 0, + "count": 1, + "names": ["heatpump_zwe1_status"], + "type": Bool, + "writeable": False, + "datatype": "UINT16", + "bit_offset": 2, + "bit_count": 1, + "unit": "boolean", + "since": "3.90.1", + "description": "Indicates whether ZWE1 is running" + }, + { + "index": 0, + "count": 1, + "names": ["heatpump_zwe2_status"], + "type": Bool, + "writeable": False, + "datatype": "UINT16", + "bit_offset": 3, + "bit_count": 1, + "unit": "boolean", + "since": "3.90.1", + "description": "Indicates whether ZWE2 is running" + }, + { + "index": 0, + "count": 1, + "names": ["heatpump_zwe3_status"], + "type": Bool, + "writeable": False, + "datatype": "UINT16", + "bit_offset": 4, + "bit_count": 1, + "unit": "boolean", + "since": "3.90.1", + "description": "Indicates whether ZWE3 is running" + }, { "index": 0, "count": 1, From df8fc76db79a1179e94c30cc2e4b58ba8f5cde1a Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Wed, 4 Feb 2026 20:28:29 +0100 Subject: [PATCH 04/68] Fix bug in the __contains__ method of the luxtronik definition --- luxtronik/definitions/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/luxtronik/definitions/__init__.py b/luxtronik/definitions/__init__.py index 6f5d908a..9afa9318 100644 --- a/luxtronik/definitions/__init__.py +++ b/luxtronik/definitions/__init__.py @@ -249,7 +249,7 @@ def __getitem__(self, name_or_idx): def __contains__(self, def_name_or_idx): if isinstance(def_name_or_idx, LuxtronikDefinition): - return any(def_name_or_idx is d for d in self._index_dict.values()) + return any(def_name_or_idx is d for d in self._name_dict.values()) return self._get(def_name_or_idx) is not None def _add_alias(self, definition, alias): From b1aafd02e4923400e365f8ffc6a15d8ff806e0ba Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Wed, 4 Feb 2026 20:49:22 +0100 Subject: [PATCH 05/68] Implement the bit-shift operation with integrate_data() --- luxtronik/collections.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/luxtronik/collections.py b/luxtronik/collections.py index 523e7b21..9190bdf7 100644 --- a/luxtronik/collections.py +++ b/luxtronik/collections.py @@ -88,6 +88,10 @@ def get_data_arr(definition, field, num_bits): data = field.raw if data is None: return None + # Currently, no read-modify-write function is implemented. + # For this reason, we cannot write (and retrieve the data to write) + # from a field with a bit_offset. + # -> no additional code here like in `integrate_data` should_unpack = field.concatenate_multiple_data_chunks \ and definition.count > 1 if should_unpack and not isinstance(data, list): @@ -111,6 +115,7 @@ def integrate_data(definition, field, raw_data, num_bits, data_offset=-1): # Use data_offset if provided, otherwise the index data_offset = data_offset if data_offset >= 0 else definition.index # Use the information of the definition to extract the raw-value + use_bit_offset = definition.bit_offset and definition.num_bits if (data_offset + definition.count - 1) >= len(raw_data): raw = None elif definition.count == 1: @@ -124,6 +129,9 @@ def integrate_data(definition, field, raw_data, num_bits, data_offset=-1): raw = pack_values(raw, num_bits) raw = raw if definition.check_raw_not_none(raw) else None + # Perform bit shift operations + if use_bit_offset and isinstance(raw, int): + raw = (raw >> definition.bit_offset) & ((1 << definition.num_bits) - 1) field.raw = raw ############################################################################### From f4248f2c1b9435e7764848a9152313a91c492145 Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Wed, 4 Feb 2026 20:57:58 +0100 Subject: [PATCH 06/68] Consequently use LOGGER instead of self.logger --- luxtronik/cfi/calculations.py | 3 +-- luxtronik/cfi/parameters.py | 7 +++---- luxtronik/cfi/visibilities.py | 1 - luxtronik/data_vector.py | 3 +-- luxtronik/shi/holdings.py | 1 - luxtronik/shi/inputs.py | 1 - 6 files changed, 5 insertions(+), 11 deletions(-) diff --git a/luxtronik/cfi/calculations.py b/luxtronik/cfi/calculations.py index a547d325..784f9be3 100644 --- a/luxtronik/cfi/calculations.py +++ b/luxtronik/cfi/calculations.py @@ -27,7 +27,6 @@ class Calculations(DataVector): """Class that holds all calculations.""" - logger = LOGGER name = CALCULATIONS_FIELD_NAME definitions = CALCULATIONS_DEFINITIONS @@ -55,7 +54,7 @@ def _get_firmware_version(self): def get(self, target): """Treats certain names specially. For all others, the function of the base class is called.""" if target == "ID_WEB_SoftStand": - self.logger.debug("The name 'ID_WEB_SoftStand' is obsolete! Use 'get_firmware_version()' instead.") + LOGGER.debug("The name 'ID_WEB_SoftStand' is obsolete! Use 'get_firmware_version()' instead.") entry = Base("ID_WEB_SoftStand") entry.raw = self._get_firmware_version() return entry diff --git a/luxtronik/cfi/parameters.py b/luxtronik/cfi/parameters.py index a27a51c6..345b7d1b 100644 --- a/luxtronik/cfi/parameters.py +++ b/luxtronik/cfi/parameters.py @@ -26,7 +26,6 @@ class Parameters(DataVector): """Class that holds all parameters.""" - logger = LOGGER name = PARAMETERS_FIELD_NAME definitions = PARAMETERS_DEFINITIONS @@ -51,8 +50,8 @@ def set(self, target, value): if isinstance(raw, int): self.queue[index] = raw else: - self.logger.error("Value '%s' for Parameter '%s' not valid!", value, parameter.name) + LOGGER.error("Value '%s' for Parameter '%s' not valid!", value, parameter.name) else: - self.logger.warning("Parameter '%s' not safe for writing!", parameter.name) + LOGGER.warning("Parameter '%s' not safe for writing!", parameter.name) else: - self.logger.warning("Parameter '%s' not found", target) + LOGGER.warning("Parameter '%s' not found", target) diff --git a/luxtronik/cfi/visibilities.py b/luxtronik/cfi/visibilities.py index f250564a..79d5f603 100644 --- a/luxtronik/cfi/visibilities.py +++ b/luxtronik/cfi/visibilities.py @@ -26,7 +26,6 @@ class Visibilities(DataVector): """Class that holds all visibilities.""" - logger = LOGGER name = VISIBILITIES_FIELD_NAME definitions = VISIBILITIES_DEFINITIONS diff --git a/luxtronik/data_vector.py b/luxtronik/data_vector.py index c1deb7bf..d8c2b0d4 100644 --- a/luxtronik/data_vector.py +++ b/luxtronik/data_vector.py @@ -20,7 +20,6 @@ class DataVector: """Class that holds a vector of data entries.""" - logger = LOGGER name = "DataVector" _obsolete = {} @@ -85,7 +84,7 @@ def _lookup(self, target, with_index=False): target_entry = self._data.get(target_index, None) if target_entry is None: - self.logger.warning("entry '%s' not found", target) + LOGGER.warning("entry '%s' not found", target) if with_index: return target_index, target_entry return target_entry diff --git a/luxtronik/shi/holdings.py b/luxtronik/shi/holdings.py index c824a8e1..1df95e68 100644 --- a/luxtronik/shi/holdings.py +++ b/luxtronik/shi/holdings.py @@ -26,7 +26,6 @@ class Holdings(DataVectorSmartHome): """Class that holds holding fields.""" - logger = LOGGER name = HOLDINGS_FIELD_NAME definitions = HOLDINGS_DEFINITIONS diff --git a/luxtronik/shi/inputs.py b/luxtronik/shi/inputs.py index 7bac711d..3a87f703 100644 --- a/luxtronik/shi/inputs.py +++ b/luxtronik/shi/inputs.py @@ -26,7 +26,6 @@ class Inputs(DataVectorSmartHome): """Class that holds input fields.""" - logger = LOGGER name = INPUTS_FIELD_NAME definitions = INPUTS_DEFINITIONS From cb1f3b2d5fe34fc13569eb36b05f24571a790b76 Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Wed, 4 Feb 2026 21:46:04 +0100 Subject: [PATCH 07/68] Remove all unknown names that were not already used in v0.3.14 Exceptions to this are those that increase the data range since then, as these are already used in other projects. I don't think it's necessary to offer these additional names in new releases, even though they weren't available before. --- luxtronik/definitions/calculations.py | 454 +++--- luxtronik/definitions/parameters.py | 2172 ++++++++++++------------- luxtronik/definitions/visibilities.py | 650 ++++---- tests/test_LuxtronikData.py | 4 +- 4 files changed, 1640 insertions(+), 1640 deletions(-) diff --git a/luxtronik/definitions/calculations.py b/luxtronik/definitions/calculations.py index 4ca70ae1..0530ab85 100644 --- a/luxtronik/definitions/calculations.py +++ b/luxtronik/definitions/calculations.py @@ -153,7 +153,7 @@ { "index": 10, "count": 1, - "names": ['ID_WEB_Temperatur_TVL', 'Unknown_Calculation_10'], + "names": ['ID_WEB_Temperatur_TVL'], "type": Celsius, "writeable": False, "datatype": 'INT32', @@ -163,7 +163,7 @@ { "index": 11, "count": 1, - "names": ['ID_WEB_Temperatur_TRL', 'Unknown_Calculation_11'], + "names": ['ID_WEB_Temperatur_TRL'], "type": Celsius, "writeable": False, "datatype": 'INT32', @@ -173,7 +173,7 @@ { "index": 12, "count": 1, - "names": ['ID_WEB_Sollwert_TRL_HZ', 'Unknown_Calculation_12'], + "names": ['ID_WEB_Sollwert_TRL_HZ'], "type": Celsius, "writeable": False, "datatype": 'INT32', @@ -183,7 +183,7 @@ { "index": 13, "count": 1, - "names": ['ID_WEB_Temperatur_TRL_ext', 'Unknown_Calculation_13'], + "names": ['ID_WEB_Temperatur_TRL_ext'], "type": Celsius, "writeable": False, "datatype": 'INT32', @@ -193,7 +193,7 @@ { "index": 14, "count": 1, - "names": ['ID_WEB_Temperatur_THG', 'Unknown_Calculation_14'], + "names": ['ID_WEB_Temperatur_THG'], "type": Celsius, "writeable": False, "datatype": 'INT32', @@ -203,7 +203,7 @@ { "index": 15, "count": 1, - "names": ['ID_WEB_Temperatur_TA', 'Unknown_Calculation_15'], + "names": ['ID_WEB_Temperatur_TA'], "type": Celsius, "writeable": False, "datatype": 'INT32', @@ -213,7 +213,7 @@ { "index": 16, "count": 1, - "names": ['ID_WEB_Mitteltemperatur', 'Unknown_Calculation_16'], + "names": ['ID_WEB_Mitteltemperatur'], "type": Celsius, "writeable": False, "datatype": 'INT32', @@ -223,7 +223,7 @@ { "index": 17, "count": 1, - "names": ['ID_WEB_Temperatur_TBW', 'Unknown_Calculation_17'], + "names": ['ID_WEB_Temperatur_TBW'], "type": Celsius, "writeable": False, "datatype": 'INT32', @@ -233,7 +233,7 @@ { "index": 18, "count": 1, - "names": ['ID_WEB_Einst_BWS_akt', 'Unknown_Calculation_18'], + "names": ['ID_WEB_Einst_BWS_akt'], "type": Celsius, "writeable": False, "datatype": 'INT32', @@ -243,7 +243,7 @@ { "index": 19, "count": 1, - "names": ['ID_WEB_Temperatur_TWE', 'Unknown_Calculation_19'], + "names": ['ID_WEB_Temperatur_TWE'], "type": Celsius, "writeable": False, "datatype": 'INT32', @@ -253,7 +253,7 @@ { "index": 20, "count": 1, - "names": ['ID_WEB_Temperatur_TWA', 'Unknown_Calculation_20'], + "names": ['ID_WEB_Temperatur_TWA'], "type": Celsius, "writeable": False, "datatype": 'INT32', @@ -263,7 +263,7 @@ { "index": 21, "count": 1, - "names": ['ID_WEB_Temperatur_TFB1', 'Unknown_Calculation_21'], + "names": ['ID_WEB_Temperatur_TFB1'], "type": Celsius, "writeable": False, "datatype": 'INT32', @@ -273,7 +273,7 @@ { "index": 22, "count": 1, - "names": ['ID_WEB_Sollwert_TVL_MK1', 'Unknown_Calculation_22'], + "names": ['ID_WEB_Sollwert_TVL_MK1'], "type": Celsius, "writeable": False, "datatype": 'INT32', @@ -283,7 +283,7 @@ { "index": 23, "count": 1, - "names": ['ID_WEB_Temperatur_RFV', 'Unknown_Calculation_23'], + "names": ['ID_WEB_Temperatur_RFV'], "type": Celsius, "writeable": False, "datatype": 'INT32', @@ -293,7 +293,7 @@ { "index": 24, "count": 1, - "names": ['ID_WEB_Temperatur_TFB2', 'Unknown_Calculation_24'], + "names": ['ID_WEB_Temperatur_TFB2'], "type": Celsius, "writeable": False, "datatype": 'INT32', @@ -303,7 +303,7 @@ { "index": 25, "count": 1, - "names": ['ID_WEB_Sollwert_TVL_MK2', 'Unknown_Calculation_25'], + "names": ['ID_WEB_Sollwert_TVL_MK2'], "type": Celsius, "writeable": False, "datatype": 'INT32', @@ -313,7 +313,7 @@ { "index": 26, "count": 1, - "names": ['ID_WEB_Temperatur_TSK', 'Unknown_Calculation_26'], + "names": ['ID_WEB_Temperatur_TSK'], "type": Celsius, "writeable": False, "datatype": 'INT32', @@ -323,7 +323,7 @@ { "index": 27, "count": 1, - "names": ['ID_WEB_Temperatur_TSS', 'Unknown_Calculation_27'], + "names": ['ID_WEB_Temperatur_TSS'], "type": Celsius, "writeable": False, "datatype": 'INT32', @@ -333,7 +333,7 @@ { "index": 28, "count": 1, - "names": ['ID_WEB_Temperatur_TEE', 'Unknown_Calculation_28'], + "names": ['ID_WEB_Temperatur_TEE'], "type": Celsius, "writeable": False, "datatype": 'INT32', @@ -343,7 +343,7 @@ { "index": 29, "count": 1, - "names": ['ID_WEB_ASDin', 'Unknown_Calculation_29'], + "names": ['ID_WEB_ASDin'], "type": Bool, "writeable": False, "datatype": 'UINT32', @@ -353,7 +353,7 @@ { "index": 30, "count": 1, - "names": ['ID_WEB_BWTin', 'Unknown_Calculation_30'], + "names": ['ID_WEB_BWTin'], "type": Bool, "writeable": False, "datatype": 'UINT32', @@ -363,7 +363,7 @@ { "index": 31, "count": 1, - "names": ['ID_WEB_EVUin', 'Unknown_Calculation_31'], + "names": ['ID_WEB_EVUin'], "type": Bool, "writeable": False, "datatype": 'UINT32', @@ -373,7 +373,7 @@ { "index": 32, "count": 1, - "names": ['ID_WEB_HDin', 'Unknown_Calculation_32'], + "names": ['ID_WEB_HDin'], "type": Bool, "writeable": False, "datatype": 'UINT32', @@ -383,7 +383,7 @@ { "index": 33, "count": 1, - "names": ['ID_WEB_MOTin', 'Unknown_Calculation_33'], + "names": ['ID_WEB_MOTin'], "type": Bool, "writeable": False, "datatype": 'UINT32', @@ -393,7 +393,7 @@ { "index": 34, "count": 1, - "names": ['ID_WEB_NDin', 'Unknown_Calculation_34'], + "names": ['ID_WEB_NDin'], "type": Bool, "writeable": False, "datatype": 'UINT32', @@ -403,7 +403,7 @@ { "index": 35, "count": 1, - "names": ['ID_WEB_PEXin', 'Unknown_Calculation_35'], + "names": ['ID_WEB_PEXin'], "type": Bool, "writeable": False, "datatype": 'UINT32', @@ -413,7 +413,7 @@ { "index": 36, "count": 1, - "names": ['ID_WEB_SWTin', 'Unknown_Calculation_36'], + "names": ['ID_WEB_SWTin'], "type": Bool, "writeable": False, "datatype": 'UINT32', @@ -423,7 +423,7 @@ { "index": 37, "count": 1, - "names": ['ID_WEB_AVout', 'Unknown_Calculation_37'], + "names": ['ID_WEB_AVout'], "type": Bool, "writeable": False, "datatype": 'UINT32', @@ -433,7 +433,7 @@ { "index": 38, "count": 1, - "names": ['ID_WEB_BUPout', 'Unknown_Calculation_38'], + "names": ['ID_WEB_BUPout'], "type": Bool, "writeable": False, "datatype": 'UINT32', @@ -443,7 +443,7 @@ { "index": 39, "count": 1, - "names": ['ID_WEB_HUPout', 'Unknown_Calculation_39'], + "names": ['ID_WEB_HUPout'], "type": Bool, "writeable": False, "datatype": 'UINT32', @@ -453,7 +453,7 @@ { "index": 40, "count": 1, - "names": ['ID_WEB_MA1out', 'Unknown_Calculation_40'], + "names": ['ID_WEB_MA1out'], "type": Bool, "writeable": False, "datatype": 'UINT32', @@ -463,7 +463,7 @@ { "index": 41, "count": 1, - "names": ['ID_WEB_MZ1out', 'Unknown_Calculation_41'], + "names": ['ID_WEB_MZ1out'], "type": Bool, "writeable": False, "datatype": 'UINT32', @@ -473,7 +473,7 @@ { "index": 42, "count": 1, - "names": ['ID_WEB_VENout', 'Unknown_Calculation_42'], + "names": ['ID_WEB_VENout'], "type": Bool, "writeable": False, "datatype": 'UINT32', @@ -483,7 +483,7 @@ { "index": 43, "count": 1, - "names": ['ID_WEB_VBOout', 'Unknown_Calculation_43'], + "names": ['ID_WEB_VBOout'], "type": Bool, "writeable": False, "datatype": 'UINT32', @@ -493,7 +493,7 @@ { "index": 44, "count": 1, - "names": ['ID_WEB_VD1out', 'Unknown_Calculation_44'], + "names": ['ID_WEB_VD1out'], "type": Bool, "writeable": False, "datatype": 'UINT32', @@ -503,7 +503,7 @@ { "index": 45, "count": 1, - "names": ['ID_WEB_VD2out', 'Unknown_Calculation_45'], + "names": ['ID_WEB_VD2out'], "type": Bool, "writeable": False, "datatype": 'UINT32', @@ -513,7 +513,7 @@ { "index": 46, "count": 1, - "names": ['ID_WEB_ZIPout', 'Unknown_Calculation_46'], + "names": ['ID_WEB_ZIPout'], "type": Bool, "writeable": False, "datatype": 'UINT32', @@ -523,7 +523,7 @@ { "index": 47, "count": 1, - "names": ['ID_WEB_ZUPout', 'Unknown_Calculation_47'], + "names": ['ID_WEB_ZUPout'], "type": Bool, "writeable": False, "datatype": 'UINT32', @@ -533,7 +533,7 @@ { "index": 48, "count": 1, - "names": ['ID_WEB_ZW1out', 'Unknown_Calculation_48'], + "names": ['ID_WEB_ZW1out'], "type": Bool, "writeable": False, "datatype": 'UINT32', @@ -543,7 +543,7 @@ { "index": 49, "count": 1, - "names": ['ID_WEB_ZW2SSTout', 'Unknown_Calculation_49'], + "names": ['ID_WEB_ZW2SSTout'], "type": Bool, "writeable": False, "datatype": 'UINT32', @@ -553,7 +553,7 @@ { "index": 50, "count": 1, - "names": ['ID_WEB_ZW3SSTout', 'Unknown_Calculation_50'], + "names": ['ID_WEB_ZW3SSTout'], "type": Bool, "writeable": False, "datatype": 'UINT32', @@ -563,7 +563,7 @@ { "index": 51, "count": 1, - "names": ['ID_WEB_FP2out', 'Unknown_Calculation_51'], + "names": ['ID_WEB_FP2out'], "type": Bool, "writeable": False, "datatype": 'UINT32', @@ -573,7 +573,7 @@ { "index": 52, "count": 1, - "names": ['ID_WEB_SLPout', 'Unknown_Calculation_52'], + "names": ['ID_WEB_SLPout'], "type": Bool, "writeable": False, "datatype": 'UINT32', @@ -583,7 +583,7 @@ { "index": 53, "count": 1, - "names": ['ID_WEB_SUPout', 'Unknown_Calculation_53'], + "names": ['ID_WEB_SUPout'], "type": Bool, "writeable": False, "datatype": 'UINT32', @@ -593,7 +593,7 @@ { "index": 54, "count": 1, - "names": ['ID_WEB_MZ2out', 'Unknown_Calculation_54'], + "names": ['ID_WEB_MZ2out'], "type": Bool, "writeable": False, "datatype": 'UINT32', @@ -603,7 +603,7 @@ { "index": 55, "count": 1, - "names": ['ID_WEB_MA2out', 'Unknown_Calculation_55'], + "names": ['ID_WEB_MA2out'], "type": Bool, "writeable": False, "datatype": 'UINT32', @@ -613,7 +613,7 @@ { "index": 56, "count": 1, - "names": ['ID_WEB_Zaehler_BetrZeitVD1', 'Unknown_Calculation_56'], + "names": ['ID_WEB_Zaehler_BetrZeitVD1'], "type": Seconds, "writeable": False, "datatype": 'UINT32', @@ -623,7 +623,7 @@ { "index": 57, "count": 1, - "names": ['ID_WEB_Zaehler_BetrZeitImpVD1', 'Unknown_Calculation_57'], + "names": ['ID_WEB_Zaehler_BetrZeitImpVD1'], "type": Count, "writeable": False, "datatype": 'UINT32', @@ -633,7 +633,7 @@ { "index": 58, "count": 1, - "names": ['ID_WEB_Zaehler_BetrZeitVD2', 'Unknown_Calculation_58'], + "names": ['ID_WEB_Zaehler_BetrZeitVD2'], "type": Seconds, "writeable": False, "datatype": 'UINT32', @@ -643,7 +643,7 @@ { "index": 59, "count": 1, - "names": ['ID_WEB_Zaehler_BetrZeitImpVD2', 'Unknown_Calculation_59'], + "names": ['ID_WEB_Zaehler_BetrZeitImpVD2'], "type": Count, "writeable": False, "datatype": 'UINT32', @@ -653,7 +653,7 @@ { "index": 60, "count": 1, - "names": ['ID_WEB_Zaehler_BetrZeitZWE1', 'Unknown_Calculation_60'], + "names": ['ID_WEB_Zaehler_BetrZeitZWE1'], "type": Seconds, "writeable": False, "datatype": 'UINT32', @@ -663,7 +663,7 @@ { "index": 61, "count": 1, - "names": ['ID_WEB_Zaehler_BetrZeitZWE2', 'Unknown_Calculation_61'], + "names": ['ID_WEB_Zaehler_BetrZeitZWE2'], "type": Seconds, "writeable": False, "datatype": 'UINT32', @@ -673,7 +673,7 @@ { "index": 62, "count": 1, - "names": ['ID_WEB_Zaehler_BetrZeitZWE3', 'Unknown_Calculation_62'], + "names": ['ID_WEB_Zaehler_BetrZeitZWE3'], "type": Seconds, "writeable": False, "datatype": 'UINT32', @@ -683,7 +683,7 @@ { "index": 63, "count": 1, - "names": ['ID_WEB_Zaehler_BetrZeitWP', 'Unknown_Calculation_63'], + "names": ['ID_WEB_Zaehler_BetrZeitWP'], "type": Seconds, "writeable": False, "datatype": 'UINT32', @@ -693,7 +693,7 @@ { "index": 64, "count": 1, - "names": ['ID_WEB_Zaehler_BetrZeitHz', 'Unknown_Calculation_64'], + "names": ['ID_WEB_Zaehler_BetrZeitHz'], "type": Seconds, "writeable": False, "datatype": 'UINT32', @@ -703,7 +703,7 @@ { "index": 65, "count": 1, - "names": ['ID_WEB_Zaehler_BetrZeitBW', 'Unknown_Calculation_65'], + "names": ['ID_WEB_Zaehler_BetrZeitBW'], "type": Seconds, "writeable": False, "datatype": 'UINT32', @@ -713,7 +713,7 @@ { "index": 66, "count": 1, - "names": ['ID_WEB_Zaehler_BetrZeitKue', 'Unknown_Calculation_66'], + "names": ['ID_WEB_Zaehler_BetrZeitKue'], "type": Seconds, "writeable": False, "datatype": 'UINT32', @@ -723,7 +723,7 @@ { "index": 67, "count": 1, - "names": ['ID_WEB_Time_WPein_akt', 'Unknown_Calculation_67'], + "names": ['ID_WEB_Time_WPein_akt'], "type": Seconds, "writeable": False, "datatype": 'UINT32', @@ -733,7 +733,7 @@ { "index": 68, "count": 1, - "names": ['ID_WEB_Time_ZWE1_akt', 'Unknown_Calculation_68'], + "names": ['ID_WEB_Time_ZWE1_akt'], "type": Seconds, "writeable": False, "datatype": 'UINT32', @@ -743,7 +743,7 @@ { "index": 69, "count": 1, - "names": ['ID_WEB_Time_ZWE2_akt', 'Unknown_Calculation_69'], + "names": ['ID_WEB_Time_ZWE2_akt'], "type": Seconds, "writeable": False, "datatype": 'UINT32', @@ -753,7 +753,7 @@ { "index": 70, "count": 1, - "names": ['ID_WEB_Timer_EinschVerz', 'Unknown_Calculation_70'], + "names": ['ID_WEB_Timer_EinschVerz'], "type": Seconds, "writeable": False, "datatype": 'UINT32', @@ -763,7 +763,7 @@ { "index": 71, "count": 1, - "names": ['ID_WEB_Time_SSPAUS_akt', 'Unknown_Calculation_71'], + "names": ['ID_WEB_Time_SSPAUS_akt'], "type": Seconds, "writeable": False, "datatype": 'UINT32', @@ -773,7 +773,7 @@ { "index": 72, "count": 1, - "names": ['ID_WEB_Time_SSPEIN_akt', 'Unknown_Calculation_72'], + "names": ['ID_WEB_Time_SSPEIN_akt'], "type": Seconds, "writeable": False, "datatype": 'UINT32', @@ -783,7 +783,7 @@ { "index": 73, "count": 1, - "names": ['ID_WEB_Time_VDStd_akt', 'Unknown_Calculation_73'], + "names": ['ID_WEB_Time_VDStd_akt'], "type": Seconds, "writeable": False, "datatype": 'UINT32', @@ -793,7 +793,7 @@ { "index": 74, "count": 1, - "names": ['ID_WEB_Time_HRM_akt', 'Unknown_Calculation_74'], + "names": ['ID_WEB_Time_HRM_akt'], "type": Seconds, "writeable": False, "datatype": 'UINT32', @@ -803,7 +803,7 @@ { "index": 75, "count": 1, - "names": ['ID_WEB_Time_HRW_akt', 'Unknown_Calculation_75'], + "names": ['ID_WEB_Time_HRW_akt'], "type": Seconds, "writeable": False, "datatype": 'UINT32', @@ -813,7 +813,7 @@ { "index": 76, "count": 1, - "names": ['ID_WEB_Time_LGS_akt', 'Unknown_Calculation_76'], + "names": ['ID_WEB_Time_LGS_akt'], "type": Seconds, "writeable": False, "datatype": 'UINT32', @@ -823,7 +823,7 @@ { "index": 77, "count": 1, - "names": ['ID_WEB_Time_SBW_akt', 'Unknown_Calculation_77'], + "names": ['ID_WEB_Time_SBW_akt'], "type": Seconds, "writeable": False, "datatype": 'UINT32', @@ -833,7 +833,7 @@ { "index": 78, "count": 1, - "names": ['ID_WEB_Code_WP_akt', 'Unknown_Calculation_78'], + "names": ['ID_WEB_Code_WP_akt'], "type": HeatpumpCode, "writeable": False, "datatype": 'UINT32', @@ -843,7 +843,7 @@ { "index": 79, "count": 1, - "names": ['ID_WEB_BIV_Stufe_akt', 'Unknown_Calculation_79'], + "names": ['ID_WEB_BIV_Stufe_akt'], "type": BivalenceLevel, "writeable": False, "datatype": 'UINT32', @@ -853,7 +853,7 @@ { "index": 80, "count": 1, - "names": ['ID_WEB_WP_BZ_akt', 'Unknown_Calculation_80'], + "names": ['ID_WEB_WP_BZ_akt'], "type": OperationMode, "writeable": False, "datatype": 'UINT32', @@ -863,7 +863,7 @@ { "index": 81, "count": 1, - "names": ['ID_WEB_SoftStand_0', 'Unknown_Calculation_81'], + "names": ['ID_WEB_SoftStand_0'], "type": Character, "writeable": False, "datatype": 'UINT32', @@ -873,7 +873,7 @@ { "index": 82, "count": 1, - "names": ['ID_WEB_SoftStand_1', 'Unknown_Calculation_82'], + "names": ['ID_WEB_SoftStand_1'], "type": Character, "writeable": False, "datatype": 'UINT32', @@ -883,7 +883,7 @@ { "index": 83, "count": 1, - "names": ['ID_WEB_SoftStand_2', 'Unknown_Calculation_83'], + "names": ['ID_WEB_SoftStand_2'], "type": Character, "writeable": False, "datatype": 'UINT32', @@ -893,7 +893,7 @@ { "index": 84, "count": 1, - "names": ['ID_WEB_SoftStand_3', 'Unknown_Calculation_84'], + "names": ['ID_WEB_SoftStand_3'], "type": Character, "writeable": False, "datatype": 'UINT32', @@ -903,7 +903,7 @@ { "index": 85, "count": 1, - "names": ['ID_WEB_SoftStand_4', 'Unknown_Calculation_85'], + "names": ['ID_WEB_SoftStand_4'], "type": Character, "writeable": False, "datatype": 'UINT32', @@ -913,7 +913,7 @@ { "index": 86, "count": 1, - "names": ['ID_WEB_SoftStand_5', 'Unknown_Calculation_86'], + "names": ['ID_WEB_SoftStand_5'], "type": Character, "writeable": False, "datatype": 'UINT32', @@ -923,7 +923,7 @@ { "index": 87, "count": 1, - "names": ['ID_WEB_SoftStand_6', 'Unknown_Calculation_87'], + "names": ['ID_WEB_SoftStand_6'], "type": Character, "writeable": False, "datatype": 'UINT32', @@ -933,7 +933,7 @@ { "index": 88, "count": 1, - "names": ['ID_WEB_SoftStand_7', 'Unknown_Calculation_88'], + "names": ['ID_WEB_SoftStand_7'], "type": Character, "writeable": False, "datatype": 'UINT32', @@ -943,7 +943,7 @@ { "index": 89, "count": 1, - "names": ['ID_WEB_SoftStand_8', 'Unknown_Calculation_89'], + "names": ['ID_WEB_SoftStand_8'], "type": Character, "writeable": False, "datatype": 'UINT32', @@ -953,7 +953,7 @@ { "index": 90, "count": 1, - "names": ['ID_WEB_SoftStand_9', 'Unknown_Calculation_90'], + "names": ['ID_WEB_SoftStand_9'], "type": Character, "writeable": False, "datatype": 'UINT32', @@ -963,7 +963,7 @@ { "index": 91, "count": 1, - "names": ['ID_WEB_AdresseIP_akt', 'Unknown_Calculation_91'], + "names": ['ID_WEB_AdresseIP_akt'], "type": IPv4Address, "writeable": False, "datatype": 'UINT32', @@ -973,7 +973,7 @@ { "index": 92, "count": 1, - "names": ['ID_WEB_SubNetMask_akt', 'Unknown_Calculation_92'], + "names": ['ID_WEB_SubNetMask_akt'], "type": IPv4Address, "writeable": False, "datatype": 'UINT32', @@ -983,7 +983,7 @@ { "index": 93, "count": 1, - "names": ['ID_WEB_Add_Broadcast', 'Unknown_Calculation_93'], + "names": ['ID_WEB_Add_Broadcast'], "type": IPv4Address, "writeable": False, "datatype": 'UINT32', @@ -993,7 +993,7 @@ { "index": 94, "count": 1, - "names": ['ID_WEB_Add_StdGateway', 'Unknown_Calculation_94'], + "names": ['ID_WEB_Add_StdGateway'], "type": IPv4Address, "writeable": False, "datatype": 'UINT32', @@ -1003,7 +1003,7 @@ { "index": 95, "count": 1, - "names": ['ID_WEB_ERROR_Time0', 'Unknown_Calculation_95'], + "names": ['ID_WEB_ERROR_Time0'], "type": Timestamp, "writeable": False, "datatype": 'UINT32', @@ -1013,7 +1013,7 @@ { "index": 96, "count": 1, - "names": ['ID_WEB_ERROR_Time1', 'Unknown_Calculation_96'], + "names": ['ID_WEB_ERROR_Time1'], "type": Timestamp, "writeable": False, "datatype": 'UINT32', @@ -1023,7 +1023,7 @@ { "index": 97, "count": 1, - "names": ['ID_WEB_ERROR_Time2', 'Unknown_Calculation_97'], + "names": ['ID_WEB_ERROR_Time2'], "type": Timestamp, "writeable": False, "datatype": 'UINT32', @@ -1033,7 +1033,7 @@ { "index": 98, "count": 1, - "names": ['ID_WEB_ERROR_Time3', 'Unknown_Calculation_98'], + "names": ['ID_WEB_ERROR_Time3'], "type": Timestamp, "writeable": False, "datatype": 'UINT32', @@ -1043,7 +1043,7 @@ { "index": 99, "count": 1, - "names": ['ID_WEB_ERROR_Time4', 'Unknown_Calculation_99'], + "names": ['ID_WEB_ERROR_Time4'], "type": Timestamp, "writeable": False, "datatype": 'UINT32', @@ -1053,7 +1053,7 @@ { "index": 100, "count": 1, - "names": ['ID_WEB_ERROR_Nr0', 'Unknown_Calculation_100'], + "names": ['ID_WEB_ERROR_Nr0'], "type": Errorcode, "writeable": False, "datatype": 'UINT32', @@ -1063,7 +1063,7 @@ { "index": 101, "count": 1, - "names": ['ID_WEB_ERROR_Nr1', 'Unknown_Calculation_101'], + "names": ['ID_WEB_ERROR_Nr1'], "type": Errorcode, "writeable": False, "datatype": 'UINT32', @@ -1073,7 +1073,7 @@ { "index": 102, "count": 1, - "names": ['ID_WEB_ERROR_Nr2', 'Unknown_Calculation_102'], + "names": ['ID_WEB_ERROR_Nr2'], "type": Errorcode, "writeable": False, "datatype": 'UINT32', @@ -1083,7 +1083,7 @@ { "index": 103, "count": 1, - "names": ['ID_WEB_ERROR_Nr3', 'Unknown_Calculation_103'], + "names": ['ID_WEB_ERROR_Nr3'], "type": Errorcode, "writeable": False, "datatype": 'UINT32', @@ -1093,7 +1093,7 @@ { "index": 104, "count": 1, - "names": ['ID_WEB_ERROR_Nr4', 'Unknown_Calculation_104'], + "names": ['ID_WEB_ERROR_Nr4'], "type": Errorcode, "writeable": False, "datatype": 'UINT32', @@ -1103,7 +1103,7 @@ { "index": 105, "count": 1, - "names": ['ID_WEB_AnzahlFehlerInSpeicher', 'Unknown_Calculation_105'], + "names": ['ID_WEB_AnzahlFehlerInSpeicher'], "type": Count, "writeable": False, "datatype": 'UINT32', @@ -1113,7 +1113,7 @@ { "index": 106, "count": 1, - "names": ['ID_WEB_Switchoff_file_Nr0', 'Unknown_Calculation_106'], + "names": ['ID_WEB_Switchoff_file_Nr0'], "type": SwitchoffFile, "writeable": False, "datatype": 'UINT32', @@ -1123,7 +1123,7 @@ { "index": 107, "count": 1, - "names": ['ID_WEB_Switchoff_file_Nr1', 'Unknown_Calculation_107'], + "names": ['ID_WEB_Switchoff_file_Nr1'], "type": SwitchoffFile, "writeable": False, "datatype": 'UINT32', @@ -1133,7 +1133,7 @@ { "index": 108, "count": 1, - "names": ['ID_WEB_Switchoff_file_Nr2', 'Unknown_Calculation_108'], + "names": ['ID_WEB_Switchoff_file_Nr2'], "type": SwitchoffFile, "writeable": False, "datatype": 'UINT32', @@ -1143,7 +1143,7 @@ { "index": 109, "count": 1, - "names": ['ID_WEB_Switchoff_file_Nr3', 'Unknown_Calculation_109'], + "names": ['ID_WEB_Switchoff_file_Nr3'], "type": SwitchoffFile, "writeable": False, "datatype": 'UINT32', @@ -1153,7 +1153,7 @@ { "index": 110, "count": 1, - "names": ['ID_WEB_Switchoff_file_Nr4', 'Unknown_Calculation_110'], + "names": ['ID_WEB_Switchoff_file_Nr4'], "type": SwitchoffFile, "writeable": False, "datatype": 'UINT32', @@ -1163,7 +1163,7 @@ { "index": 111, "count": 1, - "names": ['ID_WEB_Switchoff_file_Time0', 'Unknown_Calculation_111'], + "names": ['ID_WEB_Switchoff_file_Time0'], "type": Timestamp, "writeable": False, "datatype": 'UINT32', @@ -1173,7 +1173,7 @@ { "index": 112, "count": 1, - "names": ['ID_WEB_Switchoff_file_Time1', 'Unknown_Calculation_112'], + "names": ['ID_WEB_Switchoff_file_Time1'], "type": Timestamp, "writeable": False, "datatype": 'UINT32', @@ -1183,7 +1183,7 @@ { "index": 113, "count": 1, - "names": ['ID_WEB_Switchoff_file_Time2', 'Unknown_Calculation_113'], + "names": ['ID_WEB_Switchoff_file_Time2'], "type": Timestamp, "writeable": False, "datatype": 'UINT32', @@ -1193,7 +1193,7 @@ { "index": 114, "count": 1, - "names": ['ID_WEB_Switchoff_file_Time3', 'Unknown_Calculation_114'], + "names": ['ID_WEB_Switchoff_file_Time3'], "type": Timestamp, "writeable": False, "datatype": 'UINT32', @@ -1203,7 +1203,7 @@ { "index": 115, "count": 1, - "names": ['ID_WEB_Switchoff_file_Time4', 'Unknown_Calculation_115'], + "names": ['ID_WEB_Switchoff_file_Time4'], "type": Timestamp, "writeable": False, "datatype": 'UINT32', @@ -1213,7 +1213,7 @@ { "index": 116, "count": 1, - "names": ['ID_WEB_Comfort_exists', 'Unknown_Calculation_116'], + "names": ['ID_WEB_Comfort_exists'], "type": Bool, "writeable": False, "datatype": 'UINT32', @@ -1223,7 +1223,7 @@ { "index": 117, "count": 1, - "names": ['ID_WEB_HauptMenuStatus_Zeile1', 'Unknown_Calculation_117'], + "names": ['ID_WEB_HauptMenuStatus_Zeile1'], "type": MainMenuStatusLine1, "writeable": False, "datatype": 'UINT32', @@ -1233,7 +1233,7 @@ { "index": 118, "count": 1, - "names": ['ID_WEB_HauptMenuStatus_Zeile2', 'Unknown_Calculation_118'], + "names": ['ID_WEB_HauptMenuStatus_Zeile2'], "type": MainMenuStatusLine2, "writeable": False, "datatype": 'UINT32', @@ -1243,7 +1243,7 @@ { "index": 119, "count": 1, - "names": ['ID_WEB_HauptMenuStatus_Zeile3', 'Unknown_Calculation_119'], + "names": ['ID_WEB_HauptMenuStatus_Zeile3'], "type": MainMenuStatusLine3, "writeable": False, "datatype": 'UINT32', @@ -1253,7 +1253,7 @@ { "index": 120, "count": 1, - "names": ['ID_WEB_HauptMenuStatus_Zeit', 'Unknown_Calculation_120'], + "names": ['ID_WEB_HauptMenuStatus_Zeit'], "type": Seconds, "writeable": False, "datatype": 'UINT32', @@ -1263,7 +1263,7 @@ { "index": 121, "count": 1, - "names": ['ID_WEB_HauptMenuAHP_Stufe', 'Unknown_Calculation_121'], + "names": ['ID_WEB_HauptMenuAHP_Stufe'], "type": Level, "writeable": False, "datatype": 'UINT32', @@ -1273,7 +1273,7 @@ { "index": 122, "count": 1, - "names": ['ID_WEB_HauptMenuAHP_Temp', 'Unknown_Calculation_122'], + "names": ['ID_WEB_HauptMenuAHP_Temp'], "type": Celsius, "writeable": False, "datatype": 'INT32', @@ -1283,7 +1283,7 @@ { "index": 123, "count": 1, - "names": ['ID_WEB_HauptMenuAHP_Zeit', 'Unknown_Calculation_123'], + "names": ['ID_WEB_HauptMenuAHP_Zeit'], "type": Seconds, "writeable": False, "datatype": 'UINT32', @@ -1293,7 +1293,7 @@ { "index": 124, "count": 1, - "names": ['ID_WEB_SH_BWW', 'Unknown_Calculation_124'], + "names": ['ID_WEB_SH_BWW'], "type": Bool, "writeable": False, "datatype": 'UINT32', @@ -1303,7 +1303,7 @@ { "index": 125, "count": 1, - "names": ['ID_WEB_SH_HZ', 'Unknown_Calculation_125'], + "names": ['ID_WEB_SH_HZ'], "type": Icon, "writeable": False, "datatype": 'UINT32', @@ -1313,7 +1313,7 @@ { "index": 126, "count": 1, - "names": ['ID_WEB_SH_MK1', 'Unknown_Calculation_126'], + "names": ['ID_WEB_SH_MK1'], "type": Icon, "writeable": False, "datatype": 'UINT32', @@ -1323,7 +1323,7 @@ { "index": 127, "count": 1, - "names": ['ID_WEB_SH_MK2', 'Unknown_Calculation_127'], + "names": ['ID_WEB_SH_MK2'], "type": Icon, "writeable": False, "datatype": 'UINT32', @@ -1333,7 +1333,7 @@ { "index": 128, "count": 1, - "names": ['ID_WEB_Einst_Kurzrpgramm', 'Unknown_Calculation_128'], + "names": ['ID_WEB_Einst_Kurzrpgramm'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1343,7 +1343,7 @@ { "index": 129, "count": 1, - "names": ['ID_WEB_StatusSlave_1', 'Unknown_Calculation_129'], + "names": ['ID_WEB_StatusSlave_1'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1353,7 +1353,7 @@ { "index": 130, "count": 1, - "names": ['ID_WEB_StatusSlave_2', 'Unknown_Calculation_130'], + "names": ['ID_WEB_StatusSlave_2'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1363,7 +1363,7 @@ { "index": 131, "count": 1, - "names": ['ID_WEB_StatusSlave_3', 'Unknown_Calculation_131'], + "names": ['ID_WEB_StatusSlave_3'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1373,7 +1373,7 @@ { "index": 132, "count": 1, - "names": ['ID_WEB_StatusSlave_4', 'Unknown_Calculation_132'], + "names": ['ID_WEB_StatusSlave_4'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1383,7 +1383,7 @@ { "index": 133, "count": 1, - "names": ['ID_WEB_StatusSlave_5', 'Unknown_Calculation_133'], + "names": ['ID_WEB_StatusSlave_5'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1393,7 +1393,7 @@ { "index": 134, "count": 1, - "names": ['ID_WEB_AktuelleTimeStamp', 'Unknown_Calculation_134'], + "names": ['ID_WEB_AktuelleTimeStamp'], "type": Timestamp, "writeable": False, "datatype": 'UINT32', @@ -1403,7 +1403,7 @@ { "index": 135, "count": 1, - "names": ['ID_WEB_SH_MK3', 'Unknown_Calculation_135'], + "names": ['ID_WEB_SH_MK3'], "type": Icon, "writeable": False, "datatype": 'UINT32', @@ -1413,7 +1413,7 @@ { "index": 136, "count": 1, - "names": ['ID_WEB_Sollwert_TVL_MK3', 'Unknown_Calculation_136'], + "names": ['ID_WEB_Sollwert_TVL_MK3'], "type": Celsius, "writeable": False, "datatype": 'INT32', @@ -1423,7 +1423,7 @@ { "index": 137, "count": 1, - "names": ['ID_WEB_Temperatur_TFB3', 'Unknown_Calculation_137'], + "names": ['ID_WEB_Temperatur_TFB3'], "type": Celsius, "writeable": False, "datatype": 'INT32', @@ -1433,7 +1433,7 @@ { "index": 138, "count": 1, - "names": ['ID_WEB_MZ3out', 'Unknown_Calculation_138'], + "names": ['ID_WEB_MZ3out'], "type": Bool, "writeable": False, "datatype": 'UINT32', @@ -1443,7 +1443,7 @@ { "index": 139, "count": 1, - "names": ['ID_WEB_MA3out', 'Unknown_Calculation_139'], + "names": ['ID_WEB_MA3out'], "type": Bool, "writeable": False, "datatype": 'UINT32', @@ -1453,7 +1453,7 @@ { "index": 140, "count": 1, - "names": ['ID_WEB_FP3out', 'Unknown_Calculation_140'], + "names": ['ID_WEB_FP3out'], "type": Bool, "writeable": False, "datatype": 'UINT32', @@ -1463,7 +1463,7 @@ { "index": 141, "count": 1, - "names": ['ID_WEB_Time_AbtIn', 'Unknown_Calculation_141'], + "names": ['ID_WEB_Time_AbtIn'], "type": Seconds, "writeable": False, "datatype": 'UINT32', @@ -1473,7 +1473,7 @@ { "index": 142, "count": 1, - "names": ['ID_WEB_Temperatur_RFV2', 'Unknown_Calculation_142'], + "names": ['ID_WEB_Temperatur_RFV2'], "type": Celsius, "writeable": False, "datatype": 'INT32', @@ -1483,7 +1483,7 @@ { "index": 143, "count": 1, - "names": ['ID_WEB_Temperatur_RFV3', 'Unknown_Calculation_143'], + "names": ['ID_WEB_Temperatur_RFV3'], "type": Celsius, "writeable": False, "datatype": 'INT32', @@ -1493,7 +1493,7 @@ { "index": 144, "count": 1, - "names": ['ID_WEB_SH_SW', 'Unknown_Calculation_144'], + "names": ['ID_WEB_SH_SW'], "type": Icon, "writeable": False, "datatype": 'UINT32', @@ -1503,7 +1503,7 @@ { "index": 145, "count": 1, - "names": ['ID_WEB_Zaehler_BetrZeitSW', 'Unknown_Calculation_145'], + "names": ['ID_WEB_Zaehler_BetrZeitSW'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1513,7 +1513,7 @@ { "index": 146, "count": 1, - "names": ['ID_WEB_FreigabKuehl', 'Unknown_Calculation_146'], + "names": ['ID_WEB_FreigabKuehl'], "type": Bool, "writeable": False, "datatype": 'UINT32', @@ -1523,7 +1523,7 @@ { "index": 147, "count": 1, - "names": ['ID_WEB_AnalogIn', 'Unknown_Calculation_147'], + "names": ['ID_WEB_AnalogIn'], "type": Voltage, "writeable": False, "datatype": 'INT32', @@ -1533,7 +1533,7 @@ { "index": 148, "count": 1, - "names": ['ID_WEB_SonderZeichen', 'Unknown_Calculation_148'], + "names": ['ID_WEB_SonderZeichen'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1543,7 +1543,7 @@ { "index": 149, "count": 1, - "names": ['ID_WEB_SH_ZIP', 'Unknown_Calculation_149'], + "names": ['ID_WEB_SH_ZIP'], "type": Icon, "writeable": False, "datatype": 'UINT32', @@ -1553,7 +1553,7 @@ { "index": 150, "count": 1, - "names": ['ID_WEB_WebsrvProgrammWerteBeobarten', 'Unknown_Calculation_150'], + "names": ['ID_WEB_WebsrvProgrammWerteBeobarten'], "type": Icon, "writeable": False, "datatype": 'UINT32', @@ -1563,7 +1563,7 @@ { "index": 151, "count": 1, - "names": ['ID_WEB_WMZ_Heizung', 'Unknown_Calculation_151'], + "names": ['ID_WEB_WMZ_Heizung'], "type": Energy, "writeable": False, "datatype": 'UINT32', @@ -1573,7 +1573,7 @@ { "index": 152, "count": 1, - "names": ['ID_WEB_WMZ_Brauchwasser', 'Unknown_Calculation_152'], + "names": ['ID_WEB_WMZ_Brauchwasser'], "type": Energy, "writeable": False, "datatype": 'UINT32', @@ -1583,7 +1583,7 @@ { "index": 153, "count": 1, - "names": ['ID_WEB_WMZ_Schwimmbad', 'Unknown_Calculation_153'], + "names": ['ID_WEB_WMZ_Schwimmbad'], "type": Energy, "writeable": False, "datatype": 'UINT32', @@ -1593,7 +1593,7 @@ { "index": 154, "count": 1, - "names": ['ID_WEB_WMZ_Seit', 'Unknown_Calculation_154'], + "names": ['ID_WEB_WMZ_Seit'], "type": Energy, "writeable": False, "datatype": 'UINT32', @@ -1603,7 +1603,7 @@ { "index": 155, "count": 1, - "names": ['ID_WEB_WMZ_Durchfluss', 'Unknown_Calculation_155'], + "names": ['ID_WEB_WMZ_Durchfluss'], "type": Flow, "writeable": False, "datatype": 'UINT32', @@ -1613,7 +1613,7 @@ { "index": 156, "count": 1, - "names": ['ID_WEB_AnalogOut1', 'Unknown_Calculation_156'], + "names": ['ID_WEB_AnalogOut1'], "type": Voltage, "writeable": False, "datatype": 'INT32', @@ -1623,7 +1623,7 @@ { "index": 157, "count": 1, - "names": ['ID_WEB_AnalogOut2', 'Unknown_Calculation_157'], + "names": ['ID_WEB_AnalogOut2'], "type": Voltage, "writeable": False, "datatype": 'INT32', @@ -1633,7 +1633,7 @@ { "index": 158, "count": 1, - "names": ['ID_WEB_Time_Heissgas', 'Unknown_Calculation_158'], + "names": ['ID_WEB_Time_Heissgas'], "type": Seconds, "writeable": False, "datatype": 'UINT32', @@ -1643,7 +1643,7 @@ { "index": 159, "count": 1, - "names": ['ID_WEB_Temp_Lueftung_Zuluft', 'Unknown_Calculation_159'], + "names": ['ID_WEB_Temp_Lueftung_Zuluft'], "type": Celsius, "writeable": False, "datatype": 'INT32', @@ -1653,7 +1653,7 @@ { "index": 160, "count": 1, - "names": ['ID_WEB_Temp_Lueftung_Abluft', 'Unknown_Calculation_160'], + "names": ['ID_WEB_Temp_Lueftung_Abluft'], "type": Celsius, "writeable": False, "datatype": 'INT32', @@ -1663,7 +1663,7 @@ { "index": 161, "count": 1, - "names": ['ID_WEB_Zaehler_BetrZeitSolar', 'Unknown_Calculation_161'], + "names": ['ID_WEB_Zaehler_BetrZeitSolar'], "type": Seconds, "writeable": False, "datatype": 'UINT32', @@ -1673,7 +1673,7 @@ { "index": 162, "count": 1, - "names": ['ID_WEB_AnalogOut3', 'Unknown_Calculation_162'], + "names": ['ID_WEB_AnalogOut3'], "type": Voltage, "writeable": False, "datatype": 'INT32', @@ -1683,7 +1683,7 @@ { "index": 163, "count": 1, - "names": ['ID_WEB_AnalogOut4', 'Unknown_Calculation_163'], + "names": ['ID_WEB_AnalogOut4'], "type": Voltage, "writeable": False, "datatype": 'INT32', @@ -1693,7 +1693,7 @@ { "index": 164, "count": 1, - "names": ['ID_WEB_Out_VZU', 'Unknown_Calculation_164'], + "names": ['ID_WEB_Out_VZU'], "type": Voltage, "writeable": False, "datatype": 'INT32', @@ -1703,7 +1703,7 @@ { "index": 165, "count": 1, - "names": ['ID_WEB_Out_VAB', 'Unknown_Calculation_165'], + "names": ['ID_WEB_Out_VAB'], "type": Voltage, "writeable": False, "datatype": 'INT32', @@ -1713,7 +1713,7 @@ { "index": 166, "count": 1, - "names": ['ID_WEB_Out_VSK', 'Unknown_Calculation_166'], + "names": ['ID_WEB_Out_VSK'], "type": Bool, "writeable": False, "datatype": 'UINT32', @@ -1723,7 +1723,7 @@ { "index": 167, "count": 1, - "names": ['ID_WEB_Out_FRH', 'Unknown_Calculation_167'], + "names": ['ID_WEB_Out_FRH'], "type": Bool, "writeable": False, "datatype": 'UINT32', @@ -1733,7 +1733,7 @@ { "index": 168, "count": 1, - "names": ['ID_WEB_AnalogIn2', 'Unknown_Calculation_168'], + "names": ['ID_WEB_AnalogIn2'], "type": Voltage, "writeable": False, "datatype": 'INT32', @@ -1743,7 +1743,7 @@ { "index": 169, "count": 1, - "names": ['ID_WEB_AnalogIn3', 'Unknown_Calculation_169'], + "names": ['ID_WEB_AnalogIn3'], "type": Voltage, "writeable": False, "datatype": 'INT32', @@ -1753,7 +1753,7 @@ { "index": 170, "count": 1, - "names": ['ID_WEB_SAXin', 'Unknown_Calculation_170'], + "names": ['ID_WEB_SAXin'], "type": Bool, "writeable": False, "datatype": 'UINT32', @@ -1763,7 +1763,7 @@ { "index": 171, "count": 1, - "names": ['ID_WEB_SPLin', 'Unknown_Calculation_171'], + "names": ['ID_WEB_SPLin'], "type": Bool, "writeable": False, "datatype": 'UINT32', @@ -1773,7 +1773,7 @@ { "index": 172, "count": 1, - "names": ['ID_WEB_Compact_exists', 'Unknown_Calculation_172'], + "names": ['ID_WEB_Compact_exists'], "type": Bool, "writeable": False, "datatype": 'UINT32', @@ -1783,7 +1783,7 @@ { "index": 173, "count": 1, - "names": ['ID_WEB_Durchfluss_WQ', 'Unknown_Calculation_173'], + "names": ['ID_WEB_Durchfluss_WQ'], "type": Flow, "writeable": False, "datatype": 'UINT32', @@ -1793,7 +1793,7 @@ { "index": 174, "count": 1, - "names": ['ID_WEB_LIN_exists', 'Unknown_Calculation_174'], + "names": ['ID_WEB_LIN_exists'], "type": Bool, "writeable": False, "datatype": 'UINT32', @@ -1803,7 +1803,7 @@ { "index": 175, "count": 1, - "names": ['ID_WEB_LIN_ANSAUG_VERDAMPFER', 'Unknown_Calculation_175'], + "names": ['ID_WEB_LIN_ANSAUG_VERDAMPFER'], "type": Celsius, "writeable": False, "datatype": 'INT32', @@ -1813,7 +1813,7 @@ { "index": 176, "count": 1, - "names": ['ID_WEB_LIN_ANSAUG_VERDICHTER', 'Unknown_Calculation_176'], + "names": ['ID_WEB_LIN_ANSAUG_VERDICHTER'], "type": Celsius, "writeable": False, "datatype": 'INT32', @@ -1823,7 +1823,7 @@ { "index": 177, "count": 1, - "names": ['ID_WEB_LIN_VDH', 'Unknown_Calculation_177'], + "names": ['ID_WEB_LIN_VDH'], "type": Celsius, "writeable": False, "datatype": 'INT32', @@ -1833,7 +1833,7 @@ { "index": 178, "count": 1, - "names": ['ID_WEB_LIN_UH', 'Unknown_Calculation_178'], + "names": ['ID_WEB_LIN_UH'], "type": Kelvin, "writeable": False, "datatype": 'INT32', @@ -1843,7 +1843,7 @@ { "index": 179, "count": 1, - "names": ['ID_WEB_LIN_UH_Soll', 'Unknown_Calculation_179'], + "names": ['ID_WEB_LIN_UH_Soll'], "type": Kelvin, "writeable": False, "datatype": 'INT32', @@ -1853,7 +1853,7 @@ { "index": 180, "count": 1, - "names": ['ID_WEB_LIN_HD', 'Unknown_Calculation_180'], + "names": ['ID_WEB_LIN_HD'], "type": Pressure, "writeable": False, "datatype": 'INT32', @@ -1863,7 +1863,7 @@ { "index": 181, "count": 1, - "names": ['ID_WEB_LIN_ND', 'Unknown_Calculation_181'], + "names": ['ID_WEB_LIN_ND'], "type": Pressure, "writeable": False, "datatype": 'INT32', @@ -1873,7 +1873,7 @@ { "index": 182, "count": 1, - "names": ['ID_WEB_LIN_VDH_out', 'Unknown_Calculation_182'], + "names": ['ID_WEB_LIN_VDH_out'], "type": Bool, "writeable": False, "datatype": 'UINT32', @@ -1883,7 +1883,7 @@ { "index": 183, "count": 1, - "names": ['ID_WEB_HZIO_PWM', 'Unknown_Calculation_183'], + "names": ['ID_WEB_HZIO_PWM'], "type": Percent2, "writeable": False, "datatype": 'UINT32', @@ -1893,7 +1893,7 @@ { "index": 184, "count": 1, - "names": ['ID_WEB_HZIO_VEN', 'Unknown_Calculation_184'], + "names": ['ID_WEB_HZIO_VEN'], "type": Speed, "writeable": False, "datatype": 'UINT32', @@ -1903,7 +1903,7 @@ { "index": 185, "count": 1, - "names": ['ID_WEB_HZIO_EVU2', 'Unknown_Calculation_185'], + "names": ['ID_WEB_HZIO_EVU2'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1913,7 +1913,7 @@ { "index": 186, "count": 1, - "names": ['ID_WEB_HZIO_STB', 'Unknown_Calculation_186'], + "names": ['ID_WEB_HZIO_STB'], "type": Bool, "writeable": False, "datatype": 'UINT32', @@ -1923,7 +1923,7 @@ { "index": 187, "count": 1, - "names": ['ID_WEB_SEC_Qh_Soll', 'Unknown_Calculation_187'], + "names": ['ID_WEB_SEC_Qh_Soll'], "type": Energy, "writeable": False, "datatype": 'UINT32', @@ -1933,7 +1933,7 @@ { "index": 188, "count": 1, - "names": ['ID_WEB_SEC_Qh_Ist', 'Unknown_Calculation_188'], + "names": ['ID_WEB_SEC_Qh_Ist'], "type": Energy, "writeable": False, "datatype": 'UINT32', @@ -1943,7 +1943,7 @@ { "index": 189, "count": 1, - "names": ['ID_WEB_SEC_TVL_Soll', 'Unknown_Calculation_189'], + "names": ['ID_WEB_SEC_TVL_Soll'], "type": Celsius, "writeable": False, "datatype": 'INT32', @@ -1953,7 +1953,7 @@ { "index": 190, "count": 1, - "names": ['ID_WEB_SEC_Software', 'Unknown_Calculation_190'], + "names": ['ID_WEB_SEC_Software'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1963,7 +1963,7 @@ { "index": 191, "count": 1, - "names": ['ID_WEB_SEC_BZ', 'Unknown_Calculation_191'], + "names": ['ID_WEB_SEC_BZ'], "type": SecOperationMode, "writeable": False, "datatype": 'UINT32', @@ -1973,7 +1973,7 @@ { "index": 192, "count": 1, - "names": ['ID_WEB_SEC_VWV', 'Unknown_Calculation_192'], + "names": ['ID_WEB_SEC_VWV'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1983,7 +1983,7 @@ { "index": 193, "count": 1, - "names": ['ID_WEB_SEC_VD', 'Unknown_Calculation_193'], + "names": ['ID_WEB_SEC_VD'], "type": Speed, "writeable": False, "datatype": 'UINT32', @@ -1993,7 +1993,7 @@ { "index": 194, "count": 1, - "names": ['ID_WEB_SEC_VerdEVI', 'Unknown_Calculation_194'], + "names": ['ID_WEB_SEC_VerdEVI'], "type": Celsius, "writeable": False, "datatype": 'INT32', @@ -2003,7 +2003,7 @@ { "index": 195, "count": 1, - "names": ['ID_WEB_SEC_AnsEVI', 'Unknown_Calculation_195'], + "names": ['ID_WEB_SEC_AnsEVI'], "type": Celsius, "writeable": False, "datatype": 'INT32', @@ -2013,7 +2013,7 @@ { "index": 196, "count": 1, - "names": ['ID_WEB_SEC_UEH_EVI', 'Unknown_Calculation_196'], + "names": ['ID_WEB_SEC_UEH_EVI'], "type": Kelvin, "writeable": False, "datatype": 'INT32', @@ -2023,7 +2023,7 @@ { "index": 197, "count": 1, - "names": ['ID_WEB_SEC_UEH_EVI_S', 'Unknown_Calculation_197'], + "names": ['ID_WEB_SEC_UEH_EVI_S'], "type": Kelvin, "writeable": False, "datatype": 'INT32', @@ -2033,7 +2033,7 @@ { "index": 198, "count": 1, - "names": ['ID_WEB_SEC_KondTemp', 'Unknown_Calculation_198'], + "names": ['ID_WEB_SEC_KondTemp'], "type": Celsius, "writeable": False, "datatype": 'INT32', @@ -2043,7 +2043,7 @@ { "index": 199, "count": 1, - "names": ['ID_WEB_SEC_FlussigEx', 'Unknown_Calculation_199'], + "names": ['ID_WEB_SEC_FlussigEx'], "type": Celsius, "writeable": False, "datatype": 'INT32', @@ -2053,7 +2053,7 @@ { "index": 200, "count": 1, - "names": ['ID_WEB_SEC_UK_EEV', 'Unknown_Calculation_200'], + "names": ['ID_WEB_SEC_UK_EEV'], "type": Celsius, "writeable": False, "datatype": 'INT32', @@ -2063,7 +2063,7 @@ { "index": 201, "count": 1, - "names": ['ID_WEB_SEC_EVI_Druck', 'Unknown_Calculation_201'], + "names": ['ID_WEB_SEC_EVI_Druck'], "type": Pressure, "writeable": False, "datatype": 'INT32', @@ -2073,7 +2073,7 @@ { "index": 202, "count": 1, - "names": ['ID_WEB_SEC_U_Inv', 'Unknown_Calculation_202'], + "names": ['ID_WEB_SEC_U_Inv'], "type": Voltage, "writeable": False, "datatype": 'INT32', @@ -2083,7 +2083,7 @@ { "index": 203, "count": 1, - "names": ['ID_WEB_Temperatur_THG_2', 'Unknown_Calculation_203'], + "names": ['ID_WEB_Temperatur_THG_2'], "type": Celsius, "writeable": False, "datatype": 'INT32', @@ -2093,7 +2093,7 @@ { "index": 204, "count": 1, - "names": ['ID_WEB_Temperatur_TWE_2', 'Unknown_Calculation_204'], + "names": ['ID_WEB_Temperatur_TWE_2'], "type": Celsius, "writeable": False, "datatype": 'INT32', @@ -2103,7 +2103,7 @@ { "index": 205, "count": 1, - "names": ['ID_WEB_LIN_ANSAUG_VERDAMPFER_2', 'Unknown_Calculation_205'], + "names": ['ID_WEB_LIN_ANSAUG_VERDAMPFER_2'], "type": Celsius, "writeable": False, "datatype": 'INT32', @@ -2113,7 +2113,7 @@ { "index": 206, "count": 1, - "names": ['ID_WEB_LIN_ANSAUG_VERDICHTER_2', 'Unknown_Calculation_206'], + "names": ['ID_WEB_LIN_ANSAUG_VERDICHTER_2'], "type": Celsius, "writeable": False, "datatype": 'INT32', @@ -2123,7 +2123,7 @@ { "index": 207, "count": 1, - "names": ['ID_WEB_LIN_VDH_2', 'Unknown_Calculation_207'], + "names": ['ID_WEB_LIN_VDH_2'], "type": Celsius, "writeable": False, "datatype": 'INT32', @@ -2133,7 +2133,7 @@ { "index": 208, "count": 1, - "names": ['ID_WEB_LIN_UH_2', 'Unknown_Calculation_208'], + "names": ['ID_WEB_LIN_UH_2'], "type": Kelvin, "writeable": False, "datatype": 'INT32', @@ -2143,7 +2143,7 @@ { "index": 209, "count": 1, - "names": ['ID_WEB_LIN_UH_Soll_2', 'Unknown_Calculation_209'], + "names": ['ID_WEB_LIN_UH_Soll_2'], "type": Kelvin, "writeable": False, "datatype": 'INT32', @@ -2153,7 +2153,7 @@ { "index": 210, "count": 1, - "names": ['ID_WEB_LIN_HD_2', 'Unknown_Calculation_210'], + "names": ['ID_WEB_LIN_HD_2'], "type": Pressure, "writeable": False, "datatype": 'INT32', @@ -2163,7 +2163,7 @@ { "index": 211, "count": 1, - "names": ['ID_WEB_LIN_ND_2', 'Unknown_Calculation_211'], + "names": ['ID_WEB_LIN_ND_2'], "type": Pressure, "writeable": False, "datatype": 'INT32', @@ -2173,7 +2173,7 @@ { "index": 212, "count": 1, - "names": ['ID_WEB_HDin_2', 'Unknown_Calculation_212'], + "names": ['ID_WEB_HDin_2'], "type": Bool, "writeable": False, "datatype": 'UINT32', @@ -2183,7 +2183,7 @@ { "index": 213, "count": 1, - "names": ['ID_WEB_AVout_2', 'Unknown_Calculation_213'], + "names": ['ID_WEB_AVout_2'], "type": Bool, "writeable": False, "datatype": 'UINT32', @@ -2193,7 +2193,7 @@ { "index": 214, "count": 1, - "names": ['ID_WEB_VBOout_2', 'Unknown_Calculation_214'], + "names": ['ID_WEB_VBOout_2'], "type": Bool, "writeable": False, "datatype": 'UINT32', @@ -2203,7 +2203,7 @@ { "index": 215, "count": 1, - "names": ['ID_WEB_VD1out_2', 'Unknown_Calculation_215'], + "names": ['ID_WEB_VD1out_2'], "type": Bool, "writeable": False, "datatype": 'UINT32', @@ -2213,7 +2213,7 @@ { "index": 216, "count": 1, - "names": ['ID_WEB_LIN_VDH_out_2', 'Unknown_Calculation_216'], + "names": ['ID_WEB_LIN_VDH_out_2'], "type": Bool, "writeable": False, "datatype": 'UINT32', @@ -2223,7 +2223,7 @@ { "index": 217, "count": 1, - "names": ['ID_WEB_Switchoff2_file_Nr0', 'Unknown_Calculation_217'], + "names": ['ID_WEB_Switchoff2_file_Nr0'], "type": SwitchoffFile, "writeable": False, "datatype": 'UINT32', @@ -2233,7 +2233,7 @@ { "index": 218, "count": 1, - "names": ['ID_WEB_Switchoff2_file_Nr1', 'Unknown_Calculation_218'], + "names": ['ID_WEB_Switchoff2_file_Nr1'], "type": SwitchoffFile, "writeable": False, "datatype": 'UINT32', @@ -2243,7 +2243,7 @@ { "index": 219, "count": 1, - "names": ['ID_WEB_Switchoff2_file_Nr2', 'Unknown_Calculation_219'], + "names": ['ID_WEB_Switchoff2_file_Nr2'], "type": SwitchoffFile, "writeable": False, "datatype": 'UINT32', @@ -2253,7 +2253,7 @@ { "index": 220, "count": 1, - "names": ['ID_WEB_Switchoff2_file_Nr3', 'Unknown_Calculation_220'], + "names": ['ID_WEB_Switchoff2_file_Nr3'], "type": SwitchoffFile, "writeable": False, "datatype": 'UINT32', @@ -2263,7 +2263,7 @@ { "index": 221, "count": 1, - "names": ['ID_WEB_Switchoff2_file_Nr4', 'Unknown_Calculation_221'], + "names": ['ID_WEB_Switchoff2_file_Nr4'], "type": SwitchoffFile, "writeable": False, "datatype": 'UINT32', @@ -2273,7 +2273,7 @@ { "index": 222, "count": 1, - "names": ['ID_WEB_Switchoff2_file_Time0', 'Unknown_Calculation_222'], + "names": ['ID_WEB_Switchoff2_file_Time0'], "type": Timestamp, "writeable": False, "datatype": 'UINT32', @@ -2283,7 +2283,7 @@ { "index": 223, "count": 1, - "names": ['ID_WEB_Switchoff2_file_Time1', 'Unknown_Calculation_223'], + "names": ['ID_WEB_Switchoff2_file_Time1'], "type": Timestamp, "writeable": False, "datatype": 'UINT32', @@ -2293,7 +2293,7 @@ { "index": 224, "count": 1, - "names": ['ID_WEB_Switchoff2_file_Time2', 'Unknown_Calculation_224'], + "names": ['ID_WEB_Switchoff2_file_Time2'], "type": Timestamp, "writeable": False, "datatype": 'UINT32', @@ -2303,7 +2303,7 @@ { "index": 225, "count": 1, - "names": ['ID_WEB_Switchoff2_file_Time3', 'Unknown_Calculation_225'], + "names": ['ID_WEB_Switchoff2_file_Time3'], "type": Timestamp, "writeable": False, "datatype": 'UINT32', @@ -2313,7 +2313,7 @@ { "index": 226, "count": 1, - "names": ['ID_WEB_Switchoff2_file_Time4', 'Unknown_Calculation_226'], + "names": ['ID_WEB_Switchoff2_file_Time4'], "type": Timestamp, "writeable": False, "datatype": 'UINT32', @@ -2323,7 +2323,7 @@ { "index": 227, "count": 1, - "names": ['ID_WEB_RBE_RT_Ist', 'Unknown_Calculation_227'], + "names": ['ID_WEB_RBE_RT_Ist'], "type": Celsius, "writeable": False, "datatype": 'INT32', @@ -2333,7 +2333,7 @@ { "index": 228, "count": 1, - "names": ['ID_WEB_RBE_RT_Soll', 'Unknown_Calculation_228'], + "names": ['ID_WEB_RBE_RT_Soll'], "type": Celsius, "writeable": False, "datatype": 'INT32', @@ -2343,7 +2343,7 @@ { "index": 229, "count": 1, - "names": ['ID_WEB_Temperatur_BW_oben', 'Unknown_Calculation_229'], + "names": ['ID_WEB_Temperatur_BW_oben'], "type": Celsius, "writeable": False, "datatype": 'INT32', @@ -2353,7 +2353,7 @@ { "index": 230, "count": 1, - "names": ['ID_WEB_Code_WP_akt_2', 'Unknown_Calculation_230'], + "names": ['ID_WEB_Code_WP_akt_2'], "type": HeatpumpCode, "writeable": False, "datatype": 'UINT32', @@ -2363,7 +2363,7 @@ { "index": 231, "count": 1, - "names": ['ID_WEB_Freq_VD', 'Unknown_Calculation_231'], + "names": ['ID_WEB_Freq_VD'], "type": Frequency, "writeable": False, "datatype": 'UINT32', @@ -2463,7 +2463,7 @@ { "index": 241, "count": 1, - "names": ['HUP_PWM', 'Circulation_Pump', 'Unknown_Calculation_241'], + "names": ['HUP_PWM', 'Circulation_Pump'], "type": Percent2, "writeable": False, "datatype": 'UINT32', @@ -2593,7 +2593,7 @@ { "index": 254, "count": 1, - "names": ['Flow_Rate_254', 'Unknown_Calculation_254'], + "names": ['Flow_Rate_254'], "type": Flow, "writeable": False, "datatype": 'UINT32', @@ -2623,7 +2623,7 @@ { "index": 257, "count": 1, - "names": ['Heat_Output', 'Unknown_Calculation_257'], + "names": ['Heat_Output'], "type": Power, "writeable": False, "datatype": 'UINT32', @@ -2723,7 +2723,7 @@ { "index": 267, "count": 1, - "names": ['Desired_Room_Temperature', 'Unknown_Calculation_267'], + "names": ['Desired_Room_Temperature'], "type": Celsius, "writeable": False, "datatype": 'INT32', @@ -2733,7 +2733,7 @@ { "index": 268, "count": 1, - "names": ['AC_Power_Input', 'Unknown_Calculation_268'], + "names": ['AC_Power_Input'], "type": Power, "writeable": False, "datatype": 'UINT32', diff --git a/luxtronik/definitions/parameters.py b/luxtronik/definitions/parameters.py index ce5d3f37..d5b5040e 100644 --- a/luxtronik/definitions/parameters.py +++ b/luxtronik/definitions/parameters.py @@ -47,7 +47,7 @@ { "index": 0, "count": 1, - "names": ['ID_Transfert_LuxNet', 'Unknown_Parameter_0'], + "names": ['ID_Transfert_LuxNet'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -57,7 +57,7 @@ { "index": 1, "count": 1, - "names": ['ID_Einst_WK_akt', 'Unknown_Parameter_1'], + "names": ['ID_Einst_WK_akt'], "type": Celsius, "writeable": True, "datatype": 'INT32', @@ -67,7 +67,7 @@ { "index": 2, "count": 1, - "names": ['ID_Einst_BWS_akt', 'Unknown_Parameter_2'], + "names": ['ID_Einst_BWS_akt'], "type": Celsius, "writeable": True, "datatype": 'INT32', @@ -77,7 +77,7 @@ { "index": 3, "count": 1, - "names": ['ID_Ba_Hz_akt', 'Unknown_Parameter_3'], + "names": ['ID_Ba_Hz_akt'], "type": HeatingMode, "writeable": True, "datatype": 'UINT32', @@ -87,7 +87,7 @@ { "index": 4, "count": 1, - "names": ['ID_Ba_Bw_akt', 'Unknown_Parameter_4'], + "names": ['ID_Ba_Bw_akt'], "type": HotWaterMode, "writeable": True, "datatype": 'UINT32', @@ -97,7 +97,7 @@ { "index": 5, "count": 1, - "names": ['ID_Ba_Al_akt', 'Unknown_Parameter_5'], + "names": ['ID_Ba_Al_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -107,7 +107,7 @@ { "index": 6, "count": 1, - "names": ['ID_SU_FrkdHz', 'Unknown_Parameter_6'], + "names": ['ID_SU_FrkdHz'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -117,7 +117,7 @@ { "index": 7, "count": 1, - "names": ['ID_SU_FrkdBw', 'Unknown_Parameter_7'], + "names": ['ID_SU_FrkdBw'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -127,7 +127,7 @@ { "index": 8, "count": 1, - "names": ['ID_SU_FrkdAl', 'Unknown_Parameter_8'], + "names": ['ID_SU_FrkdAl'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -137,7 +137,7 @@ { "index": 9, "count": 1, - "names": ['ID_Einst_HReg_akt', 'Unknown_Parameter_9'], + "names": ['ID_Einst_HReg_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -147,7 +147,7 @@ { "index": 10, "count": 1, - "names": ['ID_Einst_HzHwMAt_akt', 'Unknown_Parameter_10'], + "names": ['ID_Einst_HzHwMAt_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -157,7 +157,7 @@ { "index": 11, "count": 1, - "names": ['ID_Einst_HzHwHKE_akt', 'Unknown_Parameter_11'], + "names": ['ID_Einst_HzHwHKE_akt'], "type": Celsius, "writeable": True, "datatype": 'INT32', @@ -167,7 +167,7 @@ { "index": 12, "count": 1, - "names": ['ID_Einst_HzHKRANH_akt', 'Unknown_Parameter_12'], + "names": ['ID_Einst_HzHKRANH_akt'], "type": Celsius, "writeable": True, "datatype": 'INT32', @@ -177,7 +177,7 @@ { "index": 13, "count": 1, - "names": ['ID_Einst_HzHKRABS_akt', 'Unknown_Parameter_13'], + "names": ['ID_Einst_HzHKRABS_akt'], "type": Celsius, "writeable": True, "datatype": 'INT32', @@ -187,7 +187,7 @@ { "index": 14, "count": 1, - "names": ['ID_Einst_HzMK1E_akt', 'Unknown_Parameter_14'], + "names": ['ID_Einst_HzMK1E_akt'], "type": Celsius, "writeable": True, "datatype": 'INT32', @@ -197,7 +197,7 @@ { "index": 15, "count": 1, - "names": ['ID_Einst_HzMK1ANH_akt', 'Unknown_Parameter_15'], + "names": ['ID_Einst_HzMK1ANH_akt'], "type": Celsius, "writeable": True, "datatype": 'INT32', @@ -207,7 +207,7 @@ { "index": 16, "count": 1, - "names": ['ID_Einst_HzMK1ABS_akt', 'Unknown_Parameter_16'], + "names": ['ID_Einst_HzMK1ABS_akt'], "type": Celsius, "writeable": True, "datatype": 'INT32', @@ -217,7 +217,7 @@ { "index": 17, "count": 1, - "names": ['ID_Einst_HzFtRl_akt', 'Unknown_Parameter_17'], + "names": ['ID_Einst_HzFtRl_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -227,7 +227,7 @@ { "index": 18, "count": 1, - "names": ['ID_Einst_HzFtMK1Vl_akt', 'Unknown_Parameter_18'], + "names": ['ID_Einst_HzFtMK1Vl_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -237,7 +237,7 @@ { "index": 19, "count": 1, - "names": ['ID_Einst_SUBW_akt', 'Unknown_Parameter_19'], + "names": ['ID_Einst_SUBW_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -247,7 +247,7 @@ { "index": 20, "count": 1, - "names": ['ID_Einst_BwTDI_akt_MO', 'Unknown_Parameter_20'], + "names": ['ID_Einst_BwTDI_akt_MO'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -257,7 +257,7 @@ { "index": 21, "count": 1, - "names": ['ID_Einst_BwTDI_akt_DI', 'Unknown_Parameter_21'], + "names": ['ID_Einst_BwTDI_akt_DI'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -267,7 +267,7 @@ { "index": 22, "count": 1, - "names": ['ID_Einst_BwTDI_akt_MI', 'Unknown_Parameter_22'], + "names": ['ID_Einst_BwTDI_akt_MI'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -277,7 +277,7 @@ { "index": 23, "count": 1, - "names": ['ID_Einst_BwTDI_akt_DO', 'Unknown_Parameter_23'], + "names": ['ID_Einst_BwTDI_akt_DO'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -287,7 +287,7 @@ { "index": 24, "count": 1, - "names": ['ID_Einst_BwTDI_akt_FR', 'Unknown_Parameter_24'], + "names": ['ID_Einst_BwTDI_akt_FR'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -297,7 +297,7 @@ { "index": 25, "count": 1, - "names": ['ID_Einst_BwTDI_akt_SA', 'Unknown_Parameter_25'], + "names": ['ID_Einst_BwTDI_akt_SA'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -307,7 +307,7 @@ { "index": 26, "count": 1, - "names": ['ID_Einst_BwTDI_akt_SO', 'Unknown_Parameter_26'], + "names": ['ID_Einst_BwTDI_akt_SO'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -317,7 +317,7 @@ { "index": 27, "count": 1, - "names": ['ID_Einst_BwTDI_akt_AL', 'Unknown_Parameter_27'], + "names": ['ID_Einst_BwTDI_akt_AL'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -327,7 +327,7 @@ { "index": 28, "count": 1, - "names": ['ID_Einst_AnlKonf_akt', 'Unknown_Parameter_28'], + "names": ['ID_Einst_AnlKonf_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -337,7 +337,7 @@ { "index": 29, "count": 1, - "names": ['ID_Einst_Sprache_akt', 'Unknown_Parameter_29'], + "names": ['ID_Einst_Sprache_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -347,7 +347,7 @@ { "index": 30, "count": 1, - "names": ['ID_Switchoff_Zahler', 'Unknown_Parameter_30'], + "names": ['ID_Switchoff_Zahler'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -357,7 +357,7 @@ { "index": 31, "count": 1, - "names": ['ID_Switchoff_index', 'Unknown_Parameter_31'], + "names": ['ID_Switchoff_index'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -367,7 +367,7 @@ { "index": 32, "count": 1, - "names": ['ID_Einst_EvuTyp_akt', 'Unknown_Parameter_32'], + "names": ['ID_Einst_EvuTyp_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -377,7 +377,7 @@ { "index": 33, "count": 1, - "names": ['ID_Einst_RFVEinb_akt', 'Unknown_Parameter_33'], + "names": ['ID_Einst_RFVEinb_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -387,7 +387,7 @@ { "index": 34, "count": 1, - "names": ['ID_Einst_AbtZykMax_akt', 'Unknown_Parameter_34'], + "names": ['ID_Einst_AbtZykMax_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -397,7 +397,7 @@ { "index": 35, "count": 1, - "names": ['ID_Einst_HREinb_akt', 'Unknown_Parameter_35'], + "names": ['ID_Einst_HREinb_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -407,7 +407,7 @@ { "index": 36, "count": 1, - "names": ['ID_Einst_ZWE1Art_akt', 'Unknown_Parameter_36'], + "names": ['ID_Einst_ZWE1Art_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -417,7 +417,7 @@ { "index": 37, "count": 1, - "names": ['ID_Einst_ZWE1Fkt_akt', 'Unknown_Parameter_37'], + "names": ['ID_Einst_ZWE1Fkt_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -427,7 +427,7 @@ { "index": 38, "count": 1, - "names": ['ID_Einst_ZWE2Art_akt', 'Unknown_Parameter_38'], + "names": ['ID_Einst_ZWE2Art_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -437,7 +437,7 @@ { "index": 39, "count": 1, - "names": ['ID_Einst_ZWE2Fkt_akt', 'Unknown_Parameter_39'], + "names": ['ID_Einst_ZWE2Fkt_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -447,7 +447,7 @@ { "index": 40, "count": 1, - "names": ['ID_Einst_BWBer_akt', 'Unknown_Parameter_40'], + "names": ['ID_Einst_BWBer_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -457,7 +457,7 @@ { "index": 41, "count": 1, - "names": ['ID_Einst_En_Inst', 'Unknown_Parameter_41'], + "names": ['ID_Einst_En_Inst'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -467,7 +467,7 @@ { "index": 42, "count": 1, - "names": ['ID_Einst_MK1Typ_akt', 'Unknown_Parameter_42'], + "names": ['ID_Einst_MK1Typ_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -477,7 +477,7 @@ { "index": 43, "count": 1, - "names": ['ID_Einst_ABTLuft_akt', 'Unknown_Parameter_43'], + "names": ['ID_Einst_ABTLuft_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -487,7 +487,7 @@ { "index": 44, "count": 1, - "names": ['ID_Einst_TLAbt_akt', 'Unknown_Parameter_44'], + "names": ['ID_Einst_TLAbt_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -497,7 +497,7 @@ { "index": 45, "count": 1, - "names": ['ID_Einst_LAbtTime_akt', 'Unknown_Parameter_45'], + "names": ['ID_Einst_LAbtTime_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -507,7 +507,7 @@ { "index": 46, "count": 1, - "names": ['ID_Einst_ASDTyp_akt', 'Unknown_Parameter_46'], + "names": ['ID_Einst_ASDTyp_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -517,7 +517,7 @@ { "index": 47, "count": 1, - "names": ['ID_Einst_LGST_akt', 'Unknown_Parameter_47'], + "names": ['ID_Einst_LGST_akt'], "type": Celsius, "writeable": True, "datatype": 'INT32', @@ -527,7 +527,7 @@ { "index": 48, "count": 1, - "names": ['ID_Einst_BwWpTime_akt', 'Unknown_Parameter_48'], + "names": ['ID_Einst_BwWpTime_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -537,7 +537,7 @@ { "index": 49, "count": 1, - "names": ['ID_Einst_Popt_akt', 'Unknown_Parameter_49'], + "names": ['ID_Einst_Popt_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -547,7 +547,7 @@ { "index": 50, "count": 1, - "names": ['ID_Einst_Kurzprog_akt', 'Unknown_Parameter_50'], + "names": ['ID_Einst_Kurzprog_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -557,7 +557,7 @@ { "index": 51, "count": 1, - "names": ['ID_Timer_Kurzprog_akt', 'Unknown_Parameter_51'], + "names": ['ID_Timer_Kurzprog_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -567,7 +567,7 @@ { "index": 52, "count": 1, - "names": ['ID_Einst_ManAbt_akt', 'Unknown_Parameter_52'], + "names": ['ID_Einst_ManAbt_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -577,7 +577,7 @@ { "index": 53, "count": 1, - "names": ['ID_Einst_Ahz_akt', 'Unknown_Parameter_53'], + "names": ['ID_Einst_Ahz_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -587,7 +587,7 @@ { "index": 54, "count": 1, - "names": ['ID_Einst_TVL_Ahz_1', 'Unknown_Parameter_54'], + "names": ['ID_Einst_TVL_Ahz_1'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -597,7 +597,7 @@ { "index": 55, "count": 1, - "names": ['ID_Einst_TVL_Ahz_2', 'Unknown_Parameter_55'], + "names": ['ID_Einst_TVL_Ahz_2'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -607,7 +607,7 @@ { "index": 56, "count": 1, - "names": ['ID_Einst_TVL_Ahz_3', 'Unknown_Parameter_56'], + "names": ['ID_Einst_TVL_Ahz_3'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -617,7 +617,7 @@ { "index": 57, "count": 1, - "names": ['ID_Einst_TVL_Ahz_4', 'Unknown_Parameter_57'], + "names": ['ID_Einst_TVL_Ahz_4'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -627,7 +627,7 @@ { "index": 58, "count": 1, - "names": ['ID_Einst_TVL_Ahz_5', 'Unknown_Parameter_58'], + "names": ['ID_Einst_TVL_Ahz_5'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -637,7 +637,7 @@ { "index": 59, "count": 1, - "names": ['ID_Einst_TVL_Ahz_6', 'Unknown_Parameter_59'], + "names": ['ID_Einst_TVL_Ahz_6'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -647,7 +647,7 @@ { "index": 60, "count": 1, - "names": ['ID_Einst_TVL_Ahz_7', 'Unknown_Parameter_60'], + "names": ['ID_Einst_TVL_Ahz_7'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -657,7 +657,7 @@ { "index": 61, "count": 1, - "names": ['ID_Einst_TVL_Ahz_8', 'Unknown_Parameter_61'], + "names": ['ID_Einst_TVL_Ahz_8'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -667,7 +667,7 @@ { "index": 62, "count": 1, - "names": ['ID_Einst_TVL_Ahz_9', 'Unknown_Parameter_62'], + "names": ['ID_Einst_TVL_Ahz_9'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -677,7 +677,7 @@ { "index": 63, "count": 1, - "names": ['ID_Einst_TVL_Ahz_10', 'Unknown_Parameter_63'], + "names": ['ID_Einst_TVL_Ahz_10'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -687,7 +687,7 @@ { "index": 64, "count": 1, - "names": ['ID_Einst_TVL_Std_1', 'Unknown_Parameter_64'], + "names": ['ID_Einst_TVL_Std_1'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -697,7 +697,7 @@ { "index": 65, "count": 1, - "names": ['ID_Einst_TVL_Std_2', 'Unknown_Parameter_65'], + "names": ['ID_Einst_TVL_Std_2'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -707,7 +707,7 @@ { "index": 66, "count": 1, - "names": ['ID_Einst_TVL_Std_3', 'Unknown_Parameter_66'], + "names": ['ID_Einst_TVL_Std_3'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -717,7 +717,7 @@ { "index": 67, "count": 1, - "names": ['ID_Einst_TVL_Std_4', 'Unknown_Parameter_67'], + "names": ['ID_Einst_TVL_Std_4'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -727,7 +727,7 @@ { "index": 68, "count": 1, - "names": ['ID_Einst_TVL_Std_5', 'Unknown_Parameter_68'], + "names": ['ID_Einst_TVL_Std_5'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -737,7 +737,7 @@ { "index": 69, "count": 1, - "names": ['ID_Einst_TVL_Std_6', 'Unknown_Parameter_69'], + "names": ['ID_Einst_TVL_Std_6'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -747,7 +747,7 @@ { "index": 70, "count": 1, - "names": ['ID_Einst_TVL_Std_7', 'Unknown_Parameter_70'], + "names": ['ID_Einst_TVL_Std_7'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -757,7 +757,7 @@ { "index": 71, "count": 1, - "names": ['ID_Einst_TVL_Std_8', 'Unknown_Parameter_71'], + "names": ['ID_Einst_TVL_Std_8'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -767,7 +767,7 @@ { "index": 72, "count": 1, - "names": ['ID_Einst_TVL_Std_9', 'Unknown_Parameter_72'], + "names": ['ID_Einst_TVL_Std_9'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -777,7 +777,7 @@ { "index": 73, "count": 1, - "names": ['ID_Einst_TVL_Std_10', 'Unknown_Parameter_73'], + "names": ['ID_Einst_TVL_Std_10'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -787,7 +787,7 @@ { "index": 74, "count": 1, - "names": ['ID_Einst_BWS_Hyst_akt', 'Unknown_Parameter_74'], + "names": ['ID_Einst_BWS_Hyst_akt'], "type": Kelvin, "writeable": True, "datatype": 'INT32', @@ -797,7 +797,7 @@ { "index": 75, "count": 1, - "names": ['ID_Temp_TBW_BwHD_saved', 'Unknown_Parameter_75'], + "names": ['ID_Temp_TBW_BwHD_saved'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -807,7 +807,7 @@ { "index": 76, "count": 1, - "names": ['ID_Einst_ABT1_akt', 'Unknown_Parameter_76'], + "names": ['ID_Einst_ABT1_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -817,7 +817,7 @@ { "index": 77, "count": 1, - "names": ['ID_Einst_LABTpaus_akt', 'Unknown_Parameter_77'], + "names": ['ID_Einst_LABTpaus_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -827,7 +827,7 @@ { "index": 78, "count": 1, - "names": ['ID_AHZ_state_akt', 'Unknown_Parameter_78'], + "names": ['ID_AHZ_state_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -837,7 +837,7 @@ { "index": 79, "count": 1, - "names": ['ID_Sollwert_TRL_HZ_AHZ', 'Unknown_Parameter_79'], + "names": ['ID_Sollwert_TRL_HZ_AHZ'], "type": Celsius, "writeable": True, "datatype": 'INT32', @@ -847,7 +847,7 @@ { "index": 80, "count": 1, - "names": ['ID_AHP_valid_records', 'Unknown_Parameter_80'], + "names": ['ID_AHP_valid_records'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -857,7 +857,7 @@ { "index": 81, "count": 1, - "names": ['ID_Timer_AHZ_akt', 'Unknown_Parameter_81'], + "names": ['ID_Timer_AHZ_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -867,7 +867,7 @@ { "index": 82, "count": 1, - "names": ['ID_Einst_BWTINP_akt', 'Unknown_Parameter_82'], + "names": ['ID_Einst_BWTINP_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -877,7 +877,7 @@ { "index": 83, "count": 1, - "names": ['ID_Einst_ZUPTYP_akt', 'Unknown_Parameter_83'], + "names": ['ID_Einst_ZUPTYP_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -887,7 +887,7 @@ { "index": 84, "count": 1, - "names": ['ID_Sollwert_TLG_max', 'Unknown_Parameter_84'], + "names": ['ID_Sollwert_TLG_max'], "type": Celsius, "writeable": False, "datatype": 'INT32', @@ -897,7 +897,7 @@ { "index": 85, "count": 1, - "names": ['ID_Einst_BWZIP_akt', 'Unknown_Parameter_85'], + "names": ['ID_Einst_BWZIP_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -907,7 +907,7 @@ { "index": 86, "count": 1, - "names": ['ID_Einst_ERRmZWE_akt', 'Unknown_Parameter_86'], + "names": ['ID_Einst_ERRmZWE_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -917,7 +917,7 @@ { "index": 87, "count": 1, - "names": ['ID_Einst_TRBegr_akt', 'Unknown_Parameter_87'], + "names": ['ID_Einst_TRBegr_akt'], "type": Celsius, "writeable": False, "datatype": 'INT32', @@ -927,7 +927,7 @@ { "index": 88, "count": 1, - "names": ['ID_Einst_HRHyst_akt', 'Unknown_Parameter_88'], + "names": ['ID_Einst_HRHyst_akt'], "type": Kelvin, "writeable": True, "datatype": 'INT32', @@ -937,7 +937,7 @@ { "index": 89, "count": 1, - "names": ['ID_Einst_TRErhmax_akt', 'Unknown_Parameter_89'], + "names": ['ID_Einst_TRErhmax_akt'], "type": Kelvin, "writeable": True, "datatype": 'INT32', @@ -947,7 +947,7 @@ { "index": 90, "count": 1, - "names": ['ID_Einst_ZWEFreig_akt', 'Unknown_Parameter_90'], + "names": ['ID_Einst_ZWEFreig_akt'], "type": Celsius, "writeable": True, "datatype": 'INT32', @@ -957,7 +957,7 @@ { "index": 91, "count": 1, - "names": ['ID_Einst_TAmax_akt', 'Unknown_Parameter_91'], + "names": ['ID_Einst_TAmax_akt'], "type": Celsius, "writeable": False, "datatype": 'INT32', @@ -967,7 +967,7 @@ { "index": 92, "count": 1, - "names": ['ID_Einst_TAmin_akt', 'Unknown_Parameter_92'], + "names": ['ID_Einst_TAmin_akt'], "type": Celsius, "writeable": False, "datatype": 'INT32', @@ -977,7 +977,7 @@ { "index": 93, "count": 1, - "names": ['ID_Einst_TWQmin_akt', 'Unknown_Parameter_93'], + "names": ['ID_Einst_TWQmin_akt'], "type": Celsius, "writeable": False, "datatype": 'INT32', @@ -987,7 +987,7 @@ { "index": 94, "count": 1, - "names": ['ID_Einst_THGmax_akt', 'Unknown_Parameter_94'], + "names": ['ID_Einst_THGmax_akt'], "type": Celsius, "writeable": False, "datatype": 'INT32', @@ -997,7 +997,7 @@ { "index": 95, "count": 1, - "names": ['ID_Einst_FRGT2VD_akt', 'Unknown_Parameter_95'], + "names": ['ID_Einst_FRGT2VD_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1007,7 +1007,7 @@ { "index": 96, "count": 1, - "names": ['ID_Einst_TV2VDBW_akt', 'Unknown_Parameter_96'], + "names": ['ID_Einst_TV2VDBW_akt'], "type": Celsius, "writeable": False, "datatype": 'INT32', @@ -1017,7 +1017,7 @@ { "index": 97, "count": 1, - "names": ['ID_Einst_SuAll_akt', 'Unknown_Parameter_97'], + "names": ['ID_Einst_SuAll_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1027,7 +1027,7 @@ { "index": 98, "count": 1, - "names": ['ID_Einst_TAbtEnd_akt', 'Unknown_Parameter_98'], + "names": ['ID_Einst_TAbtEnd_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1037,7 +1037,7 @@ { "index": 99, "count": 1, - "names": ['ID_Einst_NrKlingel_akt', 'Unknown_Parameter_99'], + "names": ['ID_Einst_NrKlingel_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1047,7 +1047,7 @@ { "index": 100, "count": 1, - "names": ['ID_Einst_BWStyp_akt', 'Unknown_Parameter_100'], + "names": ['ID_Einst_BWStyp_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1057,7 +1057,7 @@ { "index": 101, "count": 1, - "names": ['ID_Einst_ABT2_akt', 'Unknown_Parameter_101'], + "names": ['ID_Einst_ABT2_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1067,7 +1067,7 @@ { "index": 102, "count": 1, - "names": ['ID_Einst_UeVd_akt', 'Unknown_Parameter_102'], + "names": ['ID_Einst_UeVd_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1077,7 +1077,7 @@ { "index": 103, "count": 1, - "names": ['ID_Einst_RTyp_akt', 'Unknown_Parameter_103'], + "names": ['ID_Einst_RTyp_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1087,7 +1087,7 @@ { "index": 104, "count": 1, - "names": ['ID_Einst_AhpM_akt', 'Unknown_Parameter_104'], + "names": ['ID_Einst_AhpM_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1097,7 +1097,7 @@ { "index": 105, "count": 1, - "names": ['ID_Soll_BWS_akt', 'Unknown_Parameter_105'], + "names": ['ID_Soll_BWS_akt'], "type": Celsius, "writeable": True, "datatype": 'INT32', @@ -1107,7 +1107,7 @@ { "index": 106, "count": 1, - "names": ['ID_Timer_Password', 'Unknown_Parameter_106'], + "names": ['ID_Timer_Password'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1117,7 +1117,7 @@ { "index": 107, "count": 1, - "names": ['ID_Einst_Zugangscode', 'Unknown_Parameter_107'], + "names": ['ID_Einst_Zugangscode'], "type": AccessLevel, "writeable": True, "datatype": 'UINT32', @@ -1127,7 +1127,7 @@ { "index": 108, "count": 1, - "names": ['ID_Einst_BA_Kuehl_akt', 'Unknown_Parameter_108'], + "names": ['ID_Einst_BA_Kuehl_akt'], "type": CoolingMode, "writeable": True, "datatype": 'UINT32', @@ -1137,7 +1137,7 @@ { "index": 109, "count": 1, - "names": ['ID_Sollwert_Kuehl1_akt', 'Unknown_Parameter_109'], + "names": ['ID_Sollwert_Kuehl1_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1147,7 +1147,7 @@ { "index": 110, "count": 1, - "names": ['ID_Einst_KuehlFreig_akt', 'Unknown_Parameter_110'], + "names": ['ID_Einst_KuehlFreig_akt'], "type": Celsius, "writeable": True, "datatype": 'INT32', @@ -1157,7 +1157,7 @@ { "index": 111, "count": 1, - "names": ['ID_Einst_TAbsMin_akt', 'Unknown_Parameter_111'], + "names": ['ID_Einst_TAbsMin_akt'], "type": Celsius, "writeable": True, "datatype": 'INT32', @@ -1167,7 +1167,7 @@ { "index": 112, "count": 1, - "names": ['ID_TWQmin_saved', 'Unknown_Parameter_112'], + "names": ['ID_TWQmin_saved'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1177,7 +1177,7 @@ { "index": 113, "count": 1, - "names": ['ID_CWP_saved', 'Unknown_Parameter_113'], + "names": ['ID_CWP_saved'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1187,7 +1187,7 @@ { "index": 114, "count": 1, - "names": ['ID_Einst_Anode_akt', 'Unknown_Parameter_114'], + "names": ['ID_Einst_Anode_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1197,7 +1197,7 @@ { "index": 115, "count": 1, - "names": ['ID_Timer_pexoff_akt', 'Unknown_Parameter_115'], + "names": ['ID_Timer_pexoff_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1207,7 +1207,7 @@ { "index": 116, "count": 1, - "names": ['ID_Einst_AnlPrio_Hzakt', 'Unknown_Parameter_116'], + "names": ['ID_Einst_AnlPrio_Hzakt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1217,7 +1217,7 @@ { "index": 117, "count": 1, - "names": ['ID_Einst_AnlPrio_Bwakt', 'Unknown_Parameter_117'], + "names": ['ID_Einst_AnlPrio_Bwakt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1227,7 +1227,7 @@ { "index": 118, "count": 1, - "names": ['ID_Einst_AnlPrio_Swakt', 'Unknown_Parameter_118'], + "names": ['ID_Einst_AnlPrio_Swakt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1237,7 +1237,7 @@ { "index": 119, "count": 1, - "names": ['ID_Ba_Sw_akt', 'Unknown_Parameter_119'], + "names": ['ID_Ba_Sw_akt'], "type": PoolMode, "writeable": True, "datatype": 'UINT32', @@ -1247,7 +1247,7 @@ { "index": 120, "count": 1, - "names": ['ID_Einst_RTypMK1_akt', 'Unknown_Parameter_120'], + "names": ['ID_Einst_RTypMK1_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1257,7 +1257,7 @@ { "index": 121, "count": 1, - "names": ['ID_Einst_RTypMK2_akt', 'Unknown_Parameter_121'], + "names": ['ID_Einst_RTypMK2_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1267,7 +1267,7 @@ { "index": 122, "count": 1, - "names": ['ID_Einst_TDC_Ein_akt', 'Unknown_Parameter_122'], + "names": ['ID_Einst_TDC_Ein_akt'], "type": Kelvin, "writeable": False, "datatype": 'INT32', @@ -1277,7 +1277,7 @@ { "index": 123, "count": 1, - "names": ['ID_Einst_TDC_Aus_akt', 'Unknown_Parameter_123'], + "names": ['ID_Einst_TDC_Aus_akt'], "type": Kelvin, "writeable": False, "datatype": 'INT32', @@ -1287,7 +1287,7 @@ { "index": 124, "count": 1, - "names": ['ID_Einst_TDC_Max_akt', 'Unknown_Parameter_124'], + "names": ['ID_Einst_TDC_Max_akt'], "type": Celsius, "writeable": True, "datatype": 'INT32', @@ -1297,7 +1297,7 @@ { "index": 125, "count": 1, - "names": ['ID_Einst_HysHzExEn_akt', 'Unknown_Parameter_125'], + "names": ['ID_Einst_HysHzExEn_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1307,7 +1307,7 @@ { "index": 126, "count": 1, - "names": ['ID_Einst_HysBwExEn_akt', 'Unknown_Parameter_126'], + "names": ['ID_Einst_HysBwExEn_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1317,7 +1317,7 @@ { "index": 127, "count": 1, - "names": ['ID_Einst_ZWE3Art_akt', 'Unknown_Parameter_127'], + "names": ['ID_Einst_ZWE3Art_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1327,7 +1327,7 @@ { "index": 128, "count": 1, - "names": ['ID_Einst_ZWE3Fkt_akt', 'Unknown_Parameter_128'], + "names": ['ID_Einst_ZWE3Fkt_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1337,7 +1337,7 @@ { "index": 129, "count": 1, - "names": ['ID_Einst_HzSup_akt', 'Unknown_Parameter_129'], + "names": ['ID_Einst_HzSup_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1347,7 +1347,7 @@ { "index": 130, "count": 1, - "names": ['ID_Einst_MK2Typ_akt', 'Unknown_Parameter_130'], + "names": ['ID_Einst_MK2Typ_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1357,7 +1357,7 @@ { "index": 131, "count": 1, - "names": ['ID_Einst_KuTyp_akt', 'Unknown_Parameter_131'], + "names": ['ID_Einst_KuTyp_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1367,7 +1367,7 @@ { "index": 132, "count": 1, - "names": ['ID_Sollwert_KuCft1_akt', 'Unknown_Parameter_132'], + "names": ['ID_Sollwert_KuCft1_akt'], "type": Celsius, "writeable": True, "datatype": 'INT32', @@ -1377,7 +1377,7 @@ { "index": 133, "count": 1, - "names": ['ID_Sollwert_KuCft2_akt', 'Unknown_Parameter_133'], + "names": ['ID_Sollwert_KuCft2_akt'], "type": Celsius, "writeable": True, "datatype": 'INT32', @@ -1387,7 +1387,7 @@ { "index": 134, "count": 1, - "names": ['ID_Sollwert_AtDif1_akt', 'Unknown_Parameter_134'], + "names": ['ID_Sollwert_AtDif1_akt'], "type": Celsius, "writeable": True, "datatype": 'INT32', @@ -1397,7 +1397,7 @@ { "index": 135, "count": 1, - "names": ['ID_Sollwert_AtDif2_akt', 'Unknown_Parameter_135'], + "names": ['ID_Sollwert_AtDif2_akt'], "type": Celsius, "writeable": True, "datatype": 'INT32', @@ -1407,7 +1407,7 @@ { "index": 136, "count": 1, - "names": ['ID_SU_FrkdSwb', 'Unknown_Parameter_136'], + "names": ['ID_SU_FrkdSwb'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1417,7 +1417,7 @@ { "index": 137, "count": 1, - "names": ['ID_Einst_SwbBer_akt', 'Unknown_Parameter_137'], + "names": ['ID_Einst_SwbBer_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1427,7 +1427,7 @@ { "index": 138, "count": 1, - "names": ['ID_Einst_TV2VDSWB_akt', 'Unknown_Parameter_138'], + "names": ['ID_Einst_TV2VDSWB_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1437,7 +1437,7 @@ { "index": 139, "count": 1, - "names": ['ID_Einst_MinSwan_Time_akt', 'Unknown_Parameter_139'], + "names": ['ID_Einst_MinSwan_Time_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1447,7 +1447,7 @@ { "index": 140, "count": 1, - "names": ['ID_Einst_SuMk2_akt', 'Unknown_Parameter_140'], + "names": ['ID_Einst_SuMk2_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1457,7 +1457,7 @@ { "index": 141, "count": 1, - "names": ['ID_Einst_HzMK2E_akt', 'Unknown_Parameter_141'], + "names": ['ID_Einst_HzMK2E_akt'], "type": Celsius, "writeable": True, "datatype": 'INT32', @@ -1467,7 +1467,7 @@ { "index": 142, "count": 1, - "names": ['ID_Einst_HzMK2ANH_akt', 'Unknown_Parameter_142'], + "names": ['ID_Einst_HzMK2ANH_akt'], "type": Celsius, "writeable": True, "datatype": 'INT32', @@ -1477,7 +1477,7 @@ { "index": 143, "count": 1, - "names": ['ID_Einst_HzMK2ABS_akt', 'Unknown_Parameter_143'], + "names": ['ID_Einst_HzMK2ABS_akt'], "type": Celsius, "writeable": True, "datatype": 'INT32', @@ -1487,7 +1487,7 @@ { "index": 144, "count": 1, - "names": ['ID_Einst_HzMK2Hgr_akt', 'Unknown_Parameter_144'], + "names": ['ID_Einst_HzMK2Hgr_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1497,7 +1497,7 @@ { "index": 145, "count": 1, - "names": ['ID_Einst_HzFtMK2Vl_akt', 'Unknown_Parameter_145'], + "names": ['ID_Einst_HzFtMK2Vl_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1507,7 +1507,7 @@ { "index": 146, "count": 1, - "names": ['ID_Temp_THG_BwHD_saved', 'Unknown_Parameter_146'], + "names": ['ID_Temp_THG_BwHD_saved'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1517,7 +1517,7 @@ { "index": 147, "count": 1, - "names": ['ID_Temp_TA_BwHD_saved', 'Unknown_Parameter_147'], + "names": ['ID_Temp_TA_BwHD_saved'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1527,7 +1527,7 @@ { "index": 148, "count": 1, - "names": ['ID_Einst_BwHup_akt', 'Unknown_Parameter_148'], + "names": ['ID_Einst_BwHup_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1537,7 +1537,7 @@ { "index": 149, "count": 1, - "names": ['ID_Einst_TVLmax_akt', 'Unknown_Parameter_149'], + "names": ['ID_Einst_TVLmax_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1547,7 +1547,7 @@ { "index": 150, "count": 1, - "names": ['ID_Einst_MK1LzFaktor_akt', 'Unknown_Parameter_150'], + "names": ['ID_Einst_MK1LzFaktor_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1557,7 +1557,7 @@ { "index": 151, "count": 1, - "names": ['ID_Einst_MK2LzFaktor_akt', 'Unknown_Parameter_151'], + "names": ['ID_Einst_MK2LzFaktor_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1567,7 +1567,7 @@ { "index": 152, "count": 1, - "names": ['ID_Einst_MK1PerFaktor_akt', 'Unknown_Parameter_152'], + "names": ['ID_Einst_MK1PerFaktor_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1577,7 +1577,7 @@ { "index": 153, "count": 1, - "names": ['ID_Einst_MK2PerFaktor_akt', 'Unknown_Parameter_153'], + "names": ['ID_Einst_MK2PerFaktor_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1587,7 +1587,7 @@ { "index": 154, "count": 1, - "names": ['ID_Entl_Zyklus_akt', 'Unknown_Parameter_154'], + "names": ['ID_Entl_Zyklus_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1597,7 +1597,7 @@ { "index": 155, "count": 1, - "names": ['ID_Einst_Entl_time_akt', 'Unknown_Parameter_155'], + "names": ['ID_Einst_Entl_time_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1607,7 +1607,7 @@ { "index": 156, "count": 1, - "names": ['ID_Entl_Pause', 'Unknown_Parameter_156'], + "names": ['ID_Entl_Pause'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1617,7 +1617,7 @@ { "index": 157, "count": 1, - "names": ['ID_Entl_timer', 'Unknown_Parameter_157'], + "names": ['ID_Entl_timer'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1627,7 +1627,7 @@ { "index": 158, "count": 1, - "names": ['ID_Einst_Entl_akt', 'Unknown_Parameter_158'], + "names": ['ID_Einst_Entl_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1637,7 +1637,7 @@ { "index": 159, "count": 1, - "names": ['ID_Ahz_HLeist_confirmed', 'Unknown_Parameter_159'], + "names": ['ID_Ahz_HLeist_confirmed'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1647,7 +1647,7 @@ { "index": 160, "count": 1, - "names": ['ID_FirstInit_akt', 'Unknown_Parameter_160'], + "names": ['ID_FirstInit_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1657,7 +1657,7 @@ { "index": 161, "count": 1, - "names": ['ID_Einst_SuAll_akt2', 'Unknown_Parameter_161'], + "names": ['ID_Einst_SuAll_akt2'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1667,7 +1667,7 @@ { "index": 162, "count": 1, - "names": ['ID_Einst_SuAllWo_zeit_0_0', 'Unknown_Parameter_162'], + "names": ['ID_Einst_SuAllWo_zeit_0_0'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1677,7 +1677,7 @@ { "index": 163, "count": 1, - "names": ['ID_Einst_SuAllWo_zeit_0_1', 'Unknown_Parameter_163'], + "names": ['ID_Einst_SuAllWo_zeit_0_1'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1687,7 +1687,7 @@ { "index": 164, "count": 1, - "names": ['ID_Einst_SuAllWo_zeit_1_0', 'Unknown_Parameter_164'], + "names": ['ID_Einst_SuAllWo_zeit_1_0'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1697,7 +1697,7 @@ { "index": 165, "count": 1, - "names": ['ID_Einst_SuAllWo_zeit_1_1', 'Unknown_Parameter_165'], + "names": ['ID_Einst_SuAllWo_zeit_1_1'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1707,7 +1707,7 @@ { "index": 166, "count": 1, - "names": ['ID_Einst_SuAllWo_zeit_2_0', 'Unknown_Parameter_166'], + "names": ['ID_Einst_SuAllWo_zeit_2_0'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1717,7 +1717,7 @@ { "index": 167, "count": 1, - "names": ['ID_Einst_SuAllWo_zeit_2_1', 'Unknown_Parameter_167'], + "names": ['ID_Einst_SuAllWo_zeit_2_1'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1727,7 +1727,7 @@ { "index": 168, "count": 1, - "names": ['ID_Einst_SuAll25_zeit_0_0', 'Unknown_Parameter_168'], + "names": ['ID_Einst_SuAll25_zeit_0_0'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1737,7 +1737,7 @@ { "index": 169, "count": 1, - "names": ['ID_Einst_SuAll25_zeit_0_1', 'Unknown_Parameter_169'], + "names": ['ID_Einst_SuAll25_zeit_0_1'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1747,7 +1747,7 @@ { "index": 170, "count": 1, - "names": ['ID_Einst_SuAll25_zeit_1_0', 'Unknown_Parameter_170'], + "names": ['ID_Einst_SuAll25_zeit_1_0'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1757,7 +1757,7 @@ { "index": 171, "count": 1, - "names": ['ID_Einst_SuAll25_zeit_1_1', 'Unknown_Parameter_171'], + "names": ['ID_Einst_SuAll25_zeit_1_1'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1767,7 +1767,7 @@ { "index": 172, "count": 1, - "names": ['ID_Einst_SuAll25_zeit_2_0', 'Unknown_Parameter_172'], + "names": ['ID_Einst_SuAll25_zeit_2_0'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1777,7 +1777,7 @@ { "index": 173, "count": 1, - "names": ['ID_Einst_SuAll25_zeit_2_1', 'Unknown_Parameter_173'], + "names": ['ID_Einst_SuAll25_zeit_2_1'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1787,7 +1787,7 @@ { "index": 174, "count": 1, - "names": ['ID_Einst_SuAll25_zeit_0_2', 'Unknown_Parameter_174'], + "names": ['ID_Einst_SuAll25_zeit_0_2'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1797,7 +1797,7 @@ { "index": 175, "count": 1, - "names": ['ID_Einst_SuAll25_zeit_0_3', 'Unknown_Parameter_175'], + "names": ['ID_Einst_SuAll25_zeit_0_3'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1807,7 +1807,7 @@ { "index": 176, "count": 1, - "names": ['ID_Einst_SuAll25_zeit_1_2', 'Unknown_Parameter_176'], + "names": ['ID_Einst_SuAll25_zeit_1_2'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1817,7 +1817,7 @@ { "index": 177, "count": 1, - "names": ['ID_Einst_SuAll25_zeit_1_3', 'Unknown_Parameter_177'], + "names": ['ID_Einst_SuAll25_zeit_1_3'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1827,7 +1827,7 @@ { "index": 178, "count": 1, - "names": ['ID_Einst_SuAll25_zeit_2_2', 'Unknown_Parameter_178'], + "names": ['ID_Einst_SuAll25_zeit_2_2'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1837,7 +1837,7 @@ { "index": 179, "count": 1, - "names": ['ID_Einst_SuAll25_zeit_2_3', 'Unknown_Parameter_179'], + "names": ['ID_Einst_SuAll25_zeit_2_3'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1847,7 +1847,7 @@ { "index": 180, "count": 1, - "names": ['ID_Einst_SuAllTg_zeit_0_0', 'Unknown_Parameter_180'], + "names": ['ID_Einst_SuAllTg_zeit_0_0'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1857,7 +1857,7 @@ { "index": 181, "count": 1, - "names": ['ID_Einst_SuAllTg_zeit_0_1', 'Unknown_Parameter_181'], + "names": ['ID_Einst_SuAllTg_zeit_0_1'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1867,7 +1867,7 @@ { "index": 182, "count": 1, - "names": ['ID_Einst_SuAllTg_zeit_1_0', 'Unknown_Parameter_182'], + "names": ['ID_Einst_SuAllTg_zeit_1_0'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1877,7 +1877,7 @@ { "index": 183, "count": 1, - "names": ['ID_Einst_SuAllTg_zeit_1_1', 'Unknown_Parameter_183'], + "names": ['ID_Einst_SuAllTg_zeit_1_1'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1887,7 +1887,7 @@ { "index": 184, "count": 1, - "names": ['ID_Einst_SuAllTg_zeit_2_0', 'Unknown_Parameter_184'], + "names": ['ID_Einst_SuAllTg_zeit_2_0'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1897,7 +1897,7 @@ { "index": 185, "count": 1, - "names": ['ID_Einst_SuAllTg_zeit_2_1', 'Unknown_Parameter_185'], + "names": ['ID_Einst_SuAllTg_zeit_2_1'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1907,7 +1907,7 @@ { "index": 186, "count": 1, - "names": ['ID_Einst_SuAllTg_zeit_0_2', 'Unknown_Parameter_186'], + "names": ['ID_Einst_SuAllTg_zeit_0_2'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1917,7 +1917,7 @@ { "index": 187, "count": 1, - "names": ['ID_Einst_SuAllTg_zeit_0_3', 'Unknown_Parameter_187'], + "names": ['ID_Einst_SuAllTg_zeit_0_3'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1927,7 +1927,7 @@ { "index": 188, "count": 1, - "names": ['ID_Einst_SuAllTg_zeit_1_2', 'Unknown_Parameter_188'], + "names": ['ID_Einst_SuAllTg_zeit_1_2'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1937,7 +1937,7 @@ { "index": 189, "count": 1, - "names": ['ID_Einst_SuAllTg_zeit_1_3', 'Unknown_Parameter_189'], + "names": ['ID_Einst_SuAllTg_zeit_1_3'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1947,7 +1947,7 @@ { "index": 190, "count": 1, - "names": ['ID_Einst_SuAllTg_zeit_2_2', 'Unknown_Parameter_190'], + "names": ['ID_Einst_SuAllTg_zeit_2_2'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1957,7 +1957,7 @@ { "index": 191, "count": 1, - "names": ['ID_Einst_SuAllTg_zeit_2_3', 'Unknown_Parameter_191'], + "names": ['ID_Einst_SuAllTg_zeit_2_3'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1967,7 +1967,7 @@ { "index": 192, "count": 1, - "names": ['ID_Einst_SuAllTg_zeit_0_4', 'Unknown_Parameter_192'], + "names": ['ID_Einst_SuAllTg_zeit_0_4'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1977,7 +1977,7 @@ { "index": 193, "count": 1, - "names": ['ID_Einst_SuAllTg_zeit_0_5', 'Unknown_Parameter_193'], + "names": ['ID_Einst_SuAllTg_zeit_0_5'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1987,7 +1987,7 @@ { "index": 194, "count": 1, - "names": ['ID_Einst_SuAllTg_zeit_1_4', 'Unknown_Parameter_194'], + "names": ['ID_Einst_SuAllTg_zeit_1_4'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1997,7 +1997,7 @@ { "index": 195, "count": 1, - "names": ['ID_Einst_SuAllTg_zeit_1_5', 'Unknown_Parameter_195'], + "names": ['ID_Einst_SuAllTg_zeit_1_5'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2007,7 +2007,7 @@ { "index": 196, "count": 1, - "names": ['ID_Einst_SuAllTg_zeit_2_4', 'Unknown_Parameter_196'], + "names": ['ID_Einst_SuAllTg_zeit_2_4'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2017,7 +2017,7 @@ { "index": 197, "count": 1, - "names": ['ID_Einst_SuAllTg_zeit_2_5', 'Unknown_Parameter_197'], + "names": ['ID_Einst_SuAllTg_zeit_2_5'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2027,7 +2027,7 @@ { "index": 198, "count": 1, - "names": ['ID_Einst_SuAllTg_zeit_0_6', 'Unknown_Parameter_198'], + "names": ['ID_Einst_SuAllTg_zeit_0_6'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2037,7 +2037,7 @@ { "index": 199, "count": 1, - "names": ['ID_Einst_SuAllTg_zeit_0_7', 'Unknown_Parameter_199'], + "names": ['ID_Einst_SuAllTg_zeit_0_7'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2047,7 +2047,7 @@ { "index": 200, "count": 1, - "names": ['ID_Einst_SuAllTg_zeit_1_6', 'Unknown_Parameter_200'], + "names": ['ID_Einst_SuAllTg_zeit_1_6'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2057,7 +2057,7 @@ { "index": 201, "count": 1, - "names": ['ID_Einst_SuAllTg_zeit_1_7', 'Unknown_Parameter_201'], + "names": ['ID_Einst_SuAllTg_zeit_1_7'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2067,7 +2067,7 @@ { "index": 202, "count": 1, - "names": ['ID_Einst_SuAllTg_zeit_2_6', 'Unknown_Parameter_202'], + "names": ['ID_Einst_SuAllTg_zeit_2_6'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2077,7 +2077,7 @@ { "index": 203, "count": 1, - "names": ['ID_Einst_SuAllTg_zeit_2_7', 'Unknown_Parameter_203'], + "names": ['ID_Einst_SuAllTg_zeit_2_7'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2087,7 +2087,7 @@ { "index": 204, "count": 1, - "names": ['ID_Einst_SuAllTg_zeit_0_8', 'Unknown_Parameter_204'], + "names": ['ID_Einst_SuAllTg_zeit_0_8'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2097,7 +2097,7 @@ { "index": 205, "count": 1, - "names": ['ID_Einst_SuAllTg_zeit_0_9', 'Unknown_Parameter_205'], + "names": ['ID_Einst_SuAllTg_zeit_0_9'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2107,7 +2107,7 @@ { "index": 206, "count": 1, - "names": ['ID_Einst_SuAllTg_zeit_1_8', 'Unknown_Parameter_206'], + "names": ['ID_Einst_SuAllTg_zeit_1_8'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2117,7 +2117,7 @@ { "index": 207, "count": 1, - "names": ['ID_Einst_SuAllTg_zeit_1_9', 'Unknown_Parameter_207'], + "names": ['ID_Einst_SuAllTg_zeit_1_9'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2127,7 +2127,7 @@ { "index": 208, "count": 1, - "names": ['ID_Einst_SuAllTg_zeit_2_8', 'Unknown_Parameter_208'], + "names": ['ID_Einst_SuAllTg_zeit_2_8'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2137,7 +2137,7 @@ { "index": 209, "count": 1, - "names": ['ID_Einst_SuAllTg_zeit_2_9', 'Unknown_Parameter_209'], + "names": ['ID_Einst_SuAllTg_zeit_2_9'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2147,7 +2147,7 @@ { "index": 210, "count": 1, - "names": ['ID_Einst_SuAllTg_zeit_0_10', 'Unknown_Parameter_210'], + "names": ['ID_Einst_SuAllTg_zeit_0_10'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2157,7 +2157,7 @@ { "index": 211, "count": 1, - "names": ['ID_Einst_SuAllTg_zeit_0_11', 'Unknown_Parameter_211'], + "names": ['ID_Einst_SuAllTg_zeit_0_11'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2167,7 +2167,7 @@ { "index": 212, "count": 1, - "names": ['ID_Einst_SuAllTg_zeit_1_10', 'Unknown_Parameter_212'], + "names": ['ID_Einst_SuAllTg_zeit_1_10'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2177,7 +2177,7 @@ { "index": 213, "count": 1, - "names": ['ID_Einst_SuAllTg_zeit_1_11', 'Unknown_Parameter_213'], + "names": ['ID_Einst_SuAllTg_zeit_1_11'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2187,7 +2187,7 @@ { "index": 214, "count": 1, - "names": ['ID_Einst_SuAllTg_zeit_2_10', 'Unknown_Parameter_214'], + "names": ['ID_Einst_SuAllTg_zeit_2_10'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2197,7 +2197,7 @@ { "index": 215, "count": 1, - "names": ['ID_Einst_SuAllTg_zeit_2_11', 'Unknown_Parameter_215'], + "names": ['ID_Einst_SuAllTg_zeit_2_11'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2207,7 +2207,7 @@ { "index": 216, "count": 1, - "names": ['ID_Einst_SuAllTg_zeit_0_12', 'Unknown_Parameter_216'], + "names": ['ID_Einst_SuAllTg_zeit_0_12'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2217,7 +2217,7 @@ { "index": 217, "count": 1, - "names": ['ID_Einst_SuAllTg_zeit_0_13', 'Unknown_Parameter_217'], + "names": ['ID_Einst_SuAllTg_zeit_0_13'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2227,7 +2227,7 @@ { "index": 218, "count": 1, - "names": ['ID_Einst_SuAllTg_zeit_1_12', 'Unknown_Parameter_218'], + "names": ['ID_Einst_SuAllTg_zeit_1_12'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2237,7 +2237,7 @@ { "index": 219, "count": 1, - "names": ['ID_Einst_SuAllTg_zeit_1_13', 'Unknown_Parameter_219'], + "names": ['ID_Einst_SuAllTg_zeit_1_13'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2247,7 +2247,7 @@ { "index": 220, "count": 1, - "names": ['ID_Einst_SuAllTg_zeit_2_12', 'Unknown_Parameter_220'], + "names": ['ID_Einst_SuAllTg_zeit_2_12'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2257,7 +2257,7 @@ { "index": 221, "count": 1, - "names": ['ID_Einst_SuAllTg_zeit_2_13', 'Unknown_Parameter_221'], + "names": ['ID_Einst_SuAllTg_zeit_2_13'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2267,7 +2267,7 @@ { "index": 222, "count": 1, - "names": ['ID_Einst_SuHkr_akt', 'Unknown_Parameter_222'], + "names": ['ID_Einst_SuHkr_akt'], "type": TimerProgram, "writeable": True, "datatype": 'UINT32', @@ -2277,7 +2277,7 @@ { "index": 223, "count": 1, - "names": ['ID_Einst_SuHkrW0_zeit_0_0', 'Unknown_Parameter_223'], + "names": ['ID_Einst_SuHkrW0_zeit_0_0'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -2287,7 +2287,7 @@ { "index": 224, "count": 1, - "names": ['ID_Einst_SuHkrW0_zeit_0_1', 'Unknown_Parameter_224'], + "names": ['ID_Einst_SuHkrW0_zeit_0_1'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -2297,7 +2297,7 @@ { "index": 225, "count": 1, - "names": ['ID_Einst_SuHkrW0_zeit_1_0', 'Unknown_Parameter_225'], + "names": ['ID_Einst_SuHkrW0_zeit_1_0'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -2307,7 +2307,7 @@ { "index": 226, "count": 1, - "names": ['ID_Einst_SuHkrW0_zeit_1_1', 'Unknown_Parameter_226'], + "names": ['ID_Einst_SuHkrW0_zeit_1_1'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -2317,7 +2317,7 @@ { "index": 227, "count": 1, - "names": ['ID_Einst_SuHkrW0_zeit_2_0', 'Unknown_Parameter_227'], + "names": ['ID_Einst_SuHkrW0_zeit_2_0'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -2327,7 +2327,7 @@ { "index": 228, "count": 1, - "names": ['ID_Einst_SuHkrW0_zeit_2_1', 'Unknown_Parameter_228'], + "names": ['ID_Einst_SuHkrW0_zeit_2_1'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -2337,7 +2337,7 @@ { "index": 229, "count": 1, - "names": ['ID_Einst_SuHkr25_zeit_0_0', 'Unknown_Parameter_229'], + "names": ['ID_Einst_SuHkr25_zeit_0_0'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -2347,7 +2347,7 @@ { "index": 230, "count": 1, - "names": ['ID_Einst_SuHkr25_zeit_0_1', 'Unknown_Parameter_230'], + "names": ['ID_Einst_SuHkr25_zeit_0_1'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -2357,7 +2357,7 @@ { "index": 231, "count": 1, - "names": ['ID_Einst_SuHkr25_zeit_1_0', 'Unknown_Parameter_231'], + "names": ['ID_Einst_SuHkr25_zeit_1_0'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -2367,7 +2367,7 @@ { "index": 232, "count": 1, - "names": ['ID_Einst_SuHkr25_zeit_1_1', 'Unknown_Parameter_232'], + "names": ['ID_Einst_SuHkr25_zeit_1_1'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -2377,7 +2377,7 @@ { "index": 233, "count": 1, - "names": ['ID_Einst_SuHkr25_zeit_2_0', 'Unknown_Parameter_233'], + "names": ['ID_Einst_SuHkr25_zeit_2_0'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -2387,7 +2387,7 @@ { "index": 234, "count": 1, - "names": ['ID_Einst_SuHkr25_zeit_2_1', 'Unknown_Parameter_234'], + "names": ['ID_Einst_SuHkr25_zeit_2_1'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -2397,7 +2397,7 @@ { "index": 235, "count": 1, - "names": ['ID_Einst_SuHkr25_zeit_0_2', 'Unknown_Parameter_235'], + "names": ['ID_Einst_SuHkr25_zeit_0_2'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -2407,7 +2407,7 @@ { "index": 236, "count": 1, - "names": ['ID_Einst_SuHkr25_zeit_0_3', 'Unknown_Parameter_236'], + "names": ['ID_Einst_SuHkr25_zeit_0_3'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -2417,7 +2417,7 @@ { "index": 237, "count": 1, - "names": ['ID_Einst_SuHkr25_zeit_1_2', 'Unknown_Parameter_237'], + "names": ['ID_Einst_SuHkr25_zeit_1_2'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -2427,7 +2427,7 @@ { "index": 238, "count": 1, - "names": ['ID_Einst_SuHkr25_zeit_1_3', 'Unknown_Parameter_238'], + "names": ['ID_Einst_SuHkr25_zeit_1_3'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -2437,7 +2437,7 @@ { "index": 239, "count": 1, - "names": ['ID_Einst_SuHkr25_zeit_2_2', 'Unknown_Parameter_239'], + "names": ['ID_Einst_SuHkr25_zeit_2_2'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -2447,7 +2447,7 @@ { "index": 240, "count": 1, - "names": ['ID_Einst_SuHkr25_zeit_2_3', 'Unknown_Parameter_240'], + "names": ['ID_Einst_SuHkr25_zeit_2_3'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -2457,7 +2457,7 @@ { "index": 241, "count": 1, - "names": ['ID_Einst_SuHkrTG_zeit_0_0', 'Unknown_Parameter_241'], + "names": ['ID_Einst_SuHkrTG_zeit_0_0'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -2467,7 +2467,7 @@ { "index": 242, "count": 1, - "names": ['ID_Einst_SuHkrTG_zeit_0_1', 'Unknown_Parameter_242'], + "names": ['ID_Einst_SuHkrTG_zeit_0_1'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -2477,7 +2477,7 @@ { "index": 243, "count": 1, - "names": ['ID_Einst_SuHkrTG_zeit_1_0', 'Unknown_Parameter_243'], + "names": ['ID_Einst_SuHkrTG_zeit_1_0'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -2487,7 +2487,7 @@ { "index": 244, "count": 1, - "names": ['ID_Einst_SuHkrTG_zeit_1_1', 'Unknown_Parameter_244'], + "names": ['ID_Einst_SuHkrTG_zeit_1_1'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -2497,7 +2497,7 @@ { "index": 245, "count": 1, - "names": ['ID_Einst_SuHkrTG_zeit_2_0', 'Unknown_Parameter_245'], + "names": ['ID_Einst_SuHkrTG_zeit_2_0'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -2507,7 +2507,7 @@ { "index": 246, "count": 1, - "names": ['ID_Einst_SuHkrTG_zeit_2_1', 'Unknown_Parameter_246'], + "names": ['ID_Einst_SuHkrTG_zeit_2_1'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -2517,7 +2517,7 @@ { "index": 247, "count": 1, - "names": ['ID_Einst_SuHkrTG_zeit_0_2', 'Unknown_Parameter_247'], + "names": ['ID_Einst_SuHkrTG_zeit_0_2'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -2527,7 +2527,7 @@ { "index": 248, "count": 1, - "names": ['ID_Einst_SuHkrTG_zeit_0_3', 'Unknown_Parameter_248'], + "names": ['ID_Einst_SuHkrTG_zeit_0_3'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -2537,7 +2537,7 @@ { "index": 249, "count": 1, - "names": ['ID_Einst_SuHkrTG_zeit_1_2', 'Unknown_Parameter_249'], + "names": ['ID_Einst_SuHkrTG_zeit_1_2'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -2547,7 +2547,7 @@ { "index": 250, "count": 1, - "names": ['ID_Einst_SuHkrTG_zeit_1_3', 'Unknown_Parameter_250'], + "names": ['ID_Einst_SuHkrTG_zeit_1_3'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -2557,7 +2557,7 @@ { "index": 251, "count": 1, - "names": ['ID_Einst_SuHkrTG_zeit_2_2', 'Unknown_Parameter_251'], + "names": ['ID_Einst_SuHkrTG_zeit_2_2'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -2567,7 +2567,7 @@ { "index": 252, "count": 1, - "names": ['ID_Einst_SuHkrTG_zeit_2_3', 'Unknown_Parameter_252'], + "names": ['ID_Einst_SuHkrTG_zeit_2_3'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -2577,7 +2577,7 @@ { "index": 253, "count": 1, - "names": ['ID_Einst_SuHkrTG_zeit_0_4', 'Unknown_Parameter_253'], + "names": ['ID_Einst_SuHkrTG_zeit_0_4'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -2587,7 +2587,7 @@ { "index": 254, "count": 1, - "names": ['ID_Einst_SuHkrTG_zeit_0_5', 'Unknown_Parameter_254'], + "names": ['ID_Einst_SuHkrTG_zeit_0_5'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -2597,7 +2597,7 @@ { "index": 255, "count": 1, - "names": ['ID_Einst_SuHkrTG_zeit_1_4', 'Unknown_Parameter_255'], + "names": ['ID_Einst_SuHkrTG_zeit_1_4'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -2607,7 +2607,7 @@ { "index": 256, "count": 1, - "names": ['ID_Einst_SuHkrTG_zeit_1_5', 'Unknown_Parameter_256'], + "names": ['ID_Einst_SuHkrTG_zeit_1_5'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -2617,7 +2617,7 @@ { "index": 257, "count": 1, - "names": ['ID_Einst_SuHkrTG_zeit_2_4', 'Unknown_Parameter_257'], + "names": ['ID_Einst_SuHkrTG_zeit_2_4'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -2627,7 +2627,7 @@ { "index": 258, "count": 1, - "names": ['ID_Einst_SuHkrTG_zeit_2_5', 'Unknown_Parameter_258'], + "names": ['ID_Einst_SuHkrTG_zeit_2_5'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -2637,7 +2637,7 @@ { "index": 259, "count": 1, - "names": ['ID_Einst_SuHkrTG_zeit_0_6', 'Unknown_Parameter_259'], + "names": ['ID_Einst_SuHkrTG_zeit_0_6'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -2647,7 +2647,7 @@ { "index": 260, "count": 1, - "names": ['ID_Einst_SuHkrTG_zeit_0_7', 'Unknown_Parameter_260'], + "names": ['ID_Einst_SuHkrTG_zeit_0_7'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -2657,7 +2657,7 @@ { "index": 261, "count": 1, - "names": ['ID_Einst_SuHkrTG_zeit_1_6', 'Unknown_Parameter_261'], + "names": ['ID_Einst_SuHkrTG_zeit_1_6'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -2667,7 +2667,7 @@ { "index": 262, "count": 1, - "names": ['ID_Einst_SuHkrTG_zeit_1_7', 'Unknown_Parameter_262'], + "names": ['ID_Einst_SuHkrTG_zeit_1_7'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -2677,7 +2677,7 @@ { "index": 263, "count": 1, - "names": ['ID_Einst_SuHkrTG_zeit_2_6', 'Unknown_Parameter_263'], + "names": ['ID_Einst_SuHkrTG_zeit_2_6'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -2687,7 +2687,7 @@ { "index": 264, "count": 1, - "names": ['ID_Einst_SuHkrTG_zeit_2_7', 'Unknown_Parameter_264'], + "names": ['ID_Einst_SuHkrTG_zeit_2_7'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -2697,7 +2697,7 @@ { "index": 265, "count": 1, - "names": ['ID_Einst_SuHkrTG_zeit_0_8', 'Unknown_Parameter_265'], + "names": ['ID_Einst_SuHkrTG_zeit_0_8'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -2707,7 +2707,7 @@ { "index": 266, "count": 1, - "names": ['ID_Einst_SuHkrTG_zeit_0_9', 'Unknown_Parameter_266'], + "names": ['ID_Einst_SuHkrTG_zeit_0_9'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -2717,7 +2717,7 @@ { "index": 267, "count": 1, - "names": ['ID_Einst_SuHkrTG_zeit_1_8', 'Unknown_Parameter_267'], + "names": ['ID_Einst_SuHkrTG_zeit_1_8'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -2727,7 +2727,7 @@ { "index": 268, "count": 1, - "names": ['ID_Einst_SuHkrTG_zeit_1_9', 'Unknown_Parameter_268'], + "names": ['ID_Einst_SuHkrTG_zeit_1_9'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -2737,7 +2737,7 @@ { "index": 269, "count": 1, - "names": ['ID_Einst_SuHkrTG_zeit_2_8', 'Unknown_Parameter_269'], + "names": ['ID_Einst_SuHkrTG_zeit_2_8'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -2747,7 +2747,7 @@ { "index": 270, "count": 1, - "names": ['ID_Einst_SuHkrTG_zeit_2_9', 'Unknown_Parameter_270'], + "names": ['ID_Einst_SuHkrTG_zeit_2_9'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -2757,7 +2757,7 @@ { "index": 271, "count": 1, - "names": ['ID_Einst_SuHkrTG_zeit_0_10', 'Unknown_Parameter_271'], + "names": ['ID_Einst_SuHkrTG_zeit_0_10'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -2767,7 +2767,7 @@ { "index": 272, "count": 1, - "names": ['ID_Einst_SuHkrTG_zeit_0_11', 'Unknown_Parameter_272'], + "names": ['ID_Einst_SuHkrTG_zeit_0_11'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -2777,7 +2777,7 @@ { "index": 273, "count": 1, - "names": ['ID_Einst_SuHkrTG_zeit_1_10', 'Unknown_Parameter_273'], + "names": ['ID_Einst_SuHkrTG_zeit_1_10'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -2787,7 +2787,7 @@ { "index": 274, "count": 1, - "names": ['ID_Einst_SuHkrTG_zeit_1_11', 'Unknown_Parameter_274'], + "names": ['ID_Einst_SuHkrTG_zeit_1_11'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -2797,7 +2797,7 @@ { "index": 275, "count": 1, - "names": ['ID_Einst_SuHkrTG_zeit_2_10', 'Unknown_Parameter_275'], + "names": ['ID_Einst_SuHkrTG_zeit_2_10'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -2807,7 +2807,7 @@ { "index": 276, "count": 1, - "names": ['ID_Einst_SuHkrTG_zeit_2_11', 'Unknown_Parameter_276'], + "names": ['ID_Einst_SuHkrTG_zeit_2_11'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -2817,7 +2817,7 @@ { "index": 277, "count": 1, - "names": ['ID_Einst_SuHkrTG_zeit_0_12', 'Unknown_Parameter_277'], + "names": ['ID_Einst_SuHkrTG_zeit_0_12'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -2827,7 +2827,7 @@ { "index": 278, "count": 1, - "names": ['ID_Einst_SuHkrTG_zeit_0_13', 'Unknown_Parameter_278'], + "names": ['ID_Einst_SuHkrTG_zeit_0_13'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -2837,7 +2837,7 @@ { "index": 279, "count": 1, - "names": ['ID_Einst_SuHkrTG_zeit_1_12', 'Unknown_Parameter_279'], + "names": ['ID_Einst_SuHkrTG_zeit_1_12'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -2847,7 +2847,7 @@ { "index": 280, "count": 1, - "names": ['ID_Einst_SuHkrTG_zeit_1_13', 'Unknown_Parameter_280'], + "names": ['ID_Einst_SuHkrTG_zeit_1_13'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -2857,7 +2857,7 @@ { "index": 281, "count": 1, - "names": ['ID_Einst_SuHkrTG_zeit_2_12', 'Unknown_Parameter_281'], + "names": ['ID_Einst_SuHkrTG_zeit_2_12'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -2867,7 +2867,7 @@ { "index": 282, "count": 1, - "names": ['ID_Einst_SuHkrTG_zeit_2_13', 'Unknown_Parameter_282'], + "names": ['ID_Einst_SuHkrTG_zeit_2_13'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -2877,7 +2877,7 @@ { "index": 283, "count": 1, - "names": ['ID_Einst_SuMk1_akt', 'Unknown_Parameter_283'], + "names": ['ID_Einst_SuMk1_akt'], "type": TimerProgram, "writeable": False, "datatype": 'UINT32', @@ -2887,7 +2887,7 @@ { "index": 284, "count": 1, - "names": ['ID_Einst_SuMk1W0_zeit_0_0', 'Unknown_Parameter_284'], + "names": ['ID_Einst_SuMk1W0_zeit_0_0'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -2897,7 +2897,7 @@ { "index": 285, "count": 1, - "names": ['ID_Einst_SuMk1W0_zeit_0_1', 'Unknown_Parameter_285'], + "names": ['ID_Einst_SuMk1W0_zeit_0_1'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -2907,7 +2907,7 @@ { "index": 286, "count": 1, - "names": ['ID_Einst_SuMk1W0_zeit_1_0', 'Unknown_Parameter_286'], + "names": ['ID_Einst_SuMk1W0_zeit_1_0'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -2917,7 +2917,7 @@ { "index": 287, "count": 1, - "names": ['ID_Einst_SuMk1W0_zeit_1_1', 'Unknown_Parameter_287'], + "names": ['ID_Einst_SuMk1W0_zeit_1_1'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -2927,7 +2927,7 @@ { "index": 288, "count": 1, - "names": ['ID_Einst_SuMk1W0_zeit_2_0', 'Unknown_Parameter_288'], + "names": ['ID_Einst_SuMk1W0_zeit_2_0'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -2937,7 +2937,7 @@ { "index": 289, "count": 1, - "names": ['ID_Einst_SuMk1W0_zeit_2_1', 'Unknown_Parameter_289'], + "names": ['ID_Einst_SuMk1W0_zeit_2_1'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -2947,7 +2947,7 @@ { "index": 290, "count": 1, - "names": ['ID_Einst_SuMk125_zeit_0_0', 'Unknown_Parameter_290'], + "names": ['ID_Einst_SuMk125_zeit_0_0'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -2957,7 +2957,7 @@ { "index": 291, "count": 1, - "names": ['ID_Einst_SuMk125_zeit_0_1', 'Unknown_Parameter_291'], + "names": ['ID_Einst_SuMk125_zeit_0_1'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -2967,7 +2967,7 @@ { "index": 292, "count": 1, - "names": ['ID_Einst_SuMk125_zeit_1_0', 'Unknown_Parameter_292'], + "names": ['ID_Einst_SuMk125_zeit_1_0'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -2977,7 +2977,7 @@ { "index": 293, "count": 1, - "names": ['ID_Einst_SuMk125_zeit_1_1', 'Unknown_Parameter_293'], + "names": ['ID_Einst_SuMk125_zeit_1_1'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -2987,7 +2987,7 @@ { "index": 294, "count": 1, - "names": ['ID_Einst_SuMk125_zeit_2_0', 'Unknown_Parameter_294'], + "names": ['ID_Einst_SuMk125_zeit_2_0'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -2997,7 +2997,7 @@ { "index": 295, "count": 1, - "names": ['ID_Einst_SuMk125_zeit_2_1', 'Unknown_Parameter_295'], + "names": ['ID_Einst_SuMk125_zeit_2_1'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -3007,7 +3007,7 @@ { "index": 296, "count": 1, - "names": ['ID_Einst_SuMk125_zeit_0_2', 'Unknown_Parameter_296'], + "names": ['ID_Einst_SuMk125_zeit_0_2'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -3017,7 +3017,7 @@ { "index": 297, "count": 1, - "names": ['ID_Einst_SuMk125_zeit_0_3', 'Unknown_Parameter_297'], + "names": ['ID_Einst_SuMk125_zeit_0_3'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -3027,7 +3027,7 @@ { "index": 298, "count": 1, - "names": ['ID_Einst_SuMk125_zeit_1_2', 'Unknown_Parameter_298'], + "names": ['ID_Einst_SuMk125_zeit_1_2'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -3037,7 +3037,7 @@ { "index": 299, "count": 1, - "names": ['ID_Einst_SuMk125_zeit_1_3', 'Unknown_Parameter_299'], + "names": ['ID_Einst_SuMk125_zeit_1_3'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -3047,7 +3047,7 @@ { "index": 300, "count": 1, - "names": ['ID_Einst_SuMk125_zeit_2_2', 'Unknown_Parameter_300'], + "names": ['ID_Einst_SuMk125_zeit_2_2'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -3057,7 +3057,7 @@ { "index": 301, "count": 1, - "names": ['ID_Einst_SuMk125_zeit_2_3', 'Unknown_Parameter_301'], + "names": ['ID_Einst_SuMk125_zeit_2_3'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -3067,7 +3067,7 @@ { "index": 302, "count": 1, - "names": ['ID_Einst_SuMk1TG_zeit_0_0', 'Unknown_Parameter_302'], + "names": ['ID_Einst_SuMk1TG_zeit_0_0'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -3077,7 +3077,7 @@ { "index": 303, "count": 1, - "names": ['ID_Einst_SuMk1TG_zeit_0_1', 'Unknown_Parameter_303'], + "names": ['ID_Einst_SuMk1TG_zeit_0_1'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -3087,7 +3087,7 @@ { "index": 304, "count": 1, - "names": ['ID_Einst_SuMk1TG_zeit_1_0', 'Unknown_Parameter_304'], + "names": ['ID_Einst_SuMk1TG_zeit_1_0'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -3097,7 +3097,7 @@ { "index": 305, "count": 1, - "names": ['ID_Einst_SuMk1TG_zeit_1_1', 'Unknown_Parameter_305'], + "names": ['ID_Einst_SuMk1TG_zeit_1_1'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -3107,7 +3107,7 @@ { "index": 306, "count": 1, - "names": ['ID_Einst_SuMk1TG_zeit_2_0', 'Unknown_Parameter_306'], + "names": ['ID_Einst_SuMk1TG_zeit_2_0'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -3117,7 +3117,7 @@ { "index": 307, "count": 1, - "names": ['ID_Einst_SuMk1TG_zeit_2_1', 'Unknown_Parameter_307'], + "names": ['ID_Einst_SuMk1TG_zeit_2_1'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -3127,7 +3127,7 @@ { "index": 308, "count": 1, - "names": ['ID_Einst_SuMk1TG_zeit_0_2', 'Unknown_Parameter_308'], + "names": ['ID_Einst_SuMk1TG_zeit_0_2'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -3137,7 +3137,7 @@ { "index": 309, "count": 1, - "names": ['ID_Einst_SuMk1TG_zeit_0_3', 'Unknown_Parameter_309'], + "names": ['ID_Einst_SuMk1TG_zeit_0_3'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -3147,7 +3147,7 @@ { "index": 310, "count": 1, - "names": ['ID_Einst_SuMk1TG_zeit_1_2', 'Unknown_Parameter_310'], + "names": ['ID_Einst_SuMk1TG_zeit_1_2'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -3157,7 +3157,7 @@ { "index": 311, "count": 1, - "names": ['ID_Einst_SuMk1TG_zeit_1_3', 'Unknown_Parameter_311'], + "names": ['ID_Einst_SuMk1TG_zeit_1_3'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -3167,7 +3167,7 @@ { "index": 312, "count": 1, - "names": ['ID_Einst_SuMk1TG_zeit_2_2', 'Unknown_Parameter_312'], + "names": ['ID_Einst_SuMk1TG_zeit_2_2'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -3177,7 +3177,7 @@ { "index": 313, "count": 1, - "names": ['ID_Einst_SuMk1TG_zeit_2_3', 'Unknown_Parameter_313'], + "names": ['ID_Einst_SuMk1TG_zeit_2_3'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -3187,7 +3187,7 @@ { "index": 314, "count": 1, - "names": ['ID_Einst_SuMk1TG_zeit_0_4', 'Unknown_Parameter_314'], + "names": ['ID_Einst_SuMk1TG_zeit_0_4'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -3197,7 +3197,7 @@ { "index": 315, "count": 1, - "names": ['ID_Einst_SuMk1TG_zeit_0_5', 'Unknown_Parameter_315'], + "names": ['ID_Einst_SuMk1TG_zeit_0_5'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -3207,7 +3207,7 @@ { "index": 316, "count": 1, - "names": ['ID_Einst_SuMk1TG_zeit_1_4', 'Unknown_Parameter_316'], + "names": ['ID_Einst_SuMk1TG_zeit_1_4'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -3217,7 +3217,7 @@ { "index": 317, "count": 1, - "names": ['ID_Einst_SuMk1TG_zeit_1_5', 'Unknown_Parameter_317'], + "names": ['ID_Einst_SuMk1TG_zeit_1_5'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -3227,7 +3227,7 @@ { "index": 318, "count": 1, - "names": ['ID_Einst_SuMk1TG_zeit_2_4', 'Unknown_Parameter_318'], + "names": ['ID_Einst_SuMk1TG_zeit_2_4'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -3237,7 +3237,7 @@ { "index": 319, "count": 1, - "names": ['ID_Einst_SuMk1TG_zeit_2_5', 'Unknown_Parameter_319'], + "names": ['ID_Einst_SuMk1TG_zeit_2_5'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -3247,7 +3247,7 @@ { "index": 320, "count": 1, - "names": ['ID_Einst_SuMk1TG_zeit_0_6', 'Unknown_Parameter_320'], + "names": ['ID_Einst_SuMk1TG_zeit_0_6'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -3257,7 +3257,7 @@ { "index": 321, "count": 1, - "names": ['ID_Einst_SuMk1TG_zeit_0_7', 'Unknown_Parameter_321'], + "names": ['ID_Einst_SuMk1TG_zeit_0_7'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -3267,7 +3267,7 @@ { "index": 322, "count": 1, - "names": ['ID_Einst_SuMk1TG_zeit_1_6', 'Unknown_Parameter_322'], + "names": ['ID_Einst_SuMk1TG_zeit_1_6'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -3277,7 +3277,7 @@ { "index": 323, "count": 1, - "names": ['ID_Einst_SuMk1TG_zeit_1_7', 'Unknown_Parameter_323'], + "names": ['ID_Einst_SuMk1TG_zeit_1_7'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -3287,7 +3287,7 @@ { "index": 324, "count": 1, - "names": ['ID_Einst_SuMk1TG_zeit_2_6', 'Unknown_Parameter_324'], + "names": ['ID_Einst_SuMk1TG_zeit_2_6'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -3297,7 +3297,7 @@ { "index": 325, "count": 1, - "names": ['ID_Einst_SuMk1TG_zeit_2_7', 'Unknown_Parameter_325'], + "names": ['ID_Einst_SuMk1TG_zeit_2_7'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -3307,7 +3307,7 @@ { "index": 326, "count": 1, - "names": ['ID_Einst_SuMk1TG_zeit_0_8', 'Unknown_Parameter_326'], + "names": ['ID_Einst_SuMk1TG_zeit_0_8'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -3317,7 +3317,7 @@ { "index": 327, "count": 1, - "names": ['ID_Einst_SuMk1TG_zeit_0_9', 'Unknown_Parameter_327'], + "names": ['ID_Einst_SuMk1TG_zeit_0_9'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -3327,7 +3327,7 @@ { "index": 328, "count": 1, - "names": ['ID_Einst_SuMk1TG_zeit_1_8', 'Unknown_Parameter_328'], + "names": ['ID_Einst_SuMk1TG_zeit_1_8'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -3337,7 +3337,7 @@ { "index": 329, "count": 1, - "names": ['ID_Einst_SuMk1TG_zeit_1_9', 'Unknown_Parameter_329'], + "names": ['ID_Einst_SuMk1TG_zeit_1_9'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -3347,7 +3347,7 @@ { "index": 330, "count": 1, - "names": ['ID_Einst_SuMk1TG_zeit_2_8', 'Unknown_Parameter_330'], + "names": ['ID_Einst_SuMk1TG_zeit_2_8'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -3357,7 +3357,7 @@ { "index": 331, "count": 1, - "names": ['ID_Einst_SuMk1TG_zeit_2_9', 'Unknown_Parameter_331'], + "names": ['ID_Einst_SuMk1TG_zeit_2_9'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -3367,7 +3367,7 @@ { "index": 332, "count": 1, - "names": ['ID_Einst_SuMk1TG_zeit_0_10', 'Unknown_Parameter_332'], + "names": ['ID_Einst_SuMk1TG_zeit_0_10'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -3377,7 +3377,7 @@ { "index": 333, "count": 1, - "names": ['ID_Einst_SuMk1TG_zeit_0_11', 'Unknown_Parameter_333'], + "names": ['ID_Einst_SuMk1TG_zeit_0_11'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -3387,7 +3387,7 @@ { "index": 334, "count": 1, - "names": ['ID_Einst_SuMk1TG_zeit_1_10', 'Unknown_Parameter_334'], + "names": ['ID_Einst_SuMk1TG_zeit_1_10'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -3397,7 +3397,7 @@ { "index": 335, "count": 1, - "names": ['ID_Einst_SuMk1TG_zeit_1_11', 'Unknown_Parameter_335'], + "names": ['ID_Einst_SuMk1TG_zeit_1_11'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -3407,7 +3407,7 @@ { "index": 336, "count": 1, - "names": ['ID_Einst_SuMk1TG_zeit_2_10', 'Unknown_Parameter_336'], + "names": ['ID_Einst_SuMk1TG_zeit_2_10'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -3417,7 +3417,7 @@ { "index": 337, "count": 1, - "names": ['ID_Einst_SuMk1TG_zeit_2_11', 'Unknown_Parameter_337'], + "names": ['ID_Einst_SuMk1TG_zeit_2_11'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -3427,7 +3427,7 @@ { "index": 338, "count": 1, - "names": ['ID_Einst_SuMk1TG_zeit_0_12', 'Unknown_Parameter_338'], + "names": ['ID_Einst_SuMk1TG_zeit_0_12'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -3437,7 +3437,7 @@ { "index": 339, "count": 1, - "names": ['ID_Einst_SuMk1TG_zeit_0_13', 'Unknown_Parameter_339'], + "names": ['ID_Einst_SuMk1TG_zeit_0_13'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -3447,7 +3447,7 @@ { "index": 340, "count": 1, - "names": ['ID_Einst_SuMk1TG_zeit_1_12', 'Unknown_Parameter_340'], + "names": ['ID_Einst_SuMk1TG_zeit_1_12'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -3457,7 +3457,7 @@ { "index": 341, "count": 1, - "names": ['ID_Einst_SuMk1TG_zeit_1_13', 'Unknown_Parameter_341'], + "names": ['ID_Einst_SuMk1TG_zeit_1_13'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -3467,7 +3467,7 @@ { "index": 342, "count": 1, - "names": ['ID_Einst_SuMk1TG_zeit_2_12', 'Unknown_Parameter_342'], + "names": ['ID_Einst_SuMk1TG_zeit_2_12'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -3477,7 +3477,7 @@ { "index": 343, "count": 1, - "names": ['ID_Einst_SuMk1TG_zeit_2_13', 'Unknown_Parameter_343'], + "names": ['ID_Einst_SuMk1TG_zeit_2_13'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -3487,7 +3487,7 @@ { "index": 344, "count": 1, - "names": ['ID_Einst_SuMk2_akt2', 'Unknown_Parameter_344'], + "names": ['ID_Einst_SuMk2_akt2'], "type": TimerProgram, "writeable": False, "datatype": 'UINT32', @@ -3497,7 +3497,7 @@ { "index": 345, "count": 1, - "names": ['ID_Einst_SuMk2Wo_zeit_0_0', 'Unknown_Parameter_345'], + "names": ['ID_Einst_SuMk2Wo_zeit_0_0'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -3507,7 +3507,7 @@ { "index": 346, "count": 1, - "names": ['ID_Einst_SuMk2Wo_zeit_0_1', 'Unknown_Parameter_346'], + "names": ['ID_Einst_SuMk2Wo_zeit_0_1'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -3517,7 +3517,7 @@ { "index": 347, "count": 1, - "names": ['ID_Einst_SuMk2Wo_zeit_1_0', 'Unknown_Parameter_347'], + "names": ['ID_Einst_SuMk2Wo_zeit_1_0'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -3527,7 +3527,7 @@ { "index": 348, "count": 1, - "names": ['ID_Einst_SuMk2Wo_zeit_1_1', 'Unknown_Parameter_348'], + "names": ['ID_Einst_SuMk2Wo_zeit_1_1'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -3537,7 +3537,7 @@ { "index": 349, "count": 1, - "names": ['ID_Einst_SuMk2Wo_zeit_2_0', 'Unknown_Parameter_349'], + "names": ['ID_Einst_SuMk2Wo_zeit_2_0'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -3547,7 +3547,7 @@ { "index": 350, "count": 1, - "names": ['ID_Einst_SuMk2Wo_zeit_2_1', 'Unknown_Parameter_350'], + "names": ['ID_Einst_SuMk2Wo_zeit_2_1'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -3557,7 +3557,7 @@ { "index": 351, "count": 1, - "names": ['ID_Einst_SuMk225_zeit_0_0', 'Unknown_Parameter_351'], + "names": ['ID_Einst_SuMk225_zeit_0_0'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -3567,7 +3567,7 @@ { "index": 352, "count": 1, - "names": ['ID_Einst_SuMk225_zeit_0_1', 'Unknown_Parameter_352'], + "names": ['ID_Einst_SuMk225_zeit_0_1'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -3577,7 +3577,7 @@ { "index": 353, "count": 1, - "names": ['ID_Einst_SuMk225_zeit_1_0', 'Unknown_Parameter_353'], + "names": ['ID_Einst_SuMk225_zeit_1_0'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -3587,7 +3587,7 @@ { "index": 354, "count": 1, - "names": ['ID_Einst_SuMk225_zeit_1_1', 'Unknown_Parameter_354'], + "names": ['ID_Einst_SuMk225_zeit_1_1'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -3597,7 +3597,7 @@ { "index": 355, "count": 1, - "names": ['ID_Einst_SuMk225_zeit_2_0', 'Unknown_Parameter_355'], + "names": ['ID_Einst_SuMk225_zeit_2_0'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -3607,7 +3607,7 @@ { "index": 356, "count": 1, - "names": ['ID_Einst_SuMk225_zeit_2_1', 'Unknown_Parameter_356'], + "names": ['ID_Einst_SuMk225_zeit_2_1'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -3617,7 +3617,7 @@ { "index": 357, "count": 1, - "names": ['ID_Einst_SuMk225_zeit_0_2', 'Unknown_Parameter_357'], + "names": ['ID_Einst_SuMk225_zeit_0_2'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -3627,7 +3627,7 @@ { "index": 358, "count": 1, - "names": ['ID_Einst_SuMk225_zeit_0_3', 'Unknown_Parameter_358'], + "names": ['ID_Einst_SuMk225_zeit_0_3'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -3637,7 +3637,7 @@ { "index": 359, "count": 1, - "names": ['ID_Einst_SuMk225_zeit_1_2', 'Unknown_Parameter_359'], + "names": ['ID_Einst_SuMk225_zeit_1_2'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -3647,7 +3647,7 @@ { "index": 360, "count": 1, - "names": ['ID_Einst_SuMk225_zeit_1_3', 'Unknown_Parameter_360'], + "names": ['ID_Einst_SuMk225_zeit_1_3'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -3657,7 +3657,7 @@ { "index": 361, "count": 1, - "names": ['ID_Einst_SuMk225_zeit_2_2', 'Unknown_Parameter_361'], + "names": ['ID_Einst_SuMk225_zeit_2_2'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -3667,7 +3667,7 @@ { "index": 362, "count": 1, - "names": ['ID_Einst_SuMk225_zeit_2_3', 'Unknown_Parameter_362'], + "names": ['ID_Einst_SuMk225_zeit_2_3'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -3677,7 +3677,7 @@ { "index": 363, "count": 1, - "names": ['ID_Einst_SuMk2Tg_zeit_0_0', 'Unknown_Parameter_363'], + "names": ['ID_Einst_SuMk2Tg_zeit_0_0'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -3687,7 +3687,7 @@ { "index": 364, "count": 1, - "names": ['ID_Einst_SuMk2Tg_zeit_0_1', 'Unknown_Parameter_364'], + "names": ['ID_Einst_SuMk2Tg_zeit_0_1'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -3697,7 +3697,7 @@ { "index": 365, "count": 1, - "names": ['ID_Einst_SuMk2Tg_zeit_1_0', 'Unknown_Parameter_365'], + "names": ['ID_Einst_SuMk2Tg_zeit_1_0'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -3707,7 +3707,7 @@ { "index": 366, "count": 1, - "names": ['ID_Einst_SuMk2Tg_zeit_1_1', 'Unknown_Parameter_366'], + "names": ['ID_Einst_SuMk2Tg_zeit_1_1'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -3717,7 +3717,7 @@ { "index": 367, "count": 1, - "names": ['ID_Einst_SuMk2Tg_zeit_2_0', 'Unknown_Parameter_367'], + "names": ['ID_Einst_SuMk2Tg_zeit_2_0'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -3727,7 +3727,7 @@ { "index": 368, "count": 1, - "names": ['ID_Einst_SuMk2Tg_zeit_2_1', 'Unknown_Parameter_368'], + "names": ['ID_Einst_SuMk2Tg_zeit_2_1'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -3737,7 +3737,7 @@ { "index": 369, "count": 1, - "names": ['ID_Einst_SuMk2Tg_zeit_0_2', 'Unknown_Parameter_369'], + "names": ['ID_Einst_SuMk2Tg_zeit_0_2'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -3747,7 +3747,7 @@ { "index": 370, "count": 1, - "names": ['ID_Einst_SuMk2Tg_zeit_0_3', 'Unknown_Parameter_370'], + "names": ['ID_Einst_SuMk2Tg_zeit_0_3'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -3757,7 +3757,7 @@ { "index": 371, "count": 1, - "names": ['ID_Einst_SuMk2Tg_zeit_1_2', 'Unknown_Parameter_371'], + "names": ['ID_Einst_SuMk2Tg_zeit_1_2'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -3767,7 +3767,7 @@ { "index": 372, "count": 1, - "names": ['ID_Einst_SuMk2Tg_zeit_1_3', 'Unknown_Parameter_372'], + "names": ['ID_Einst_SuMk2Tg_zeit_1_3'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -3777,7 +3777,7 @@ { "index": 373, "count": 1, - "names": ['ID_Einst_SuMk2Tg_zeit_2_2', 'Unknown_Parameter_373'], + "names": ['ID_Einst_SuMk2Tg_zeit_2_2'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -3787,7 +3787,7 @@ { "index": 374, "count": 1, - "names": ['ID_Einst_SuMk2Tg_zeit_2_3', 'Unknown_Parameter_374'], + "names": ['ID_Einst_SuMk2Tg_zeit_2_3'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -3797,7 +3797,7 @@ { "index": 375, "count": 1, - "names": ['ID_Einst_SuMk2Tg_zeit_0_4', 'Unknown_Parameter_375'], + "names": ['ID_Einst_SuMk2Tg_zeit_0_4'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -3807,7 +3807,7 @@ { "index": 376, "count": 1, - "names": ['ID_Einst_SuMk2Tg_zeit_0_5', 'Unknown_Parameter_376'], + "names": ['ID_Einst_SuMk2Tg_zeit_0_5'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -3817,7 +3817,7 @@ { "index": 377, "count": 1, - "names": ['ID_Einst_SuMk2Tg_zeit_1_4', 'Unknown_Parameter_377'], + "names": ['ID_Einst_SuMk2Tg_zeit_1_4'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -3827,7 +3827,7 @@ { "index": 378, "count": 1, - "names": ['ID_Einst_SuMk2Tg_zeit_1_5', 'Unknown_Parameter_378'], + "names": ['ID_Einst_SuMk2Tg_zeit_1_5'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -3837,7 +3837,7 @@ { "index": 379, "count": 1, - "names": ['ID_Einst_SuMk2Tg_zeit_2_4', 'Unknown_Parameter_379'], + "names": ['ID_Einst_SuMk2Tg_zeit_2_4'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -3847,7 +3847,7 @@ { "index": 380, "count": 1, - "names": ['ID_Einst_SuMk2Tg_zeit_2_5', 'Unknown_Parameter_380'], + "names": ['ID_Einst_SuMk2Tg_zeit_2_5'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -3857,7 +3857,7 @@ { "index": 381, "count": 1, - "names": ['ID_Einst_SuMk2Tg_zeit_0_6', 'Unknown_Parameter_381'], + "names": ['ID_Einst_SuMk2Tg_zeit_0_6'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -3867,7 +3867,7 @@ { "index": 382, "count": 1, - "names": ['ID_Einst_SuMk2Tg_zeit_0_7', 'Unknown_Parameter_382'], + "names": ['ID_Einst_SuMk2Tg_zeit_0_7'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -3877,7 +3877,7 @@ { "index": 383, "count": 1, - "names": ['ID_Einst_SuMk2Tg_zeit_1_6', 'Unknown_Parameter_383'], + "names": ['ID_Einst_SuMk2Tg_zeit_1_6'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -3887,7 +3887,7 @@ { "index": 384, "count": 1, - "names": ['ID_Einst_SuMk2Tg_zeit_1_7', 'Unknown_Parameter_384'], + "names": ['ID_Einst_SuMk2Tg_zeit_1_7'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -3897,7 +3897,7 @@ { "index": 385, "count": 1, - "names": ['ID_Einst_SuMk2Tg_zeit_2_6', 'Unknown_Parameter_385'], + "names": ['ID_Einst_SuMk2Tg_zeit_2_6'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -3907,7 +3907,7 @@ { "index": 386, "count": 1, - "names": ['ID_Einst_SuMk2Tg_zeit_2_7', 'Unknown_Parameter_386'], + "names": ['ID_Einst_SuMk2Tg_zeit_2_7'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -3917,7 +3917,7 @@ { "index": 387, "count": 1, - "names": ['ID_Einst_SuMk2Tg_zeit_0_8', 'Unknown_Parameter_387'], + "names": ['ID_Einst_SuMk2Tg_zeit_0_8'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -3927,7 +3927,7 @@ { "index": 388, "count": 1, - "names": ['ID_Einst_SuMk2Tg_zeit_0_9', 'Unknown_Parameter_388'], + "names": ['ID_Einst_SuMk2Tg_zeit_0_9'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -3937,7 +3937,7 @@ { "index": 389, "count": 1, - "names": ['ID_Einst_SuMk2Tg_zeit_1_8', 'Unknown_Parameter_389'], + "names": ['ID_Einst_SuMk2Tg_zeit_1_8'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -3947,7 +3947,7 @@ { "index": 390, "count": 1, - "names": ['ID_Einst_SuMk2Tg_zeit_1_9', 'Unknown_Parameter_390'], + "names": ['ID_Einst_SuMk2Tg_zeit_1_9'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -3957,7 +3957,7 @@ { "index": 391, "count": 1, - "names": ['ID_Einst_SuMk2Tg_zeit_2_8', 'Unknown_Parameter_391'], + "names": ['ID_Einst_SuMk2Tg_zeit_2_8'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -3967,7 +3967,7 @@ { "index": 392, "count": 1, - "names": ['ID_Einst_SuMk2Tg_zeit_2_9', 'Unknown_Parameter_392'], + "names": ['ID_Einst_SuMk2Tg_zeit_2_9'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -3977,7 +3977,7 @@ { "index": 393, "count": 1, - "names": ['ID_Einst_SuMk2Tg_zeit_0_10', 'Unknown_Parameter_393'], + "names": ['ID_Einst_SuMk2Tg_zeit_0_10'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -3987,7 +3987,7 @@ { "index": 394, "count": 1, - "names": ['ID_Einst_SuMk2Tg_zeit_0_11', 'Unknown_Parameter_394'], + "names": ['ID_Einst_SuMk2Tg_zeit_0_11'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -3997,7 +3997,7 @@ { "index": 395, "count": 1, - "names": ['ID_Einst_SuMk2Tg_zeit_1_10', 'Unknown_Parameter_395'], + "names": ['ID_Einst_SuMk2Tg_zeit_1_10'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -4007,7 +4007,7 @@ { "index": 396, "count": 1, - "names": ['ID_Einst_SuMk2Tg_zeit_1_11', 'Unknown_Parameter_396'], + "names": ['ID_Einst_SuMk2Tg_zeit_1_11'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -4017,7 +4017,7 @@ { "index": 397, "count": 1, - "names": ['ID_Einst_SuMk2Tg_zeit_2_10', 'Unknown_Parameter_397'], + "names": ['ID_Einst_SuMk2Tg_zeit_2_10'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -4027,7 +4027,7 @@ { "index": 398, "count": 1, - "names": ['ID_Einst_SuMk2Tg_zeit_2_11', 'Unknown_Parameter_398'], + "names": ['ID_Einst_SuMk2Tg_zeit_2_11'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -4037,7 +4037,7 @@ { "index": 399, "count": 1, - "names": ['ID_Einst_SuMk2Tg_zeit_0_12', 'Unknown_Parameter_399'], + "names": ['ID_Einst_SuMk2Tg_zeit_0_12'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -4047,7 +4047,7 @@ { "index": 400, "count": 1, - "names": ['ID_Einst_SuMk2Tg_zeit_0_13', 'Unknown_Parameter_400'], + "names": ['ID_Einst_SuMk2Tg_zeit_0_13'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -4057,7 +4057,7 @@ { "index": 401, "count": 1, - "names": ['ID_Einst_SuMk2Tg_zeit_1_12', 'Unknown_Parameter_401'], + "names": ['ID_Einst_SuMk2Tg_zeit_1_12'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -4067,7 +4067,7 @@ { "index": 402, "count": 1, - "names": ['ID_Einst_SuMk2Tg_zeit_1_13', 'Unknown_Parameter_402'], + "names": ['ID_Einst_SuMk2Tg_zeit_1_13'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -4077,7 +4077,7 @@ { "index": 403, "count": 1, - "names": ['ID_Einst_SuMk2Tg_zeit_2_12', 'Unknown_Parameter_403'], + "names": ['ID_Einst_SuMk2Tg_zeit_2_12'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -4087,7 +4087,7 @@ { "index": 404, "count": 1, - "names": ['ID_Einst_SuMk2Tg_zeit_2_13', 'Unknown_Parameter_404'], + "names": ['ID_Einst_SuMk2Tg_zeit_2_13'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -4097,7 +4097,7 @@ { "index": 405, "count": 1, - "names": ['ID_Einst_SUBW_akt2', 'Unknown_Parameter_405'], + "names": ['ID_Einst_SUBW_akt2'], "type": TimerProgram, "writeable": True, "datatype": 'UINT32', @@ -4107,7 +4107,7 @@ { "index": 406, "count": 1, - "names": ['ID_Einst_SuBwWO_zeit_0_0', 'Unknown_Parameter_406'], + "names": ['ID_Einst_SuBwWO_zeit_0_0'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -4117,7 +4117,7 @@ { "index": 407, "count": 1, - "names": ['ID_Einst_SuBwWO_zeit_0_1', 'Unknown_Parameter_407'], + "names": ['ID_Einst_SuBwWO_zeit_0_1'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -4127,7 +4127,7 @@ { "index": 408, "count": 1, - "names": ['ID_Einst_SuBwWO_zeit_1_0', 'Unknown_Parameter_408'], + "names": ['ID_Einst_SuBwWO_zeit_1_0'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -4137,7 +4137,7 @@ { "index": 409, "count": 1, - "names": ['ID_Einst_SuBwWO_zeit_1_1', 'Unknown_Parameter_409'], + "names": ['ID_Einst_SuBwWO_zeit_1_1'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -4147,7 +4147,7 @@ { "index": 410, "count": 1, - "names": ['ID_Einst_SuBwWO_zeit_2_0', 'Unknown_Parameter_410'], + "names": ['ID_Einst_SuBwWO_zeit_2_0'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -4157,7 +4157,7 @@ { "index": 411, "count": 1, - "names": ['ID_Einst_SuBwWO_zeit_2_1', 'Unknown_Parameter_411'], + "names": ['ID_Einst_SuBwWO_zeit_2_1'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -4167,7 +4167,7 @@ { "index": 412, "count": 1, - "names": ['ID_Einst_SuBwWO_zeit_3_0', 'Unknown_Parameter_412'], + "names": ['ID_Einst_SuBwWO_zeit_3_0'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -4177,7 +4177,7 @@ { "index": 413, "count": 1, - "names": ['ID_Einst_SuBwWO_zeit_3_1', 'Unknown_Parameter_413'], + "names": ['ID_Einst_SuBwWO_zeit_3_1'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -4187,7 +4187,7 @@ { "index": 414, "count": 1, - "names": ['ID_Einst_SuBwWO_zeit_4_0', 'Unknown_Parameter_414'], + "names": ['ID_Einst_SuBwWO_zeit_4_0'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -4197,7 +4197,7 @@ { "index": 415, "count": 1, - "names": ['ID_Einst_SuBwWO_zeit_4_1', 'Unknown_Parameter_415'], + "names": ['ID_Einst_SuBwWO_zeit_4_1'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -4207,7 +4207,7 @@ { "index": 416, "count": 1, - "names": ['ID_Einst_SuBw25_zeit_0_0', 'Unknown_Parameter_416'], + "names": ['ID_Einst_SuBw25_zeit_0_0'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -4217,7 +4217,7 @@ { "index": 417, "count": 1, - "names": ['ID_Einst_SuBw25_zeit_0_1', 'Unknown_Parameter_417'], + "names": ['ID_Einst_SuBw25_zeit_0_1'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -4227,7 +4227,7 @@ { "index": 418, "count": 1, - "names": ['ID_Einst_SuBw25_zeit_1_0', 'Unknown_Parameter_418'], + "names": ['ID_Einst_SuBw25_zeit_1_0'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -4237,7 +4237,7 @@ { "index": 419, "count": 1, - "names": ['ID_Einst_SuBw25_zeit_1_1', 'Unknown_Parameter_419'], + "names": ['ID_Einst_SuBw25_zeit_1_1'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -4247,7 +4247,7 @@ { "index": 420, "count": 1, - "names": ['ID_Einst_SuBw25_zeit_2_0', 'Unknown_Parameter_420'], + "names": ['ID_Einst_SuBw25_zeit_2_0'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -4257,7 +4257,7 @@ { "index": 421, "count": 1, - "names": ['ID_Einst_SuBw25_zeit_2_1', 'Unknown_Parameter_421'], + "names": ['ID_Einst_SuBw25_zeit_2_1'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -4267,7 +4267,7 @@ { "index": 422, "count": 1, - "names": ['ID_Einst_SuBw25_zeit_3_0', 'Unknown_Parameter_422'], + "names": ['ID_Einst_SuBw25_zeit_3_0'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -4277,7 +4277,7 @@ { "index": 423, "count": 1, - "names": ['ID_Einst_SuBw25_zeit_3_1', 'Unknown_Parameter_423'], + "names": ['ID_Einst_SuBw25_zeit_3_1'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -4287,7 +4287,7 @@ { "index": 424, "count": 1, - "names": ['ID_Einst_SuBw25_zeit_4_0', 'Unknown_Parameter_424'], + "names": ['ID_Einst_SuBw25_zeit_4_0'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -4297,7 +4297,7 @@ { "index": 425, "count": 1, - "names": ['ID_Einst_SuBw25_zeit_4_1', 'Unknown_Parameter_425'], + "names": ['ID_Einst_SuBw25_zeit_4_1'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -4307,7 +4307,7 @@ { "index": 426, "count": 1, - "names": ['ID_Einst_SuBw25_zeit_0_2', 'Unknown_Parameter_426'], + "names": ['ID_Einst_SuBw25_zeit_0_2'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -4317,7 +4317,7 @@ { "index": 427, "count": 1, - "names": ['ID_Einst_SuBw25_zeit_0_3', 'Unknown_Parameter_427'], + "names": ['ID_Einst_SuBw25_zeit_0_3'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -4327,7 +4327,7 @@ { "index": 428, "count": 1, - "names": ['ID_Einst_SuBw25_zeit_1_2', 'Unknown_Parameter_428'], + "names": ['ID_Einst_SuBw25_zeit_1_2'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -4337,7 +4337,7 @@ { "index": 429, "count": 1, - "names": ['ID_Einst_SuBw25_zeit_1_3', 'Unknown_Parameter_429'], + "names": ['ID_Einst_SuBw25_zeit_1_3'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -4347,7 +4347,7 @@ { "index": 430, "count": 1, - "names": ['ID_Einst_SuBw25_zeit_2_2', 'Unknown_Parameter_430'], + "names": ['ID_Einst_SuBw25_zeit_2_2'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -4357,7 +4357,7 @@ { "index": 431, "count": 1, - "names": ['ID_Einst_SuBw25_zeit_2_3', 'Unknown_Parameter_431'], + "names": ['ID_Einst_SuBw25_zeit_2_3'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -4367,7 +4367,7 @@ { "index": 432, "count": 1, - "names": ['ID_Einst_SuBw25_zeit_3_2', 'Unknown_Parameter_432'], + "names": ['ID_Einst_SuBw25_zeit_3_2'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -4377,7 +4377,7 @@ { "index": 433, "count": 1, - "names": ['ID_Einst_SuBw25_zeit_3_3', 'Unknown_Parameter_433'], + "names": ['ID_Einst_SuBw25_zeit_3_3'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -4387,7 +4387,7 @@ { "index": 434, "count": 1, - "names": ['ID_Einst_SuBw25_zeit_4_2', 'Unknown_Parameter_434'], + "names": ['ID_Einst_SuBw25_zeit_4_2'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -4397,7 +4397,7 @@ { "index": 435, "count": 1, - "names": ['ID_Einst_SuBw25_zeit_4_3', 'Unknown_Parameter_435'], + "names": ['ID_Einst_SuBw25_zeit_4_3'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -4407,7 +4407,7 @@ { "index": 436, "count": 1, - "names": ['ID_Einst_SuBwTG_zeit_0_0', 'Unknown_Parameter_436'], + "names": ['ID_Einst_SuBwTG_zeit_0_0'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -4417,7 +4417,7 @@ { "index": 437, "count": 1, - "names": ['ID_Einst_SuBwTG_zeit_0_1', 'Unknown_Parameter_437'], + "names": ['ID_Einst_SuBwTG_zeit_0_1'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -4427,7 +4427,7 @@ { "index": 438, "count": 1, - "names": ['ID_Einst_SuBwTG_zeit_1_0', 'Unknown_Parameter_438'], + "names": ['ID_Einst_SuBwTG_zeit_1_0'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -4437,7 +4437,7 @@ { "index": 439, "count": 1, - "names": ['ID_Einst_SuBwTG_zeit_1_1', 'Unknown_Parameter_439'], + "names": ['ID_Einst_SuBwTG_zeit_1_1'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -4447,7 +4447,7 @@ { "index": 440, "count": 1, - "names": ['ID_Einst_SuBwTG_zeit_2_0', 'Unknown_Parameter_440'], + "names": ['ID_Einst_SuBwTG_zeit_2_0'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -4457,7 +4457,7 @@ { "index": 441, "count": 1, - "names": ['ID_Einst_SuBwTG_zeit_2_1', 'Unknown_Parameter_441'], + "names": ['ID_Einst_SuBwTG_zeit_2_1'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -4467,7 +4467,7 @@ { "index": 442, "count": 1, - "names": ['ID_Einst_SuBwTG_zeit_3_0', 'Unknown_Parameter_442'], + "names": ['ID_Einst_SuBwTG_zeit_3_0'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -4477,7 +4477,7 @@ { "index": 443, "count": 1, - "names": ['ID_Einst_SuBwTG_zeit_3_1', 'Unknown_Parameter_443'], + "names": ['ID_Einst_SuBwTG_zeit_3_1'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -4487,7 +4487,7 @@ { "index": 444, "count": 1, - "names": ['ID_Einst_SuBwTG_zeit_4_0', 'Unknown_Parameter_444'], + "names": ['ID_Einst_SuBwTG_zeit_4_0'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -4497,7 +4497,7 @@ { "index": 445, "count": 1, - "names": ['ID_Einst_SuBwTG_zeit_4_1', 'Unknown_Parameter_445'], + "names": ['ID_Einst_SuBwTG_zeit_4_1'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -4507,7 +4507,7 @@ { "index": 446, "count": 1, - "names": ['ID_Einst_SuBwTG_zeit_0_2', 'Unknown_Parameter_446'], + "names": ['ID_Einst_SuBwTG_zeit_0_2'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -4517,7 +4517,7 @@ { "index": 447, "count": 1, - "names": ['ID_Einst_SuBwTG_zeit_0_3', 'Unknown_Parameter_447'], + "names": ['ID_Einst_SuBwTG_zeit_0_3'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -4527,7 +4527,7 @@ { "index": 448, "count": 1, - "names": ['ID_Einst_SuBwTG_zeit_1_2', 'Unknown_Parameter_448'], + "names": ['ID_Einst_SuBwTG_zeit_1_2'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -4537,7 +4537,7 @@ { "index": 449, "count": 1, - "names": ['ID_Einst_SuBwTG_zeit_1_3', 'Unknown_Parameter_449'], + "names": ['ID_Einst_SuBwTG_zeit_1_3'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -4547,7 +4547,7 @@ { "index": 450, "count": 1, - "names": ['ID_Einst_SuBwTG_zeit_2_2', 'Unknown_Parameter_450'], + "names": ['ID_Einst_SuBwTG_zeit_2_2'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -4557,7 +4557,7 @@ { "index": 451, "count": 1, - "names": ['ID_Einst_SuBwTG_zeit_2_3', 'Unknown_Parameter_451'], + "names": ['ID_Einst_SuBwTG_zeit_2_3'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -4567,7 +4567,7 @@ { "index": 452, "count": 1, - "names": ['ID_Einst_SuBwTG_zeit_3_2', 'Unknown_Parameter_452'], + "names": ['ID_Einst_SuBwTG_zeit_3_2'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -4577,7 +4577,7 @@ { "index": 453, "count": 1, - "names": ['ID_Einst_SuBwTG_zeit_3_3', 'Unknown_Parameter_453'], + "names": ['ID_Einst_SuBwTG_zeit_3_3'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -4587,7 +4587,7 @@ { "index": 454, "count": 1, - "names": ['ID_Einst_SuBwTG_zeit_4_2', 'Unknown_Parameter_454'], + "names": ['ID_Einst_SuBwTG_zeit_4_2'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -4597,7 +4597,7 @@ { "index": 455, "count": 1, - "names": ['ID_Einst_SuBwTG_zeit_4_3', 'Unknown_Parameter_455'], + "names": ['ID_Einst_SuBwTG_zeit_4_3'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -4607,7 +4607,7 @@ { "index": 456, "count": 1, - "names": ['ID_Einst_SuBwTG_zeit_0_4', 'Unknown_Parameter_456'], + "names": ['ID_Einst_SuBwTG_zeit_0_4'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -4617,7 +4617,7 @@ { "index": 457, "count": 1, - "names": ['ID_Einst_SuBwTG_zeit_0_5', 'Unknown_Parameter_457'], + "names": ['ID_Einst_SuBwTG_zeit_0_5'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -4627,7 +4627,7 @@ { "index": 458, "count": 1, - "names": ['ID_Einst_SuBwTG_zeit_1_4', 'Unknown_Parameter_458'], + "names": ['ID_Einst_SuBwTG_zeit_1_4'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -4637,7 +4637,7 @@ { "index": 459, "count": 1, - "names": ['ID_Einst_SuBwTG_zeit_1_5', 'Unknown_Parameter_459'], + "names": ['ID_Einst_SuBwTG_zeit_1_5'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -4647,7 +4647,7 @@ { "index": 460, "count": 1, - "names": ['ID_Einst_SuBwTG_zeit_2_4', 'Unknown_Parameter_460'], + "names": ['ID_Einst_SuBwTG_zeit_2_4'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -4657,7 +4657,7 @@ { "index": 461, "count": 1, - "names": ['ID_Einst_SuBwTG_zeit_2_5', 'Unknown_Parameter_461'], + "names": ['ID_Einst_SuBwTG_zeit_2_5'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -4667,7 +4667,7 @@ { "index": 462, "count": 1, - "names": ['ID_Einst_SuBwTG_zeit_3_4', 'Unknown_Parameter_462'], + "names": ['ID_Einst_SuBwTG_zeit_3_4'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -4677,7 +4677,7 @@ { "index": 463, "count": 1, - "names": ['ID_Einst_SuBwTG_zeit_3_5', 'Unknown_Parameter_463'], + "names": ['ID_Einst_SuBwTG_zeit_3_5'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -4687,7 +4687,7 @@ { "index": 464, "count": 1, - "names": ['ID_Einst_SuBwTG_zeit_4_4', 'Unknown_Parameter_464'], + "names": ['ID_Einst_SuBwTG_zeit_4_4'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -4697,7 +4697,7 @@ { "index": 465, "count": 1, - "names": ['ID_Einst_SuBwTG_zeit_4_5', 'Unknown_Parameter_465'], + "names": ['ID_Einst_SuBwTG_zeit_4_5'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -4707,7 +4707,7 @@ { "index": 466, "count": 1, - "names": ['ID_Einst_SuBwTG_zeit_0_6', 'Unknown_Parameter_466'], + "names": ['ID_Einst_SuBwTG_zeit_0_6'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -4717,7 +4717,7 @@ { "index": 467, "count": 1, - "names": ['ID_Einst_SuBwTG_zeit_0_7', 'Unknown_Parameter_467'], + "names": ['ID_Einst_SuBwTG_zeit_0_7'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -4727,7 +4727,7 @@ { "index": 468, "count": 1, - "names": ['ID_Einst_SuBwTG_zeit_1_6', 'Unknown_Parameter_468'], + "names": ['ID_Einst_SuBwTG_zeit_1_6'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -4737,7 +4737,7 @@ { "index": 469, "count": 1, - "names": ['ID_Einst_SuBwTG_zeit_1_7', 'Unknown_Parameter_469'], + "names": ['ID_Einst_SuBwTG_zeit_1_7'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -4747,7 +4747,7 @@ { "index": 470, "count": 1, - "names": ['ID_Einst_SuBwTG_zeit_2_6', 'Unknown_Parameter_470'], + "names": ['ID_Einst_SuBwTG_zeit_2_6'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -4757,7 +4757,7 @@ { "index": 471, "count": 1, - "names": ['ID_Einst_SuBwTG_zeit_2_7', 'Unknown_Parameter_471'], + "names": ['ID_Einst_SuBwTG_zeit_2_7'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -4767,7 +4767,7 @@ { "index": 472, "count": 1, - "names": ['ID_Einst_SuBwTG_zeit_3_6', 'Unknown_Parameter_472'], + "names": ['ID_Einst_SuBwTG_zeit_3_6'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -4777,7 +4777,7 @@ { "index": 473, "count": 1, - "names": ['ID_Einst_SuBwTG_zeit_3_7', 'Unknown_Parameter_473'], + "names": ['ID_Einst_SuBwTG_zeit_3_7'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -4787,7 +4787,7 @@ { "index": 474, "count": 1, - "names": ['ID_Einst_SuBwTG_zeit_4_6', 'Unknown_Parameter_474'], + "names": ['ID_Einst_SuBwTG_zeit_4_6'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -4797,7 +4797,7 @@ { "index": 475, "count": 1, - "names": ['ID_Einst_SuBwTG_zeit_4_7', 'Unknown_Parameter_475'], + "names": ['ID_Einst_SuBwTG_zeit_4_7'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -4807,7 +4807,7 @@ { "index": 476, "count": 1, - "names": ['ID_Einst_SuBwTG_zeit_0_8', 'Unknown_Parameter_476'], + "names": ['ID_Einst_SuBwTG_zeit_0_8'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -4817,7 +4817,7 @@ { "index": 477, "count": 1, - "names": ['ID_Einst_SuBwTG_zeit_0_9', 'Unknown_Parameter_477'], + "names": ['ID_Einst_SuBwTG_zeit_0_9'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -4827,7 +4827,7 @@ { "index": 478, "count": 1, - "names": ['ID_Einst_SuBwTG_zeit_1_8', 'Unknown_Parameter_478'], + "names": ['ID_Einst_SuBwTG_zeit_1_8'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -4837,7 +4837,7 @@ { "index": 479, "count": 1, - "names": ['ID_Einst_SuBwTG_zeit_1_9', 'Unknown_Parameter_479'], + "names": ['ID_Einst_SuBwTG_zeit_1_9'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -4847,7 +4847,7 @@ { "index": 480, "count": 1, - "names": ['ID_Einst_SuBwTG_zeit_2_8', 'Unknown_Parameter_480'], + "names": ['ID_Einst_SuBwTG_zeit_2_8'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -4857,7 +4857,7 @@ { "index": 481, "count": 1, - "names": ['ID_Einst_SuBwTG_zeit_2_9', 'Unknown_Parameter_481'], + "names": ['ID_Einst_SuBwTG_zeit_2_9'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -4867,7 +4867,7 @@ { "index": 482, "count": 1, - "names": ['ID_Einst_SuBwTG_zeit_3_8', 'Unknown_Parameter_482'], + "names": ['ID_Einst_SuBwTG_zeit_3_8'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -4877,7 +4877,7 @@ { "index": 483, "count": 1, - "names": ['ID_Einst_SuBwTG_zeit_3_9', 'Unknown_Parameter_483'], + "names": ['ID_Einst_SuBwTG_zeit_3_9'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -4887,7 +4887,7 @@ { "index": 484, "count": 1, - "names": ['ID_Einst_SuBwTG_zeit_4_8', 'Unknown_Parameter_484'], + "names": ['ID_Einst_SuBwTG_zeit_4_8'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -4897,7 +4897,7 @@ { "index": 485, "count": 1, - "names": ['ID_Einst_SuBwTG_zeit_4_9', 'Unknown_Parameter_485'], + "names": ['ID_Einst_SuBwTG_zeit_4_9'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -4907,7 +4907,7 @@ { "index": 486, "count": 1, - "names": ['ID_Einst_SuBwTG_zeit_0_10', 'Unknown_Parameter_486'], + "names": ['ID_Einst_SuBwTG_zeit_0_10'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -4917,7 +4917,7 @@ { "index": 487, "count": 1, - "names": ['ID_Einst_SuBwTG_zeit_0_11', 'Unknown_Parameter_487'], + "names": ['ID_Einst_SuBwTG_zeit_0_11'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -4927,7 +4927,7 @@ { "index": 488, "count": 1, - "names": ['ID_Einst_SuBwTG_zeit_1_10', 'Unknown_Parameter_488'], + "names": ['ID_Einst_SuBwTG_zeit_1_10'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -4937,7 +4937,7 @@ { "index": 489, "count": 1, - "names": ['ID_Einst_SuBwTG_zeit_1_11', 'Unknown_Parameter_489'], + "names": ['ID_Einst_SuBwTG_zeit_1_11'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -4947,7 +4947,7 @@ { "index": 490, "count": 1, - "names": ['ID_Einst_SuBwTG_zeit_2_10', 'Unknown_Parameter_490'], + "names": ['ID_Einst_SuBwTG_zeit_2_10'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -4957,7 +4957,7 @@ { "index": 491, "count": 1, - "names": ['ID_Einst_SuBwTG_zeit_2_11', 'Unknown_Parameter_491'], + "names": ['ID_Einst_SuBwTG_zeit_2_11'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -4967,7 +4967,7 @@ { "index": 492, "count": 1, - "names": ['ID_Einst_SuBwTG_zeit_3_10', 'Unknown_Parameter_492'], + "names": ['ID_Einst_SuBwTG_zeit_3_10'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -4977,7 +4977,7 @@ { "index": 493, "count": 1, - "names": ['ID_Einst_SuBwTG_zeit_3_11', 'Unknown_Parameter_493'], + "names": ['ID_Einst_SuBwTG_zeit_3_11'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -4987,7 +4987,7 @@ { "index": 494, "count": 1, - "names": ['ID_Einst_SuBwTG_zeit_4_10', 'Unknown_Parameter_494'], + "names": ['ID_Einst_SuBwTG_zeit_4_10'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -4997,7 +4997,7 @@ { "index": 495, "count": 1, - "names": ['ID_Einst_SuBwTG_zeit_4_11', 'Unknown_Parameter_495'], + "names": ['ID_Einst_SuBwTG_zeit_4_11'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -5007,7 +5007,7 @@ { "index": 496, "count": 1, - "names": ['ID_Einst_SuBwTG_zeit_0_12', 'Unknown_Parameter_496'], + "names": ['ID_Einst_SuBwTG_zeit_0_12'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -5017,7 +5017,7 @@ { "index": 497, "count": 1, - "names": ['ID_Einst_SuBwTG_zeit_0_13', 'Unknown_Parameter_497'], + "names": ['ID_Einst_SuBwTG_zeit_0_13'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -5027,7 +5027,7 @@ { "index": 498, "count": 1, - "names": ['ID_Einst_SuBwTG_zeit_1_12', 'Unknown_Parameter_498'], + "names": ['ID_Einst_SuBwTG_zeit_1_12'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -5037,7 +5037,7 @@ { "index": 499, "count": 1, - "names": ['ID_Einst_SuBwTG_zeit_1_13', 'Unknown_Parameter_499'], + "names": ['ID_Einst_SuBwTG_zeit_1_13'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -5047,7 +5047,7 @@ { "index": 500, "count": 1, - "names": ['ID_Einst_SuBwTG_zeit_2_12', 'Unknown_Parameter_500'], + "names": ['ID_Einst_SuBwTG_zeit_2_12'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -5057,7 +5057,7 @@ { "index": 501, "count": 1, - "names": ['ID_Einst_SuBwTG_zeit_2_13', 'Unknown_Parameter_501'], + "names": ['ID_Einst_SuBwTG_zeit_2_13'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -5067,7 +5067,7 @@ { "index": 502, "count": 1, - "names": ['ID_Einst_SuBwTG_zeit_3_12', 'Unknown_Parameter_502'], + "names": ['ID_Einst_SuBwTG_zeit_3_12'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -5077,7 +5077,7 @@ { "index": 503, "count": 1, - "names": ['ID_Einst_SuBwTG_zeit_3_13', 'Unknown_Parameter_503'], + "names": ['ID_Einst_SuBwTG_zeit_3_13'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -5087,7 +5087,7 @@ { "index": 504, "count": 1, - "names": ['ID_Einst_SuBwTG_zeit_4_12', 'Unknown_Parameter_504'], + "names": ['ID_Einst_SuBwTG_zeit_4_12'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -5097,7 +5097,7 @@ { "index": 505, "count": 1, - "names": ['ID_Einst_SuBwTG_zeit_4_13', 'Unknown_Parameter_505'], + "names": ['ID_Einst_SuBwTG_zeit_4_13'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -5107,7 +5107,7 @@ { "index": 506, "count": 1, - "names": ['ID_Einst_SuZIP_akt', 'Unknown_Parameter_506'], + "names": ['ID_Einst_SuZIP_akt'], "type": TimerProgram, "writeable": True, "datatype": 'UINT32', @@ -5117,7 +5117,7 @@ { "index": 507, "count": 1, - "names": ['ID_Einst_SuZIPWo_zeit_0_0', 'Unknown_Parameter_507'], + "names": ['ID_Einst_SuZIPWo_zeit_0_0'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -5127,7 +5127,7 @@ { "index": 508, "count": 1, - "names": ['ID_Einst_SuZIPWo_zeit_0_1', 'Unknown_Parameter_508'], + "names": ['ID_Einst_SuZIPWo_zeit_0_1'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -5137,7 +5137,7 @@ { "index": 509, "count": 1, - "names": ['ID_Einst_SuZIPWo_zeit_1_0', 'Unknown_Parameter_509'], + "names": ['ID_Einst_SuZIPWo_zeit_1_0'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -5147,7 +5147,7 @@ { "index": 510, "count": 1, - "names": ['ID_Einst_SuZIPWo_zeit_1_1', 'Unknown_Parameter_510'], + "names": ['ID_Einst_SuZIPWo_zeit_1_1'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -5157,7 +5157,7 @@ { "index": 511, "count": 1, - "names": ['ID_Einst_SuZIPWo_zeit_2_0', 'Unknown_Parameter_511'], + "names": ['ID_Einst_SuZIPWo_zeit_2_0'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -5167,7 +5167,7 @@ { "index": 512, "count": 1, - "names": ['ID_Einst_SuZIPWo_zeit_2_1', 'Unknown_Parameter_512'], + "names": ['ID_Einst_SuZIPWo_zeit_2_1'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -5177,7 +5177,7 @@ { "index": 513, "count": 1, - "names": ['ID_Einst_SuZIPWo_zeit_3_0', 'Unknown_Parameter_513'], + "names": ['ID_Einst_SuZIPWo_zeit_3_0'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -5187,7 +5187,7 @@ { "index": 514, "count": 1, - "names": ['ID_Einst_SuZIPWo_zeit_3_1', 'Unknown_Parameter_514'], + "names": ['ID_Einst_SuZIPWo_zeit_3_1'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -5197,7 +5197,7 @@ { "index": 515, "count": 1, - "names": ['ID_Einst_SuZIPWo_zeit_4_0', 'Unknown_Parameter_515'], + "names": ['ID_Einst_SuZIPWo_zeit_4_0'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -5207,7 +5207,7 @@ { "index": 516, "count": 1, - "names": ['ID_Einst_SuZIPWo_zeit_4_1', 'Unknown_Parameter_516'], + "names": ['ID_Einst_SuZIPWo_zeit_4_1'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -5217,7 +5217,7 @@ { "index": 517, "count": 1, - "names": ['ID_Einst_SuZIP25_zeit_0_0', 'Unknown_Parameter_517'], + "names": ['ID_Einst_SuZIP25_zeit_0_0'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -5227,7 +5227,7 @@ { "index": 518, "count": 1, - "names": ['ID_Einst_SuZIP25_zeit_0_1', 'Unknown_Parameter_518'], + "names": ['ID_Einst_SuZIP25_zeit_0_1'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -5237,7 +5237,7 @@ { "index": 519, "count": 1, - "names": ['ID_Einst_SuZIP25_zeit_1_0', 'Unknown_Parameter_519'], + "names": ['ID_Einst_SuZIP25_zeit_1_0'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -5247,7 +5247,7 @@ { "index": 520, "count": 1, - "names": ['ID_Einst_SuZIP25_zeit_1_1', 'Unknown_Parameter_520'], + "names": ['ID_Einst_SuZIP25_zeit_1_1'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -5257,7 +5257,7 @@ { "index": 521, "count": 1, - "names": ['ID_Einst_SuZIP25_zeit_2_0', 'Unknown_Parameter_521'], + "names": ['ID_Einst_SuZIP25_zeit_2_0'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -5267,7 +5267,7 @@ { "index": 522, "count": 1, - "names": ['ID_Einst_SuZIP25_zeit_2_1', 'Unknown_Parameter_522'], + "names": ['ID_Einst_SuZIP25_zeit_2_1'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -5277,7 +5277,7 @@ { "index": 523, "count": 1, - "names": ['ID_Einst_SuZIP25_zeit_3_0', 'Unknown_Parameter_523'], + "names": ['ID_Einst_SuZIP25_zeit_3_0'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -5287,7 +5287,7 @@ { "index": 524, "count": 1, - "names": ['ID_Einst_SuZIP25_zeit_3_1', 'Unknown_Parameter_524'], + "names": ['ID_Einst_SuZIP25_zeit_3_1'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -5297,7 +5297,7 @@ { "index": 525, "count": 1, - "names": ['ID_Einst_SuZIP25_zeit_4_0', 'Unknown_Parameter_525'], + "names": ['ID_Einst_SuZIP25_zeit_4_0'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -5307,7 +5307,7 @@ { "index": 526, "count": 1, - "names": ['ID_Einst_SuZIP25_zeit_4_1', 'Unknown_Parameter_526'], + "names": ['ID_Einst_SuZIP25_zeit_4_1'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -5317,7 +5317,7 @@ { "index": 527, "count": 1, - "names": ['ID_Einst_SuZIP25_zeit_0_2', 'Unknown_Parameter_527'], + "names": ['ID_Einst_SuZIP25_zeit_0_2'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -5327,7 +5327,7 @@ { "index": 528, "count": 1, - "names": ['ID_Einst_SuZIP25_zeit_0_3', 'Unknown_Parameter_528'], + "names": ['ID_Einst_SuZIP25_zeit_0_3'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -5337,7 +5337,7 @@ { "index": 529, "count": 1, - "names": ['ID_Einst_SuZIP25_zeit_1_2', 'Unknown_Parameter_529'], + "names": ['ID_Einst_SuZIP25_zeit_1_2'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -5347,7 +5347,7 @@ { "index": 530, "count": 1, - "names": ['ID_Einst_SuZIP25_zeit_1_3', 'Unknown_Parameter_530'], + "names": ['ID_Einst_SuZIP25_zeit_1_3'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -5357,7 +5357,7 @@ { "index": 531, "count": 1, - "names": ['ID_Einst_SuZIP25_zeit_2_2', 'Unknown_Parameter_531'], + "names": ['ID_Einst_SuZIP25_zeit_2_2'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -5367,7 +5367,7 @@ { "index": 532, "count": 1, - "names": ['ID_Einst_SuZIP25_zeit_2_3', 'Unknown_Parameter_532'], + "names": ['ID_Einst_SuZIP25_zeit_2_3'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -5377,7 +5377,7 @@ { "index": 533, "count": 1, - "names": ['ID_Einst_SuZIP25_zeit_3_2', 'Unknown_Parameter_533'], + "names": ['ID_Einst_SuZIP25_zeit_3_2'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -5387,7 +5387,7 @@ { "index": 534, "count": 1, - "names": ['ID_Einst_SuZIP25_zeit_3_3', 'Unknown_Parameter_534'], + "names": ['ID_Einst_SuZIP25_zeit_3_3'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -5397,7 +5397,7 @@ { "index": 535, "count": 1, - "names": ['ID_Einst_SuZIP25_zeit_4_2', 'Unknown_Parameter_535'], + "names": ['ID_Einst_SuZIP25_zeit_4_2'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -5407,7 +5407,7 @@ { "index": 536, "count": 1, - "names": ['ID_Einst_SuZIP25_zeit_4_3', 'Unknown_Parameter_536'], + "names": ['ID_Einst_SuZIP25_zeit_4_3'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -5417,7 +5417,7 @@ { "index": 537, "count": 1, - "names": ['ID_Einst_SuZIPTg_zeit_0_0', 'Unknown_Parameter_537'], + "names": ['ID_Einst_SuZIPTg_zeit_0_0'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -5427,7 +5427,7 @@ { "index": 538, "count": 1, - "names": ['ID_Einst_SuZIPTg_zeit_0_1', 'Unknown_Parameter_538'], + "names": ['ID_Einst_SuZIPTg_zeit_0_1'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -5437,7 +5437,7 @@ { "index": 539, "count": 1, - "names": ['ID_Einst_SuZIPTg_zeit_1_0', 'Unknown_Parameter_539'], + "names": ['ID_Einst_SuZIPTg_zeit_1_0'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -5447,7 +5447,7 @@ { "index": 540, "count": 1, - "names": ['ID_Einst_SuZIPTg_zeit_1_1', 'Unknown_Parameter_540'], + "names": ['ID_Einst_SuZIPTg_zeit_1_1'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -5457,7 +5457,7 @@ { "index": 541, "count": 1, - "names": ['ID_Einst_SuZIPTg_zeit_2_0', 'Unknown_Parameter_541'], + "names": ['ID_Einst_SuZIPTg_zeit_2_0'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -5467,7 +5467,7 @@ { "index": 542, "count": 1, - "names": ['ID_Einst_SuZIPTg_zeit_2_1', 'Unknown_Parameter_542'], + "names": ['ID_Einst_SuZIPTg_zeit_2_1'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -5477,7 +5477,7 @@ { "index": 543, "count": 1, - "names": ['ID_Einst_SuZIPTg_zeit_3_0', 'Unknown_Parameter_543'], + "names": ['ID_Einst_SuZIPTg_zeit_3_0'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -5487,7 +5487,7 @@ { "index": 544, "count": 1, - "names": ['ID_Einst_SuZIPTg_zeit_3_1', 'Unknown_Parameter_544'], + "names": ['ID_Einst_SuZIPTg_zeit_3_1'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -5497,7 +5497,7 @@ { "index": 545, "count": 1, - "names": ['ID_Einst_SuZIPTg_zeit_4_0', 'Unknown_Parameter_545'], + "names": ['ID_Einst_SuZIPTg_zeit_4_0'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -5507,7 +5507,7 @@ { "index": 546, "count": 1, - "names": ['ID_Einst_SuZIPTg_zeit_4_1', 'Unknown_Parameter_546'], + "names": ['ID_Einst_SuZIPTg_zeit_4_1'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -5517,7 +5517,7 @@ { "index": 547, "count": 1, - "names": ['ID_Einst_SuZIPTg_zeit_0_2', 'Unknown_Parameter_547'], + "names": ['ID_Einst_SuZIPTg_zeit_0_2'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -5527,7 +5527,7 @@ { "index": 548, "count": 1, - "names": ['ID_Einst_SuZIPTg_zeit_0_3', 'Unknown_Parameter_548'], + "names": ['ID_Einst_SuZIPTg_zeit_0_3'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -5537,7 +5537,7 @@ { "index": 549, "count": 1, - "names": ['ID_Einst_SuZIPTg_zeit_1_2', 'Unknown_Parameter_549'], + "names": ['ID_Einst_SuZIPTg_zeit_1_2'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -5547,7 +5547,7 @@ { "index": 550, "count": 1, - "names": ['ID_Einst_SuZIPTg_zeit_1_3', 'Unknown_Parameter_550'], + "names": ['ID_Einst_SuZIPTg_zeit_1_3'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -5557,7 +5557,7 @@ { "index": 551, "count": 1, - "names": ['ID_Einst_SuZIPTg_zeit_2_2', 'Unknown_Parameter_551'], + "names": ['ID_Einst_SuZIPTg_zeit_2_2'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -5567,7 +5567,7 @@ { "index": 552, "count": 1, - "names": ['ID_Einst_SuZIPTg_zeit_2_3', 'Unknown_Parameter_552'], + "names": ['ID_Einst_SuZIPTg_zeit_2_3'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -5577,7 +5577,7 @@ { "index": 553, "count": 1, - "names": ['ID_Einst_SuZIPTg_zeit_3_2', 'Unknown_Parameter_553'], + "names": ['ID_Einst_SuZIPTg_zeit_3_2'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -5587,7 +5587,7 @@ { "index": 554, "count": 1, - "names": ['ID_Einst_SuZIPTg_zeit_3_3', 'Unknown_Parameter_554'], + "names": ['ID_Einst_SuZIPTg_zeit_3_3'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -5597,7 +5597,7 @@ { "index": 555, "count": 1, - "names": ['ID_Einst_SuZIPTg_zeit_4_2', 'Unknown_Parameter_555'], + "names": ['ID_Einst_SuZIPTg_zeit_4_2'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -5607,7 +5607,7 @@ { "index": 556, "count": 1, - "names": ['ID_Einst_SuZIPTg_zeit_4_3', 'Unknown_Parameter_556'], + "names": ['ID_Einst_SuZIPTg_zeit_4_3'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -5617,7 +5617,7 @@ { "index": 557, "count": 1, - "names": ['ID_Einst_SuZIPTg_zeit_0_4', 'Unknown_Parameter_557'], + "names": ['ID_Einst_SuZIPTg_zeit_0_4'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -5627,7 +5627,7 @@ { "index": 558, "count": 1, - "names": ['ID_Einst_SuZIPTg_zeit_0_5', 'Unknown_Parameter_558'], + "names": ['ID_Einst_SuZIPTg_zeit_0_5'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -5637,7 +5637,7 @@ { "index": 559, "count": 1, - "names": ['ID_Einst_SuZIPTg_zeit_1_4', 'Unknown_Parameter_559'], + "names": ['ID_Einst_SuZIPTg_zeit_1_4'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -5647,7 +5647,7 @@ { "index": 560, "count": 1, - "names": ['ID_Einst_SuZIPTg_zeit_1_5', 'Unknown_Parameter_560'], + "names": ['ID_Einst_SuZIPTg_zeit_1_5'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -5657,7 +5657,7 @@ { "index": 561, "count": 1, - "names": ['ID_Einst_SuZIPTg_zeit_2_4', 'Unknown_Parameter_561'], + "names": ['ID_Einst_SuZIPTg_zeit_2_4'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -5667,7 +5667,7 @@ { "index": 562, "count": 1, - "names": ['ID_Einst_SuZIPTg_zeit_2_5', 'Unknown_Parameter_562'], + "names": ['ID_Einst_SuZIPTg_zeit_2_5'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -5677,7 +5677,7 @@ { "index": 563, "count": 1, - "names": ['ID_Einst_SuZIPTg_zeit_3_4', 'Unknown_Parameter_563'], + "names": ['ID_Einst_SuZIPTg_zeit_3_4'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -5687,7 +5687,7 @@ { "index": 564, "count": 1, - "names": ['ID_Einst_SuZIPTg_zeit_3_5', 'Unknown_Parameter_564'], + "names": ['ID_Einst_SuZIPTg_zeit_3_5'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -5697,7 +5697,7 @@ { "index": 565, "count": 1, - "names": ['ID_Einst_SuZIPTg_zeit_4_4', 'Unknown_Parameter_565'], + "names": ['ID_Einst_SuZIPTg_zeit_4_4'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -5707,7 +5707,7 @@ { "index": 566, "count": 1, - "names": ['ID_Einst_SuZIPTg_zeit_4_5', 'Unknown_Parameter_566'], + "names": ['ID_Einst_SuZIPTg_zeit_4_5'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -5717,7 +5717,7 @@ { "index": 567, "count": 1, - "names": ['ID_Einst_SuZIPTg_zeit_0_6', 'Unknown_Parameter_567'], + "names": ['ID_Einst_SuZIPTg_zeit_0_6'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -5727,7 +5727,7 @@ { "index": 568, "count": 1, - "names": ['ID_Einst_SuZIPTg_zeit_0_7', 'Unknown_Parameter_568'], + "names": ['ID_Einst_SuZIPTg_zeit_0_7'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -5737,7 +5737,7 @@ { "index": 569, "count": 1, - "names": ['ID_Einst_SuZIPTg_zeit_1_6', 'Unknown_Parameter_569'], + "names": ['ID_Einst_SuZIPTg_zeit_1_6'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -5747,7 +5747,7 @@ { "index": 570, "count": 1, - "names": ['ID_Einst_SuZIPTg_zeit_1_7', 'Unknown_Parameter_570'], + "names": ['ID_Einst_SuZIPTg_zeit_1_7'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -5757,7 +5757,7 @@ { "index": 571, "count": 1, - "names": ['ID_Einst_SuZIPTg_zeit_2_6', 'Unknown_Parameter_571'], + "names": ['ID_Einst_SuZIPTg_zeit_2_6'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -5767,7 +5767,7 @@ { "index": 572, "count": 1, - "names": ['ID_Einst_SuZIPTg_zeit_2_7', 'Unknown_Parameter_572'], + "names": ['ID_Einst_SuZIPTg_zeit_2_7'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -5777,7 +5777,7 @@ { "index": 573, "count": 1, - "names": ['ID_Einst_SuZIPTg_zeit_3_6', 'Unknown_Parameter_573'], + "names": ['ID_Einst_SuZIPTg_zeit_3_6'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -5787,7 +5787,7 @@ { "index": 574, "count": 1, - "names": ['ID_Einst_SuZIPTg_zeit_3_7', 'Unknown_Parameter_574'], + "names": ['ID_Einst_SuZIPTg_zeit_3_7'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -5797,7 +5797,7 @@ { "index": 575, "count": 1, - "names": ['ID_Einst_SuZIPTg_zeit_4_6', 'Unknown_Parameter_575'], + "names": ['ID_Einst_SuZIPTg_zeit_4_6'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -5807,7 +5807,7 @@ { "index": 576, "count": 1, - "names": ['ID_Einst_SuZIPTg_zeit_4_7', 'Unknown_Parameter_576'], + "names": ['ID_Einst_SuZIPTg_zeit_4_7'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -5817,7 +5817,7 @@ { "index": 577, "count": 1, - "names": ['ID_Einst_SuZIPTg_zeit_0_8', 'Unknown_Parameter_577'], + "names": ['ID_Einst_SuZIPTg_zeit_0_8'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -5827,7 +5827,7 @@ { "index": 578, "count": 1, - "names": ['ID_Einst_SuZIPTg_zeit_0_9', 'Unknown_Parameter_578'], + "names": ['ID_Einst_SuZIPTg_zeit_0_9'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -5837,7 +5837,7 @@ { "index": 579, "count": 1, - "names": ['ID_Einst_SuZIPTg_zeit_1_8', 'Unknown_Parameter_579'], + "names": ['ID_Einst_SuZIPTg_zeit_1_8'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -5847,7 +5847,7 @@ { "index": 580, "count": 1, - "names": ['ID_Einst_SuZIPTg_zeit_1_9', 'Unknown_Parameter_580'], + "names": ['ID_Einst_SuZIPTg_zeit_1_9'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -5857,7 +5857,7 @@ { "index": 581, "count": 1, - "names": ['ID_Einst_SuZIPTg_zeit_2_8', 'Unknown_Parameter_581'], + "names": ['ID_Einst_SuZIPTg_zeit_2_8'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -5867,7 +5867,7 @@ { "index": 582, "count": 1, - "names": ['ID_Einst_SuZIPTg_zeit_2_9', 'Unknown_Parameter_582'], + "names": ['ID_Einst_SuZIPTg_zeit_2_9'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -5877,7 +5877,7 @@ { "index": 583, "count": 1, - "names": ['ID_Einst_SuZIPTg_zeit_3_8', 'Unknown_Parameter_583'], + "names": ['ID_Einst_SuZIPTg_zeit_3_8'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -5887,7 +5887,7 @@ { "index": 584, "count": 1, - "names": ['ID_Einst_SuZIPTg_zeit_3_9', 'Unknown_Parameter_584'], + "names": ['ID_Einst_SuZIPTg_zeit_3_9'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -5897,7 +5897,7 @@ { "index": 585, "count": 1, - "names": ['ID_Einst_SuZIPTg_zeit_4_8', 'Unknown_Parameter_585'], + "names": ['ID_Einst_SuZIPTg_zeit_4_8'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -5907,7 +5907,7 @@ { "index": 586, "count": 1, - "names": ['ID_Einst_SuZIPTg_zeit_4_9', 'Unknown_Parameter_586'], + "names": ['ID_Einst_SuZIPTg_zeit_4_9'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -5917,7 +5917,7 @@ { "index": 587, "count": 1, - "names": ['ID_Einst_SuZIPTg_zeit_0_10', 'Unknown_Parameter_587'], + "names": ['ID_Einst_SuZIPTg_zeit_0_10'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -5927,7 +5927,7 @@ { "index": 588, "count": 1, - "names": ['ID_Einst_SuZIPTg_zeit_0_11', 'Unknown_Parameter_588'], + "names": ['ID_Einst_SuZIPTg_zeit_0_11'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -5937,7 +5937,7 @@ { "index": 589, "count": 1, - "names": ['ID_Einst_SuZIPTg_zeit_1_10', 'Unknown_Parameter_589'], + "names": ['ID_Einst_SuZIPTg_zeit_1_10'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -5947,7 +5947,7 @@ { "index": 590, "count": 1, - "names": ['ID_Einst_SuZIPTg_zeit_1_11', 'Unknown_Parameter_590'], + "names": ['ID_Einst_SuZIPTg_zeit_1_11'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -5957,7 +5957,7 @@ { "index": 591, "count": 1, - "names": ['ID_Einst_SuZIPTg_zeit_2_10', 'Unknown_Parameter_591'], + "names": ['ID_Einst_SuZIPTg_zeit_2_10'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -5967,7 +5967,7 @@ { "index": 592, "count": 1, - "names": ['ID_Einst_SuZIPTg_zeit_2_11', 'Unknown_Parameter_592'], + "names": ['ID_Einst_SuZIPTg_zeit_2_11'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -5977,7 +5977,7 @@ { "index": 593, "count": 1, - "names": ['ID_Einst_SuZIPTg_zeit_3_10', 'Unknown_Parameter_593'], + "names": ['ID_Einst_SuZIPTg_zeit_3_10'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -5987,7 +5987,7 @@ { "index": 594, "count": 1, - "names": ['ID_Einst_SuZIPTg_zeit_3_11', 'Unknown_Parameter_594'], + "names": ['ID_Einst_SuZIPTg_zeit_3_11'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -5997,7 +5997,7 @@ { "index": 595, "count": 1, - "names": ['ID_Einst_SuZIPTg_zeit_4_10', 'Unknown_Parameter_595'], + "names": ['ID_Einst_SuZIPTg_zeit_4_10'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -6007,7 +6007,7 @@ { "index": 596, "count": 1, - "names": ['ID_Einst_SuZIPTg_zeit_4_11', 'Unknown_Parameter_596'], + "names": ['ID_Einst_SuZIPTg_zeit_4_11'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -6017,7 +6017,7 @@ { "index": 597, "count": 1, - "names": ['ID_Einst_SuZIPTg_zeit_0_12', 'Unknown_Parameter_597'], + "names": ['ID_Einst_SuZIPTg_zeit_0_12'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -6027,7 +6027,7 @@ { "index": 598, "count": 1, - "names": ['ID_Einst_SuZIPTg_zeit_0_13', 'Unknown_Parameter_598'], + "names": ['ID_Einst_SuZIPTg_zeit_0_13'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -6037,7 +6037,7 @@ { "index": 599, "count": 1, - "names": ['ID_Einst_SuZIPTg_zeit_1_12', 'Unknown_Parameter_599'], + "names": ['ID_Einst_SuZIPTg_zeit_1_12'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -6047,7 +6047,7 @@ { "index": 600, "count": 1, - "names": ['ID_Einst_SuZIPTg_zeit_1_13', 'Unknown_Parameter_600'], + "names": ['ID_Einst_SuZIPTg_zeit_1_13'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -6057,7 +6057,7 @@ { "index": 601, "count": 1, - "names": ['ID_Einst_SuZIPTg_zeit_2_12', 'Unknown_Parameter_601'], + "names": ['ID_Einst_SuZIPTg_zeit_2_12'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -6067,7 +6067,7 @@ { "index": 602, "count": 1, - "names": ['ID_Einst_SuZIPTg_zeit_2_13', 'Unknown_Parameter_602'], + "names": ['ID_Einst_SuZIPTg_zeit_2_13'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -6077,7 +6077,7 @@ { "index": 603, "count": 1, - "names": ['ID_Einst_SuZIPTg_zeit_3_12', 'Unknown_Parameter_603'], + "names": ['ID_Einst_SuZIPTg_zeit_3_12'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -6087,7 +6087,7 @@ { "index": 604, "count": 1, - "names": ['ID_Einst_SuZIPTg_zeit_3_13', 'Unknown_Parameter_604'], + "names": ['ID_Einst_SuZIPTg_zeit_3_13'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -6097,7 +6097,7 @@ { "index": 605, "count": 1, - "names": ['ID_Einst_SuZIPTg_zeit_4_12', 'Unknown_Parameter_605'], + "names": ['ID_Einst_SuZIPTg_zeit_4_12'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -6107,7 +6107,7 @@ { "index": 606, "count": 1, - "names": ['ID_Einst_SuZIPTg_zeit_4_13', 'Unknown_Parameter_606'], + "names": ['ID_Einst_SuZIPTg_zeit_4_13'], "type": TimeOfDay, "writeable": True, "datatype": 'UINT32', @@ -6117,7 +6117,7 @@ { "index": 607, "count": 1, - "names": ['ID_Einst_SuSwb_akt', 'Unknown_Parameter_607'], + "names": ['ID_Einst_SuSwb_akt'], "type": TimerProgram, "writeable": False, "datatype": 'UINT32', @@ -6127,7 +6127,7 @@ { "index": 608, "count": 1, - "names": ['ID_Einst_SuSwbWo_zeit_0_0', 'Unknown_Parameter_608'], + "names": ['ID_Einst_SuSwbWo_zeit_0_0'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -6137,7 +6137,7 @@ { "index": 609, "count": 1, - "names": ['ID_Einst_SuSwbWo_zeit_0_1', 'Unknown_Parameter_609'], + "names": ['ID_Einst_SuSwbWo_zeit_0_1'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -6147,7 +6147,7 @@ { "index": 610, "count": 1, - "names": ['ID_Einst_SuSwbWo_zeit_1_0', 'Unknown_Parameter_610'], + "names": ['ID_Einst_SuSwbWo_zeit_1_0'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -6157,7 +6157,7 @@ { "index": 611, "count": 1, - "names": ['ID_Einst_SuSwbWo_zeit_1_1', 'Unknown_Parameter_611'], + "names": ['ID_Einst_SuSwbWo_zeit_1_1'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -6167,7 +6167,7 @@ { "index": 612, "count": 1, - "names": ['ID_Einst_SuSwbWo_zeit_2_0', 'Unknown_Parameter_612'], + "names": ['ID_Einst_SuSwbWo_zeit_2_0'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -6177,7 +6177,7 @@ { "index": 613, "count": 1, - "names": ['ID_Einst_SuSwbWo_zeit_2_1', 'Unknown_Parameter_613'], + "names": ['ID_Einst_SuSwbWo_zeit_2_1'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -6187,7 +6187,7 @@ { "index": 614, "count": 1, - "names": ['ID_Einst_SuSwb25_zeit_0_0', 'Unknown_Parameter_614'], + "names": ['ID_Einst_SuSwb25_zeit_0_0'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -6197,7 +6197,7 @@ { "index": 615, "count": 1, - "names": ['ID_Einst_SuSwb25_zeit_0_1', 'Unknown_Parameter_615'], + "names": ['ID_Einst_SuSwb25_zeit_0_1'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -6207,7 +6207,7 @@ { "index": 616, "count": 1, - "names": ['ID_Einst_SuSwb25_zeit_1_0', 'Unknown_Parameter_616'], + "names": ['ID_Einst_SuSwb25_zeit_1_0'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -6217,7 +6217,7 @@ { "index": 617, "count": 1, - "names": ['ID_Einst_SuSwb25_zeit_1_1', 'Unknown_Parameter_617'], + "names": ['ID_Einst_SuSwb25_zeit_1_1'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -6227,7 +6227,7 @@ { "index": 618, "count": 1, - "names": ['ID_Einst_SuSwb25_zeit_2_0', 'Unknown_Parameter_618'], + "names": ['ID_Einst_SuSwb25_zeit_2_0'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -6237,7 +6237,7 @@ { "index": 619, "count": 1, - "names": ['ID_Einst_SuSwb25_zeit_2_1', 'Unknown_Parameter_619'], + "names": ['ID_Einst_SuSwb25_zeit_2_1'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -6247,7 +6247,7 @@ { "index": 620, "count": 1, - "names": ['ID_Einst_SuSwb25_zeit_0_2', 'Unknown_Parameter_620'], + "names": ['ID_Einst_SuSwb25_zeit_0_2'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -6257,7 +6257,7 @@ { "index": 621, "count": 1, - "names": ['ID_Einst_SuSwb25_zeit_0_3', 'Unknown_Parameter_621'], + "names": ['ID_Einst_SuSwb25_zeit_0_3'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -6267,7 +6267,7 @@ { "index": 622, "count": 1, - "names": ['ID_Einst_SuSwb25_zeit_1_2', 'Unknown_Parameter_622'], + "names": ['ID_Einst_SuSwb25_zeit_1_2'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -6277,7 +6277,7 @@ { "index": 623, "count": 1, - "names": ['ID_Einst_SuSwb25_zeit_1_3', 'Unknown_Parameter_623'], + "names": ['ID_Einst_SuSwb25_zeit_1_3'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -6287,7 +6287,7 @@ { "index": 624, "count": 1, - "names": ['ID_Einst_SuSwb25_zeit_2_2', 'Unknown_Parameter_624'], + "names": ['ID_Einst_SuSwb25_zeit_2_2'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -6297,7 +6297,7 @@ { "index": 625, "count": 1, - "names": ['ID_Einst_SuSwb25_zeit_2_3', 'Unknown_Parameter_625'], + "names": ['ID_Einst_SuSwb25_zeit_2_3'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -6307,7 +6307,7 @@ { "index": 626, "count": 1, - "names": ['ID_Einst_SuSwbTg_zeit_0_0', 'Unknown_Parameter_626'], + "names": ['ID_Einst_SuSwbTg_zeit_0_0'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -6317,7 +6317,7 @@ { "index": 627, "count": 1, - "names": ['ID_Einst_SuSwbTg_zeit_0_1', 'Unknown_Parameter_627'], + "names": ['ID_Einst_SuSwbTg_zeit_0_1'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -6327,7 +6327,7 @@ { "index": 628, "count": 1, - "names": ['ID_Einst_SuSwbTg_zeit_1_0', 'Unknown_Parameter_628'], + "names": ['ID_Einst_SuSwbTg_zeit_1_0'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -6337,7 +6337,7 @@ { "index": 629, "count": 1, - "names": ['ID_Einst_SuSwbTg_zeit_1_1', 'Unknown_Parameter_629'], + "names": ['ID_Einst_SuSwbTg_zeit_1_1'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -6347,7 +6347,7 @@ { "index": 630, "count": 1, - "names": ['ID_Einst_SuSwbTg_zeit_2_0', 'Unknown_Parameter_630'], + "names": ['ID_Einst_SuSwbTg_zeit_2_0'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -6357,7 +6357,7 @@ { "index": 631, "count": 1, - "names": ['ID_Einst_SuSwbTg_zeit_2_1', 'Unknown_Parameter_631'], + "names": ['ID_Einst_SuSwbTg_zeit_2_1'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -6367,7 +6367,7 @@ { "index": 632, "count": 1, - "names": ['ID_Einst_SuSwbTg_zeit_0_2', 'Unknown_Parameter_632'], + "names": ['ID_Einst_SuSwbTg_zeit_0_2'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -6377,7 +6377,7 @@ { "index": 633, "count": 1, - "names": ['ID_Einst_SuSwbTg_zeit_0_3', 'Unknown_Parameter_633'], + "names": ['ID_Einst_SuSwbTg_zeit_0_3'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -6387,7 +6387,7 @@ { "index": 634, "count": 1, - "names": ['ID_Einst_SuSwbTg_zeit_1_2', 'Unknown_Parameter_634'], + "names": ['ID_Einst_SuSwbTg_zeit_1_2'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -6397,7 +6397,7 @@ { "index": 635, "count": 1, - "names": ['ID_Einst_SuSwbTg_zeit_1_3', 'Unknown_Parameter_635'], + "names": ['ID_Einst_SuSwbTg_zeit_1_3'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -6407,7 +6407,7 @@ { "index": 636, "count": 1, - "names": ['ID_Einst_SuSwbTg_zeit_2_2', 'Unknown_Parameter_636'], + "names": ['ID_Einst_SuSwbTg_zeit_2_2'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -6417,7 +6417,7 @@ { "index": 637, "count": 1, - "names": ['ID_Einst_SuSwbTg_zeit_2_3', 'Unknown_Parameter_637'], + "names": ['ID_Einst_SuSwbTg_zeit_2_3'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -6427,7 +6427,7 @@ { "index": 638, "count": 1, - "names": ['ID_Einst_SuSwbTg_zeit_0_4', 'Unknown_Parameter_638'], + "names": ['ID_Einst_SuSwbTg_zeit_0_4'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -6437,7 +6437,7 @@ { "index": 639, "count": 1, - "names": ['ID_Einst_SuSwbTg_zeit_0_5', 'Unknown_Parameter_639'], + "names": ['ID_Einst_SuSwbTg_zeit_0_5'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -6447,7 +6447,7 @@ { "index": 640, "count": 1, - "names": ['ID_Einst_SuSwbTg_zeit_1_4', 'Unknown_Parameter_640'], + "names": ['ID_Einst_SuSwbTg_zeit_1_4'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -6457,7 +6457,7 @@ { "index": 641, "count": 1, - "names": ['ID_Einst_SuSwbTg_zeit_1_5', 'Unknown_Parameter_641'], + "names": ['ID_Einst_SuSwbTg_zeit_1_5'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -6467,7 +6467,7 @@ { "index": 642, "count": 1, - "names": ['ID_Einst_SuSwbTg_zeit_2_4', 'Unknown_Parameter_642'], + "names": ['ID_Einst_SuSwbTg_zeit_2_4'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -6477,7 +6477,7 @@ { "index": 643, "count": 1, - "names": ['ID_Einst_SuSwbTg_zeit_2_5', 'Unknown_Parameter_643'], + "names": ['ID_Einst_SuSwbTg_zeit_2_5'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -6487,7 +6487,7 @@ { "index": 644, "count": 1, - "names": ['ID_Einst_SuSwbTg_zeit_0_6', 'Unknown_Parameter_644'], + "names": ['ID_Einst_SuSwbTg_zeit_0_6'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -6497,7 +6497,7 @@ { "index": 645, "count": 1, - "names": ['ID_Einst_SuSwbTg_zeit_0_7', 'Unknown_Parameter_645'], + "names": ['ID_Einst_SuSwbTg_zeit_0_7'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -6507,7 +6507,7 @@ { "index": 646, "count": 1, - "names": ['ID_Einst_SuSwbTg_zeit_1_6', 'Unknown_Parameter_646'], + "names": ['ID_Einst_SuSwbTg_zeit_1_6'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -6517,7 +6517,7 @@ { "index": 647, "count": 1, - "names": ['ID_Einst_SuSwbTg_zeit_1_7', 'Unknown_Parameter_647'], + "names": ['ID_Einst_SuSwbTg_zeit_1_7'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -6527,7 +6527,7 @@ { "index": 648, "count": 1, - "names": ['ID_Einst_SuSwbTg_zeit_2_6', 'Unknown_Parameter_648'], + "names": ['ID_Einst_SuSwbTg_zeit_2_6'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -6537,7 +6537,7 @@ { "index": 649, "count": 1, - "names": ['ID_Einst_SuSwbTg_zeit_2_7', 'Unknown_Parameter_649'], + "names": ['ID_Einst_SuSwbTg_zeit_2_7'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -6547,7 +6547,7 @@ { "index": 650, "count": 1, - "names": ['ID_Einst_SuSwbTg_zeit_0_8', 'Unknown_Parameter_650'], + "names": ['ID_Einst_SuSwbTg_zeit_0_8'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -6557,7 +6557,7 @@ { "index": 651, "count": 1, - "names": ['ID_Einst_SuSwbTg_zeit_0_9', 'Unknown_Parameter_651'], + "names": ['ID_Einst_SuSwbTg_zeit_0_9'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -6567,7 +6567,7 @@ { "index": 652, "count": 1, - "names": ['ID_Einst_SuSwbTg_zeit_1_8', 'Unknown_Parameter_652'], + "names": ['ID_Einst_SuSwbTg_zeit_1_8'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -6577,7 +6577,7 @@ { "index": 653, "count": 1, - "names": ['ID_Einst_SuSwbTg_zeit_1_9', 'Unknown_Parameter_653'], + "names": ['ID_Einst_SuSwbTg_zeit_1_9'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -6587,7 +6587,7 @@ { "index": 654, "count": 1, - "names": ['ID_Einst_SuSwbTg_zeit_2_8', 'Unknown_Parameter_654'], + "names": ['ID_Einst_SuSwbTg_zeit_2_8'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -6597,7 +6597,7 @@ { "index": 655, "count": 1, - "names": ['ID_Einst_SuSwbTg_zeit_2_9', 'Unknown_Parameter_655'], + "names": ['ID_Einst_SuSwbTg_zeit_2_9'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -6607,7 +6607,7 @@ { "index": 656, "count": 1, - "names": ['ID_Einst_SuSwbTg_zeit_0_10', 'Unknown_Parameter_656'], + "names": ['ID_Einst_SuSwbTg_zeit_0_10'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -6617,7 +6617,7 @@ { "index": 657, "count": 1, - "names": ['ID_Einst_SuSwbTg_zeit_0_11', 'Unknown_Parameter_657'], + "names": ['ID_Einst_SuSwbTg_zeit_0_11'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -6627,7 +6627,7 @@ { "index": 658, "count": 1, - "names": ['ID_Einst_SuSwbTg_zeit_1_10', 'Unknown_Parameter_658'], + "names": ['ID_Einst_SuSwbTg_zeit_1_10'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -6637,7 +6637,7 @@ { "index": 659, "count": 1, - "names": ['ID_Einst_SuSwbTg_zeit_1_11', 'Unknown_Parameter_659'], + "names": ['ID_Einst_SuSwbTg_zeit_1_11'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -6647,7 +6647,7 @@ { "index": 660, "count": 1, - "names": ['ID_Einst_SuSwbTg_zeit_2_10', 'Unknown_Parameter_660'], + "names": ['ID_Einst_SuSwbTg_zeit_2_10'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -6657,7 +6657,7 @@ { "index": 661, "count": 1, - "names": ['ID_Einst_SuSwbTg_zeit_2_11', 'Unknown_Parameter_661'], + "names": ['ID_Einst_SuSwbTg_zeit_2_11'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -6667,7 +6667,7 @@ { "index": 662, "count": 1, - "names": ['ID_Einst_SuSwbTg_zeit_0_12', 'Unknown_Parameter_662'], + "names": ['ID_Einst_SuSwbTg_zeit_0_12'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -6677,7 +6677,7 @@ { "index": 663, "count": 1, - "names": ['ID_Einst_SuSwbTg_zeit_0_13', 'Unknown_Parameter_663'], + "names": ['ID_Einst_SuSwbTg_zeit_0_13'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -6687,7 +6687,7 @@ { "index": 664, "count": 1, - "names": ['ID_Einst_SuSwbTg_zeit_1_12', 'Unknown_Parameter_664'], + "names": ['ID_Einst_SuSwbTg_zeit_1_12'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -6697,7 +6697,7 @@ { "index": 665, "count": 1, - "names": ['ID_Einst_SuSwbTg_zeit_1_13', 'Unknown_Parameter_665'], + "names": ['ID_Einst_SuSwbTg_zeit_1_13'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -6707,7 +6707,7 @@ { "index": 666, "count": 1, - "names": ['ID_Einst_SuSwbTg_zeit_2_12', 'Unknown_Parameter_666'], + "names": ['ID_Einst_SuSwbTg_zeit_2_12'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -6717,7 +6717,7 @@ { "index": 667, "count": 1, - "names": ['ID_Einst_SuSwbTg_zeit_2_13', 'Unknown_Parameter_667'], + "names": ['ID_Einst_SuSwbTg_zeit_2_13'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -6727,7 +6727,7 @@ { "index": 668, "count": 1, - "names": ['ID_Zaehler_BetrZeitWP', 'Unknown_Parameter_668'], + "names": ['ID_Zaehler_BetrZeitWP'], "type": Seconds, "writeable": False, "datatype": 'UINT32', @@ -6737,7 +6737,7 @@ { "index": 669, "count": 1, - "names": ['ID_Zaehler_BetrZeitVD1', 'Unknown_Parameter_669'], + "names": ['ID_Zaehler_BetrZeitVD1'], "type": Seconds, "writeable": False, "datatype": 'UINT32', @@ -6747,7 +6747,7 @@ { "index": 670, "count": 1, - "names": ['ID_Zaehler_BetrZeitVD2', 'Unknown_Parameter_670'], + "names": ['ID_Zaehler_BetrZeitVD2'], "type": Seconds, "writeable": False, "datatype": 'UINT32', @@ -6757,7 +6757,7 @@ { "index": 671, "count": 1, - "names": ['ID_Zaehler_BetrZeitZWE1', 'Unknown_Parameter_671'], + "names": ['ID_Zaehler_BetrZeitZWE1'], "type": Seconds, "writeable": False, "datatype": 'UINT32', @@ -6767,7 +6767,7 @@ { "index": 672, "count": 1, - "names": ['ID_Zaehler_BetrZeitZWE2', 'Unknown_Parameter_672'], + "names": ['ID_Zaehler_BetrZeitZWE2'], "type": Seconds, "writeable": False, "datatype": 'UINT32', @@ -6777,7 +6777,7 @@ { "index": 673, "count": 1, - "names": ['ID_Zaehler_BetrZeitZWE3', 'Unknown_Parameter_673'], + "names": ['ID_Zaehler_BetrZeitZWE3'], "type": Seconds, "writeable": False, "datatype": 'UINT32', @@ -6787,7 +6787,7 @@ { "index": 674, "count": 1, - "names": ['ID_Zaehler_BetrZeitImpVD1', 'Unknown_Parameter_674'], + "names": ['ID_Zaehler_BetrZeitImpVD1'], "type": Count, "writeable": False, "datatype": 'UINT32', @@ -6797,7 +6797,7 @@ { "index": 675, "count": 1, - "names": ['ID_Zaehler_BetrZeitImpVD2', 'Unknown_Parameter_675'], + "names": ['ID_Zaehler_BetrZeitImpVD2'], "type": Count, "writeable": False, "datatype": 'UINT32', @@ -6807,7 +6807,7 @@ { "index": 676, "count": 1, - "names": ['ID_Zaehler_BetrZeitEZMVD1', 'Unknown_Parameter_676'], + "names": ['ID_Zaehler_BetrZeitEZMVD1'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -6817,7 +6817,7 @@ { "index": 677, "count": 1, - "names": ['ID_Zaehler_BetrZeitEZMVD2', 'Unknown_Parameter_677'], + "names": ['ID_Zaehler_BetrZeitEZMVD2'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -6827,7 +6827,7 @@ { "index": 678, "count": 1, - "names": ['ID_Einst_Entl_Typ_0', 'Unknown_Parameter_678'], + "names": ['ID_Einst_Entl_Typ_0'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -6837,7 +6837,7 @@ { "index": 679, "count": 1, - "names": ['ID_Einst_Entl_Typ_1', 'Unknown_Parameter_679'], + "names": ['ID_Einst_Entl_Typ_1'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -6847,7 +6847,7 @@ { "index": 680, "count": 1, - "names": ['ID_Einst_Entl_Typ_2', 'Unknown_Parameter_680'], + "names": ['ID_Einst_Entl_Typ_2'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -6857,7 +6857,7 @@ { "index": 681, "count": 1, - "names": ['ID_Einst_Entl_Typ_3', 'Unknown_Parameter_681'], + "names": ['ID_Einst_Entl_Typ_3'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -6867,7 +6867,7 @@ { "index": 682, "count": 1, - "names": ['ID_Einst_Entl_Typ_4', 'Unknown_Parameter_682'], + "names": ['ID_Einst_Entl_Typ_4'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -6877,7 +6877,7 @@ { "index": 683, "count": 1, - "names": ['ID_Einst_Entl_Typ_5', 'Unknown_Parameter_683'], + "names": ['ID_Einst_Entl_Typ_5'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -6887,7 +6887,7 @@ { "index": 684, "count": 1, - "names": ['ID_Einst_Entl_Typ_6', 'Unknown_Parameter_684'], + "names": ['ID_Einst_Entl_Typ_6'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -6897,7 +6897,7 @@ { "index": 685, "count": 1, - "names": ['ID_Einst_Entl_Typ_7', 'Unknown_Parameter_685'], + "names": ['ID_Einst_Entl_Typ_7'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -6907,7 +6907,7 @@ { "index": 686, "count": 1, - "names": ['ID_Einst_Entl_Typ_8', 'Unknown_Parameter_686'], + "names": ['ID_Einst_Entl_Typ_8'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -6917,7 +6917,7 @@ { "index": 687, "count": 1, - "names": ['ID_Einst_Entl_Typ_9', 'Unknown_Parameter_687'], + "names": ['ID_Einst_Entl_Typ_9'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -6927,7 +6927,7 @@ { "index": 688, "count": 1, - "names": ['ID_Einst_Entl_Typ_10', 'Unknown_Parameter_688'], + "names": ['ID_Einst_Entl_Typ_10'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -6937,7 +6937,7 @@ { "index": 689, "count": 1, - "names": ['ID_Einst_Entl_Typ_11', 'Unknown_Parameter_689'], + "names": ['ID_Einst_Entl_Typ_11'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -6947,7 +6947,7 @@ { "index": 690, "count": 1, - "names": ['ID_Einst_Entl_Typ_12', 'Unknown_Parameter_690'], + "names": ['ID_Einst_Entl_Typ_12'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -6957,7 +6957,7 @@ { "index": 691, "count": 1, - "names": ['ID_Einst_Vorl_max_MK1', 'Unknown_Parameter_691'], + "names": ['ID_Einst_Vorl_max_MK1'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -6967,7 +6967,7 @@ { "index": 692, "count": 1, - "names": ['ID_Einst_Vorl_max_MK2', 'Unknown_Parameter_692'], + "names": ['ID_Einst_Vorl_max_MK2'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -6977,7 +6977,7 @@ { "index": 693, "count": 1, - "names": ['ID_SU_FrkdMK1', 'Unknown_Parameter_693'], + "names": ['ID_SU_FrkdMK1'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -6987,7 +6987,7 @@ { "index": 694, "count": 1, - "names": ['ID_SU_FrkdMK2', 'Unknown_Parameter_694'], + "names": ['ID_SU_FrkdMK2'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -6997,7 +6997,7 @@ { "index": 695, "count": 1, - "names": ['ID_Ba_Hz_MK1_akt', 'Unknown_Parameter_695'], + "names": ['ID_Ba_Hz_MK1_akt'], "type": MixedCircuitMode, "writeable": False, "datatype": 'UINT32', @@ -7007,7 +7007,7 @@ { "index": 696, "count": 1, - "names": ['ID_Ba_Hz_MK2_akt', 'Unknown_Parameter_696'], + "names": ['ID_Ba_Hz_MK2_akt'], "type": MixedCircuitMode, "writeable": False, "datatype": 'UINT32', @@ -7017,7 +7017,7 @@ { "index": 697, "count": 1, - "names": ['ID_Einst_Zirk_Ein_akt', 'Unknown_Parameter_697'], + "names": ['ID_Einst_Zirk_Ein_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -7027,7 +7027,7 @@ { "index": 698, "count": 1, - "names": ['ID_Einst_Zirk_Aus_akt', 'Unknown_Parameter_698'], + "names": ['ID_Einst_Zirk_Aus_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -7037,7 +7037,7 @@ { "index": 699, "count": 1, - "names": ['ID_Einst_Heizgrenze', 'Unknown_Parameter_699'], + "names": ['ID_Einst_Heizgrenze'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -7047,7 +7047,7 @@ { "index": 700, "count": 1, - "names": ['ID_Einst_Heizgrenze_Temp', 'Unknown_Parameter_700'], + "names": ['ID_Einst_Heizgrenze_Temp'], "type": Celsius, "writeable": False, "datatype": 'INT32', @@ -7057,7 +7057,7 @@ { "index": 701, "count": 1, - "names": ['ID_VariablenIBNgespeichert', 'Unknown_Parameter_701'], + "names": ['ID_VariablenIBNgespeichert'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -7067,7 +7067,7 @@ { "index": 702, "count": 1, - "names": ['ID_SchonIBNAssistant', 'Unknown_Parameter_702'], + "names": ['ID_SchonIBNAssistant'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -7077,7 +7077,7 @@ { "index": 703, "count": 1, - "names": ['ID_Heizgrenze_0', 'Unknown_Parameter_703'], + "names": ['ID_Heizgrenze_0'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -7087,7 +7087,7 @@ { "index": 704, "count": 1, - "names": ['ID_Heizgrenze_1', 'Unknown_Parameter_704'], + "names": ['ID_Heizgrenze_1'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -7097,7 +7097,7 @@ { "index": 705, "count": 1, - "names": ['ID_Heizgrenze_2', 'Unknown_Parameter_705'], + "names": ['ID_Heizgrenze_2'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -7107,7 +7107,7 @@ { "index": 706, "count": 1, - "names": ['ID_Heizgrenze_3', 'Unknown_Parameter_706'], + "names": ['ID_Heizgrenze_3'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -7117,7 +7117,7 @@ { "index": 707, "count": 1, - "names": ['ID_Heizgrenze_4', 'Unknown_Parameter_707'], + "names": ['ID_Heizgrenze_4'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -7127,7 +7127,7 @@ { "index": 708, "count": 1, - "names": ['ID_Heizgrenze_5', 'Unknown_Parameter_708'], + "names": ['ID_Heizgrenze_5'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -7137,7 +7137,7 @@ { "index": 709, "count": 1, - "names": ['ID_Heizgrenze_6', 'Unknown_Parameter_709'], + "names": ['ID_Heizgrenze_6'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -7147,7 +7147,7 @@ { "index": 710, "count": 1, - "names": ['ID_Heizgrenze_7', 'Unknown_Parameter_710'], + "names": ['ID_Heizgrenze_7'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -7157,7 +7157,7 @@ { "index": 711, "count": 1, - "names": ['ID_Heizgrenze_8', 'Unknown_Parameter_711'], + "names": ['ID_Heizgrenze_8'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -7167,7 +7167,7 @@ { "index": 712, "count": 1, - "names": ['ID_Heizgrenze_9', 'Unknown_Parameter_712'], + "names": ['ID_Heizgrenze_9'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -7177,7 +7177,7 @@ { "index": 713, "count": 1, - "names": ['ID_Heizgrenze_10', 'Unknown_Parameter_713'], + "names": ['ID_Heizgrenze_10'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -7187,7 +7187,7 @@ { "index": 714, "count": 1, - "names": ['ID_Heizgrenze_11', 'Unknown_Parameter_714'], + "names": ['ID_Heizgrenze_11'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -7197,7 +7197,7 @@ { "index": 715, "count": 1, - "names": ['ID_SchemenIBNgewahlt', 'Unknown_Parameter_715'], + "names": ['ID_SchemenIBNgewahlt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -7207,7 +7207,7 @@ { "index": 716, "count": 1, - "names": ['ID_Switchoff_file_0_0', 'Unknown_Parameter_716'], + "names": ['ID_Switchoff_file_0_0'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -7217,7 +7217,7 @@ { "index": 717, "count": 1, - "names": ['ID_Switchoff_file_1_0', 'Unknown_Parameter_717'], + "names": ['ID_Switchoff_file_1_0'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -7227,7 +7227,7 @@ { "index": 718, "count": 1, - "names": ['ID_Switchoff_file_2_0', 'Unknown_Parameter_718'], + "names": ['ID_Switchoff_file_2_0'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -7237,7 +7237,7 @@ { "index": 719, "count": 1, - "names": ['ID_Switchoff_file_3_0', 'Unknown_Parameter_719'], + "names": ['ID_Switchoff_file_3_0'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -7247,7 +7247,7 @@ { "index": 720, "count": 1, - "names": ['ID_Switchoff_file_4_0', 'Unknown_Parameter_720'], + "names": ['ID_Switchoff_file_4_0'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -7257,7 +7257,7 @@ { "index": 721, "count": 1, - "names": ['ID_Switchoff_file_0_1', 'Unknown_Parameter_721'], + "names": ['ID_Switchoff_file_0_1'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -7267,7 +7267,7 @@ { "index": 722, "count": 1, - "names": ['ID_Switchoff_file_1_1', 'Unknown_Parameter_722'], + "names": ['ID_Switchoff_file_1_1'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -7277,7 +7277,7 @@ { "index": 723, "count": 1, - "names": ['ID_Switchoff_file_2_1', 'Unknown_Parameter_723'], + "names": ['ID_Switchoff_file_2_1'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -7287,7 +7287,7 @@ { "index": 724, "count": 1, - "names": ['ID_Switchoff_file_3_1', 'Unknown_Parameter_724'], + "names": ['ID_Switchoff_file_3_1'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -7297,7 +7297,7 @@ { "index": 725, "count": 1, - "names": ['ID_Switchoff_file_4_1', 'Unknown_Parameter_725'], + "names": ['ID_Switchoff_file_4_1'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -7307,7 +7307,7 @@ { "index": 726, "count": 1, - "names": ['ID_DauerDatenLoggerAktiv', 'Unknown_Parameter_726'], + "names": ['ID_DauerDatenLoggerAktiv'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -7317,7 +7317,7 @@ { "index": 727, "count": 1, - "names": ['ID_Laufvar_Heizgrenze', 'Unknown_Parameter_727'], + "names": ['ID_Laufvar_Heizgrenze'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -7327,7 +7327,7 @@ { "index": 728, "count": 1, - "names": ['ID_Zaehler_BetrZeitHz', 'Unknown_Parameter_728'], + "names": ['ID_Zaehler_BetrZeitHz'], "type": Seconds, "writeable": False, "datatype": 'UINT32', @@ -7337,7 +7337,7 @@ { "index": 729, "count": 1, - "names": ['ID_Zaehler_BetrZeitBW', 'Unknown_Parameter_729'], + "names": ['ID_Zaehler_BetrZeitBW'], "type": Seconds, "writeable": False, "datatype": 'UINT32', @@ -7347,7 +7347,7 @@ { "index": 730, "count": 1, - "names": ['ID_Zaehler_BetrZeitKue', 'Unknown_Parameter_730'], + "names": ['ID_Zaehler_BetrZeitKue'], "type": Seconds, "writeable": False, "datatype": 'UINT32', @@ -7357,7 +7357,7 @@ { "index": 731, "count": 1, - "names": ['ID_SU_FstdHz', 'Unknown_Parameter_731'], + "names": ['ID_SU_FstdHz'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -7367,7 +7367,7 @@ { "index": 732, "count": 1, - "names": ['ID_SU_FstdBw', 'Unknown_Parameter_732'], + "names": ['ID_SU_FstdBw'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -7377,7 +7377,7 @@ { "index": 733, "count": 1, - "names": ['ID_SU_FstdSwb', 'Unknown_Parameter_733'], + "names": ['ID_SU_FstdSwb'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -7387,7 +7387,7 @@ { "index": 734, "count": 1, - "names": ['ID_SU_FstdMK1', 'Unknown_Parameter_734'], + "names": ['ID_SU_FstdMK1'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -7397,7 +7397,7 @@ { "index": 735, "count": 1, - "names": ['ID_SU_FstdMK2', 'Unknown_Parameter_735'], + "names": ['ID_SU_FstdMK2'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -7407,7 +7407,7 @@ { "index": 736, "count": 1, - "names": ['ID_FerienAbsenkungHz', 'Unknown_Parameter_736'], + "names": ['ID_FerienAbsenkungHz'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -7417,7 +7417,7 @@ { "index": 737, "count": 1, - "names": ['ID_FerienAbsenkungMK1', 'Unknown_Parameter_737'], + "names": ['ID_FerienAbsenkungMK1'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -7427,7 +7427,7 @@ { "index": 738, "count": 1, - "names": ['ID_FerienAbsenkungMK2', 'Unknown_Parameter_738'], + "names": ['ID_FerienAbsenkungMK2'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -7437,7 +7437,7 @@ { "index": 739, "count": 1, - "names": ['ID_FerienModusAktivHz', 'Unknown_Parameter_739'], + "names": ['ID_FerienModusAktivHz'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -7447,7 +7447,7 @@ { "index": 740, "count": 1, - "names": ['ID_FerienModusAktivBw', 'Unknown_Parameter_740'], + "names": ['ID_FerienModusAktivBw'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -7457,7 +7457,7 @@ { "index": 741, "count": 1, - "names": ['ID_FerienModusAktivSwb', 'Unknown_Parameter_741'], + "names": ['ID_FerienModusAktivSwb'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -7467,7 +7467,7 @@ { "index": 742, "count": 1, - "names": ['ID_FerienModusAktivMk1', 'Unknown_Parameter_742'], + "names": ['ID_FerienModusAktivMk1'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -7477,7 +7477,7 @@ { "index": 743, "count": 1, - "names": ['ID_FerienModusAktivMk2', 'Unknown_Parameter_743'], + "names": ['ID_FerienModusAktivMk2'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -7487,7 +7487,7 @@ { "index": 744, "count": 1, - "names": ['ID_DisplayContrast_akt', 'Unknown_Parameter_744'], + "names": ['ID_DisplayContrast_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -7497,7 +7497,7 @@ { "index": 745, "count": 1, - "names": ['ID_Ba_Hz_saved', 'Unknown_Parameter_745'], + "names": ['ID_Ba_Hz_saved'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -7507,7 +7507,7 @@ { "index": 746, "count": 1, - "names": ['ID_Ba_Bw_saved', 'Unknown_Parameter_746'], + "names": ['ID_Ba_Bw_saved'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -7517,7 +7517,7 @@ { "index": 747, "count": 1, - "names": ['ID_Ba_Sw_saved', 'Unknown_Parameter_747'], + "names": ['ID_Ba_Sw_saved'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -7527,7 +7527,7 @@ { "index": 748, "count": 1, - "names": ['ID_Ba_Hz_MK1_saved', 'Unknown_Parameter_748'], + "names": ['ID_Ba_Hz_MK1_saved'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -7537,7 +7537,7 @@ { "index": 749, "count": 1, - "names": ['ID_Ba_Hz_MK2_saved', 'Unknown_Parameter_749'], + "names": ['ID_Ba_Hz_MK2_saved'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -7547,7 +7547,7 @@ { "index": 750, "count": 1, - "names": ['ID_AdresseIP_akt', 'Unknown_Parameter_750'], + "names": ['ID_AdresseIP_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -7557,7 +7557,7 @@ { "index": 751, "count": 1, - "names": ['ID_SubNetMask_akt', 'Unknown_Parameter_751'], + "names": ['ID_SubNetMask_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -7567,7 +7567,7 @@ { "index": 752, "count": 1, - "names": ['ID_Add_Broadcast_akt', 'Unknown_Parameter_752'], + "names": ['ID_Add_Broadcast_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -7577,7 +7577,7 @@ { "index": 753, "count": 1, - "names": ['ID_Add_StdGateway_akt', 'Unknown_Parameter_753'], + "names": ['ID_Add_StdGateway_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -7587,7 +7587,7 @@ { "index": 754, "count": 1, - "names": ['ID_DHCPServerAktiv_akt', 'Unknown_Parameter_754'], + "names": ['ID_DHCPServerAktiv_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -7597,7 +7597,7 @@ { "index": 755, "count": 1, - "names": ['ID_WebserverPasswort_1_akt', 'Unknown_Parameter_755'], + "names": ['ID_WebserverPasswort_1_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -7607,7 +7607,7 @@ { "index": 756, "count": 1, - "names": ['ID_WebserverPasswort_2_akt', 'Unknown_Parameter_756'], + "names": ['ID_WebserverPasswort_2_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -7617,7 +7617,7 @@ { "index": 757, "count": 1, - "names": ['ID_WebserverPasswort_3_akt', 'Unknown_Parameter_757'], + "names": ['ID_WebserverPasswort_3_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -7627,7 +7627,7 @@ { "index": 758, "count": 1, - "names": ['ID_WebserverPasswort_4_akt', 'Unknown_Parameter_758'], + "names": ['ID_WebserverPasswort_4_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -7637,7 +7637,7 @@ { "index": 759, "count": 1, - "names": ['ID_WebserverPasswort_5_akt', 'Unknown_Parameter_759'], + "names": ['ID_WebserverPasswort_5_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -7647,7 +7647,7 @@ { "index": 760, "count": 1, - "names": ['ID_WebserverPasswort_6_akt', 'Unknown_Parameter_760'], + "names": ['ID_WebserverPasswort_6_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -7657,7 +7657,7 @@ { "index": 761, "count": 1, - "names": ['ID_WebServerWerteBekommen', 'Unknown_Parameter_761'], + "names": ['ID_WebServerWerteBekommen'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -7667,7 +7667,7 @@ { "index": 762, "count": 1, - "names": ['ID_Einst_ParBetr_akt', 'Unknown_Parameter_762'], + "names": ['ID_Einst_ParBetr_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -7677,7 +7677,7 @@ { "index": 763, "count": 1, - "names": ['ID_Einst_WpAnz_akt', 'Unknown_Parameter_763'], + "names": ['ID_Einst_WpAnz_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -7687,7 +7687,7 @@ { "index": 764, "count": 1, - "names": ['ID_Einst_PhrTime_akt', 'Unknown_Parameter_764'], + "names": ['ID_Einst_PhrTime_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -7697,7 +7697,7 @@ { "index": 765, "count": 1, - "names": ['ID_Einst_HysPar_akt', 'Unknown_Parameter_765'], + "names": ['ID_Einst_HysPar_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -7707,7 +7707,7 @@ { "index": 766, "count": 1, - "names": ['ID_IP_PB_Slave_0', 'Unknown_Parameter_766'], + "names": ['ID_IP_PB_Slave_0'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -7717,7 +7717,7 @@ { "index": 767, "count": 1, - "names": ['ID_IP_PB_Slave_1', 'Unknown_Parameter_767'], + "names": ['ID_IP_PB_Slave_1'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -7727,7 +7727,7 @@ { "index": 768, "count": 1, - "names": ['ID_IP_PB_Slave_2', 'Unknown_Parameter_768'], + "names": ['ID_IP_PB_Slave_2'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -7737,7 +7737,7 @@ { "index": 769, "count": 1, - "names": ['ID_IP_PB_Slave_3', 'Unknown_Parameter_769'], + "names": ['ID_IP_PB_Slave_3'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -7747,7 +7747,7 @@ { "index": 770, "count": 1, - "names": ['ID_IP_PB_Slave_4', 'Unknown_Parameter_770'], + "names": ['ID_IP_PB_Slave_4'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -7757,7 +7757,7 @@ { "index": 771, "count": 1, - "names": ['ID_IP_PB_Slave_5', 'Unknown_Parameter_771'], + "names": ['ID_IP_PB_Slave_5'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -7767,7 +7767,7 @@ { "index": 772, "count": 1, - "names": ['ID_Einst_BwHup_akt_backup', 'Unknown_Parameter_772'], + "names": ['ID_Einst_BwHup_akt_backup'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -7777,7 +7777,7 @@ { "index": 773, "count": 1, - "names": ['ID_Einst_SuMk3_akt', 'Unknown_Parameter_773'], + "names": ['ID_Einst_SuMk3_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -7787,7 +7787,7 @@ { "index": 774, "count": 1, - "names": ['ID_Einst_HzMK3E_akt', 'Unknown_Parameter_774'], + "names": ['ID_Einst_HzMK3E_akt'], "type": Celsius, "writeable": True, "datatype": 'INT32', @@ -7797,7 +7797,7 @@ { "index": 775, "count": 1, - "names": ['ID_Einst_HzMK3ANH_akt', 'Unknown_Parameter_775'], + "names": ['ID_Einst_HzMK3ANH_akt'], "type": Celsius, "writeable": True, "datatype": 'INT32', @@ -7807,7 +7807,7 @@ { "index": 776, "count": 1, - "names": ['ID_Einst_HzMK3ABS_akt', 'Unknown_Parameter_776'], + "names": ['ID_Einst_HzMK3ABS_akt'], "type": Celsius, "writeable": True, "datatype": 'INT32', @@ -7817,7 +7817,7 @@ { "index": 777, "count": 1, - "names": ['ID_Einst_HzMK3Hgr_akt', 'Unknown_Parameter_777'], + "names": ['ID_Einst_HzMK3Hgr_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -7827,7 +7827,7 @@ { "index": 778, "count": 1, - "names": ['ID_Einst_HzFtMK3Vl_akt', 'Unknown_Parameter_778'], + "names": ['ID_Einst_HzFtMK3Vl_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -7837,7 +7837,7 @@ { "index": 779, "count": 1, - "names": ['ID_Ba_Hz_MK3_akt', 'Unknown_Parameter_779'], + "names": ['ID_Ba_Hz_MK3_akt'], "type": MixedCircuitMode, "writeable": True, "datatype": 'UINT32', @@ -7847,7 +7847,7 @@ { "index": 780, "count": 1, - "names": ['ID_Einst_MK3Typ_akt', 'Unknown_Parameter_780'], + "names": ['ID_Einst_MK3Typ_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -7857,7 +7857,7 @@ { "index": 781, "count": 1, - "names": ['ID_Einst_RTypMK3_akt', 'Unknown_Parameter_781'], + "names": ['ID_Einst_RTypMK3_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -7867,7 +7867,7 @@ { "index": 782, "count": 1, - "names": ['ID_Einst_MK3LzFaktor_akt', 'Unknown_Parameter_782'], + "names": ['ID_Einst_MK3LzFaktor_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -7877,7 +7877,7 @@ { "index": 783, "count": 1, - "names": ['ID_Einst_MK3PerFaktor_akt', 'Unknown_Parameter_783'], + "names": ['ID_Einst_MK3PerFaktor_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -7887,7 +7887,7 @@ { "index": 784, "count": 1, - "names": ['ID_FerienModusAktivMk3', 'Unknown_Parameter_784'], + "names": ['ID_FerienModusAktivMk3'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -7897,7 +7897,7 @@ { "index": 785, "count": 1, - "names": ['ID_SU_FrkdMK3', 'Unknown_Parameter_785'], + "names": ['ID_SU_FrkdMK3'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -7907,7 +7907,7 @@ { "index": 786, "count": 1, - "names": ['ID_FerienAbsenkungMK3', 'Unknown_Parameter_786'], + "names": ['ID_FerienAbsenkungMK3'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -7917,7 +7917,7 @@ { "index": 787, "count": 1, - "names": ['ID_SU_FstdMK3', 'Unknown_Parameter_787'], + "names": ['ID_SU_FstdMK3'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -7927,7 +7927,7 @@ { "index": 788, "count": 1, - "names": ['ID_Einst_SuMk3_akt2', 'Unknown_Parameter_788'], + "names": ['ID_Einst_SuMk3_akt2'], "type": TimerProgram, "writeable": False, "datatype": 'UINT32', @@ -7937,7 +7937,7 @@ { "index": 789, "count": 1, - "names": ['ID_Einst_SuMk3Wo_zeit_0_0', 'Unknown_Parameter_789'], + "names": ['ID_Einst_SuMk3Wo_zeit_0_0'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -7947,7 +7947,7 @@ { "index": 790, "count": 1, - "names": ['ID_Einst_SuMk3Wo_zeit_0_1', 'Unknown_Parameter_790'], + "names": ['ID_Einst_SuMk3Wo_zeit_0_1'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -7957,7 +7957,7 @@ { "index": 791, "count": 1, - "names": ['ID_Einst_SuMk3Wo_zeit_1_0', 'Unknown_Parameter_791'], + "names": ['ID_Einst_SuMk3Wo_zeit_1_0'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -7967,7 +7967,7 @@ { "index": 792, "count": 1, - "names": ['ID_Einst_SuMk3Wo_zeit_1_1', 'Unknown_Parameter_792'], + "names": ['ID_Einst_SuMk3Wo_zeit_1_1'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -7977,7 +7977,7 @@ { "index": 793, "count": 1, - "names": ['ID_Einst_SuMk3Wo_zeit_2_0', 'Unknown_Parameter_793'], + "names": ['ID_Einst_SuMk3Wo_zeit_2_0'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -7987,7 +7987,7 @@ { "index": 794, "count": 1, - "names": ['ID_Einst_SuMk3Wo_zeit_2_1', 'Unknown_Parameter_794'], + "names": ['ID_Einst_SuMk3Wo_zeit_2_1'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -7997,7 +7997,7 @@ { "index": 795, "count": 1, - "names": ['ID_Einst_SuMk325_zeit_0_0', 'Unknown_Parameter_795'], + "names": ['ID_Einst_SuMk325_zeit_0_0'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -8007,7 +8007,7 @@ { "index": 796, "count": 1, - "names": ['ID_Einst_SuMk325_zeit_0_1', 'Unknown_Parameter_796'], + "names": ['ID_Einst_SuMk325_zeit_0_1'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -8017,7 +8017,7 @@ { "index": 797, "count": 1, - "names": ['ID_Einst_SuMk325_zeit_1_0', 'Unknown_Parameter_797'], + "names": ['ID_Einst_SuMk325_zeit_1_0'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -8027,7 +8027,7 @@ { "index": 798, "count": 1, - "names": ['ID_Einst_SuMk325_zeit_1_1', 'Unknown_Parameter_798'], + "names": ['ID_Einst_SuMk325_zeit_1_1'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -8037,7 +8037,7 @@ { "index": 799, "count": 1, - "names": ['ID_Einst_SuMk325_zeit_2_0', 'Unknown_Parameter_799'], + "names": ['ID_Einst_SuMk325_zeit_2_0'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -8047,7 +8047,7 @@ { "index": 800, "count": 1, - "names": ['ID_Einst_SuMk325_zeit_2_1', 'Unknown_Parameter_800'], + "names": ['ID_Einst_SuMk325_zeit_2_1'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -8057,7 +8057,7 @@ { "index": 801, "count": 1, - "names": ['ID_Einst_SuMk325_zeit_0_2', 'Unknown_Parameter_801'], + "names": ['ID_Einst_SuMk325_zeit_0_2'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -8067,7 +8067,7 @@ { "index": 802, "count": 1, - "names": ['ID_Einst_SuMk325_zeit_0_3', 'Unknown_Parameter_802'], + "names": ['ID_Einst_SuMk325_zeit_0_3'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -8077,7 +8077,7 @@ { "index": 803, "count": 1, - "names": ['ID_Einst_SuMk325_zeit_1_2', 'Unknown_Parameter_803'], + "names": ['ID_Einst_SuMk325_zeit_1_2'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -8087,7 +8087,7 @@ { "index": 804, "count": 1, - "names": ['ID_Einst_SuMk325_zeit_1_3', 'Unknown_Parameter_804'], + "names": ['ID_Einst_SuMk325_zeit_1_3'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -8097,7 +8097,7 @@ { "index": 805, "count": 1, - "names": ['ID_Einst_SuMk325_zeit_2_2', 'Unknown_Parameter_805'], + "names": ['ID_Einst_SuMk325_zeit_2_2'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -8107,7 +8107,7 @@ { "index": 806, "count": 1, - "names": ['ID_Einst_SuMk325_zeit_2_3', 'Unknown_Parameter_806'], + "names": ['ID_Einst_SuMk325_zeit_2_3'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -8117,7 +8117,7 @@ { "index": 807, "count": 1, - "names": ['ID_Einst_SuMk3Tg_zeit_0_0', 'Unknown_Parameter_807'], + "names": ['ID_Einst_SuMk3Tg_zeit_0_0'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -8127,7 +8127,7 @@ { "index": 808, "count": 1, - "names": ['ID_Einst_SuMk3Tg_zeit_0_1', 'Unknown_Parameter_808'], + "names": ['ID_Einst_SuMk3Tg_zeit_0_1'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -8137,7 +8137,7 @@ { "index": 809, "count": 1, - "names": ['ID_Einst_SuMk3Tg_zeit_1_0', 'Unknown_Parameter_809'], + "names": ['ID_Einst_SuMk3Tg_zeit_1_0'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -8147,7 +8147,7 @@ { "index": 810, "count": 1, - "names": ['ID_Einst_SuMk3Tg_zeit_1_1', 'Unknown_Parameter_810'], + "names": ['ID_Einst_SuMk3Tg_zeit_1_1'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -8157,7 +8157,7 @@ { "index": 811, "count": 1, - "names": ['ID_Einst_SuMk3Tg_zeit_2_0', 'Unknown_Parameter_811'], + "names": ['ID_Einst_SuMk3Tg_zeit_2_0'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -8167,7 +8167,7 @@ { "index": 812, "count": 1, - "names": ['ID_Einst_SuMk3Tg_zeit_2_1', 'Unknown_Parameter_812'], + "names": ['ID_Einst_SuMk3Tg_zeit_2_1'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -8177,7 +8177,7 @@ { "index": 813, "count": 1, - "names": ['ID_Einst_SuMk3Tg_zeit_0_2', 'Unknown_Parameter_813'], + "names": ['ID_Einst_SuMk3Tg_zeit_0_2'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -8187,7 +8187,7 @@ { "index": 814, "count": 1, - "names": ['ID_Einst_SuMk3Tg_zeit_0_3', 'Unknown_Parameter_814'], + "names": ['ID_Einst_SuMk3Tg_zeit_0_3'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -8197,7 +8197,7 @@ { "index": 815, "count": 1, - "names": ['ID_Einst_SuMk3Tg_zeit_1_2', 'Unknown_Parameter_815'], + "names": ['ID_Einst_SuMk3Tg_zeit_1_2'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -8207,7 +8207,7 @@ { "index": 816, "count": 1, - "names": ['ID_Einst_SuMk3Tg_zeit_1_3', 'Unknown_Parameter_816'], + "names": ['ID_Einst_SuMk3Tg_zeit_1_3'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -8217,7 +8217,7 @@ { "index": 817, "count": 1, - "names": ['ID_Einst_SuMk3Tg_zeit_2_2', 'Unknown_Parameter_817'], + "names": ['ID_Einst_SuMk3Tg_zeit_2_2'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -8227,7 +8227,7 @@ { "index": 818, "count": 1, - "names": ['ID_Einst_SuMk3Tg_zeit_2_3', 'Unknown_Parameter_818'], + "names": ['ID_Einst_SuMk3Tg_zeit_2_3'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -8237,7 +8237,7 @@ { "index": 819, "count": 1, - "names": ['ID_Einst_SuMk3Tg_zeit_0_4', 'Unknown_Parameter_819'], + "names": ['ID_Einst_SuMk3Tg_zeit_0_4'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -8247,7 +8247,7 @@ { "index": 820, "count": 1, - "names": ['ID_Einst_SuMk3Tg_zeit_0_5', 'Unknown_Parameter_820'], + "names": ['ID_Einst_SuMk3Tg_zeit_0_5'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -8257,7 +8257,7 @@ { "index": 821, "count": 1, - "names": ['ID_Einst_SuMk3Tg_zeit_1_4', 'Unknown_Parameter_821'], + "names": ['ID_Einst_SuMk3Tg_zeit_1_4'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -8267,7 +8267,7 @@ { "index": 822, "count": 1, - "names": ['ID_Einst_SuMk3Tg_zeit_1_5', 'Unknown_Parameter_822'], + "names": ['ID_Einst_SuMk3Tg_zeit_1_5'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -8277,7 +8277,7 @@ { "index": 823, "count": 1, - "names": ['ID_Einst_SuMk3Tg_zeit_2_4', 'Unknown_Parameter_823'], + "names": ['ID_Einst_SuMk3Tg_zeit_2_4'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -8287,7 +8287,7 @@ { "index": 824, "count": 1, - "names": ['ID_Einst_SuMk3Tg_zeit_2_5', 'Unknown_Parameter_824'], + "names": ['ID_Einst_SuMk3Tg_zeit_2_5'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -8297,7 +8297,7 @@ { "index": 825, "count": 1, - "names": ['ID_Einst_SuMk3Tg_zeit_0_6', 'Unknown_Parameter_825'], + "names": ['ID_Einst_SuMk3Tg_zeit_0_6'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -8307,7 +8307,7 @@ { "index": 826, "count": 1, - "names": ['ID_Einst_SuMk3Tg_zeit_0_7', 'Unknown_Parameter_826'], + "names": ['ID_Einst_SuMk3Tg_zeit_0_7'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -8317,7 +8317,7 @@ { "index": 827, "count": 1, - "names": ['ID_Einst_SuMk3Tg_zeit_1_6', 'Unknown_Parameter_827'], + "names": ['ID_Einst_SuMk3Tg_zeit_1_6'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -8327,7 +8327,7 @@ { "index": 828, "count": 1, - "names": ['ID_Einst_SuMk3Tg_zeit_1_7', 'Unknown_Parameter_828'], + "names": ['ID_Einst_SuMk3Tg_zeit_1_7'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -8337,7 +8337,7 @@ { "index": 829, "count": 1, - "names": ['ID_Einst_SuMk3Tg_zeit_2_6', 'Unknown_Parameter_829'], + "names": ['ID_Einst_SuMk3Tg_zeit_2_6'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -8347,7 +8347,7 @@ { "index": 830, "count": 1, - "names": ['ID_Einst_SuMk3Tg_zeit_2_7', 'Unknown_Parameter_830'], + "names": ['ID_Einst_SuMk3Tg_zeit_2_7'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -8357,7 +8357,7 @@ { "index": 831, "count": 1, - "names": ['ID_Einst_SuMk3Tg_zeit_0_8', 'Unknown_Parameter_831'], + "names": ['ID_Einst_SuMk3Tg_zeit_0_8'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -8367,7 +8367,7 @@ { "index": 832, "count": 1, - "names": ['ID_Einst_SuMk3Tg_zeit_0_9', 'Unknown_Parameter_832'], + "names": ['ID_Einst_SuMk3Tg_zeit_0_9'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -8377,7 +8377,7 @@ { "index": 833, "count": 1, - "names": ['ID_Einst_SuMk3Tg_zeit_1_8', 'Unknown_Parameter_833'], + "names": ['ID_Einst_SuMk3Tg_zeit_1_8'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -8387,7 +8387,7 @@ { "index": 834, "count": 1, - "names": ['ID_Einst_SuMk3Tg_zeit_1_9', 'Unknown_Parameter_834'], + "names": ['ID_Einst_SuMk3Tg_zeit_1_9'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -8397,7 +8397,7 @@ { "index": 835, "count": 1, - "names": ['ID_Einst_SuMk3Tg_zeit_2_8', 'Unknown_Parameter_835'], + "names": ['ID_Einst_SuMk3Tg_zeit_2_8'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -8407,7 +8407,7 @@ { "index": 836, "count": 1, - "names": ['ID_Einst_SuMk3Tg_zeit_2_9', 'Unknown_Parameter_836'], + "names": ['ID_Einst_SuMk3Tg_zeit_2_9'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -8417,7 +8417,7 @@ { "index": 837, "count": 1, - "names": ['ID_Einst_SuMk3Tg_zeit_0_10', 'Unknown_Parameter_837'], + "names": ['ID_Einst_SuMk3Tg_zeit_0_10'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -8427,7 +8427,7 @@ { "index": 838, "count": 1, - "names": ['ID_Einst_SuMk3Tg_zeit_0_11', 'Unknown_Parameter_838'], + "names": ['ID_Einst_SuMk3Tg_zeit_0_11'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -8437,7 +8437,7 @@ { "index": 839, "count": 1, - "names": ['ID_Einst_SuMk3Tg_zeit_1_10', 'Unknown_Parameter_839'], + "names": ['ID_Einst_SuMk3Tg_zeit_1_10'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -8447,7 +8447,7 @@ { "index": 840, "count": 1, - "names": ['ID_Einst_SuMk3Tg_zeit_1_11', 'Unknown_Parameter_840'], + "names": ['ID_Einst_SuMk3Tg_zeit_1_11'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -8457,7 +8457,7 @@ { "index": 841, "count": 1, - "names": ['ID_Einst_SuMk3Tg_zeit_2_10', 'Unknown_Parameter_841'], + "names": ['ID_Einst_SuMk3Tg_zeit_2_10'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -8467,7 +8467,7 @@ { "index": 842, "count": 1, - "names": ['ID_Einst_SuMk3Tg_zeit_2_11', 'Unknown_Parameter_842'], + "names": ['ID_Einst_SuMk3Tg_zeit_2_11'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -8477,7 +8477,7 @@ { "index": 843, "count": 1, - "names": ['ID_Einst_SuMk3Tg_zeit_0_12', 'Unknown_Parameter_843'], + "names": ['ID_Einst_SuMk3Tg_zeit_0_12'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -8487,7 +8487,7 @@ { "index": 844, "count": 1, - "names": ['ID_Einst_SuMk3Tg_zeit_0_13', 'Unknown_Parameter_844'], + "names": ['ID_Einst_SuMk3Tg_zeit_0_13'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -8497,7 +8497,7 @@ { "index": 845, "count": 1, - "names": ['ID_Einst_SuMk3Tg_zeit_1_12', 'Unknown_Parameter_845'], + "names": ['ID_Einst_SuMk3Tg_zeit_1_12'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -8507,7 +8507,7 @@ { "index": 846, "count": 1, - "names": ['ID_Einst_SuMk3Tg_zeit_1_13', 'Unknown_Parameter_846'], + "names": ['ID_Einst_SuMk3Tg_zeit_1_13'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -8517,7 +8517,7 @@ { "index": 847, "count": 1, - "names": ['ID_Einst_SuMk3Tg_zeit_2_12', 'Unknown_Parameter_847'], + "names": ['ID_Einst_SuMk3Tg_zeit_2_12'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -8527,7 +8527,7 @@ { "index": 848, "count": 1, - "names": ['ID_Einst_SuMk3Tg_zeit_2_13', 'Unknown_Parameter_848'], + "names": ['ID_Einst_SuMk3Tg_zeit_2_13'], "type": TimeOfDay, "writeable": False, "datatype": 'UINT32', @@ -8537,7 +8537,7 @@ { "index": 849, "count": 1, - "names": ['ID_Ba_Hz_MK3_saved', 'Unknown_Parameter_849'], + "names": ['ID_Ba_Hz_MK3_saved'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -8547,7 +8547,7 @@ { "index": 850, "count": 1, - "names": ['ID_Einst_Kuhl_Zeit_Ein_akt', 'Unknown_Parameter_850'], + "names": ['ID_Einst_Kuhl_Zeit_Ein_akt'], "type": Hours, "writeable": True, "datatype": 'UINT32', @@ -8557,7 +8557,7 @@ { "index": 851, "count": 1, - "names": ['ID_Einst_Kuhl_Zeit_Aus_akt', 'Unknown_Parameter_851'], + "names": ['ID_Einst_Kuhl_Zeit_Aus_akt'], "type": Hours, "writeable": True, "datatype": 'UINT32', @@ -8567,7 +8567,7 @@ { "index": 852, "count": 1, - "names": ['ID_Waermemenge_Seit', 'Unknown_Parameter_852'], + "names": ['ID_Waermemenge_Seit'], "type": Energy, "writeable": False, "datatype": 'UINT32', @@ -8577,7 +8577,7 @@ { "index": 853, "count": 1, - "names": ['ID_Waermemenge_WQ', 'Unknown_Parameter_853'], + "names": ['ID_Waermemenge_WQ'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -8587,7 +8587,7 @@ { "index": 854, "count": 1, - "names": ['ID_Waermemenge_Hz', 'Unknown_Parameter_854'], + "names": ['ID_Waermemenge_Hz'], "type": Energy, "writeable": False, "datatype": 'UINT32', @@ -8597,7 +8597,7 @@ { "index": 855, "count": 1, - "names": ['ID_Waermemenge_WQ_ges', 'Unknown_Parameter_855'], + "names": ['ID_Waermemenge_WQ_ges'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -8607,7 +8607,7 @@ { "index": 856, "count": 1, - "names": ['ID_Einst_Entl_Typ_13', 'Unknown_Parameter_856'], + "names": ['ID_Einst_Entl_Typ_13'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -8617,7 +8617,7 @@ { "index": 857, "count": 1, - "names": ['ID_Einst_Entl_Typ_14', 'Unknown_Parameter_857'], + "names": ['ID_Einst_Entl_Typ_14'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -8627,7 +8627,7 @@ { "index": 858, "count": 1, - "names": ['ID_Einst_Entl_Typ_15', 'Unknown_Parameter_858'], + "names": ['ID_Einst_Entl_Typ_15'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -8637,7 +8637,7 @@ { "index": 859, "count": 1, - "names": ['ID_Zaehler_BetrZeitSW', 'Unknown_Parameter_859'], + "names": ['ID_Zaehler_BetrZeitSW'], "type": Seconds, "writeable": False, "datatype": 'UINT32', @@ -8647,7 +8647,7 @@ { "index": 860, "count": 1, - "names": ['ID_Einst_Fernwartung_akt', 'Unknown_Parameter_860'], + "names": ['ID_Einst_Fernwartung_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -8657,7 +8657,7 @@ { "index": 861, "count": 1, - "names": ['ID_AdresseIPServ_akt', 'Unknown_Parameter_861'], + "names": ['ID_AdresseIPServ_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -8667,7 +8667,7 @@ { "index": 862, "count": 1, - "names": ['ID_Einst_TA_EG_akt', 'Unknown_Parameter_862'], + "names": ['ID_Einst_TA_EG_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -8677,7 +8677,7 @@ { "index": 863, "count": 1, - "names": ['ID_Einst_TVLmax_EG_akt', 'Unknown_Parameter_863'], + "names": ['ID_Einst_TVLmax_EG_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -8687,7 +8687,7 @@ { "index": 864, "count": 1, - "names": ['ID_Einst_Popt_Nachlauf_akt', 'Unknown_Parameter_864'], + "names": ['ID_Einst_Popt_Nachlauf_akt'], "type": Minutes, "writeable": True, "datatype": 'UINT32', @@ -8697,7 +8697,7 @@ { "index": 865, "count": 1, - "names": ['ID_FernwartungVertrag_akt', 'Unknown_Parameter_865'], + "names": ['ID_FernwartungVertrag_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -8707,7 +8707,7 @@ { "index": 866, "count": 1, - "names": ['ID_FernwartungAktuZeit', 'Unknown_Parameter_866'], + "names": ['ID_FernwartungAktuZeit'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -8717,7 +8717,7 @@ { "index": 867, "count": 1, - "names": ['ID_Einst_Effizienzpumpe_Nominal_akt', 'Unknown_Parameter_867'], + "names": ['ID_Einst_Effizienzpumpe_Nominal_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -8727,7 +8727,7 @@ { "index": 868, "count": 1, - "names": ['ID_Einst_Effizienzpumpe_Minimal_akt', 'Unknown_Parameter_868'], + "names": ['ID_Einst_Effizienzpumpe_Minimal_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -8737,7 +8737,7 @@ { "index": 869, "count": 1, - "names": ['ID_Einst_Effizienzpumpe_akt', 'Unknown_Parameter_869'], + "names": ['ID_Einst_Effizienzpumpe_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -8747,7 +8747,7 @@ { "index": 870, "count": 1, - "names": ['ID_Einst_Waermemenge_akt', 'Unknown_Parameter_870'], + "names": ['ID_Einst_Waermemenge_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -8757,7 +8757,7 @@ { "index": 871, "count": 1, - "names": ['ID_Einst_Wm_Versorgung_Korrektur_akt', 'Unknown_Parameter_871'], + "names": ['ID_Einst_Wm_Versorgung_Korrektur_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -8767,7 +8767,7 @@ { "index": 872, "count": 1, - "names": ['ID_Einst_Wm_Auswertung_Korrektur_akt', 'Unknown_Parameter_872'], + "names": ['ID_Einst_Wm_Auswertung_Korrektur_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -8777,7 +8777,7 @@ { "index": 873, "count": 1, - "names": ['ID_SoftwareUpdateJetztGemacht_akt', 'Unknown_Parameter_873'], + "names": ['ID_SoftwareUpdateJetztGemacht_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -8787,7 +8787,7 @@ { "index": 874, "count": 1, - "names": ['ID_WP_SerienNummer_DATUM', 'Unknown_Parameter_874'], + "names": ['ID_WP_SerienNummer_DATUM'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -8797,7 +8797,7 @@ { "index": 875, "count": 1, - "names": ['ID_WP_SerienNummer_HEX', 'Unknown_Parameter_875'], + "names": ['ID_WP_SerienNummer_HEX'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -8807,7 +8807,7 @@ { "index": 876, "count": 1, - "names": ['ID_WP_SerienNummer_INDEX', 'Unknown_Parameter_876'], + "names": ['ID_WP_SerienNummer_INDEX'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -8817,7 +8817,7 @@ { "index": 877, "count": 1, - "names": ['ID_ProgWerteWebSrvBeobarten', 'Unknown_Parameter_877'], + "names": ['ID_ProgWerteWebSrvBeobarten'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -8827,7 +8827,7 @@ { "index": 878, "count": 1, - "names": ['ID_Waermemenge_BW', 'Unknown_Parameter_878'], + "names": ['ID_Waermemenge_BW'], "type": Energy, "writeable": False, "datatype": 'UINT32', @@ -8837,7 +8837,7 @@ { "index": 879, "count": 1, - "names": ['ID_Waermemenge_SW', 'Unknown_Parameter_879'], + "names": ['ID_Waermemenge_SW'], "type": Energy, "writeable": False, "datatype": 'UINT32', @@ -8847,7 +8847,7 @@ { "index": 880, "count": 1, - "names": ['ID_Waermemenge_Datum', 'Unknown_Parameter_880'], + "names": ['ID_Waermemenge_Datum'], "type": Timestamp, "writeable": False, "datatype": 'UINT32', @@ -8857,7 +8857,7 @@ { "index": 881, "count": 1, - "names": ['ID_Einst_Solar_akt', 'Unknown_Parameter_881'], + "names": ['ID_Einst_Solar_akt'], "type": SolarMode, "writeable": True, "datatype": 'UINT32', @@ -8867,7 +8867,7 @@ { "index": 882, "count": 1, - "names": ['ID_BSTD_Solar', 'Unknown_Parameter_882'], + "names": ['ID_BSTD_Solar'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -8877,7 +8877,7 @@ { "index": 883, "count": 1, - "names": ['ID_Einst_TDC_Koll_Max_akt', 'Unknown_Parameter_883'], + "names": ['ID_Einst_TDC_Koll_Max_akt'], "type": Celsius, "writeable": False, "datatype": 'INT32', @@ -8887,7 +8887,7 @@ { "index": 884, "count": 1, - "names": ['ID_Einst_Akt_Kuehlung_akt', 'Unknown_Parameter_884'], + "names": ['ID_Einst_Akt_Kuehlung_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -8897,7 +8897,7 @@ { "index": 885, "count": 1, - "names": ['ID_Einst_Vorlauf_VBO_akt', 'Unknown_Parameter_885'], + "names": ['ID_Einst_Vorlauf_VBO_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -8907,7 +8907,7 @@ { "index": 886, "count": 1, - "names": ['ID_Einst_KRHyst_akt', 'Unknown_Parameter_886'], + "names": ['ID_Einst_KRHyst_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -8917,7 +8917,7 @@ { "index": 887, "count": 1, - "names": ['ID_Einst_Akt_Kuehl_Speicher_min_akt', 'Unknown_Parameter_887'], + "names": ['ID_Einst_Akt_Kuehl_Speicher_min_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -8927,7 +8927,7 @@ { "index": 888, "count": 1, - "names": ['ID_Einst_Akt_Kuehl_Freig_WQE_akt', 'Unknown_Parameter_888'], + "names": ['ID_Einst_Akt_Kuehl_Freig_WQE_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -8937,7 +8937,7 @@ { "index": 889, "count": 1, - "names": ['ID_NDAB_WW_Anzahl', 'Unknown_Parameter_889'], + "names": ['ID_NDAB_WW_Anzahl'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -8947,7 +8947,7 @@ { "index": 890, "count": 1, - "names": ['ID_NDS_WW_KD_Quitt', 'Unknown_Parameter_890'], + "names": ['ID_NDS_WW_KD_Quitt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -8957,7 +8957,7 @@ { "index": 891, "count": 1, - "names": ['ID_Einst_AbtZykMin_akt', 'Unknown_Parameter_891'], + "names": ['ID_Einst_AbtZykMin_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -8967,7 +8967,7 @@ { "index": 892, "count": 1, - "names": ['ID_Einst_VD2_Zeit_Min_akt', 'Unknown_Parameter_892'], + "names": ['ID_Einst_VD2_Zeit_Min_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -8977,7 +8977,7 @@ { "index": 893, "count": 1, - "names": ['ID_Einst_Hysterese_HR_verkuerzt_akt', 'Unknown_Parameter_893'], + "names": ['ID_Einst_Hysterese_HR_verkuerzt_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -8987,7 +8987,7 @@ { "index": 894, "count": 1, - "names": ['ID_Einst_BA_Lueftung_akt', 'Unknown_Parameter_894'], + "names": ['ID_Einst_BA_Lueftung_akt'], "type": VentilationMode, "writeable": True, "datatype": 'UINT32', @@ -8997,7 +8997,7 @@ { "index": 895, "count": 1, - "names": ['ID_Einst_SuLuf_akt', 'Unknown_Parameter_895'], + "names": ['ID_Einst_SuLuf_akt'], "type": TimerProgram, "writeable": False, "datatype": 'UINT32', @@ -9007,7 +9007,7 @@ { "index": 896, "count": 1, - "names": ['ID_Einst_SuLufWo_zeit_0_0_0', 'Unknown_Parameter_896'], + "names": ['ID_Einst_SuLufWo_zeit_0_0_0'], "type": TimeOfDay2, "writeable": False, "datatype": 'UINT32', @@ -9017,7 +9017,7 @@ { "index": 897, "count": 1, - "names": ['ID_Einst_SuLufWo_zeit_0_1_0', 'Unknown_Parameter_897'], + "names": ['ID_Einst_SuLufWo_zeit_0_1_0'], "type": TimeOfDay2, "writeable": False, "datatype": 'UINT32', @@ -9027,7 +9027,7 @@ { "index": 898, "count": 1, - "names": ['ID_Einst_SuLufWo_zeit_0_2_0', 'Unknown_Parameter_898'], + "names": ['ID_Einst_SuLufWo_zeit_0_2_0'], "type": TimeOfDay2, "writeable": False, "datatype": 'UINT32', @@ -9037,7 +9037,7 @@ { "index": 899, "count": 1, - "names": ['ID_Einst_SuLuf25_zeit_0_0_0', 'Unknown_Parameter_899'], + "names": ['ID_Einst_SuLuf25_zeit_0_0_0'], "type": TimeOfDay2, "writeable": False, "datatype": 'UINT32', @@ -9047,7 +9047,7 @@ { "index": 900, "count": 1, - "names": ['ID_Einst_SuLuf25_zeit_0_1_0', 'Unknown_Parameter_900'], + "names": ['ID_Einst_SuLuf25_zeit_0_1_0'], "type": TimeOfDay2, "writeable": False, "datatype": 'UINT32', @@ -9057,7 +9057,7 @@ { "index": 901, "count": 1, - "names": ['ID_Einst_SuLuf25_zeit_0_2_0', 'Unknown_Parameter_901'], + "names": ['ID_Einst_SuLuf25_zeit_0_2_0'], "type": TimeOfDay2, "writeable": False, "datatype": 'UINT32', @@ -9067,7 +9067,7 @@ { "index": 902, "count": 1, - "names": ['ID_Einst_SuLuf25_zeit_0_0_2', 'Unknown_Parameter_902'], + "names": ['ID_Einst_SuLuf25_zeit_0_0_2'], "type": TimeOfDay2, "writeable": False, "datatype": 'UINT32', @@ -9077,7 +9077,7 @@ { "index": 903, "count": 1, - "names": ['ID_Einst_SuLuf25_zeit_0_1_2', 'Unknown_Parameter_903'], + "names": ['ID_Einst_SuLuf25_zeit_0_1_2'], "type": TimeOfDay2, "writeable": False, "datatype": 'UINT32', @@ -9087,7 +9087,7 @@ { "index": 904, "count": 1, - "names": ['ID_Einst_SuLuf25_zeit_0_2_2', 'Unknown_Parameter_904'], + "names": ['ID_Einst_SuLuf25_zeit_0_2_2'], "type": TimeOfDay2, "writeable": False, "datatype": 'UINT32', @@ -9097,7 +9097,7 @@ { "index": 905, "count": 1, - "names": ['ID_Einst_SuLufTg_zeit_0_0_0', 'Unknown_Parameter_905'], + "names": ['ID_Einst_SuLufTg_zeit_0_0_0'], "type": TimeOfDay2, "writeable": False, "datatype": 'UINT32', @@ -9107,7 +9107,7 @@ { "index": 906, "count": 1, - "names": ['ID_Einst_SuLufTg_zeit_0_1_0', 'Unknown_Parameter_906'], + "names": ['ID_Einst_SuLufTg_zeit_0_1_0'], "type": TimeOfDay2, "writeable": False, "datatype": 'UINT32', @@ -9117,7 +9117,7 @@ { "index": 907, "count": 1, - "names": ['ID_Einst_SuLufTg_zeit_0_2_0', 'Unknown_Parameter_907'], + "names": ['ID_Einst_SuLufTg_zeit_0_2_0'], "type": TimeOfDay2, "writeable": False, "datatype": 'UINT32', @@ -9127,7 +9127,7 @@ { "index": 908, "count": 1, - "names": ['ID_Einst_SuLufTg_zeit_0_0_2', 'Unknown_Parameter_908'], + "names": ['ID_Einst_SuLufTg_zeit_0_0_2'], "type": TimeOfDay2, "writeable": False, "datatype": 'UINT32', @@ -9137,7 +9137,7 @@ { "index": 909, "count": 1, - "names": ['ID_Einst_SuLufTg_zeit_0_1_2', 'Unknown_Parameter_909'], + "names": ['ID_Einst_SuLufTg_zeit_0_1_2'], "type": TimeOfDay2, "writeable": False, "datatype": 'UINT32', @@ -9147,7 +9147,7 @@ { "index": 910, "count": 1, - "names": ['ID_Einst_SuLufTg_zeit_0_2_2', 'Unknown_Parameter_910'], + "names": ['ID_Einst_SuLufTg_zeit_0_2_2'], "type": TimeOfDay2, "writeable": False, "datatype": 'UINT32', @@ -9157,7 +9157,7 @@ { "index": 911, "count": 1, - "names": ['ID_Einst_SuLufTg_zeit_0_0_4', 'Unknown_Parameter_911'], + "names": ['ID_Einst_SuLufTg_zeit_0_0_4'], "type": TimeOfDay2, "writeable": False, "datatype": 'UINT32', @@ -9167,7 +9167,7 @@ { "index": 912, "count": 1, - "names": ['ID_Einst_SuLufTg_zeit_0_1_4', 'Unknown_Parameter_912'], + "names": ['ID_Einst_SuLufTg_zeit_0_1_4'], "type": TimeOfDay2, "writeable": False, "datatype": 'UINT32', @@ -9177,7 +9177,7 @@ { "index": 913, "count": 1, - "names": ['ID_Einst_SuLufTg_zeit_0_2_4', 'Unknown_Parameter_913'], + "names": ['ID_Einst_SuLufTg_zeit_0_2_4'], "type": TimeOfDay2, "writeable": False, "datatype": 'UINT32', @@ -9187,7 +9187,7 @@ { "index": 914, "count": 1, - "names": ['ID_Einst_SuLufTg_zeit_0_0_6', 'Unknown_Parameter_914'], + "names": ['ID_Einst_SuLufTg_zeit_0_0_6'], "type": TimeOfDay2, "writeable": False, "datatype": 'UINT32', @@ -9197,7 +9197,7 @@ { "index": 915, "count": 1, - "names": ['ID_Einst_SuLufTg_zeit_0_1_6', 'Unknown_Parameter_915'], + "names": ['ID_Einst_SuLufTg_zeit_0_1_6'], "type": TimeOfDay2, "writeable": False, "datatype": 'UINT32', @@ -9207,7 +9207,7 @@ { "index": 916, "count": 1, - "names": ['ID_Einst_SuLufTg_zeit_0_2_6', 'Unknown_Parameter_916'], + "names": ['ID_Einst_SuLufTg_zeit_0_2_6'], "type": TimeOfDay2, "writeable": False, "datatype": 'UINT32', @@ -9217,7 +9217,7 @@ { "index": 917, "count": 1, - "names": ['ID_Einst_SuLufTg_zeit_0_0_8', 'Unknown_Parameter_917'], + "names": ['ID_Einst_SuLufTg_zeit_0_0_8'], "type": TimeOfDay2, "writeable": False, "datatype": 'UINT32', @@ -9227,7 +9227,7 @@ { "index": 918, "count": 1, - "names": ['ID_Einst_SuLufTg_zeit_0_1_8', 'Unknown_Parameter_918'], + "names": ['ID_Einst_SuLufTg_zeit_0_1_8'], "type": TimeOfDay2, "writeable": False, "datatype": 'UINT32', @@ -9237,7 +9237,7 @@ { "index": 919, "count": 1, - "names": ['ID_Einst_SuLufTg_zeit_0_2_8', 'Unknown_Parameter_919'], + "names": ['ID_Einst_SuLufTg_zeit_0_2_8'], "type": TimeOfDay2, "writeable": False, "datatype": 'UINT32', @@ -9247,7 +9247,7 @@ { "index": 920, "count": 1, - "names": ['ID_Einst_SuLufTg_zeit_0_0_10', 'Unknown_Parameter_920'], + "names": ['ID_Einst_SuLufTg_zeit_0_0_10'], "type": TimeOfDay2, "writeable": False, "datatype": 'UINT32', @@ -9257,7 +9257,7 @@ { "index": 921, "count": 1, - "names": ['ID_Einst_SuLufTg_zeit_0_1_10', 'Unknown_Parameter_921'], + "names": ['ID_Einst_SuLufTg_zeit_0_1_10'], "type": TimeOfDay2, "writeable": False, "datatype": 'UINT32', @@ -9267,7 +9267,7 @@ { "index": 922, "count": 1, - "names": ['ID_Einst_SuLufTg_zeit_0_2_10', 'Unknown_Parameter_922'], + "names": ['ID_Einst_SuLufTg_zeit_0_2_10'], "type": TimeOfDay2, "writeable": False, "datatype": 'UINT32', @@ -9277,7 +9277,7 @@ { "index": 923, "count": 1, - "names": ['ID_Einst_SuLufTg_zeit_0_0_12', 'Unknown_Parameter_923'], + "names": ['ID_Einst_SuLufTg_zeit_0_0_12'], "type": TimeOfDay2, "writeable": False, "datatype": 'UINT32', @@ -9287,7 +9287,7 @@ { "index": 924, "count": 1, - "names": ['ID_Einst_SuLufTg_zeit_0_1_12', 'Unknown_Parameter_924'], + "names": ['ID_Einst_SuLufTg_zeit_0_1_12'], "type": TimeOfDay2, "writeable": False, "datatype": 'UINT32', @@ -9297,7 +9297,7 @@ { "index": 925, "count": 1, - "names": ['ID_Einst_SuLufTg_zeit_0_2_12', 'Unknown_Parameter_925'], + "names": ['ID_Einst_SuLufTg_zeit_0_2_12'], "type": TimeOfDay2, "writeable": False, "datatype": 'UINT32', @@ -9307,7 +9307,7 @@ { "index": 926, "count": 1, - "names": ['ID_Einst_SuLufWo_zeit_1_0_0', 'Unknown_Parameter_926'], + "names": ['ID_Einst_SuLufWo_zeit_1_0_0'], "type": TimeOfDay2, "writeable": False, "datatype": 'UINT32', @@ -9317,7 +9317,7 @@ { "index": 927, "count": 1, - "names": ['ID_Einst_SuLufWo_zeit_1_1_0', 'Unknown_Parameter_927'], + "names": ['ID_Einst_SuLufWo_zeit_1_1_0'], "type": TimeOfDay2, "writeable": False, "datatype": 'UINT32', @@ -9327,7 +9327,7 @@ { "index": 928, "count": 1, - "names": ['ID_Einst_SuLufWo_zeit_1_2_0', 'Unknown_Parameter_928'], + "names": ['ID_Einst_SuLufWo_zeit_1_2_0'], "type": TimeOfDay2, "writeable": False, "datatype": 'UINT32', @@ -9337,7 +9337,7 @@ { "index": 929, "count": 1, - "names": ['ID_Einst_SuLuf25_zeit_1_0_0', 'Unknown_Parameter_929'], + "names": ['ID_Einst_SuLuf25_zeit_1_0_0'], "type": TimeOfDay2, "writeable": False, "datatype": 'UINT32', @@ -9347,7 +9347,7 @@ { "index": 930, "count": 1, - "names": ['ID_Einst_SuLuf25_zeit_1_1_0', 'Unknown_Parameter_930'], + "names": ['ID_Einst_SuLuf25_zeit_1_1_0'], "type": TimeOfDay2, "writeable": False, "datatype": 'UINT32', @@ -9357,7 +9357,7 @@ { "index": 931, "count": 1, - "names": ['ID_Einst_SuLuf25_zeit_1_2_0', 'Unknown_Parameter_931'], + "names": ['ID_Einst_SuLuf25_zeit_1_2_0'], "type": TimeOfDay2, "writeable": False, "datatype": 'UINT32', @@ -9367,7 +9367,7 @@ { "index": 932, "count": 1, - "names": ['ID_Einst_SuLuf25_zeit_1_0_2', 'Unknown_Parameter_932'], + "names": ['ID_Einst_SuLuf25_zeit_1_0_2'], "type": TimeOfDay2, "writeable": False, "datatype": 'UINT32', @@ -9377,7 +9377,7 @@ { "index": 933, "count": 1, - "names": ['ID_Einst_SuLuf25_zeit_1_1_2', 'Unknown_Parameter_933'], + "names": ['ID_Einst_SuLuf25_zeit_1_1_2'], "type": TimeOfDay2, "writeable": False, "datatype": 'UINT32', @@ -9387,7 +9387,7 @@ { "index": 934, "count": 1, - "names": ['ID_Einst_SuLuf25_zeit_1_2_2', 'Unknown_Parameter_934'], + "names": ['ID_Einst_SuLuf25_zeit_1_2_2'], "type": TimeOfDay2, "writeable": False, "datatype": 'UINT32', @@ -9397,7 +9397,7 @@ { "index": 935, "count": 1, - "names": ['ID_Einst_SuLufTg_zeit_1_0_0', 'Unknown_Parameter_935'], + "names": ['ID_Einst_SuLufTg_zeit_1_0_0'], "type": TimeOfDay2, "writeable": False, "datatype": 'UINT32', @@ -9407,7 +9407,7 @@ { "index": 936, "count": 1, - "names": ['ID_Einst_SuLufTg_zeit_1_1_0', 'Unknown_Parameter_936'], + "names": ['ID_Einst_SuLufTg_zeit_1_1_0'], "type": TimeOfDay2, "writeable": False, "datatype": 'UINT32', @@ -9417,7 +9417,7 @@ { "index": 937, "count": 1, - "names": ['ID_Einst_SuLufTg_zeit_1_2_0', 'Unknown_Parameter_937'], + "names": ['ID_Einst_SuLufTg_zeit_1_2_0'], "type": TimeOfDay2, "writeable": False, "datatype": 'UINT32', @@ -9427,7 +9427,7 @@ { "index": 938, "count": 1, - "names": ['ID_Einst_SuLufTg_zeit_1_0_2', 'Unknown_Parameter_938'], + "names": ['ID_Einst_SuLufTg_zeit_1_0_2'], "type": TimeOfDay2, "writeable": False, "datatype": 'UINT32', @@ -9437,7 +9437,7 @@ { "index": 939, "count": 1, - "names": ['ID_Einst_SuLufTg_zeit_1_1_2', 'Unknown_Parameter_939'], + "names": ['ID_Einst_SuLufTg_zeit_1_1_2'], "type": TimeOfDay2, "writeable": False, "datatype": 'UINT32', @@ -9447,7 +9447,7 @@ { "index": 940, "count": 1, - "names": ['ID_Einst_SuLufTg_zeit_1_2_2', 'Unknown_Parameter_940'], + "names": ['ID_Einst_SuLufTg_zeit_1_2_2'], "type": TimeOfDay2, "writeable": False, "datatype": 'UINT32', @@ -9457,7 +9457,7 @@ { "index": 941, "count": 1, - "names": ['ID_Einst_SuLufTg_zeit_1_0_4', 'Unknown_Parameter_941'], + "names": ['ID_Einst_SuLufTg_zeit_1_0_4'], "type": TimeOfDay2, "writeable": False, "datatype": 'UINT32', @@ -9467,7 +9467,7 @@ { "index": 942, "count": 1, - "names": ['ID_Einst_SuLufTg_zeit_1_1_4', 'Unknown_Parameter_942'], + "names": ['ID_Einst_SuLufTg_zeit_1_1_4'], "type": TimeOfDay2, "writeable": False, "datatype": 'UINT32', @@ -9477,7 +9477,7 @@ { "index": 943, "count": 1, - "names": ['ID_Einst_SuLufTg_zeit_1_2_4', 'Unknown_Parameter_943'], + "names": ['ID_Einst_SuLufTg_zeit_1_2_4'], "type": TimeOfDay2, "writeable": False, "datatype": 'UINT32', @@ -9487,7 +9487,7 @@ { "index": 944, "count": 1, - "names": ['ID_Einst_SuLufTg_zeit_1_0_6', 'Unknown_Parameter_944'], + "names": ['ID_Einst_SuLufTg_zeit_1_0_6'], "type": TimeOfDay2, "writeable": False, "datatype": 'UINT32', @@ -9497,7 +9497,7 @@ { "index": 945, "count": 1, - "names": ['ID_Einst_SuLufTg_zeit_1_1_6', 'Unknown_Parameter_945'], + "names": ['ID_Einst_SuLufTg_zeit_1_1_6'], "type": TimeOfDay2, "writeable": False, "datatype": 'UINT32', @@ -9507,7 +9507,7 @@ { "index": 946, "count": 1, - "names": ['ID_Einst_SuLufTg_zeit_1_2_6', 'Unknown_Parameter_946'], + "names": ['ID_Einst_SuLufTg_zeit_1_2_6'], "type": TimeOfDay2, "writeable": False, "datatype": 'UINT32', @@ -9517,7 +9517,7 @@ { "index": 947, "count": 1, - "names": ['ID_Einst_SuLufTg_zeit_1_0_8', 'Unknown_Parameter_947'], + "names": ['ID_Einst_SuLufTg_zeit_1_0_8'], "type": TimeOfDay2, "writeable": False, "datatype": 'UINT32', @@ -9527,7 +9527,7 @@ { "index": 948, "count": 1, - "names": ['ID_Einst_SuLufTg_zeit_1_1_8', 'Unknown_Parameter_948'], + "names": ['ID_Einst_SuLufTg_zeit_1_1_8'], "type": TimeOfDay2, "writeable": False, "datatype": 'UINT32', @@ -9537,7 +9537,7 @@ { "index": 949, "count": 1, - "names": ['ID_Einst_SuLufTg_zeit_1_2_8', 'Unknown_Parameter_949'], + "names": ['ID_Einst_SuLufTg_zeit_1_2_8'], "type": TimeOfDay2, "writeable": False, "datatype": 'UINT32', @@ -9547,7 +9547,7 @@ { "index": 950, "count": 1, - "names": ['ID_Einst_SuLufTg_zeit_1_0_10', 'Unknown_Parameter_950'], + "names": ['ID_Einst_SuLufTg_zeit_1_0_10'], "type": TimeOfDay2, "writeable": False, "datatype": 'UINT32', @@ -9557,7 +9557,7 @@ { "index": 951, "count": 1, - "names": ['ID_Einst_SuLufTg_zeit_1_1_10', 'Unknown_Parameter_951'], + "names": ['ID_Einst_SuLufTg_zeit_1_1_10'], "type": TimeOfDay2, "writeable": False, "datatype": 'UINT32', @@ -9567,7 +9567,7 @@ { "index": 952, "count": 1, - "names": ['ID_Einst_SuLufTg_zeit_1_2_10', 'Unknown_Parameter_952'], + "names": ['ID_Einst_SuLufTg_zeit_1_2_10'], "type": TimeOfDay2, "writeable": False, "datatype": 'UINT32', @@ -9577,7 +9577,7 @@ { "index": 953, "count": 1, - "names": ['ID_Einst_SuLufTg_zeit_1_0_12', 'Unknown_Parameter_953'], + "names": ['ID_Einst_SuLufTg_zeit_1_0_12'], "type": TimeOfDay2, "writeable": False, "datatype": 'UINT32', @@ -9587,7 +9587,7 @@ { "index": 954, "count": 1, - "names": ['ID_Einst_SuLufTg_zeit_1_1_12', 'Unknown_Parameter_954'], + "names": ['ID_Einst_SuLufTg_zeit_1_1_12'], "type": TimeOfDay2, "writeable": False, "datatype": 'UINT32', @@ -9597,7 +9597,7 @@ { "index": 955, "count": 1, - "names": ['ID_Einst_SuLufTg_zeit_1_2_12', 'Unknown_Parameter_955'], + "names": ['ID_Einst_SuLufTg_zeit_1_2_12'], "type": TimeOfDay2, "writeable": False, "datatype": 'UINT32', @@ -9607,7 +9607,7 @@ { "index": 956, "count": 1, - "names": ['ID_FerienModusAktivLueftung', 'Unknown_Parameter_956'], + "names": ['ID_FerienModusAktivLueftung'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -9617,7 +9617,7 @@ { "index": 957, "count": 1, - "names": ['ID_Einst_BA_Lueftung_saved', 'Unknown_Parameter_957'], + "names": ['ID_Einst_BA_Lueftung_saved'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -9627,7 +9627,7 @@ { "index": 958, "count": 1, - "names": ['ID_SU_FrkdLueftung', 'Unknown_Parameter_958'], + "names": ['ID_SU_FrkdLueftung'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -9637,7 +9637,7 @@ { "index": 959, "count": 1, - "names": ['ID_SU_FstdLueftung', 'Unknown_Parameter_959'], + "names": ['ID_SU_FstdLueftung'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -9647,7 +9647,7 @@ { "index": 960, "count": 1, - "names": ['ID_Einst_Luf_Feuchteschutz_akt', 'Unknown_Parameter_960'], + "names": ['ID_Einst_Luf_Feuchteschutz_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -9657,7 +9657,7 @@ { "index": 961, "count": 1, - "names": ['ID_Einst_Luf_Reduziert_akt', 'Unknown_Parameter_961'], + "names": ['ID_Einst_Luf_Reduziert_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -9667,7 +9667,7 @@ { "index": 962, "count": 1, - "names": ['ID_Einst_Luf_Nennlueftung_akt', 'Unknown_Parameter_962'], + "names": ['ID_Einst_Luf_Nennlueftung_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -9677,7 +9677,7 @@ { "index": 963, "count": 1, - "names": ['ID_Einst_Luf_Intensivlueftung_akt', 'Unknown_Parameter_963'], + "names": ['ID_Einst_Luf_Intensivlueftung_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -9687,7 +9687,7 @@ { "index": 964, "count": 1, - "names": ['ID_Timer_Fil_4Makt', 'Unknown_Parameter_964'], + "names": ['ID_Timer_Fil_4Makt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -9697,7 +9697,7 @@ { "index": 965, "count": 1, - "names": ['ID_Timer_Fil_WoAkt', 'Unknown_Parameter_965'], + "names": ['ID_Timer_Fil_WoAkt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -9707,7 +9707,7 @@ { "index": 966, "count": 1, - "names": ['ID_Sollwert_KuCft3_akt', 'Unknown_Parameter_966'], + "names": ['ID_Sollwert_KuCft3_akt'], "type": Celsius, "writeable": True, "datatype": 'INT32', @@ -9717,7 +9717,7 @@ { "index": 967, "count": 1, - "names": ['ID_Sollwert_AtDif3_akt', 'Unknown_Parameter_967'], + "names": ['ID_Sollwert_AtDif3_akt'], "type": Celsius, "writeable": True, "datatype": 'INT32', @@ -9727,7 +9727,7 @@ { "index": 968, "count": 1, - "names": ['ID_Bitmaske_0', 'Unknown_Parameter_968'], + "names": ['ID_Bitmaske_0'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -9737,7 +9737,7 @@ { "index": 969, "count": 1, - "names": ['ID_Einst_Lueftungsstufen', 'Unknown_Parameter_969'], + "names": ['ID_Einst_Lueftungsstufen'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -9747,7 +9747,7 @@ { "index": 970, "count": 1, - "names": ['ID_SysEin_Meldung_TDI', 'Unknown_Parameter_970'], + "names": ['ID_SysEin_Meldung_TDI'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -9757,7 +9757,7 @@ { "index": 971, "count": 1, - "names": ['ID_SysEin_Typ_WZW', 'Unknown_Parameter_971'], + "names": ['ID_SysEin_Typ_WZW'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -9767,7 +9767,7 @@ { "index": 972, "count": 1, - "names": ['ID_Einst_GLT_aktiviert', 'Unknown_Parameter_972'], + "names": ['ID_Einst_GLT_aktiviert'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -9777,7 +9777,7 @@ { "index": 973, "count": 1, - "names": ['ID_Einst_BW_max', 'Unknown_Parameter_973'], + "names": ['ID_Einst_BW_max'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -9787,7 +9787,7 @@ { "index": 974, "count": 1, - "names": ['ID_Einst_Sollwert_TRL_Kuehlen', 'Unknown_Parameter_974'], + "names": ['ID_Einst_Sollwert_TRL_Kuehlen'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -9797,7 +9797,7 @@ { "index": 975, "count": 1, - "names": ['ID_Einst_Medium_Waermequelle', 'Unknown_Parameter_975'], + "names": ['ID_Einst_Medium_Waermequelle'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -9807,7 +9807,7 @@ { "index": 976, "count": 1, - "names": ['ID_Einst_Photovoltaik_akt', 'Unknown_Parameter_976'], + "names": ['ID_Einst_Photovoltaik_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -9817,7 +9817,7 @@ { "index": 977, "count": 1, - "names": ['ID_Einst_Multispeicher_akt', 'Unknown_Parameter_977'], + "names": ['ID_Einst_Multispeicher_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -9827,7 +9827,7 @@ { "index": 978, "count": 1, - "names": ['ID_Einst_PKuehlTime_akt', 'Unknown_Parameter_978'], + "names": ['ID_Einst_PKuehlTime_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -9837,7 +9837,7 @@ { "index": 979, "count": 1, - "names": ['ID_Einst_Minimale_Ruecklaufsolltemperatur', 'Unknown_Parameter_979'], + "names": ['ID_Einst_Minimale_Ruecklaufsolltemperatur'], "type": Celsius, "writeable": True, "datatype": 'INT32', @@ -9847,7 +9847,7 @@ { "index": 980, "count": 1, - "names": ['ID_RBE_Einflussfaktor_RT_akt', 'Unknown_Parameter_980'], + "names": ['ID_RBE_Einflussfaktor_RT_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -9857,7 +9857,7 @@ { "index": 981, "count": 1, - "names": ['ID_RBE_Freigabe_Kuehlung_akt', 'Unknown_Parameter_981'], + "names": ['ID_RBE_Freigabe_Kuehlung_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -9867,7 +9867,7 @@ { "index": 982, "count": 1, - "names": ['ID_RBE_Waermeverteilsystem_akt', 'Unknown_Parameter_982'], + "names": ['ID_RBE_Waermeverteilsystem_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -9877,7 +9877,7 @@ { "index": 983, "count": 1, - "names": ['ID_RBE_Zeit_Heizstab_aktiv', 'Unknown_Parameter_983'], + "names": ['ID_RBE_Zeit_Heizstab_aktiv'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -9887,7 +9887,7 @@ { "index": 984, "count": 1, - "names": ['ID_SEC_ND_Alarmgrenze', 'Unknown_Parameter_984'], + "names": ['ID_SEC_ND_Alarmgrenze'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -9897,7 +9897,7 @@ { "index": 985, "count": 1, - "names": ['ID_SEC_HD_Alarmgrenze', 'Unknown_Parameter_985'], + "names": ['ID_SEC_HD_Alarmgrenze'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -9907,7 +9907,7 @@ { "index": 986, "count": 1, - "names": ['ID_SEC_Abtauendtemperatur', 'Unknown_Parameter_986'], + "names": ['ID_SEC_Abtauendtemperatur'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -9917,7 +9917,7 @@ { "index": 987, "count": 1, - "names": ['ID_Einst_Min_RPM_BW', 'Unknown_Parameter_987'], + "names": ['ID_Einst_Min_RPM_BW'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -9927,7 +9927,7 @@ { "index": 988, "count": 1, - "names": ['ID_Einst_Luf_Feuchteschutz_Faktor_akt', 'Unknown_Parameter_988'], + "names": ['ID_Einst_Luf_Feuchteschutz_Faktor_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -9937,7 +9937,7 @@ { "index": 989, "count": 1, - "names": ['ID_Einst_Luf_Reduziert_Faktor_akt', 'Unknown_Parameter_989'], + "names": ['ID_Einst_Luf_Reduziert_Faktor_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -9947,7 +9947,7 @@ { "index": 990, "count": 1, - "names": ['ID_Einst_Luf_Nennlueftung_Faktor_akt', 'Unknown_Parameter_990'], + "names": ['ID_Einst_Luf_Nennlueftung_Faktor_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -9957,7 +9957,7 @@ { "index": 991, "count": 1, - "names": ['ID_Einst_Luf_Intensivlueftung_Faktor_akt', 'Unknown_Parameter_991'], + "names": ['ID_Einst_Luf_Intensivlueftung_Faktor_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -9967,7 +9967,7 @@ { "index": 992, "count": 1, - "names": ['ID_Einst_Freigabe_Zeit_ZWE', 'Unknown_Parameter_992'], + "names": ['ID_Einst_Freigabe_Zeit_ZWE'], "type": Minutes, "writeable": True, "datatype": 'UINT32', @@ -9977,7 +9977,7 @@ { "index": 993, "count": 1, - "names": ['ID_Einst_min_VL_Kuehl', 'Unknown_Parameter_993'], + "names": ['ID_Einst_min_VL_Kuehl'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -9987,7 +9987,7 @@ { "index": 994, "count": 1, - "names": ['ID_Einst_Warmwasser_Nachheizung', 'Unknown_Parameter_994'], + "names": ['ID_Einst_Warmwasser_Nachheizung'], "type": Bool, "writeable": True, "datatype": 'UINT32', @@ -9997,7 +9997,7 @@ { "index": 995, "count": 1, - "names": ['ID_Switchoff_file_LWD2_0_0', 'Unknown_Parameter_995'], + "names": ['ID_Switchoff_file_LWD2_0_0'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -10007,7 +10007,7 @@ { "index": 996, "count": 1, - "names": ['ID_Switchoff_file_LWD2_1_0', 'Unknown_Parameter_996'], + "names": ['ID_Switchoff_file_LWD2_1_0'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -10017,7 +10017,7 @@ { "index": 997, "count": 1, - "names": ['ID_Switchoff_file_LWD2_2_0', 'Unknown_Parameter_997'], + "names": ['ID_Switchoff_file_LWD2_2_0'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -10027,7 +10027,7 @@ { "index": 998, "count": 1, - "names": ['ID_Switchoff_file_LWD2_3_0', 'Unknown_Parameter_998'], + "names": ['ID_Switchoff_file_LWD2_3_0'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -10037,7 +10037,7 @@ { "index": 999, "count": 1, - "names": ['ID_Switchoff_file_LWD2_4_0', 'Unknown_Parameter_999'], + "names": ['ID_Switchoff_file_LWD2_4_0'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -10047,7 +10047,7 @@ { "index": 1000, "count": 1, - "names": ['ID_Switchoff_file_LWD2_0_1', 'Unknown_Parameter_1000'], + "names": ['ID_Switchoff_file_LWD2_0_1'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -10057,7 +10057,7 @@ { "index": 1001, "count": 1, - "names": ['ID_Switchoff_file_LWD2_1_1', 'Unknown_Parameter_1001'], + "names": ['ID_Switchoff_file_LWD2_1_1'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -10067,7 +10067,7 @@ { "index": 1002, "count": 1, - "names": ['ID_Switchoff_file_LWD2_2_1', 'Unknown_Parameter_1002'], + "names": ['ID_Switchoff_file_LWD2_2_1'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -10077,7 +10077,7 @@ { "index": 1003, "count": 1, - "names": ['ID_Switchoff_file_LWD2_3_1', 'Unknown_Parameter_1003'], + "names": ['ID_Switchoff_file_LWD2_3_1'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -10087,7 +10087,7 @@ { "index": 1004, "count": 1, - "names": ['ID_Switchoff_file_LWD2_4_1', 'Unknown_Parameter_1004'], + "names": ['ID_Switchoff_file_LWD2_4_1'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -10097,7 +10097,7 @@ { "index": 1005, "count": 1, - "names": ['ID_Switchoff_index_LWD2', 'Unknown_Parameter_1005'], + "names": ['ID_Switchoff_index_LWD2'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -10107,7 +10107,7 @@ { "index": 1006, "count": 1, - "names": ['ID_Einst_Effizienzpumpe_Nominal_2', 'Unknown_Parameter_1006'], + "names": ['ID_Einst_Effizienzpumpe_Nominal_2'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -10117,7 +10117,7 @@ { "index": 1007, "count": 1, - "names": ['ID_Einst_Effizienzpumpe_Minimal_2', 'Unknown_Parameter_1007'], + "names": ['ID_Einst_Effizienzpumpe_Minimal_2'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -10127,7 +10127,7 @@ { "index": 1008, "count": 1, - "names": ['ID_Einst_Wm_Versorgung_Korrektur_2', 'Unknown_Parameter_1008'], + "names": ['ID_Einst_Wm_Versorgung_Korrektur_2'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -10137,7 +10137,7 @@ { "index": 1009, "count": 1, - "names": ['ID_Einst_Wm_Auswertung_Korrektur_2', 'Unknown_Parameter_1009'], + "names": ['ID_Einst_Wm_Auswertung_Korrektur_2'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -10147,7 +10147,7 @@ { "index": 1010, "count": 1, - "names": ['ID_Einst_isTwin', 'Unknown_Parameter_1010'], + "names": ['ID_Einst_isTwin'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -10157,7 +10157,7 @@ { "index": 1011, "count": 1, - "names": ['ID_Einst_TAmin_2', 'Unknown_Parameter_1011'], + "names": ['ID_Einst_TAmin_2'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -10167,7 +10167,7 @@ { "index": 1012, "count": 1, - "names": ['ID_Einst_TVLmax_2', 'Unknown_Parameter_1012'], + "names": ['ID_Einst_TVLmax_2'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -10177,7 +10177,7 @@ { "index": 1013, "count": 1, - "names": ['ID_Einst_TA_EG_2', 'Unknown_Parameter_1013'], + "names": ['ID_Einst_TA_EG_2'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -10187,7 +10187,7 @@ { "index": 1014, "count": 1, - "names": ['ID_Einst_TVLmax_EG_2', 'Unknown_Parameter_1014'], + "names": ['ID_Einst_TVLmax_EG_2'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -10197,7 +10197,7 @@ { "index": 1015, "count": 1, - "names": ['ID_Waermemenge_Hz_2', 'Unknown_Parameter_1015'], + "names": ['ID_Waermemenge_Hz_2'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -10207,7 +10207,7 @@ { "index": 1016, "count": 1, - "names": ['ID_Waermemenge_BW_2', 'Unknown_Parameter_1016'], + "names": ['ID_Waermemenge_BW_2'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -10217,7 +10217,7 @@ { "index": 1017, "count": 1, - "names": ['ID_Waermemenge_SW_2', 'Unknown_Parameter_1017'], + "names": ['ID_Waermemenge_SW_2'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -10227,7 +10227,7 @@ { "index": 1018, "count": 1, - "names": ['ID_Waermemenge_Seit_2', 'Unknown_Parameter_1018'], + "names": ['ID_Waermemenge_Seit_2'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -10237,7 +10237,7 @@ { "index": 1019, "count": 1, - "names": ['ID_Einst_Entl_Typ_15_2', 'Unknown_Parameter_1019'], + "names": ['ID_Einst_Entl_Typ_15_2'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -10247,7 +10247,7 @@ { "index": 1020, "count": 1, - "names": ['ID_Einst_WW_Nachheizung_max', 'Unknown_Parameter_1020'], + "names": ['ID_Einst_WW_Nachheizung_max'], "type": Hours2, "writeable": True, "datatype": 'UINT32', @@ -10257,7 +10257,7 @@ { "index": 1021, "count": 1, - "names": ['ID_Einst_Kuhl_Zeit_Ein_RT', 'Unknown_Parameter_1021'], + "names": ['ID_Einst_Kuhl_Zeit_Ein_RT'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -10267,7 +10267,7 @@ { "index": 1022, "count": 1, - "names": ['ID_Einst_ZWE1_Pos', 'Unknown_Parameter_1022'], + "names": ['ID_Einst_ZWE1_Pos'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -10277,7 +10277,7 @@ { "index": 1023, "count": 1, - "names": ['ID_Einst_ZWE2_Pos', 'Unknown_Parameter_1023'], + "names": ['ID_Einst_ZWE2_Pos'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -10287,7 +10287,7 @@ { "index": 1024, "count": 1, - "names": ['ID_Einst_ZWE3_Pos', 'Unknown_Parameter_1024'], + "names": ['ID_Einst_ZWE3_Pos'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -10297,7 +10297,7 @@ { "index": 1025, "count": 1, - "names": ['ID_Einst_Leistung_ZWE', 'Unknown_Parameter_1025'], + "names": ['ID_Einst_Leistung_ZWE'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -10307,7 +10307,7 @@ { "index": 1026, "count": 1, - "names": ['ID_WP_SN2_DATUM', 'Unknown_Parameter_1026'], + "names": ['ID_WP_SN2_DATUM'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -10317,7 +10317,7 @@ { "index": 1027, "count": 1, - "names": ['ID_WP_SN2_HEX', 'Unknown_Parameter_1027'], + "names": ['ID_WP_SN2_HEX'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -10327,7 +10327,7 @@ { "index": 1028, "count": 1, - "names": ['ID_WP_SN2_INDEX', 'Unknown_Parameter_1028'], + "names": ['ID_WP_SN2_INDEX'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -10337,7 +10337,7 @@ { "index": 1029, "count": 1, - "names": ['ID_CWP_saved2', 'Unknown_Parameter_1029'], + "names": ['ID_CWP_saved2'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -10347,7 +10347,7 @@ { "index": 1030, "count": 1, - "names": ['ID_Einst_SmartGrid', 'Unknown_Parameter_1030'], + "names": ['ID_Einst_SmartGrid'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -10357,7 +10357,7 @@ { "index": 1031, "count": 1, - "names": ['ID_Einst_P155_HDS', 'Unknown_Parameter_1031'], + "names": ['ID_Einst_P155_HDS'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -10367,7 +10367,7 @@ { "index": 1032, "count": 1, - "names": ['ID_Einst_P155_PumpHeat_Max', 'Unknown_Parameter_1032'], + "names": ['ID_Einst_P155_PumpHeat_Max'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -10377,7 +10377,7 @@ { "index": 1033, "count": 1, - "names": ['ID_Einst_P155_PumpHeatCtrl', 'Unknown_Parameter_1033'], + "names": ['ID_Einst_P155_PumpHeatCtrl'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -10387,7 +10387,7 @@ { "index": 1034, "count": 1, - "names": ['ID_Einst_P155_PumpDHWCtrl', 'Unknown_Parameter_1034'], + "names": ['ID_Einst_P155_PumpDHWCtrl'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -10397,7 +10397,7 @@ { "index": 1035, "count": 1, - "names": ['ID_Einst_P155_PumpDHW_RPM', 'Unknown_Parameter_1035'], + "names": ['ID_Einst_P155_PumpDHW_RPM'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -10407,7 +10407,7 @@ { "index": 1036, "count": 1, - "names": ['ID_Einst_P155_PumpPoolCtrl', 'Unknown_Parameter_1036'], + "names": ['ID_Einst_P155_PumpPoolCtrl'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -10417,7 +10417,7 @@ { "index": 1037, "count": 1, - "names": ['ID_Einst_P155_PumpPool_RPM', 'Unknown_Parameter_1037'], + "names": ['ID_Einst_P155_PumpPool_RPM'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -10427,7 +10427,7 @@ { "index": 1038, "count": 1, - "names": ['ID_Einst_P155_PumpCool_RPM', 'Unknown_Parameter_1038'], + "names": ['ID_Einst_P155_PumpCool_RPM'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -10437,7 +10437,7 @@ { "index": 1039, "count": 1, - "names": ['ID_Einst_P155_PumpVBOCtrl', 'Unknown_Parameter_1039'], + "names": ['ID_Einst_P155_PumpVBOCtrl'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -10447,7 +10447,7 @@ { "index": 1040, "count": 1, - "names": ['ID_Einst_P155_PumpVBO_RPM_C', 'Unknown_Parameter_1040'], + "names": ['ID_Einst_P155_PumpVBO_RPM_C'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -10457,7 +10457,7 @@ { "index": 1041, "count": 1, - "names": ['ID_Einst_P155_PumpDHW_Max', 'Unknown_Parameter_1041'], + "names": ['ID_Einst_P155_PumpDHW_Max'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -10467,7 +10467,7 @@ { "index": 1042, "count": 1, - "names": ['ID_Einst_P155_PumpPool_Max', 'Unknown_Parameter_1042'], + "names": ['ID_Einst_P155_PumpPool_Max'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -10477,7 +10477,7 @@ { "index": 1043, "count": 1, - "names": ['ID_Einst_P155_Sperrband_1', 'Unknown_Parameter_1043'], + "names": ['ID_Einst_P155_Sperrband_1'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -10487,7 +10487,7 @@ { "index": 1044, "count": 1, - "names": ['ID_Einst_P155_Leistungsfreigabe', 'Unknown_Parameter_1044'], + "names": ['ID_Einst_P155_Leistungsfreigabe'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -10497,7 +10497,7 @@ { "index": 1045, "count": 1, - "names": ['ID_Einst_P155_DHW_Freq', 'Unknown_Parameter_1045'], + "names": ['ID_Einst_P155_DHW_Freq'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -10507,7 +10507,7 @@ { "index": 1046, "count": 1, - "names": ['ID_Einst_SWHUP', 'Unknown_Parameter_1046'], + "names": ['ID_Einst_SWHUP'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -10517,7 +10517,7 @@ { "index": 1047, "count": 1, - "names": ['ID_Einst_P155_SWB_Freq', 'Unknown_Parameter_1047'], + "names": ['ID_Einst_P155_SWB_Freq'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -10527,7 +10527,7 @@ { "index": 1048, "count": 1, - "names": ['ID_Einst_MK1_Regelung', 'Unknown_Parameter_1048'], + "names": ['ID_Einst_MK1_Regelung'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -10537,7 +10537,7 @@ { "index": 1049, "count": 1, - "names": ['ID_Einst_MK2_Regelung', 'Unknown_Parameter_1049'], + "names": ['ID_Einst_MK2_Regelung'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -10547,7 +10547,7 @@ { "index": 1050, "count": 1, - "names": ['ID_Einst_MK3_Regelung', 'Unknown_Parameter_1050'], + "names": ['ID_Einst_MK3_Regelung'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -10557,7 +10557,7 @@ { "index": 1051, "count": 1, - "names": ['ID_Einst_PV_WW_Sperrzeit', 'Unknown_Parameter_1051'], + "names": ['ID_Einst_PV_WW_Sperrzeit'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -10567,7 +10567,7 @@ { "index": 1052, "count": 1, - "names": ['ID_Einst_Warmwasser_extra', 'Unknown_Parameter_1052'], + "names": ['ID_Einst_Warmwasser_extra'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -10577,7 +10577,7 @@ { "index": 1053, "count": 1, - "names": ['ID_Einst_Vorl_akt_Kuehl', 'Unknown_Parameter_1053'], + "names": ['ID_Einst_Vorl_akt_Kuehl'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -10587,7 +10587,7 @@ { "index": 1054, "count": 1, - "names": ['ID_WP_SN3_DATUM', 'Unknown_Parameter_1054'], + "names": ['ID_WP_SN3_DATUM'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -10597,7 +10597,7 @@ { "index": 1055, "count": 1, - "names": ['ID_WP_SN3_HEX', 'Unknown_Parameter_1055'], + "names": ['ID_WP_SN3_HEX'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -10607,7 +10607,7 @@ { "index": 1056, "count": 1, - "names": ['ID_WP_SN3_INDEX', 'Unknown_Parameter_1056'], + "names": ['ID_WP_SN3_INDEX'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -10617,7 +10617,7 @@ { "index": 1057, "count": 1, - "names": ['ID_Einst_Vorlauf_ZUP', 'Unknown_Parameter_1057'], + "names": ['ID_Einst_Vorlauf_ZUP'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -10627,7 +10627,7 @@ { "index": 1058, "count": 1, - "names": ['ID_Einst_Abtauen_im_Warmwasser', 'Unknown_Parameter_1058'], + "names": ['ID_Einst_Abtauen_im_Warmwasser'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -10637,7 +10637,7 @@ { "index": 1059, "count": 1, - "names": ['ID_Waermemenge_ZWE', 'Unknown_Parameter_1059'], + "names": ['ID_Waermemenge_ZWE'], "type": Energy, "writeable": False, "datatype": 'UINT32', @@ -10647,7 +10647,7 @@ { "index": 1060, "count": 1, - "names": ['ID_Waermemenge_Reset', 'Unknown_Parameter_1060'], + "names": ['ID_Waermemenge_Reset'], "type": Energy, "writeable": False, "datatype": 'UINT32', @@ -10657,7 +10657,7 @@ { "index": 1061, "count": 1, - "names": ['ID_Waermemenge_Reset_2', 'Unknown_Parameter_1061'], + "names": ['ID_Waermemenge_Reset_2'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -10667,7 +10667,7 @@ { "index": 1062, "count": 1, - "names": ['ID_Einst_Brunnenpumpe_min', 'Unknown_Parameter_1062'], + "names": ['ID_Einst_Brunnenpumpe_min'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -10677,7 +10677,7 @@ { "index": 1063, "count": 1, - "names": ['ID_Einst_Brunnenpumpe_max', 'Unknown_Parameter_1063'], + "names": ['ID_Einst_Brunnenpumpe_max'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -10687,7 +10687,7 @@ { "index": 1064, "count": 1, - "names": ['ID_Einst_SmartHomeID', 'Unknown_Parameter_1064'], + "names": ['ID_Einst_SmartHomeID'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -10697,7 +10697,7 @@ { "index": 1065, "count": 1, - "names": ['ID_Einst_SmartHK', 'Unknown_Parameter_1065'], + "names": ['ID_Einst_SmartHK'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -10707,7 +10707,7 @@ { "index": 1066, "count": 1, - "names": ['ID_Einst_SmartMK1', 'Unknown_Parameter_1066'], + "names": ['ID_Einst_SmartMK1'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -10717,7 +10717,7 @@ { "index": 1067, "count": 1, - "names": ['ID_Einst_SmartMK2', 'Unknown_Parameter_1067'], + "names": ['ID_Einst_SmartMK2'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -10727,7 +10727,7 @@ { "index": 1068, "count": 1, - "names": ['ID_Einst_SmartMK3', 'Unknown_Parameter_1068'], + "names": ['ID_Einst_SmartMK3'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -10737,7 +10737,7 @@ { "index": 1069, "count": 1, - "names": ['ID_Einst_SmartWW', 'Unknown_Parameter_1069'], + "names": ['ID_Einst_SmartWW'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -10747,7 +10747,7 @@ { "index": 1070, "count": 1, - "names": ['ID_Einst_SmartDefrost', 'Unknown_Parameter_1070'], + "names": ['ID_Einst_SmartDefrost'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -10757,7 +10757,7 @@ { "index": 1071, "count": 1, - "names": ['ID_Einst_Empty1071', 'Unknown_Parameter_1071'], + "names": ['ID_Einst_Empty1071'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -10767,7 +10767,7 @@ { "index": 1072, "count": 1, - "names": ['ID_Einst_MinVLMK1', 'Unknown_Parameter_1072'], + "names": ['ID_Einst_MinVLMK1'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -10777,7 +10777,7 @@ { "index": 1073, "count": 1, - "names": ['ID_Einst_MinVLMK2', 'Unknown_Parameter_1073'], + "names": ['ID_Einst_MinVLMK2'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -10787,7 +10787,7 @@ { "index": 1074, "count": 1, - "names": ['ID_Einst_MinVLMK3', 'Unknown_Parameter_1074'], + "names": ['ID_Einst_MinVLMK3'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -10797,7 +10797,7 @@ { "index": 1075, "count": 1, - "names": ['ID_Einst_MaxVLMK1', 'Unknown_Parameter_1075'], + "names": ['ID_Einst_MaxVLMK1'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -10807,7 +10807,7 @@ { "index": 1076, "count": 1, - "names": ['ID_Einst_MaxVLMK2', 'Unknown_Parameter_1076'], + "names": ['ID_Einst_MaxVLMK2'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -10817,7 +10817,7 @@ { "index": 1077, "count": 1, - "names": ['ID_Einst_MaxVLMK3', 'Unknown_Parameter_1077'], + "names": ['ID_Einst_MaxVLMK3'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -10827,7 +10827,7 @@ { "index": 1078, "count": 1, - "names": ['ID_Einst_SmartPlusHz', 'Unknown_Parameter_1078'], + "names": ['ID_Einst_SmartPlusHz'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -10837,7 +10837,7 @@ { "index": 1079, "count": 1, - "names": ['ID_Einst_SmartMinusHz', 'Unknown_Parameter_1079'], + "names": ['ID_Einst_SmartMinusHz'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -10847,7 +10847,7 @@ { "index": 1080, "count": 1, - "names": ['ID_Einst_SmartPlusMK1', 'Unknown_Parameter_1080'], + "names": ['ID_Einst_SmartPlusMK1'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -10857,7 +10857,7 @@ { "index": 1081, "count": 1, - "names": ['ID_Einst_SmartMinusMK1', 'Unknown_Parameter_1081'], + "names": ['ID_Einst_SmartMinusMK1'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -10867,7 +10867,7 @@ { "index": 1082, "count": 1, - "names": ['ID_Einst_SmartPlusMK2', 'Unknown_Parameter_1082'], + "names": ['ID_Einst_SmartPlusMK2'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -10877,7 +10877,7 @@ { "index": 1083, "count": 1, - "names": ['ID_Einst_SmartMinusMK2', 'Unknown_Parameter_1083'], + "names": ['ID_Einst_SmartMinusMK2'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -10887,7 +10887,7 @@ { "index": 1084, "count": 1, - "names": ['ID_Einst_SmartPlusMK3', 'Unknown_Parameter_1084'], + "names": ['ID_Einst_SmartPlusMK3'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -10897,7 +10897,7 @@ { "index": 1085, "count": 1, - "names": ['ID_Einst_SmartMinusMK3', 'Unknown_Parameter_1085'], + "names": ['ID_Einst_SmartMinusMK3'], "type": Unknown, "writeable": False, "datatype": 'UINT32', diff --git a/luxtronik/definitions/visibilities.py b/luxtronik/definitions/visibilities.py index 8f5d0b6d..d8df6bbe 100644 --- a/luxtronik/definitions/visibilities.py +++ b/luxtronik/definitions/visibilities.py @@ -24,7 +24,7 @@ { "index": 0, "count": 1, - "names": ['ID_Visi_NieAnzeigen', 'Unknown_Visibility_0'], + "names": ['ID_Visi_NieAnzeigen'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -34,7 +34,7 @@ { "index": 1, "count": 1, - "names": ['ID_Visi_ImmerAnzeigen', 'Unknown_Visibility_1'], + "names": ['ID_Visi_ImmerAnzeigen'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -44,7 +44,7 @@ { "index": 2, "count": 1, - "names": ['ID_Visi_Heizung', 'Unknown_Visibility_2'], + "names": ['ID_Visi_Heizung'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -54,7 +54,7 @@ { "index": 3, "count": 1, - "names": ['ID_Visi_Brauwasser', 'Unknown_Visibility_3'], + "names": ['ID_Visi_Brauwasser'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -64,7 +64,7 @@ { "index": 4, "count": 1, - "names": ['ID_Visi_Schwimmbad', 'Unknown_Visibility_4'], + "names": ['ID_Visi_Schwimmbad'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -74,7 +74,7 @@ { "index": 5, "count": 1, - "names": ['ID_Visi_Kuhlung', 'Unknown_Visibility_5'], + "names": ['ID_Visi_Kuhlung'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -84,7 +84,7 @@ { "index": 6, "count": 1, - "names": ['ID_Visi_Lueftung', 'Unknown_Visibility_6'], + "names": ['ID_Visi_Lueftung'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -94,7 +94,7 @@ { "index": 7, "count": 1, - "names": ['ID_Visi_MK1', 'Unknown_Visibility_7'], + "names": ['ID_Visi_MK1'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -104,7 +104,7 @@ { "index": 8, "count": 1, - "names": ['ID_Visi_MK2', 'Unknown_Visibility_8'], + "names": ['ID_Visi_MK2'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -114,7 +114,7 @@ { "index": 9, "count": 1, - "names": ['ID_Visi_ThermDesinfekt', 'Unknown_Visibility_9'], + "names": ['ID_Visi_ThermDesinfekt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -124,7 +124,7 @@ { "index": 10, "count": 1, - "names": ['ID_Visi_Zirkulation', 'Unknown_Visibility_10'], + "names": ['ID_Visi_Zirkulation'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -134,7 +134,7 @@ { "index": 11, "count": 1, - "names": ['ID_Visi_KuhlTemp_SolltempMK1', 'Unknown_Visibility_11'], + "names": ['ID_Visi_KuhlTemp_SolltempMK1'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -144,7 +144,7 @@ { "index": 12, "count": 1, - "names": ['ID_Visi_KuhlTemp_SolltempMK2', 'Unknown_Visibility_12'], + "names": ['ID_Visi_KuhlTemp_SolltempMK2'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -154,7 +154,7 @@ { "index": 13, "count": 1, - "names": ['ID_Visi_KuhlTemp_ATDiffMK1', 'Unknown_Visibility_13'], + "names": ['ID_Visi_KuhlTemp_ATDiffMK1'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -164,7 +164,7 @@ { "index": 14, "count": 1, - "names": ['ID_Visi_KuhlTemp_ATDiffMK2', 'Unknown_Visibility_14'], + "names": ['ID_Visi_KuhlTemp_ATDiffMK2'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -174,7 +174,7 @@ { "index": 15, "count": 1, - "names": ['ID_Visi_Service_Information', 'Unknown_Visibility_15'], + "names": ['ID_Visi_Service_Information'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -184,7 +184,7 @@ { "index": 16, "count": 1, - "names": ['ID_Visi_Service_Einstellung', 'Unknown_Visibility_16'], + "names": ['ID_Visi_Service_Einstellung'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -194,7 +194,7 @@ { "index": 17, "count": 1, - "names": ['ID_Visi_Service_Sprache', 'Unknown_Visibility_17'], + "names": ['ID_Visi_Service_Sprache'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -204,7 +204,7 @@ { "index": 18, "count": 1, - "names": ['ID_Visi_Service_DatumUhrzeit', 'Unknown_Visibility_18'], + "names": ['ID_Visi_Service_DatumUhrzeit'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -214,7 +214,7 @@ { "index": 19, "count": 1, - "names": ['ID_Visi_Service_Ausheiz', 'Unknown_Visibility_19'], + "names": ['ID_Visi_Service_Ausheiz'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -224,7 +224,7 @@ { "index": 20, "count": 1, - "names": ['ID_Visi_Service_Anlagenkonfiguration', 'Unknown_Visibility_20'], + "names": ['ID_Visi_Service_Anlagenkonfiguration'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -234,7 +234,7 @@ { "index": 21, "count": 1, - "names": ['ID_Visi_Service_IBNAssistant', 'Unknown_Visibility_21'], + "names": ['ID_Visi_Service_IBNAssistant'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -244,7 +244,7 @@ { "index": 22, "count": 1, - "names": ['ID_Visi_Service_ParameterIBNZuruck', 'Unknown_Visibility_22'], + "names": ['ID_Visi_Service_ParameterIBNZuruck'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -254,7 +254,7 @@ { "index": 23, "count": 1, - "names": ['ID_Visi_Temp_Vorlauf', 'Unknown_Visibility_23'], + "names": ['ID_Visi_Temp_Vorlauf'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -264,7 +264,7 @@ { "index": 24, "count": 1, - "names": ['ID_Visi_Temp_Rucklauf', 'Unknown_Visibility_24'], + "names": ['ID_Visi_Temp_Rucklauf'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -274,7 +274,7 @@ { "index": 25, "count": 1, - "names": ['ID_Visi_Temp_RL_Soll', 'Unknown_Visibility_25'], + "names": ['ID_Visi_Temp_RL_Soll'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -284,7 +284,7 @@ { "index": 26, "count": 1, - "names": ['ID_Visi_Temp_Ruecklext', 'Unknown_Visibility_26'], + "names": ['ID_Visi_Temp_Ruecklext'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -294,7 +294,7 @@ { "index": 27, "count": 1, - "names": ['ID_Visi_Temp_Heissgas', 'Unknown_Visibility_27'], + "names": ['ID_Visi_Temp_Heissgas'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -304,7 +304,7 @@ { "index": 28, "count": 1, - "names": ['ID_Visi_Temp_Aussent', 'Unknown_Visibility_28'], + "names": ['ID_Visi_Temp_Aussent'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -314,7 +314,7 @@ { "index": 29, "count": 1, - "names": ['ID_Visi_Temp_BW_Ist', 'Unknown_Visibility_29'], + "names": ['ID_Visi_Temp_BW_Ist'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -324,7 +324,7 @@ { "index": 30, "count": 1, - "names": ['ID_Visi_Temp_BW_Soll', 'Unknown_Visibility_30'], + "names": ['ID_Visi_Temp_BW_Soll'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -334,7 +334,7 @@ { "index": 31, "count": 1, - "names": ['ID_Visi_Temp_WQ_Ein', 'Unknown_Visibility_31'], + "names": ['ID_Visi_Temp_WQ_Ein'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -344,7 +344,7 @@ { "index": 32, "count": 1, - "names": ['ID_Visi_Temp_Kaltekreis', 'Unknown_Visibility_32'], + "names": ['ID_Visi_Temp_Kaltekreis'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -354,7 +354,7 @@ { "index": 33, "count": 1, - "names": ['ID_Visi_Temp_MK1_Vorlauf', 'Unknown_Visibility_33'], + "names": ['ID_Visi_Temp_MK1_Vorlauf'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -364,7 +364,7 @@ { "index": 34, "count": 1, - "names": ['ID_Visi_Temp_MK1VL_Soll', 'Unknown_Visibility_34'], + "names": ['ID_Visi_Temp_MK1VL_Soll'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -374,7 +374,7 @@ { "index": 35, "count": 1, - "names": ['ID_Visi_Temp_Raumstation', 'Unknown_Visibility_35'], + "names": ['ID_Visi_Temp_Raumstation'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -384,7 +384,7 @@ { "index": 36, "count": 1, - "names": ['ID_Visi_Temp_MK2_Vorlauf', 'Unknown_Visibility_36'], + "names": ['ID_Visi_Temp_MK2_Vorlauf'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -394,7 +394,7 @@ { "index": 37, "count": 1, - "names": ['ID_Visi_Temp_MK2VL_Soll', 'Unknown_Visibility_37'], + "names": ['ID_Visi_Temp_MK2VL_Soll'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -404,7 +404,7 @@ { "index": 38, "count": 1, - "names": ['ID_Visi_Temp_Solarkoll', 'Unknown_Visibility_38'], + "names": ['ID_Visi_Temp_Solarkoll'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -414,7 +414,7 @@ { "index": 39, "count": 1, - "names": ['ID_Visi_Temp_Solarsp', 'Unknown_Visibility_39'], + "names": ['ID_Visi_Temp_Solarsp'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -424,7 +424,7 @@ { "index": 40, "count": 1, - "names": ['ID_Visi_Temp_Ext_Energ', 'Unknown_Visibility_40'], + "names": ['ID_Visi_Temp_Ext_Energ'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -434,7 +434,7 @@ { "index": 41, "count": 1, - "names": ['ID_Visi_IN_ASD', 'Unknown_Visibility_41'], + "names": ['ID_Visi_IN_ASD'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -444,7 +444,7 @@ { "index": 42, "count": 1, - "names": ['ID_Visi_IN_BWT', 'Unknown_Visibility_42'], + "names": ['ID_Visi_IN_BWT'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -454,7 +454,7 @@ { "index": 43, "count": 1, - "names": ['ID_Visi_IN_EVU', 'Unknown_Visibility_43'], + "names": ['ID_Visi_IN_EVU'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -464,7 +464,7 @@ { "index": 44, "count": 1, - "names": ['ID_Visi_IN_HD', 'Unknown_Visibility_44'], + "names": ['ID_Visi_IN_HD'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -474,7 +474,7 @@ { "index": 45, "count": 1, - "names": ['ID_Visi_IN_MOT', 'Unknown_Visibility_45'], + "names": ['ID_Visi_IN_MOT'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -484,7 +484,7 @@ { "index": 46, "count": 1, - "names": ['ID_Visi_IN_ND', 'Unknown_Visibility_46'], + "names": ['ID_Visi_IN_ND'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -494,7 +494,7 @@ { "index": 47, "count": 1, - "names": ['ID_Visi_IN_PEX', 'Unknown_Visibility_47'], + "names": ['ID_Visi_IN_PEX'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -504,7 +504,7 @@ { "index": 48, "count": 1, - "names": ['ID_Visi_IN_SWT', 'Unknown_Visibility_48'], + "names": ['ID_Visi_IN_SWT'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -514,7 +514,7 @@ { "index": 49, "count": 1, - "names": ['ID_Visi_OUT_Abtauventil', 'Unknown_Visibility_49'], + "names": ['ID_Visi_OUT_Abtauventil'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -524,7 +524,7 @@ { "index": 50, "count": 1, - "names": ['ID_Visi_OUT_BUP', 'Unknown_Visibility_50'], + "names": ['ID_Visi_OUT_BUP'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -534,7 +534,7 @@ { "index": 51, "count": 1, - "names": ['ID_Visi_OUT_FUP1', 'Unknown_Visibility_51'], + "names": ['ID_Visi_OUT_FUP1'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -544,7 +544,7 @@ { "index": 52, "count": 1, - "names": ['ID_Visi_OUT_HUP', 'Unknown_Visibility_52'], + "names": ['ID_Visi_OUT_HUP'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -554,7 +554,7 @@ { "index": 53, "count": 1, - "names": ['ID_Visi_OUT_Mischer1Auf', 'Unknown_Visibility_53'], + "names": ['ID_Visi_OUT_Mischer1Auf'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -564,7 +564,7 @@ { "index": 54, "count": 1, - "names": ['ID_Visi_OUT_Mischer1Zu', 'Unknown_Visibility_54'], + "names": ['ID_Visi_OUT_Mischer1Zu'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -574,7 +574,7 @@ { "index": 55, "count": 1, - "names": ['ID_Visi_OUT_Ventilation', 'Unknown_Visibility_55'], + "names": ['ID_Visi_OUT_Ventilation'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -584,7 +584,7 @@ { "index": 56, "count": 1, - "names": ['ID_Visi_OUT_Ventil_BOSUP', 'Unknown_Visibility_56'], + "names": ['ID_Visi_OUT_Ventil_BOSUP'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -594,7 +594,7 @@ { "index": 57, "count": 1, - "names": ['ID_Visi_OUT_Verdichter1', 'Unknown_Visibility_57'], + "names": ['ID_Visi_OUT_Verdichter1'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -604,7 +604,7 @@ { "index": 58, "count": 1, - "names": ['ID_Visi_OUT_Verdichter2', 'Unknown_Visibility_58'], + "names": ['ID_Visi_OUT_Verdichter2'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -614,7 +614,7 @@ { "index": 59, "count": 1, - "names": ['ID_Visi_OUT_ZIP', 'Unknown_Visibility_59'], + "names": ['ID_Visi_OUT_ZIP'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -624,7 +624,7 @@ { "index": 60, "count": 1, - "names": ['ID_Visi_OUT_ZUP', 'Unknown_Visibility_60'], + "names": ['ID_Visi_OUT_ZUP'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -634,7 +634,7 @@ { "index": 61, "count": 1, - "names": ['ID_Visi_OUT_ZWE1', 'Unknown_Visibility_61'], + "names": ['ID_Visi_OUT_ZWE1'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -644,7 +644,7 @@ { "index": 62, "count": 1, - "names": ['ID_Visi_OUT_ZWE2_SST', 'Unknown_Visibility_62'], + "names": ['ID_Visi_OUT_ZWE2_SST'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -654,7 +654,7 @@ { "index": 63, "count": 1, - "names": ['ID_Visi_OUT_ZWE3', 'Unknown_Visibility_63'], + "names": ['ID_Visi_OUT_ZWE3'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -664,7 +664,7 @@ { "index": 64, "count": 1, - "names": ['ID_Visi_OUT_FUP2', 'Unknown_Visibility_64'], + "names": ['ID_Visi_OUT_FUP2'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -674,7 +674,7 @@ { "index": 65, "count": 1, - "names": ['ID_Visi_OUT_SLP', 'Unknown_Visibility_65'], + "names": ['ID_Visi_OUT_SLP'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -684,7 +684,7 @@ { "index": 66, "count": 1, - "names": ['ID_Visi_OUT_SUP', 'Unknown_Visibility_66'], + "names": ['ID_Visi_OUT_SUP'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -694,7 +694,7 @@ { "index": 67, "count": 1, - "names": ['ID_Visi_OUT_Mischer2Auf', 'Unknown_Visibility_67'], + "names": ['ID_Visi_OUT_Mischer2Auf'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -704,7 +704,7 @@ { "index": 68, "count": 1, - "names": ['ID_Visi_OUT_Mischer2Zu', 'Unknown_Visibility_68'], + "names": ['ID_Visi_OUT_Mischer2Zu'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -714,7 +714,7 @@ { "index": 69, "count": 1, - "names": ['ID_Visi_AblaufZ_WP_Seit', 'Unknown_Visibility_69'], + "names": ['ID_Visi_AblaufZ_WP_Seit'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -724,7 +724,7 @@ { "index": 70, "count": 1, - "names": ['ID_Visi_AblaufZ_ZWE1_seit', 'Unknown_Visibility_70'], + "names": ['ID_Visi_AblaufZ_ZWE1_seit'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -734,7 +734,7 @@ { "index": 71, "count": 1, - "names": ['ID_Visi_AblaufZ_ZWE2_seit', 'Unknown_Visibility_71'], + "names": ['ID_Visi_AblaufZ_ZWE2_seit'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -744,7 +744,7 @@ { "index": 72, "count": 1, - "names": ['ID_Visi_AblaufZ_ZWE3_seit', 'Unknown_Visibility_72'], + "names": ['ID_Visi_AblaufZ_ZWE3_seit'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -754,7 +754,7 @@ { "index": 73, "count": 1, - "names": ['ID_Visi_AblaufZ_Netzeinv', 'Unknown_Visibility_73'], + "names": ['ID_Visi_AblaufZ_Netzeinv'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -764,7 +764,7 @@ { "index": 74, "count": 1, - "names": ['ID_Visi_AblaufZ_SSP_Zeit1', 'Unknown_Visibility_74'], + "names": ['ID_Visi_AblaufZ_SSP_Zeit1'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -774,7 +774,7 @@ { "index": 75, "count": 1, - "names": ['ID_Visi_AblaufZ_VD_Stand', 'Unknown_Visibility_75'], + "names": ['ID_Visi_AblaufZ_VD_Stand'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -784,7 +784,7 @@ { "index": 76, "count": 1, - "names": ['ID_Visi_AblaufZ_HRM_Zeit', 'Unknown_Visibility_76'], + "names": ['ID_Visi_AblaufZ_HRM_Zeit'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -794,7 +794,7 @@ { "index": 77, "count": 1, - "names": ['ID_Visi_AblaufZ_HRW_Zeit', 'Unknown_Visibility_77'], + "names": ['ID_Visi_AblaufZ_HRW_Zeit'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -804,7 +804,7 @@ { "index": 78, "count": 1, - "names": ['ID_Visi_AblaufZ_TDI_seit', 'Unknown_Visibility_78'], + "names": ['ID_Visi_AblaufZ_TDI_seit'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -814,7 +814,7 @@ { "index": 79, "count": 1, - "names": ['ID_Visi_AblaufZ_Sperre_BW', 'Unknown_Visibility_79'], + "names": ['ID_Visi_AblaufZ_Sperre_BW'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -824,7 +824,7 @@ { "index": 80, "count": 1, - "names": ['ID_Visi_Bst_BStdVD1', 'Unknown_Visibility_80'], + "names": ['ID_Visi_Bst_BStdVD1'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -834,7 +834,7 @@ { "index": 81, "count": 1, - "names": ['ID_Visi_Bst_ImpVD1', 'Unknown_Visibility_81'], + "names": ['ID_Visi_Bst_ImpVD1'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -844,7 +844,7 @@ { "index": 82, "count": 1, - "names": ['ID_Visi_Bst_dEZVD1', 'Unknown_Visibility_82'], + "names": ['ID_Visi_Bst_dEZVD1'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -854,7 +854,7 @@ { "index": 83, "count": 1, - "names": ['ID_Visi_Bst_BStdVD2', 'Unknown_Visibility_83'], + "names": ['ID_Visi_Bst_BStdVD2'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -864,7 +864,7 @@ { "index": 84, "count": 1, - "names": ['ID_Visi_Bst_ImpVD2', 'Unknown_Visibility_84'], + "names": ['ID_Visi_Bst_ImpVD2'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -874,7 +874,7 @@ { "index": 85, "count": 1, - "names": ['ID_Visi_Bst_dEZVD2', 'Unknown_Visibility_85'], + "names": ['ID_Visi_Bst_dEZVD2'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -884,7 +884,7 @@ { "index": 86, "count": 1, - "names": ['ID_Visi_Bst_BStdZWE1', 'Unknown_Visibility_86'], + "names": ['ID_Visi_Bst_BStdZWE1'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -894,7 +894,7 @@ { "index": 87, "count": 1, - "names": ['ID_Visi_Bst_BStdZWE2', 'Unknown_Visibility_87'], + "names": ['ID_Visi_Bst_BStdZWE2'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -904,7 +904,7 @@ { "index": 88, "count": 1, - "names": ['ID_Visi_Bst_BStdZWE3', 'Unknown_Visibility_88'], + "names": ['ID_Visi_Bst_BStdZWE3'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -914,7 +914,7 @@ { "index": 89, "count": 1, - "names": ['ID_Visi_Bst_BStdWP', 'Unknown_Visibility_89'], + "names": ['ID_Visi_Bst_BStdWP'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -924,7 +924,7 @@ { "index": 90, "count": 1, - "names": ['ID_Visi_Text_Kurzprogramme', 'Unknown_Visibility_90'], + "names": ['ID_Visi_Text_Kurzprogramme'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -934,7 +934,7 @@ { "index": 91, "count": 1, - "names": ['ID_Visi_Text_Zwangsheizung', 'Unknown_Visibility_91'], + "names": ['ID_Visi_Text_Zwangsheizung'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -944,7 +944,7 @@ { "index": 92, "count": 1, - "names": ['ID_Visi_Text_Zwangsbrauchwasser', 'Unknown_Visibility_92'], + "names": ['ID_Visi_Text_Zwangsbrauchwasser'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -954,7 +954,7 @@ { "index": 93, "count": 1, - "names": ['ID_Visi_Text_Abtauen', 'Unknown_Visibility_93'], + "names": ['ID_Visi_Text_Abtauen'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -964,7 +964,7 @@ { "index": 94, "count": 1, - "names": ['ID_Visi_EinstTemp_RucklBegr', 'Unknown_Visibility_94'], + "names": ['ID_Visi_EinstTemp_RucklBegr'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -974,7 +974,7 @@ { "index": 95, "count": 1, - "names": ['ID_Visi_EinstTemp_HystereseHR', 'Unknown_Visibility_95'], + "names": ['ID_Visi_EinstTemp_HystereseHR'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -984,7 +984,7 @@ { "index": 96, "count": 1, - "names": ['ID_Visi_EinstTemp_TRErhmax', 'Unknown_Visibility_96'], + "names": ['ID_Visi_EinstTemp_TRErhmax'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -994,7 +994,7 @@ { "index": 97, "count": 1, - "names": ['ID_Visi_EinstTemp_Freig2VD', 'Unknown_Visibility_97'], + "names": ['ID_Visi_EinstTemp_Freig2VD'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1004,7 +1004,7 @@ { "index": 98, "count": 1, - "names": ['ID_Visi_EinstTemp_FreigZWE', 'Unknown_Visibility_98'], + "names": ['ID_Visi_EinstTemp_FreigZWE'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1014,7 +1014,7 @@ { "index": 99, "count": 1, - "names": ['ID_Visi_EinstTemp_Tluftabt', 'Unknown_Visibility_99'], + "names": ['ID_Visi_EinstTemp_Tluftabt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1024,7 +1024,7 @@ { "index": 100, "count": 1, - "names": ['ID_Visi_EinstTemp_TDISolltemp', 'Unknown_Visibility_100'], + "names": ['ID_Visi_EinstTemp_TDISolltemp'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1034,7 +1034,7 @@ { "index": 101, "count": 1, - "names": ['ID_Visi_EinstTemp_HystereseBW', 'Unknown_Visibility_101'], + "names": ['ID_Visi_EinstTemp_HystereseBW'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1044,7 +1044,7 @@ { "index": 102, "count": 1, - "names": ['ID_Visi_EinstTemp_Vorl2VDBW', 'Unknown_Visibility_102'], + "names": ['ID_Visi_EinstTemp_Vorl2VDBW'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1054,7 +1054,7 @@ { "index": 103, "count": 1, - "names": ['ID_Visi_EinstTemp_TAussenmax', 'Unknown_Visibility_103'], + "names": ['ID_Visi_EinstTemp_TAussenmax'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1064,7 +1064,7 @@ { "index": 104, "count": 1, - "names": ['ID_Visi_EinstTemp_TAussenmin', 'Unknown_Visibility_104'], + "names": ['ID_Visi_EinstTemp_TAussenmin'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1074,7 +1074,7 @@ { "index": 105, "count": 1, - "names": ['ID_Visi_EinstTemp_TWQmin', 'Unknown_Visibility_105'], + "names": ['ID_Visi_EinstTemp_TWQmin'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1084,7 +1084,7 @@ { "index": 106, "count": 1, - "names": ['ID_Visi_EinstTemp_THGmax', 'Unknown_Visibility_106'], + "names": ['ID_Visi_EinstTemp_THGmax'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1094,7 +1094,7 @@ { "index": 107, "count": 1, - "names": ['ID_Visi_EinstTemp_TLABTEnde', 'Unknown_Visibility_107'], + "names": ['ID_Visi_EinstTemp_TLABTEnde'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1104,7 +1104,7 @@ { "index": 108, "count": 1, - "names": ['ID_Visi_EinstTemp_Absenkbis', 'Unknown_Visibility_108'], + "names": ['ID_Visi_EinstTemp_Absenkbis'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1114,7 +1114,7 @@ { "index": 109, "count": 1, - "names": ['ID_Visi_EinstTemp_Vorlaufmax', 'Unknown_Visibility_109'], + "names": ['ID_Visi_EinstTemp_Vorlaufmax'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1124,7 +1124,7 @@ { "index": 110, "count": 1, - "names": ['ID_Visi_EinstTemp_TDiffEin', 'Unknown_Visibility_110'], + "names": ['ID_Visi_EinstTemp_TDiffEin'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1134,7 +1134,7 @@ { "index": 111, "count": 1, - "names": ['ID_Visi_EinstTemp_TDiffAus', 'Unknown_Visibility_111'], + "names": ['ID_Visi_EinstTemp_TDiffAus'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1144,7 +1144,7 @@ { "index": 112, "count": 1, - "names": ['ID_Visi_EinstTemp_TDiffmax', 'Unknown_Visibility_112'], + "names": ['ID_Visi_EinstTemp_TDiffmax'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1154,7 +1154,7 @@ { "index": 113, "count": 1, - "names": ['ID_Visi_EinstTemp_TEEHeizung', 'Unknown_Visibility_113'], + "names": ['ID_Visi_EinstTemp_TEEHeizung'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1164,7 +1164,7 @@ { "index": 114, "count": 1, - "names": ['ID_Visi_EinstTemp_TEEBrauchw', 'Unknown_Visibility_114'], + "names": ['ID_Visi_EinstTemp_TEEBrauchw'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1174,7 +1174,7 @@ { "index": 115, "count": 1, - "names": ['ID_Visi_EinstTemp_Vorl2VDSW', 'Unknown_Visibility_115'], + "names": ['ID_Visi_EinstTemp_Vorl2VDSW'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1184,7 +1184,7 @@ { "index": 116, "count": 1, - "names": ['ID_Visi_EinstTemp_VLMaxMk1', 'Unknown_Visibility_116'], + "names": ['ID_Visi_EinstTemp_VLMaxMk1'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1194,7 +1194,7 @@ { "index": 117, "count": 1, - "names": ['ID_Visi_EinstTemp_VLMaxMk2', 'Unknown_Visibility_117'], + "names": ['ID_Visi_EinstTemp_VLMaxMk2'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1204,7 +1204,7 @@ { "index": 118, "count": 1, - "names": ['ID_Visi_Priori_Brauchwasser', 'Unknown_Visibility_118'], + "names": ['ID_Visi_Priori_Brauchwasser'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1214,7 +1214,7 @@ { "index": 119, "count": 1, - "names": ['ID_Visi_Priori_Heizung', 'Unknown_Visibility_119'], + "names": ['ID_Visi_Priori_Heizung'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1224,7 +1224,7 @@ { "index": 120, "count": 1, - "names": ['ID_Visi_Priori_Schwimmbad', 'Unknown_Visibility_120'], + "names": ['ID_Visi_Priori_Schwimmbad'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1234,7 +1234,7 @@ { "index": 121, "count": 1, - "names": ['ID_Visi_SysEin_EVUSperre', 'Unknown_Visibility_121'], + "names": ['ID_Visi_SysEin_EVUSperre'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1244,7 +1244,7 @@ { "index": 122, "count": 1, - "names": ['ID_Visi_SysEin_Raumstation', 'Unknown_Visibility_122'], + "names": ['ID_Visi_SysEin_Raumstation'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1254,7 +1254,7 @@ { "index": 123, "count": 1, - "names": ['ID_Visi_SysEin_Einbindung', 'Unknown_Visibility_123'], + "names": ['ID_Visi_SysEin_Einbindung'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1264,7 +1264,7 @@ { "index": 124, "count": 1, - "names": ['ID_Visi_SysEin_Mischkreis1', 'Unknown_Visibility_124'], + "names": ['ID_Visi_SysEin_Mischkreis1'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1274,7 +1274,7 @@ { "index": 125, "count": 1, - "names": ['ID_Visi_SysEin_Mischkreis2', 'Unknown_Visibility_125'], + "names": ['ID_Visi_SysEin_Mischkreis2'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1284,7 +1284,7 @@ { "index": 126, "count": 1, - "names": ['ID_Visi_SysEin_ZWE1Art', 'Unknown_Visibility_126'], + "names": ['ID_Visi_SysEin_ZWE1Art'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1294,7 +1294,7 @@ { "index": 127, "count": 1, - "names": ['ID_Visi_SysEin_ZWE1Fkt', 'Unknown_Visibility_127'], + "names": ['ID_Visi_SysEin_ZWE1Fkt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1304,7 +1304,7 @@ { "index": 128, "count": 1, - "names": ['ID_Visi_SysEin_ZWE2Art', 'Unknown_Visibility_128'], + "names": ['ID_Visi_SysEin_ZWE2Art'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1314,7 +1314,7 @@ { "index": 129, "count": 1, - "names": ['ID_Visi_SysEin_ZWE2Fkt', 'Unknown_Visibility_129'], + "names": ['ID_Visi_SysEin_ZWE2Fkt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1324,7 +1324,7 @@ { "index": 130, "count": 1, - "names": ['ID_Visi_SysEin_ZWE3Art', 'Unknown_Visibility_130'], + "names": ['ID_Visi_SysEin_ZWE3Art'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1334,7 +1334,7 @@ { "index": 131, "count": 1, - "names": ['ID_Visi_SysEin_ZWE3Fkt', 'Unknown_Visibility_131'], + "names": ['ID_Visi_SysEin_ZWE3Fkt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1344,7 +1344,7 @@ { "index": 132, "count": 1, - "names": ['ID_Visi_SysEin_Stoerung', 'Unknown_Visibility_132'], + "names": ['ID_Visi_SysEin_Stoerung'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1354,7 +1354,7 @@ { "index": 133, "count": 1, - "names": ['ID_Visi_SysEin_Brauchwasser1', 'Unknown_Visibility_133'], + "names": ['ID_Visi_SysEin_Brauchwasser1'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1364,7 +1364,7 @@ { "index": 134, "count": 1, - "names": ['ID_Visi_SysEin_Brauchwasser2', 'Unknown_Visibility_134'], + "names": ['ID_Visi_SysEin_Brauchwasser2'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1374,7 +1374,7 @@ { "index": 135, "count": 1, - "names": ['ID_Visi_SysEin_Brauchwasser3', 'Unknown_Visibility_135'], + "names": ['ID_Visi_SysEin_Brauchwasser3'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1384,7 +1384,7 @@ { "index": 136, "count": 1, - "names": ['ID_Visi_SysEin_Brauchwasser4', 'Unknown_Visibility_136'], + "names": ['ID_Visi_SysEin_Brauchwasser4'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1394,7 +1394,7 @@ { "index": 137, "count": 1, - "names": ['ID_Visi_SysEin_Brauchwasser5', 'Unknown_Visibility_137'], + "names": ['ID_Visi_SysEin_Brauchwasser5'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1404,7 +1404,7 @@ { "index": 138, "count": 1, - "names": ['ID_Visi_SysEin_BWWPmax', 'Unknown_Visibility_138'], + "names": ['ID_Visi_SysEin_BWWPmax'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1414,7 +1414,7 @@ { "index": 139, "count": 1, - "names": ['ID_Visi_SysEin_Abtzykmax', 'Unknown_Visibility_139'], + "names": ['ID_Visi_SysEin_Abtzykmax'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1424,7 +1424,7 @@ { "index": 140, "count": 1, - "names": ['ID_Visi_SysEin_Luftabt', 'Unknown_Visibility_140'], + "names": ['ID_Visi_SysEin_Luftabt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1434,7 +1434,7 @@ { "index": 141, "count": 1, - "names": ['ID_Visi_SysEin_LuftAbtmax', 'Unknown_Visibility_141'], + "names": ['ID_Visi_SysEin_LuftAbtmax'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1444,7 +1444,7 @@ { "index": 142, "count": 1, - "names": ['ID_Visi_SysEin_Abtauen1', 'Unknown_Visibility_142'], + "names": ['ID_Visi_SysEin_Abtauen1'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1454,7 +1454,7 @@ { "index": 143, "count": 1, - "names": ['ID_Visi_SysEin_Abtauen2', 'Unknown_Visibility_143'], + "names": ['ID_Visi_SysEin_Abtauen2'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1464,7 +1464,7 @@ { "index": 144, "count": 1, - "names": ['ID_Visi_SysEin_Pumpenoptim', 'Unknown_Visibility_144'], + "names": ['ID_Visi_SysEin_Pumpenoptim'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1474,7 +1474,7 @@ { "index": 145, "count": 1, - "names": ['ID_Visi_SysEin_Zusatzpumpe', 'Unknown_Visibility_145'], + "names": ['ID_Visi_SysEin_Zusatzpumpe'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1484,7 +1484,7 @@ { "index": 146, "count": 1, - "names": ['ID_Visi_SysEin_Zugang', 'Unknown_Visibility_146'], + "names": ['ID_Visi_SysEin_Zugang'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1494,7 +1494,7 @@ { "index": 147, "count": 1, - "names": ['ID_Visi_SysEin_SoledrDurchf', 'Unknown_Visibility_147'], + "names": ['ID_Visi_SysEin_SoledrDurchf'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1504,7 +1504,7 @@ { "index": 148, "count": 1, - "names": ['ID_Visi_SysEin_UberwachungVD', 'Unknown_Visibility_148'], + "names": ['ID_Visi_SysEin_UberwachungVD'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1514,7 +1514,7 @@ { "index": 149, "count": 1, - "names": ['ID_Visi_SysEin_RegelungHK', 'Unknown_Visibility_149'], + "names": ['ID_Visi_SysEin_RegelungHK'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1524,7 +1524,7 @@ { "index": 150, "count": 1, - "names": ['ID_Visi_SysEin_RegelungMK1', 'Unknown_Visibility_150'], + "names": ['ID_Visi_SysEin_RegelungMK1'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1534,7 +1534,7 @@ { "index": 151, "count": 1, - "names": ['ID_Visi_SysEin_RegelungMK2', 'Unknown_Visibility_151'], + "names": ['ID_Visi_SysEin_RegelungMK2'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1544,7 +1544,7 @@ { "index": 152, "count": 1, - "names": ['ID_Visi_SysEin_Kuhlung', 'Unknown_Visibility_152'], + "names": ['ID_Visi_SysEin_Kuhlung'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1554,7 +1554,7 @@ { "index": 153, "count": 1, - "names": ['ID_Visi_SysEin_Ausheizen', 'Unknown_Visibility_153'], + "names": ['ID_Visi_SysEin_Ausheizen'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1564,7 +1564,7 @@ { "index": 154, "count": 1, - "names": ['ID_Visi_SysEin_ElektrAnode', 'Unknown_Visibility_154'], + "names": ['ID_Visi_SysEin_ElektrAnode'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1574,7 +1574,7 @@ { "index": 155, "count": 1, - "names": ['ID_Visi_SysEin_SWBBer', 'Unknown_Visibility_155'], + "names": ['ID_Visi_SysEin_SWBBer'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1584,7 +1584,7 @@ { "index": 156, "count": 1, - "names": ['ID_Visi_SysEin_SWBMin', 'Unknown_Visibility_156'], + "names": ['ID_Visi_SysEin_SWBMin'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1594,7 +1594,7 @@ { "index": 157, "count": 1, - "names": ['ID_Visi_SysEin_Heizung', 'Unknown_Visibility_157'], + "names": ['ID_Visi_SysEin_Heizung'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1604,7 +1604,7 @@ { "index": 158, "count": 1, - "names": ['ID_Visi_SysEin_PeriodeMk1', 'Unknown_Visibility_158'], + "names": ['ID_Visi_SysEin_PeriodeMk1'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1614,7 +1614,7 @@ { "index": 159, "count": 1, - "names": ['ID_Visi_SysEin_LaufzeitMk1', 'Unknown_Visibility_159'], + "names": ['ID_Visi_SysEin_LaufzeitMk1'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1624,7 +1624,7 @@ { "index": 160, "count": 1, - "names": ['ID_Visi_SysEin_PeriodeMk2', 'Unknown_Visibility_160'], + "names": ['ID_Visi_SysEin_PeriodeMk2'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1634,7 +1634,7 @@ { "index": 161, "count": 1, - "names": ['ID_Visi_SysEin_LaufzeitMk2', 'Unknown_Visibility_161'], + "names": ['ID_Visi_SysEin_LaufzeitMk2'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1644,7 +1644,7 @@ { "index": 162, "count": 1, - "names": ['ID_Visi_SysEin_Heizgrenze', 'Unknown_Visibility_162'], + "names": ['ID_Visi_SysEin_Heizgrenze'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1654,7 +1654,7 @@ { "index": 163, "count": 1, - "names": ['ID_Visi_Enlt_HUP', 'Unknown_Visibility_163'], + "names": ['ID_Visi_Enlt_HUP'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1664,7 +1664,7 @@ { "index": 164, "count": 1, - "names": ['ID_Visi_Enlt_ZUP', 'Unknown_Visibility_164'], + "names": ['ID_Visi_Enlt_ZUP'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1674,7 +1674,7 @@ { "index": 165, "count": 1, - "names": ['ID_Visi_Enlt_BUP', 'Unknown_Visibility_165'], + "names": ['ID_Visi_Enlt_BUP'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1684,7 +1684,7 @@ { "index": 166, "count": 1, - "names": ['ID_Visi_Enlt_Ventilator_BOSUP', 'Unknown_Visibility_166'], + "names": ['ID_Visi_Enlt_Ventilator_BOSUP'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1694,7 +1694,7 @@ { "index": 167, "count": 1, - "names": ['ID_Visi_Enlt_MA1', 'Unknown_Visibility_167'], + "names": ['ID_Visi_Enlt_MA1'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1704,7 +1704,7 @@ { "index": 168, "count": 1, - "names": ['ID_Visi_Enlt_MZ1', 'Unknown_Visibility_168'], + "names": ['ID_Visi_Enlt_MZ1'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1714,7 +1714,7 @@ { "index": 169, "count": 1, - "names": ['ID_Visi_Enlt_ZIP', 'Unknown_Visibility_169'], + "names": ['ID_Visi_Enlt_ZIP'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1724,7 +1724,7 @@ { "index": 170, "count": 1, - "names": ['ID_Visi_Enlt_MA2', 'Unknown_Visibility_170'], + "names": ['ID_Visi_Enlt_MA2'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1734,7 +1734,7 @@ { "index": 171, "count": 1, - "names": ['ID_Visi_Enlt_MZ2', 'Unknown_Visibility_171'], + "names": ['ID_Visi_Enlt_MZ2'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1744,7 +1744,7 @@ { "index": 172, "count": 1, - "names": ['ID_Visi_Enlt_SUP', 'Unknown_Visibility_172'], + "names": ['ID_Visi_Enlt_SUP'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1754,7 +1754,7 @@ { "index": 173, "count": 1, - "names": ['ID_Visi_Enlt_SLP', 'Unknown_Visibility_173'], + "names": ['ID_Visi_Enlt_SLP'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1764,7 +1764,7 @@ { "index": 174, "count": 1, - "names": ['ID_Visi_Enlt_FP2', 'Unknown_Visibility_174'], + "names": ['ID_Visi_Enlt_FP2'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1774,7 +1774,7 @@ { "index": 175, "count": 1, - "names": ['ID_Visi_Enlt_Laufzeit', 'Unknown_Visibility_175'], + "names": ['ID_Visi_Enlt_Laufzeit'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1784,7 +1784,7 @@ { "index": 176, "count": 1, - "names": ['ID_Visi_Anlgkonf_Heizung', 'Unknown_Visibility_176'], + "names": ['ID_Visi_Anlgkonf_Heizung'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1794,7 +1794,7 @@ { "index": 177, "count": 1, - "names": ['ID_Visi_Anlgkonf_Brauchwarmwasser', 'Unknown_Visibility_177'], + "names": ['ID_Visi_Anlgkonf_Brauchwarmwasser'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1804,7 +1804,7 @@ { "index": 178, "count": 1, - "names": ['ID_Visi_Anlgkonf_Schwimmbad', 'Unknown_Visibility_178'], + "names": ['ID_Visi_Anlgkonf_Schwimmbad'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1814,7 +1814,7 @@ { "index": 179, "count": 1, - "names": ['ID_Visi_Heizung_Betriebsart', 'Unknown_Visibility_179'], + "names": ['ID_Visi_Heizung_Betriebsart'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1824,7 +1824,7 @@ { "index": 180, "count": 1, - "names": ['ID_Visi_Heizung_TemperaturPlusMinus', 'Unknown_Visibility_180'], + "names": ['ID_Visi_Heizung_TemperaturPlusMinus'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1834,7 +1834,7 @@ { "index": 181, "count": 1, - "names": ['ID_Visi_Heizung_Heizkurven', 'Unknown_Visibility_181'], + "names": ['ID_Visi_Heizung_Heizkurven'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1844,7 +1844,7 @@ { "index": 182, "count": 1, - "names": ['ID_Visi_Heizung_Zeitschaltprogramm', 'ID_Visi_Heizung_Zeitschlaltprogramm', 'Unknown_Visibility_182'], + "names": ['ID_Visi_Heizung_Zeitschaltprogramm', 'ID_Visi_Heizung_Zeitschlaltprogramm'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1854,7 +1854,7 @@ { "index": 183, "count": 1, - "names": ['ID_Visi_Heizung_Heizgrenze', 'Unknown_Visibility_183'], + "names": ['ID_Visi_Heizung_Heizgrenze'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1864,7 +1864,7 @@ { "index": 184, "count": 1, - "names": ['ID_Visi_Mitteltemperatur', 'Unknown_Visibility_184'], + "names": ['ID_Visi_Mitteltemperatur'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1874,7 +1874,7 @@ { "index": 185, "count": 1, - "names": ['ID_Visi_Dataenlogger', 'Unknown_Visibility_185'], + "names": ['ID_Visi_Dataenlogger'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1884,7 +1884,7 @@ { "index": 186, "count": 1, - "names": ['ID_Visi_Sprachen_DEUTSCH', 'Unknown_Visibility_186'], + "names": ['ID_Visi_Sprachen_DEUTSCH'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1894,7 +1894,7 @@ { "index": 187, "count": 1, - "names": ['ID_Visi_Sprachen_ENGLISH', 'Unknown_Visibility_187'], + "names": ['ID_Visi_Sprachen_ENGLISH'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1904,7 +1904,7 @@ { "index": 188, "count": 1, - "names": ['ID_Visi_Sprachen_FRANCAIS', 'Unknown_Visibility_188'], + "names": ['ID_Visi_Sprachen_FRANCAIS'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1914,7 +1914,7 @@ { "index": 189, "count": 1, - "names": ['ID_Visi_Sprachen_NORWAY', 'Unknown_Visibility_189'], + "names": ['ID_Visi_Sprachen_NORWAY'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1924,7 +1924,7 @@ { "index": 190, "count": 1, - "names": ['ID_Visi_Sprachen_TCHECH', 'Unknown_Visibility_190'], + "names": ['ID_Visi_Sprachen_TCHECH'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1934,7 +1934,7 @@ { "index": 191, "count": 1, - "names": ['ID_Visi_Sprachen_ITALIANO', 'Unknown_Visibility_191'], + "names": ['ID_Visi_Sprachen_ITALIANO'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1944,7 +1944,7 @@ { "index": 192, "count": 1, - "names": ['ID_Visi_Sprachen_NEDERLANDS', 'Unknown_Visibility_192'], + "names": ['ID_Visi_Sprachen_NEDERLANDS'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1954,7 +1954,7 @@ { "index": 193, "count": 1, - "names": ['ID_Visi_Sprachen_SVENSKA', 'Unknown_Visibility_193'], + "names": ['ID_Visi_Sprachen_SVENSKA'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1964,7 +1964,7 @@ { "index": 194, "count": 1, - "names": ['ID_Visi_Sprachen_POLSKI', 'Unknown_Visibility_194'], + "names": ['ID_Visi_Sprachen_POLSKI'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1974,7 +1974,7 @@ { "index": 195, "count": 1, - "names": ['ID_Visi_Sprachen_MAGYARUL', 'Unknown_Visibility_195'], + "names": ['ID_Visi_Sprachen_MAGYARUL'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1984,7 +1984,7 @@ { "index": 196, "count": 1, - "names": ['ID_Visi_ErrorUSBspeichern', 'Unknown_Visibility_196'], + "names": ['ID_Visi_ErrorUSBspeichern'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1994,7 +1994,7 @@ { "index": 197, "count": 1, - "names": ['ID_Visi_Bst_BStdHz', 'Unknown_Visibility_197'], + "names": ['ID_Visi_Bst_BStdHz'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2004,7 +2004,7 @@ { "index": 198, "count": 1, - "names": ['ID_Visi_Bst_BStdBW', 'Unknown_Visibility_198'], + "names": ['ID_Visi_Bst_BStdBW'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2014,7 +2014,7 @@ { "index": 199, "count": 1, - "names": ['ID_Visi_Bst_BStdKue', 'Unknown_Visibility_199'], + "names": ['ID_Visi_Bst_BStdKue'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2024,7 +2024,7 @@ { "index": 200, "count": 1, - "names": ['ID_Visi_Service_Systemsteuerung', 'Unknown_Visibility_200'], + "names": ['ID_Visi_Service_Systemsteuerung'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2034,7 +2034,7 @@ { "index": 201, "count": 1, - "names": ['ID_Visi_Service_Systemsteuerung_Contrast', 'Unknown_Visibility_201'], + "names": ['ID_Visi_Service_Systemsteuerung_Contrast'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2044,7 +2044,7 @@ { "index": 202, "count": 1, - "names": ['ID_Visi_Service_Systemsteuerung_Webserver', 'Unknown_Visibility_202'], + "names": ['ID_Visi_Service_Systemsteuerung_Webserver'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2054,7 +2054,7 @@ { "index": 203, "count": 1, - "names": ['ID_Visi_Service_Systemsteuerung_IPAdresse', 'Unknown_Visibility_203'], + "names": ['ID_Visi_Service_Systemsteuerung_IPAdresse'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2064,7 +2064,7 @@ { "index": 204, "count": 1, - "names": ['ID_Visi_Service_Systemsteuerung_Fernwartung', 'Unknown_Visibility_204'], + "names": ['ID_Visi_Service_Systemsteuerung_Fernwartung'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2074,7 +2074,7 @@ { "index": 205, "count": 1, - "names": ['ID_Visi_Paralleleschaltung', 'Unknown_Visibility_205'], + "names": ['ID_Visi_Paralleleschaltung'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2084,7 +2084,7 @@ { "index": 206, "count": 1, - "names": ['ID_Visi_SysEin_Paralleleschaltung', 'Unknown_Visibility_206'], + "names": ['ID_Visi_SysEin_Paralleleschaltung'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2094,7 +2094,7 @@ { "index": 207, "count": 1, - "names": ['ID_Visi_Sprachen_DANSK', 'Unknown_Visibility_207'], + "names": ['ID_Visi_Sprachen_DANSK'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2104,7 +2104,7 @@ { "index": 208, "count": 1, - "names": ['ID_Visi_Sprachen_PORTUGES', 'Unknown_Visibility_208'], + "names": ['ID_Visi_Sprachen_PORTUGES'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2114,7 +2114,7 @@ { "index": 209, "count": 1, - "names": ['ID_Visi_Heizkurve_Heizung', 'Unknown_Visibility_209'], + "names": ['ID_Visi_Heizkurve_Heizung'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2124,7 +2124,7 @@ { "index": 210, "count": 1, - "names": ['ID_Visi_SysEin_Mischkreis3', 'Unknown_Visibility_210'], + "names": ['ID_Visi_SysEin_Mischkreis3'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2134,7 +2134,7 @@ { "index": 211, "count": 1, - "names": ['ID_Visi_MK3', 'Unknown_Visibility_211'], + "names": ['ID_Visi_MK3'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2144,7 +2144,7 @@ { "index": 212, "count": 1, - "names": ['ID_Visi_Temp_MK3_Vorlauf', 'Unknown_Visibility_212'], + "names": ['ID_Visi_Temp_MK3_Vorlauf'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2154,7 +2154,7 @@ { "index": 213, "count": 1, - "names": ['ID_Visi_Temp_MK3VL_Soll', 'Unknown_Visibility_213'], + "names": ['ID_Visi_Temp_MK3VL_Soll'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2164,7 +2164,7 @@ { "index": 214, "count": 1, - "names": ['ID_Visi_OUT_Mischer3Auf', 'Unknown_Visibility_214'], + "names": ['ID_Visi_OUT_Mischer3Auf'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2174,7 +2174,7 @@ { "index": 215, "count": 1, - "names": ['ID_Visi_OUT_Mischer3Zu', 'Unknown_Visibility_215'], + "names": ['ID_Visi_OUT_Mischer3Zu'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2184,7 +2184,7 @@ { "index": 216, "count": 1, - "names": ['ID_Visi_SysEin_RegelungMK3', 'Unknown_Visibility_216'], + "names": ['ID_Visi_SysEin_RegelungMK3'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2194,7 +2194,7 @@ { "index": 217, "count": 1, - "names": ['ID_Visi_SysEin_PeriodeMk3', 'Unknown_Visibility_217'], + "names": ['ID_Visi_SysEin_PeriodeMk3'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2204,7 +2204,7 @@ { "index": 218, "count": 1, - "names": ['ID_Visi_SysEin_LaufzeitMk3', 'Unknown_Visibility_218'], + "names": ['ID_Visi_SysEin_LaufzeitMk3'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2214,7 +2214,7 @@ { "index": 219, "count": 1, - "names": ['ID_Visi_SysEin_Kuhl_Zeit_Ein', 'Unknown_Visibility_219'], + "names": ['ID_Visi_SysEin_Kuhl_Zeit_Ein'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2224,7 +2224,7 @@ { "index": 220, "count": 1, - "names": ['ID_Visi_SysEin_Kuhl_Zeit_Aus', 'Unknown_Visibility_220'], + "names": ['ID_Visi_SysEin_Kuhl_Zeit_Aus'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2234,7 +2234,7 @@ { "index": 221, "count": 1, - "names": ['ID_Visi_AblaufZ_AbtauIn', 'Unknown_Visibility_221'], + "names": ['ID_Visi_AblaufZ_AbtauIn'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2244,7 +2244,7 @@ { "index": 222, "count": 1, - "names": ['ID_Visi_Waermemenge_WS', 'Unknown_Visibility_222'], + "names": ['ID_Visi_Waermemenge_WS'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2254,7 +2254,7 @@ { "index": 223, "count": 1, - "names": ['ID_Visi_Waermemenge_WQ', 'Unknown_Visibility_223'], + "names": ['ID_Visi_Waermemenge_WQ'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2264,7 +2264,7 @@ { "index": 224, "count": 1, - "names": ['ID_Visi_Enlt_MA3', 'Unknown_Visibility_224'], + "names": ['ID_Visi_Enlt_MA3'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2274,7 +2274,7 @@ { "index": 225, "count": 1, - "names": ['ID_Visi_Enlt_MZ3', 'Unknown_Visibility_225'], + "names": ['ID_Visi_Enlt_MZ3'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2284,7 +2284,7 @@ { "index": 226, "count": 1, - "names": ['ID_Visi_Enlt_FP3', 'Unknown_Visibility_226'], + "names": ['ID_Visi_Enlt_FP3'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2294,7 +2294,7 @@ { "index": 227, "count": 1, - "names": ['ID_Visi_OUT_FUP3', 'Unknown_Visibility_227'], + "names": ['ID_Visi_OUT_FUP3'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2304,7 +2304,7 @@ { "index": 228, "count": 1, - "names": ['ID_Visi_Temp_Raumstation2', 'Unknown_Visibility_228'], + "names": ['ID_Visi_Temp_Raumstation2'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2314,7 +2314,7 @@ { "index": 229, "count": 1, - "names": ['ID_Visi_Temp_Raumstation3', 'Unknown_Visibility_229'], + "names": ['ID_Visi_Temp_Raumstation3'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2324,7 +2324,7 @@ { "index": 230, "count": 1, - "names": ['ID_Visi_Bst_BStdSW', 'Unknown_Visibility_230'], + "names": ['ID_Visi_Bst_BStdSW'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2334,7 +2334,7 @@ { "index": 231, "count": 1, - "names": ['ID_Visi_Sprachen_LITAUISCH', 'Unknown_Visibility_231'], + "names": ['ID_Visi_Sprachen_LITAUISCH'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2344,7 +2344,7 @@ { "index": 232, "count": 1, - "names": ['ID_Visi_Sprachen_ESTNICH', 'Unknown_Visibility_232'], + "names": ['ID_Visi_Sprachen_ESTNICH'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2354,7 +2354,7 @@ { "index": 233, "count": 1, - "names": ['ID_Visi_SysEin_Fernwartung', 'Unknown_Visibility_233'], + "names": ['ID_Visi_SysEin_Fernwartung'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2364,7 +2364,7 @@ { "index": 234, "count": 1, - "names": ['ID_Visi_Sprachen_SLOVENISCH', 'Unknown_Visibility_234'], + "names": ['ID_Visi_Sprachen_SLOVENISCH'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2374,7 +2374,7 @@ { "index": 235, "count": 1, - "names": ['ID_Visi_EinstTemp_TA_EG', 'Unknown_Visibility_235'], + "names": ['ID_Visi_EinstTemp_TA_EG'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2384,7 +2384,7 @@ { "index": 236, "count": 1, - "names": ['ID_Visi_Einst_TVLmax_EG', 'Unknown_Visibility_236'], + "names": ['ID_Visi_Einst_TVLmax_EG'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2394,7 +2394,7 @@ { "index": 237, "count": 1, - "names": ['ID_Visi_SysEin_PoptNachlauf', 'Unknown_Visibility_237'], + "names": ['ID_Visi_SysEin_PoptNachlauf'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2404,7 +2404,7 @@ { "index": 238, "count": 1, - "names": ['ID_Visi_RFV_K_Kuehlin', 'Unknown_Visibility_238'], + "names": ['ID_Visi_RFV_K_Kuehlin'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2414,7 +2414,7 @@ { "index": 239, "count": 1, - "names": ['ID_Visi_SysEin_EffizienzpumpeNom', 'Unknown_Visibility_239'], + "names": ['ID_Visi_SysEin_EffizienzpumpeNom'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2424,7 +2424,7 @@ { "index": 240, "count": 1, - "names": ['ID_Visi_SysEin_EffizienzpumpeMin', 'Unknown_Visibility_240'], + "names": ['ID_Visi_SysEin_EffizienzpumpeMin'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2434,7 +2434,7 @@ { "index": 241, "count": 1, - "names": ['ID_Visi_SysEin_Effizienzpumpe', 'Unknown_Visibility_241'], + "names": ['ID_Visi_SysEin_Effizienzpumpe'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2444,7 +2444,7 @@ { "index": 242, "count": 1, - "names": ['ID_Visi_SysEin_Waermemenge', 'Unknown_Visibility_242'], + "names": ['ID_Visi_SysEin_Waermemenge'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2454,7 +2454,7 @@ { "index": 243, "count": 1, - "names": ['ID_Visi_Service_WMZ_Effizienz', 'Unknown_Visibility_243'], + "names": ['ID_Visi_Service_WMZ_Effizienz'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2464,7 +2464,7 @@ { "index": 244, "count": 1, - "names": ['ID_Visi_SysEin_Wm_Versorgung_Korrektur', 'Unknown_Visibility_244'], + "names": ['ID_Visi_SysEin_Wm_Versorgung_Korrektur'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2474,7 +2474,7 @@ { "index": 245, "count": 1, - "names": ['ID_Visi_SysEin_Wm_Auswertung_Korrektur', 'Unknown_Visibility_245'], + "names": ['ID_Visi_SysEin_Wm_Auswertung_Korrektur'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2484,7 +2484,7 @@ { "index": 246, "count": 1, - "names": ['ID_Visi_IN_AnalogIn', 'Unknown_Visibility_246'], + "names": ['ID_Visi_IN_AnalogIn'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2494,7 +2494,7 @@ { "index": 247, "count": 1, - "names": ['ID_Visi_Eins_SN_Eingabe', 'Unknown_Visibility_247'], + "names": ['ID_Visi_Eins_SN_Eingabe'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2504,7 +2504,7 @@ { "index": 248, "count": 1, - "names": ['ID_Visi_OUT_Analog_1', 'Unknown_Visibility_248'], + "names": ['ID_Visi_OUT_Analog_1'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2514,7 +2514,7 @@ { "index": 249, "count": 1, - "names": ['ID_Visi_OUT_Analog_2', 'Unknown_Visibility_249'], + "names": ['ID_Visi_OUT_Analog_2'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2524,7 +2524,7 @@ { "index": 250, "count": 1, - "names": ['ID_Visi_Solar', 'Unknown_Visibility_250'], + "names": ['ID_Visi_Solar'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2534,7 +2534,7 @@ { "index": 251, "count": 1, - "names": ['ID_Visi_SysEin_Solar', 'Unknown_Visibility_251'], + "names": ['ID_Visi_SysEin_Solar'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2544,7 +2544,7 @@ { "index": 252, "count": 1, - "names": ['ID_Visi_EinstTemp_TDiffKollmax', 'Unknown_Visibility_252'], + "names": ['ID_Visi_EinstTemp_TDiffKollmax'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2554,7 +2554,7 @@ { "index": 253, "count": 1, - "names": ['ID_Visi_AblaufZ_HG_Sperre', 'Unknown_Visibility_253'], + "names": ['ID_Visi_AblaufZ_HG_Sperre'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2564,7 +2564,7 @@ { "index": 254, "count": 1, - "names": ['ID_Visi_SysEin_Akt_Kuehlung', 'Unknown_Visibility_254'], + "names": ['ID_Visi_SysEin_Akt_Kuehlung'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2574,7 +2574,7 @@ { "index": 255, "count": 1, - "names": ['ID_Visi_SysEin_Vorlauf_VBO', 'Unknown_Visibility_255'], + "names": ['ID_Visi_SysEin_Vorlauf_VBO'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2584,7 +2584,7 @@ { "index": 256, "count": 1, - "names": ['ID_Visi_Einst_KRHyst', 'Unknown_Visibility_256'], + "names": ['ID_Visi_Einst_KRHyst'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2594,7 +2594,7 @@ { "index": 257, "count": 1, - "names": ['ID_Visi_Einst_Akt_Kuehl_Speicher_min', 'Unknown_Visibility_257'], + "names": ['ID_Visi_Einst_Akt_Kuehl_Speicher_min'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2604,7 +2604,7 @@ { "index": 258, "count": 1, - "names": ['ID_Visi_Einst_Akt_Kuehl_Freig_WQE', 'Unknown_Visibility_258'], + "names": ['ID_Visi_Einst_Akt_Kuehl_Freig_WQE'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2614,7 +2614,7 @@ { "index": 259, "count": 1, - "names": ['ID_Visi_SysEin_AbtZykMin', 'Unknown_Visibility_259'], + "names": ['ID_Visi_SysEin_AbtZykMin'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2624,7 +2624,7 @@ { "index": 260, "count": 1, - "names": ['ID_Visi_SysEin_VD2_Zeit_Min', 'Unknown_Visibility_260'], + "names": ['ID_Visi_SysEin_VD2_Zeit_Min'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2634,7 +2634,7 @@ { "index": 261, "count": 1, - "names": ['ID_Visi_EinstTemp_Hysterese_HR_verkuerzt', 'Unknown_Visibility_261'], + "names": ['ID_Visi_EinstTemp_Hysterese_HR_verkuerzt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2644,7 +2644,7 @@ { "index": 262, "count": 1, - "names": ['ID_Visi_Einst_Luf_Feuchteschutz_akt', 'Unknown_Visibility_262'], + "names": ['ID_Visi_Einst_Luf_Feuchteschutz_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2654,7 +2654,7 @@ { "index": 263, "count": 1, - "names": ['ID_Visi_Einst_Luf_Reduziert_akt', 'Unknown_Visibility_263'], + "names": ['ID_Visi_Einst_Luf_Reduziert_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2664,7 +2664,7 @@ { "index": 264, "count": 1, - "names": ['ID_Visi_Einst_Luf_Nennlueftung_akt', 'Unknown_Visibility_264'], + "names": ['ID_Visi_Einst_Luf_Nennlueftung_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2674,7 +2674,7 @@ { "index": 265, "count": 1, - "names": ['ID_Visi_Einst_Luf_Intensivlueftung_akt', 'Unknown_Visibility_265'], + "names": ['ID_Visi_Einst_Luf_Intensivlueftung_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2684,7 +2684,7 @@ { "index": 266, "count": 1, - "names": ['ID_Visi_Temperatur_Lueftung_Zuluft', 'Unknown_Visibility_266'], + "names": ['ID_Visi_Temperatur_Lueftung_Zuluft'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2694,7 +2694,7 @@ { "index": 267, "count": 1, - "names": ['ID_Visi_Temperatur_Lueftung_Abluft', 'Unknown_Visibility_267'], + "names": ['ID_Visi_Temperatur_Lueftung_Abluft'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2704,7 +2704,7 @@ { "index": 268, "count": 1, - "names": ['ID_Visi_OUT_Analog_3', 'Unknown_Visibility_268'], + "names": ['ID_Visi_OUT_Analog_3'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2714,7 +2714,7 @@ { "index": 269, "count": 1, - "names": ['ID_Visi_OUT_Analog_4', 'Unknown_Visibility_269'], + "names": ['ID_Visi_OUT_Analog_4'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2724,7 +2724,7 @@ { "index": 270, "count": 1, - "names": ['ID_Visi_IN_Analog_2', 'Unknown_Visibility_270'], + "names": ['ID_Visi_IN_Analog_2'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2734,7 +2734,7 @@ { "index": 271, "count": 1, - "names": ['ID_Visi_IN_Analog_3', 'Unknown_Visibility_271'], + "names": ['ID_Visi_IN_Analog_3'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2744,7 +2744,7 @@ { "index": 272, "count": 1, - "names": ['ID_Visi_IN_SAX', 'Unknown_Visibility_272'], + "names": ['ID_Visi_IN_SAX'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2754,7 +2754,7 @@ { "index": 273, "count": 1, - "names": ['ID_Visi_OUT_VZU', 'Unknown_Visibility_273'], + "names": ['ID_Visi_OUT_VZU'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2764,7 +2764,7 @@ { "index": 274, "count": 1, - "names": ['ID_Visi_OUT_VAB', 'Unknown_Visibility_274'], + "names": ['ID_Visi_OUT_VAB'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2774,7 +2774,7 @@ { "index": 275, "count": 1, - "names": ['ID_Visi_OUT_VSK', 'Unknown_Visibility_275'], + "names": ['ID_Visi_OUT_VSK'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2784,7 +2784,7 @@ { "index": 276, "count": 1, - "names": ['ID_Visi_OUT_FRH', 'Unknown_Visibility_276'], + "names": ['ID_Visi_OUT_FRH'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2794,7 +2794,7 @@ { "index": 277, "count": 1, - "names": ['ID_Visi_KuhlTemp_SolltempMK3', 'Unknown_Visibility_277'], + "names": ['ID_Visi_KuhlTemp_SolltempMK3'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2804,7 +2804,7 @@ { "index": 278, "count": 1, - "names": ['ID_Visi_KuhlTemp_ATDiffMK3', 'Unknown_Visibility_278'], + "names": ['ID_Visi_KuhlTemp_ATDiffMK3'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2814,7 +2814,7 @@ { "index": 279, "count": 1, - "names": ['ID_Visi_IN_SPL', 'Unknown_Visibility_279'], + "names": ['ID_Visi_IN_SPL'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2824,7 +2824,7 @@ { "index": 280, "count": 1, - "names": ['ID_Visi_SysEin_Lueftungsstufen', 'Unknown_Visibility_280'], + "names": ['ID_Visi_SysEin_Lueftungsstufen'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2834,7 +2834,7 @@ { "index": 281, "count": 1, - "names": ['ID_Visi_SysEin_Meldung_TDI', 'Unknown_Visibility_281'], + "names": ['ID_Visi_SysEin_Meldung_TDI'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2844,7 +2844,7 @@ { "index": 282, "count": 1, - "names": ['ID_Visi_SysEin_Typ_WZW', 'Unknown_Visibility_282'], + "names": ['ID_Visi_SysEin_Typ_WZW'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2854,7 +2854,7 @@ { "index": 283, "count": 1, - "names": ['ID_Visi_BACnet', 'Unknown_Visibility_283'], + "names": ['ID_Visi_BACnet'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2864,7 +2864,7 @@ { "index": 284, "count": 1, - "names": ['ID_Visi_Sprachen_SLOWAKISCH', 'Unknown_Visibility_284'], + "names": ['ID_Visi_Sprachen_SLOWAKISCH'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2874,7 +2874,7 @@ { "index": 285, "count": 1, - "names": ['ID_Visi_Sprachen_LETTISCH', 'Unknown_Visibility_285'], + "names": ['ID_Visi_Sprachen_LETTISCH'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2884,7 +2884,7 @@ { "index": 286, "count": 1, - "names": ['ID_Visi_Sprachen_FINNISCH', 'Unknown_Visibility_286'], + "names": ['ID_Visi_Sprachen_FINNISCH'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2894,7 +2894,7 @@ { "index": 287, "count": 1, - "names": ['ID_Visi_Kalibrierung_LWD', 'Unknown_Visibility_287'], + "names": ['ID_Visi_Kalibrierung_LWD'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2904,7 +2904,7 @@ { "index": 288, "count": 1, - "names": ['ID_Visi_IN_Durchfluss', 'Unknown_Visibility_288'], + "names": ['ID_Visi_IN_Durchfluss'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2914,7 +2914,7 @@ { "index": 289, "count": 1, - "names": ['ID_Visi_LIN_ANSAUG_VERDICHTER', 'Unknown_Visibility_289'], + "names": ['ID_Visi_LIN_ANSAUG_VERDICHTER'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2924,7 +2924,7 @@ { "index": 290, "count": 1, - "names": ['ID_Visi_LIN_VDH', 'Unknown_Visibility_290'], + "names": ['ID_Visi_LIN_VDH'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2934,7 +2934,7 @@ { "index": 291, "count": 1, - "names": ['ID_Visi_LIN_UH', 'Unknown_Visibility_291'], + "names": ['ID_Visi_LIN_UH'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2944,7 +2944,7 @@ { "index": 292, "count": 1, - "names": ['ID_Visi_LIN_Druck', 'Unknown_Visibility_292'], + "names": ['ID_Visi_LIN_Druck'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2954,7 +2954,7 @@ { "index": 293, "count": 1, - "names": ['ID_Visi_Einst_Sollwert_TRL_Kuehlen', 'Unknown_Visibility_293'], + "names": ['ID_Visi_Einst_Sollwert_TRL_Kuehlen'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2964,7 +2964,7 @@ { "index": 294, "count": 1, - "names": ['ID_Visi_Entl_ExVentil', 'Unknown_Visibility_294'], + "names": ['ID_Visi_Entl_ExVentil'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2974,7 +2974,7 @@ { "index": 295, "count": 1, - "names": ['ID_Visi_Einst_Medium_Waermequelle', 'Unknown_Visibility_295'], + "names": ['ID_Visi_Einst_Medium_Waermequelle'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2984,7 +2984,7 @@ { "index": 296, "count": 1, - "names": ['ID_Visi_Einst_Multispeicher', 'Unknown_Visibility_296'], + "names": ['ID_Visi_Einst_Multispeicher'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -2994,7 +2994,7 @@ { "index": 297, "count": 1, - "names": ['ID_Visi_Einst_Minimale_Ruecklaufsolltemperatur', 'Unknown_Visibility_297'], + "names": ['ID_Visi_Einst_Minimale_Ruecklaufsolltemperatur'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -3004,7 +3004,7 @@ { "index": 298, "count": 1, - "names": ['ID_Visi_Einst_PKuehlTime', 'Unknown_Visibility_298'], + "names": ['ID_Visi_Einst_PKuehlTime'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -3014,7 +3014,7 @@ { "index": 299, "count": 1, - "names": ['ID_Visi_Sprachen_TUERKISCH', 'Unknown_Visibility_299'], + "names": ['ID_Visi_Sprachen_TUERKISCH'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -3024,7 +3024,7 @@ { "index": 300, "count": 1, - "names": ['ID_Visi_RBE', 'Unknown_Visibility_300'], + "names": ['ID_Visi_RBE'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -3034,7 +3034,7 @@ { "index": 301, "count": 1, - "names": ['ID_Visi_Einst_Luf_Stufen_Faktor', 'Unknown_Visibility_301'], + "names": ['ID_Visi_Einst_Luf_Stufen_Faktor'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -3044,7 +3044,7 @@ { "index": 302, "count": 1, - "names": ['ID_Visi_Freigabe_Zeit_ZWE', 'Unknown_Visibility_302'], + "names": ['ID_Visi_Freigabe_Zeit_ZWE'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -3054,7 +3054,7 @@ { "index": 303, "count": 1, - "names": ['ID_Visi_Einst_min_VL_Kuehl', 'Unknown_Visibility_303'], + "names": ['ID_Visi_Einst_min_VL_Kuehl'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -3064,7 +3064,7 @@ { "index": 304, "count": 1, - "names": ['ID_Visi_ZWE1', 'Unknown_Visibility_304'], + "names": ['ID_Visi_ZWE1'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -3074,7 +3074,7 @@ { "index": 305, "count": 1, - "names": ['ID_Visi_ZWE2', 'Unknown_Visibility_305'], + "names": ['ID_Visi_ZWE2'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -3084,7 +3084,7 @@ { "index": 306, "count": 1, - "names": ['ID_Visi_ZWE3', 'Unknown_Visibility_306'], + "names": ['ID_Visi_ZWE3'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -3094,7 +3094,7 @@ { "index": 307, "count": 1, - "names": ['ID_Visi_SEC', 'Unknown_Visibility_307'], + "names": ['ID_Visi_SEC'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -3104,7 +3104,7 @@ { "index": 308, "count": 1, - "names": ['ID_Visi_HZIO', 'Unknown_Visibility_308'], + "names": ['ID_Visi_HZIO'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -3114,7 +3114,7 @@ { "index": 309, "count": 1, - "names": ['ID_Visi_WPIO', 'Unknown_Visibility_309'], + "names": ['ID_Visi_WPIO'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -3124,7 +3124,7 @@ { "index": 310, "count": 1, - "names": ['ID_Visi_LIN_ANSAUG_VERDAMPFER', 'Unknown_Visibility_310'], + "names": ['ID_Visi_LIN_ANSAUG_VERDAMPFER'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -3134,7 +3134,7 @@ { "index": 311, "count": 1, - "names": ['ID_Visi_LIN_MULTI1', 'Unknown_Visibility_311'], + "names": ['ID_Visi_LIN_MULTI1'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -3144,7 +3144,7 @@ { "index": 312, "count": 1, - "names": ['ID_Visi_LIN_MULTI2', 'Unknown_Visibility_312'], + "names": ['ID_Visi_LIN_MULTI2'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -3154,7 +3154,7 @@ { "index": 313, "count": 1, - "names": ['ID_Visi_Einst_Leistung_ZWE', 'Unknown_Visibility_313'], + "names": ['ID_Visi_Einst_Leistung_ZWE'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -3164,7 +3164,7 @@ { "index": 314, "count": 1, - "names": ['ID_Visi_Sprachen_ESPANOL', 'Unknown_Visibility_314'], + "names": ['ID_Visi_Sprachen_ESPANOL'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -3174,7 +3174,7 @@ { "index": 315, "count": 1, - "names": ['ID_Visi_Temp_BW_oben', 'Unknown_Visibility_315'], + "names": ['ID_Visi_Temp_BW_oben'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -3184,7 +3184,7 @@ { "index": 316, "count": 1, - "names": ['ID_Visi_MAXIO', 'Unknown_Visibility_316'], + "names": ['ID_Visi_MAXIO'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -3194,7 +3194,7 @@ { "index": 317, "count": 1, - "names": ['ID_Visi_OUT_Abtauwunsch', 'Unknown_Visibility_317'], + "names": ['ID_Visi_OUT_Abtauwunsch'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -3204,7 +3204,7 @@ { "index": 318, "count": 1, - "names": ['ID_Visi_SmartGrid', 'Unknown_Visibility_318'], + "names": ['ID_Visi_SmartGrid'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -3214,7 +3214,7 @@ { "index": 319, "count": 1, - "names": ['ID_Visi_Drehzahlgeregelt', 'Unknown_Visibility_319'], + "names": ['ID_Visi_Drehzahlgeregelt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -3224,7 +3224,7 @@ { "index": 320, "count": 1, - "names": ['ID_Visi_P155_Inverter', 'Unknown_Visibility_320'], + "names": ['ID_Visi_P155_Inverter'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -3234,7 +3234,7 @@ { "index": 321, "count": 1, - "names": ['ID_Visi_Leistungsfreigabe', 'Unknown_Visibility_321'], + "names": ['ID_Visi_Leistungsfreigabe'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -3244,7 +3244,7 @@ { "index": 322, "count": 1, - "names": ['ID_Visi_Einst_Vorl_akt_Kuehl', 'Unknown_Visibility_322'], + "names": ['ID_Visi_Einst_Vorl_akt_Kuehl'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -3254,7 +3254,7 @@ { "index": 323, "count": 1, - "names": ['ID_Visi_Einst_Abtauen_im_Warmwasser', 'Unknown_Visibility_323'], + "names": ['ID_Visi_Einst_Abtauen_im_Warmwasser'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -3264,7 +3264,7 @@ { "index": 324, "count": 1, - "names": ['ID_Visi_Waermemenge_ZWE', 'Unknown_Visibility_324'], + "names": ['ID_Visi_Waermemenge_ZWE'], "type": Unknown, "writeable": False, "datatype": 'UINT32', diff --git a/tests/test_LuxtronikData.py b/tests/test_LuxtronikData.py index bb327e13..39ca2e52 100644 --- a/tests/test_LuxtronikData.py +++ b/tests/test_LuxtronikData.py @@ -68,8 +68,8 @@ def test_get_firmware_version(self): ("para", 1106, ["ID_Einst_SilenceTimer_13", "Unknown_Parameter_1106"]), ("para", 1109, ["ID_Einst_SilenceTimer_16", "Unknown_Parameter_1109"]), ("calc", 232, ["Vapourisation_Temperature", "Unknown_Calculation_232"]), - ("calc", 241, ["HUP_PWM", "Circulation_Pump", "Unknown_Calculation_241"]), - ("visi", 182, ["ID_Visi_Heizung_Zeitschaltprogramm", "ID_Visi_Heizung_Zeitschlaltprogramm", "Unknown_Visibility_182"]), + ("calc", 241, ["HUP_PWM", "Circulation_Pump"]), + ("visi", 182, ["ID_Visi_Heizung_Zeitschaltprogramm", "ID_Visi_Heizung_Zeitschlaltprogramm"]), ("visi", 326, ["Unknown_Visibility_326"]), ]) def test_obsolete(self, vector, index, names): From dd736cab6dd8eb87cbd7065ad9efae065c5261b1 Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Wed, 4 Feb 2026 21:47:24 +0100 Subject: [PATCH 08/68] Also check if all alternative names are added to the compatibility test dictionary --- tests/test_compatibility.py | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/tests/test_compatibility.py b/tests/test_compatibility.py index 963c1799..4a0f80c3 100644 --- a/tests/test_compatibility.py +++ b/tests/test_compatibility.py @@ -1204,7 +1204,9 @@ def test_compatibilities(self): "Unknown_Parameter_1155": 1155, "Unknown_Parameter_1156": 1156, "Unknown_Parameter_1157": 1157, + "Unknown_Parameter_1158": 1158, "POWER_LIMIT_SWITCH": 1158, + "Unknown_Parameter_1159": 1159, "POWER_LIMIT_VALUE": 1159, } @@ -1911,11 +1913,11 @@ def test_compatibilities(self): # First, we check if we can find all entries of the above dicts. ok = True - for mapping, obj, caption in values: + for mapping, data_vector, caption in values: print_caption = True for old_name, old_idx in mapping.items(): - cur_idx, new_name = obj._name_lookup(old_name) - cur_name = obj.get(old_idx).name + cur_idx, new_name = data_vector._name_lookup(old_name) + cur_name = data_vector.get(old_idx).name if cur_idx != old_idx or (new_name is not None and new_name != cur_name): # We do not use assert here, in order to catch all incompatibilities at once. if print_caption: @@ -1927,15 +1929,16 @@ def test_compatibilities(self): # Second, we check if all names are present in the above dicts. ok = True - for mapping, obj, caption in values: + for mapping, data_vector, caption in values: print_caption = True - for cur_idx, entry in obj: - if entry.name not in mapping: - # We do not use assert here, in order to catch all incompatibilities at once. - # The output can be copied to the dicts above - if print_caption: - print(f"### Missing - {caption}:") - print_caption = False - print(f'"{entry.name}": {cur_idx},') - ok = False - assert ok, f"Found missing {obj.name}. Please consider to add them to the test suite." \ No newline at end of file + for definition in data_vector.definitions: + for name in definition.names: + if name not in mapping: + # We do not use assert here, in order to catch all incompatibilities at once. + # The output can be copied to the dicts above + if print_caption: + print(f"### Missing - {caption}:") + print_caption = False + print(f'"{name}": {definition.index},') + ok = False + assert ok, "Found missing entries. Please consider to add them to the test suite." \ No newline at end of file From 10086a47d29ddc8d198c0479d5c5901a2489f745 Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Tue, 20 Jan 2026 20:22:23 +0100 Subject: [PATCH 09/68] wip --- README.md | 4 +- luxtronik/cfi/calculations.py | 9 +- luxtronik/cfi/interface.py | 36 +- luxtronik/cfi/parameters.py | 28 +- luxtronik/cfi/visibilities.py | 4 +- luxtronik/constants.py | 4 + luxtronik/data_vector.py | 607 ++++++++++++++++++++++++++---- luxtronik/definitions/__init__.py | 52 +-- luxtronik/shi/contiguous.py | 7 +- luxtronik/shi/interface.py | 9 +- luxtronik/shi/vector.py | 198 +--------- tests/cfi/test_cfi_parameters.py | 23 +- tests/shi/test_shi_contiguous.py | 35 +- tests/shi/test_shi_definitions.py | 121 ++++++ tests/test_compatibility.py | 33 +- tests/test_definition_list.py | 5 +- tests/test_socket_interaction.py | 40 +- 17 files changed, 786 insertions(+), 429 deletions(-) create mode 100644 tests/shi/test_shi_definitions.py diff --git a/README.md b/README.md index f40a9c36..96ab3409 100755 --- a/README.md +++ b/README.md @@ -256,8 +256,8 @@ print(parameters.get("ID_Ba_Hz_akt").options()) # returns a list of possible val # Now we increase the heating controller target temperature by 2 Kelvin heating_offset = l.holdings.get(2) # Get an object for the offset -heating_offset.value = 2.0 # Set the desired value -l.holdings["heating_mode"] = "Offset" # Set the value to activate the offset mode +heating_offset.value = 2.0 # Queue the desired value by setting the field's value +l.holdings["heating_mode"] = "Offset" # Queue the value to activate the offset mode l.write() # Write down the values to the heatpump ``` diff --git a/luxtronik/cfi/calculations.py b/luxtronik/cfi/calculations.py index 784f9be3..51d98785 100644 --- a/luxtronik/cfi/calculations.py +++ b/luxtronik/cfi/calculations.py @@ -11,7 +11,7 @@ ) from luxtronik.cfi.constants import CALCULATIONS_FIELD_NAME -from luxtronik.data_vector import DataVector +from luxtronik.cfi.vector import DataVectorConfig from luxtronik.datatypes import Base @@ -24,7 +24,7 @@ CALCULATIONS_DEFAULT_DATA_TYPE ) -class Calculations(DataVector): +class Calculations(DataVectorConfig): """Class that holds all calculations.""" name = CALCULATIONS_FIELD_NAME @@ -34,11 +34,6 @@ class Calculations(DataVector): "ID_WEB_SoftStand": "get_firmware_version()" } - def __init__(self): - super().__init__() - for d in CALCULATIONS_DEFINITIONS: - self._data.add(d, d.create_field()) - @property def calculations(self): return self._data diff --git a/luxtronik/cfi/interface.py b/luxtronik/cfi/interface.py index 0d030f3b..7ddcc662 100644 --- a/luxtronik/cfi/interface.py +++ b/luxtronik/cfi/interface.py @@ -162,23 +162,25 @@ def _write_and_read(self, parameters, data): return self._read(data) def _write(self, parameters): - for index, value in parameters.queue.items(): - if not isinstance(index, int) or not isinstance(value, int): - LOGGER.warning( - "%s: Parameter id '%s' or value '%s' invalid!", - self._host, - index, - value, - ) - continue - LOGGER.info("%s: Parameter '%d' set to '%s'", self._host, index, value) - self._send_ints(LUXTRONIK_PARAMETERS_WRITE, index, value) - cmd = self._read_int() - LOGGER.debug("%s: Command %s", self._host, cmd) - val = self._read_int() - LOGGER.debug("%s: Value %s", self._host, val) - # Flush queue after writing all values - parameters.queue = {} + for index, field in parameters.items(): + if field.write_pending: + value = field.raw + if not isinstance(index, int) or not isinstance(value, int): + LOGGER.warning( + "%s: Parameter id '%s' or value '%s' invalid!", + self._host, + index, + value, + ) + field.write_pending = False + continue + LOGGER.info("%s: Parameter '%d' set to '%s'", self._host, index, value) + self._send_ints(LUXTRONIK_PARAMETERS_WRITE, index, value) + cmd = self._read_int() + LOGGER.debug("%s: Command %s", self._host, cmd) + val = self._read_int() + LOGGER.debug("%s: Value %s", self._host, val) + field.write_pending = False # Give the heatpump a short time to handle the value changes/calculations: time.sleep(WAIT_TIME_AFTER_PARAMETER_WRITE) diff --git a/luxtronik/cfi/parameters.py b/luxtronik/cfi/parameters.py index 345b7d1b..f0976028 100644 --- a/luxtronik/cfi/parameters.py +++ b/luxtronik/cfi/parameters.py @@ -11,7 +11,7 @@ ) from luxtronik.cfi.constants import PARAMETERS_FIELD_NAME -from luxtronik.data_vector import DataVector +from luxtronik.cfi.vector import DataVectorConfig LOGGER = logging.getLogger(__name__) @@ -23,35 +23,13 @@ PARAMETERS_DEFAULT_DATA_TYPE ) -class Parameters(DataVector): +class Parameters(DataVectorConfig): """Class that holds all parameters.""" + logger = LOGGER name = PARAMETERS_FIELD_NAME definitions = PARAMETERS_DEFINITIONS - def __init__(self, safe=True): - """Initialize parameters class.""" - super().__init__() - self.safe = safe - self.queue = {} - for d in PARAMETERS_DEFINITIONS: - self._data.add(d, d.create_field()) - @property def parameters(self): return self._data - - def set(self, target, value): - """Set parameter to new value.""" - index, parameter = self._lookup(target, with_index=True) - if index is not None: - if parameter.writeable or not self.safe: - raw = parameter.to_heatpump(value) - if isinstance(raw, int): - self.queue[index] = raw - else: - LOGGER.error("Value '%s' for Parameter '%s' not valid!", value, parameter.name) - else: - LOGGER.warning("Parameter '%s' not safe for writing!", parameter.name) - else: - LOGGER.warning("Parameter '%s' not found", target) diff --git a/luxtronik/cfi/visibilities.py b/luxtronik/cfi/visibilities.py index 79d5f603..ec87c3bf 100644 --- a/luxtronik/cfi/visibilities.py +++ b/luxtronik/cfi/visibilities.py @@ -11,7 +11,7 @@ ) from luxtronik.cfi.constants import VISIBILITIES_FIELD_NAME -from luxtronik.data_vector import DataVector +from luxtronik.cfi.vector import DataVectorConfig LOGGER = logging.getLogger(__name__) @@ -23,7 +23,7 @@ VISIBILITIES_DEFAULT_DATA_TYPE, ) -class Visibilities(DataVector): +class Visibilities(DataVectorConfig): """Class that holds all visibilities.""" name = VISIBILITIES_FIELD_NAME diff --git a/luxtronik/constants.py b/luxtronik/constants.py index 894b3d31..35ddd4a7 100644 --- a/luxtronik/constants.py +++ b/luxtronik/constants.py @@ -21,3 +21,7 @@ LUXTRONIK_NAME_CHECK_NONE: Final = "none" LUXTRONIK_NAME_CHECK_PREFERRED: Final = "preferred" LUXTRONIK_NAME_CHECK_OBSOLETE: Final = "obsolete" + +# Since version 3.92.0, all unavailable 16 bit data fields +# have been returning this value (0x7FFF) +LUXTRONIK_VALUE_FUNCTION_NOT_AVAILABLE: Final = 32767 diff --git a/luxtronik/data_vector.py b/luxtronik/data_vector.py index 97512c9b..902a3167 100644 --- a/luxtronik/data_vector.py +++ b/luxtronik/data_vector.py @@ -5,121 +5,580 @@ from luxtronik.constants import ( LUXTRONIK_NAME_CHECK_PREFERRED, LUXTRONIK_NAME_CHECK_OBSOLETE, + LUXTRONIK_VALUE_FUNCTION_NOT_AVAILABLE, ) -from luxtronik.collections import LuxtronikFieldsDictionary +from luxtronik.datatypes import Base +from luxtronik.definitions import LuxtronikDefinition, LuxtronikDefinitionsDictionary LOGGER = logging.getLogger(__name__) +############################################################################### +# Common functions +############################################################################### + +def pack_values(values, num_bits, reverse=True): + """ + Packs a list of data chunks into one integer. + + Args: + values (list[int]): raw data; distributed across multiple registers. + num_bits (int): Number of bits per chunk. + reverse (bool): Use big-endian/MSB-first if true, + otherwise use little-endian/LSB-first order. + + Returns: + int: Packed raw data as a single integer value. + + Note: + The smart home interface uses a chunk size of 16 bits. + """ + count = len(values) + mask = (1 << num_bits) - 1 + + result = 0 + for idx, value in enumerate(values): + # normal: idx = 0..n-1 + # reversed index: highest chunk first + bit_index = (count - 1 - idx) if reverse else idx + + result |= (value & mask) << (num_bits * bit_index) + + return result + +def unpack_values(packed, count, num_bits, reverse=True): + """ + Unpacks 'count' chunks from a packed integer. + + Args: + packed (int): Packed raw data as a single integer value. + count (int): Number of chunks to unpack. + num_bits (int): Number of bits per chunk. + reverse (bool): Use big-endian/MSB-first if true, + otherwise use little-endian/LSB-first order. + + Returns: + list[int]: List of unpacked raw data values. + + Note: + The smart home interface uses a chunk size of 16 bits. + """ + values = [] + mask = (1 << num_bits) - 1 + + for idx in range(count): + # normal: idx = 0..n-1 + # reversed: highest chunk first + bit_index = (count - 1 - idx) if reverse else idx + + chunk = (packed >> (num_bits * bit_index)) & mask + values.append(chunk) + + return values + +def integrate_data(definition, field, raw_data, data_offset=-1): + """ + Integrate raw values from a data array into the field. + + Args: + definition (LuxtronikDefinition): Meta-data of the field. + field (Base): Field object where to integrate the data. + raw_data (list): Source array of bytes/words. + data_offset (int): Optional offset. Defaults to `definition.index`. + """ + # Use data_offset if provided, otherwise the index + data_offset = data_offset if data_offset >= 0 else definition.index + # Use the information of the definition to extract the raw-value + if (data_offset + definition.count - 1) >= len(raw_data): + raw = None + elif definition.count == 1: + raw = raw_data[data_offset] + else: + raw = raw_data[data_offset : data_offset + definition.count] + raw = raw if len(raw) == definition.count else None + if field.concatenate_multiple_data_chunks and raw is not None: + # Usually big-endian (reverse=True) is used + raw = pack_values(raw, definition.reg_bits) + raw = raw if definition.check_raw_not_none(raw) else None + field.raw = raw + +def get_data_arr(definition, field): + """ + Normalize the field's data to a list of the correct size. + + Args: + definition (LuxtronikDefinition): Meta-data of the field. + field (Base): Field object that contains data to get. + + Returns: + list[int] | None: List of length `definition.count`, + or None if the data size does not match. + """ + data = field.raw + if data is None: + return None + if not isinstance(data, list) and definition.count > 1 \ + and field.concatenate_multiple_data_chunks: + # Usually big-endian (reverse=True) is used + data = unpack_values(data, definition.count, definition.reg_bits) + if not isinstance(data, list): + data = [data] + return data if len(data) == definition.count else None + +############################################################################### +# Definition / field pair +############################################################################### + +class LuxtronikDefFieldPair: + """ + Combines a definition and a field into a single iterable object. + """ + + def __init__(self, definition, field): + """ + Initialize a definition-field-pair. + + Args: + field (Base): The field object. + definition (LuxtronikDefinition): The definition for this field. + """ + self.field = field + self.definition = definition + + def __iter__(self): + yield self.definition + yield self.field + + @property + def index(self): + return self.definition.index + + @property + def addr(self): + return self.definition.addr + + @property + def count(self): + return self.definition.count + + def get_data_arr(self): + """ + Normalize the field's data to a list of the correct size. + + Returns: + list[int] | None: List of length `definition.count`, or None if insufficient. + """ + return get_data_arr(self.definition, self.field) + + def integrate_data(self, raw_data, data_offset=-1): + """ + Integrate the related parts of the `raw_data` into the field + + Args: + raw_data (list): Source array of bytes/words. + data_offset (int): Optional offset. Defaults to `definition.index`. + """ + integrate_data(self.definition, self.field, raw_data, data_offset) + +############################################################################### +# Field dictionary for data vectors +############################################################################### + +class LuxtronikFieldsDictionary: + """ + Dictionary that behaves like the earlier data vector dictionaries (index-field-dictionary), + with the addition that obsolete fields are also supported and can be addressed by name. + Aliases are also supported. + """ + + def __init__(self): + # There may be several names or alias that points to one definition. + # So in order to spare memory we split the name/index-to-field-lookup + # into a name/index-to-definition-lookup and a definition-to-field-lookup + self._def_lookup = LuxtronikDefinitionsDictionary() + self._field_lookup = {} + # Furthermore stores the definition-to-field-lookup separate from the + # field-definition pairs to keep the index-sorted order when adding new entries + self._pairs = [] # list of LuxtronikDefFieldPair + + def __getitem__(self, def_field_name_or_idx): + return self.get(def_field_name_or_idx) + + def __setitem__(self, def_name_or_idx, value): + assert False, "__setitem__ not implemented." + + def __len__(self): + return len(self._def_lookup._index_dict) + + def __iter__(self): + """ + Iterate over all non-obsolete indices. If an index is assigned multiple times, + only the index of the preferred definition will be output. + """ + all_related_defs = self._def_lookup._index_dict.values() + return iter([d.index for d in self._pairs if d in all_related_defs]) + + def __contains__(self, def_field_name_or_idx): + """ + Check whether the data vector contains a name, index, + or definition matching an added field, or the field itself. + + Args: + def_field_name_or_idx (LuxtronikDefinition | Base | str | int): + Definition object, field object, field name or register index. + + Returns: + True if the searched element was found, otherwise False. + """ + if isinstance(def_field_name_or_idx, Base): + return any(def_field_name_or_idx is field for field in self._field_lookup.values()) + elif isinstance(def_field_name_or_idx, LuxtronikDefinition): + # speed-up the look-up by search only the name-dict + return def_field_name_or_idx.name in self._def_lookup._name_dict + else: + return def_field_name_or_idx in self._def_lookup + + def values(self): + """ + Iterator for all added non-obsolete fields. If an index is assigned multiple times, + only the field of the preferred definition will be output. + """ + all_related_defs = self._def_lookup._index_dict.values() + return iter([f for d, f in self._pairs if d in all_related_defs]) + + def items(self): + """ + Iterator for all non-obsolete index-field-pairs (list of tuples with + 0: index, 1: field) contained herein. If an index is assigned multiple times, + only the index-field-pair of the preferred definition will be output. + """ + all_related_defs = self._def_lookup._index_dict.values() + return iter([(d.index, f) for d, f in self._pairs if d in all_related_defs]) + + def pairs(self): + """ + Return all definition-field-pairs contained herein. + """ + return self._pairs + + @property + def def_dict(self): + """Return the internal definition dictionary""" + return self._def_lookup + + def add(self, definition, field, alias=None): + """ + Add a definition-field-pair to the internal dictionaries. + + Args: + definition (LuxtronikDefinition): Definition related to the field. + field (Base): Field to add. + alias (Hashable | None): Alias, which can be used to access the field again. + """ + if definition.valid: + self._def_lookup.add(definition, alias) + self._field_lookup[definition] = field + self._pairs.append(LuxtronikDefFieldPair(definition, field)) + + def add_sorted(self, definition, field, alias=None): + if definition.valid: + self.add(definition, field, alias) + # sort _pairs by definition.index + self._pairs.sort(key=lambda pair: pair.definition.index) + + def register_alias(self, def_field_name_or_idx, alias): + """ + Add an alternative name (or anything hashable else) + that can be used to access a specific field. + + Args: + def_field_name_or_idx (LuxtronikDefinition | Base | str | int): + Field to which the alias is to be added. + Either by definition, name, register index, or the field itself. + alias (Hashable): Alias, which can be used to access the field again. + + Returns: + Base | None: The field to which the alias was added, + or None if not possible + """ + # Resolve a field input + def_name_or_idx = def_field_name_or_idx + if isinstance(def_name_or_idx, Base): + def_name_or_idx = def_name_or_idx.name + # register alias + definition = self._def_lookup.register_alias(def_name_or_idx, alias) + if definition is None: + return None + return self._field_lookup.get(definition, None) + + def get(self, def_field_name_or_idx, default=None): + """ + Retrieve a field by definition, name or register index. + + Args: + def_field_name_or_idx (LuxtronikDefinition | str | int): + Definition, name, or register index to be used to search for the field. + + Returns: + Base | None: The field found or the provided default if not found. + + Note: + If multiple fields added for the same index/name, + the last added takes precedence. + """ + def_name_or_idx = def_field_name_or_idx + if isinstance(def_name_or_idx, Base): + def_name_or_idx = def_name_or_idx.name + if isinstance(def_name_or_idx, LuxtronikDefinition): + definition = def_name_or_idx + else: + definition = self._def_lookup.get(def_name_or_idx) + if definition is not None: + return self._field_lookup.get(definition, default) + return default + ############################################################################### # Base class for all luxtronik data vectors ############################################################################### class DataVector: - """Class that holds a vector of data entries.""" + """ + Class that holds a vector of data entries. + + Provides access to fields by name, index or alias. + To use aliases, they must first be registered here (locally = only valid + for this vector) or directly in the `LuxtronikDefinitionsList` + (globally = valid for all newly created vector). + """ + logger = LOGGER name = "DataVector" + # DataVector specific list of definitions as `LuxtronikDefinitionsList` + definitions = None # override this + _obsolete = {} + +# Field construction methods ################################################## + + @classmethod + def create_unknown_field(cls, idx): + """ + Create an unknown field object. + Be careful! The used controller firmware + may not support this field. + + Args: + idx (int): Register index. + + Returns: + Unknown: A field instance of type 'Unknown'. + """ + return Unknown(f"unknown_{cls.name}_{idx}", False) + + @classmethod + def create_any_field(cls, name_or_idx): + """ + Create a field object from an available definition + (= included in class variable `cls.definitions`). + Be careful! The used controller firmware + may not support this field. + + Args: + name_or_idx (str | int): Field name or register index. + + Returns: + Base | None: The created field, or None if not found or not valid. + """ + # The definitions object hold all available definitions + definition = cls.definitions.get(name_or_idx) + if definition is not None and definition.valid: + return definition.create_field() + return None + + def create_field(self, name_or_idx): + """ + Create a field object from a version-dependent definition (= included in + class variable `cls.definitions` and is valid for `self.version`). + + Args: + name_or_idx (str | int): Field name or register index. + + Returns: + Base | None: The created field, or None if not found or not valid. + """ + definition, _ = self._get_definition(name_or_idx, False) + if definition is not None and definition.valid: + return definition.create_field() + return None + + +# constructor, magic methods and iterators #################################### + def __init__(self): """Initialize DataVector class.""" self._data = LuxtronikFieldsDictionary() - def __iter__(self): - """Iterator for the data entries.""" - return iter(self._data.items()) - @property def data(self): - """ - Return the internal `LuxtronikFieldsDictionary`. - Please check its documentation. - """ return self._data def __getitem__(self, def_name_or_idx): - """ - Array-style access to method `get`. - Please check its documentation. - """ return self.get(def_name_or_idx) def __setitem__(self, def_name_or_idx, value): - """ - Array-style access to method `set`. - Please check its documentation. - """ return self.set(def_name_or_idx, value) + def __len__(self): + return len(self._data) + + def __iter__(self): + return iter(self._data) def __contains__(self, def_field_name_or_idx): """ - Forward the `LuxtronikFieldsDictionary.__contains__` method. - Please check its documentation. + Check whether the data vector contains a name, index, + or definition matching an added field, or the field itself. + + Args: + def_field_name_or_idx (LuxtronikDefinition | Base | str | int): + Definition object, field object, field name or register index. + + Returns: + True if the searched element was found, otherwise False. """ return def_field_name_or_idx in self._data - def _name_lookup(self, name): + def values(self): + return iter(self._data.values()) + + def items(self): + return iter(self._data.items()) + + +# Alias methods ############################################################### + + def register_alias(self, def_field_name_or_idx, alias): """ - Try to find the index using the given field name. + Add an alternative name (or anything hashable else) + that can be used to access a specific field. Args: - name (string): Field name. + def_field_name_or_idx (LuxtronikDefinition | Base | str | int): + Field to which the alias is to be added. + Either by definition, name, register index, or the field itself. + alias (Hashable): Alias, which can be used to access the field again. Returns: - tuple[int | None, str | None]: - 0: Index found or None - 1: New preferred name, if available, otherwise None + Base | None: The field to which the alias was added, + or None if not possible + """ + return self._data.register_alias(def_field_name_or_idx, alias) + + +# Parse methods ############################################################### + + def parse(self, raw_data): """ - obsolete_entry = self._obsolete.get(name, None) + Parse raw data into the corresponding fields. + + Args: + raw_data (list[int]): List of raw register values. + The raw data must start at register index 0. + """ + raw_len = len(raw_data) + undefined = {i for i in range(0, raw_len)} + for definition, field in self._data.pairs(): + next_idx = definition.index + definition.count + if next_idx >= raw_len: + # not enough registers + continue + for index in range(definition.index, next_idx): + undefined.discard(index) + integrate_data(definition, field, raw_data) + field.write_pending = False + # create an unknown field for additional data + for index in undefined: + # self.logger.warning(f"Entry '%d' not in list of {self.name}", index) + definition = LuxtronikDefinition.unknown(index, self.name, self.definitions.offset) + field = definition.create_field() + field.raw = raw_data[index] + self._data.add_sorted(definition, field) + + +# Get and set methods ######################################################### + + def _get_definition(self, def_field_name_or_idx, all_not_version_dependent): + """ + Look-up a definition by name, index, a field instance or by the definition itself. + + Args: + def_field_name_or_idx (LuxtronikDefinition | Base | str | int): + Definition object, field object, field name or register index. + all_not_version_dependent (bool): If true, look up the definition + within the `cls.definitions` otherwise within `self._data` (which + contain all definitions related to all added fields) + + Returns: + tuple[LuxtronikDefinition | None, Base | None]: + A definition-field-pair tuple: + Index 0: Return the found or given definitions, otherwise None + Index 1: Return the given field, otherwise None + """ + definition = def_field_name_or_idx + field = None + if isinstance(def_field_name_or_idx, Base): + definition = def_field_name_or_idx.name + field = def_field_name_or_idx + if not isinstance(def_field_name_or_idx, LuxtronikDefinition): + if all_not_version_dependent: + definition = self.definitions.get(definition) + else: + # def_dict contains only valid and addable definitions + definition = self._data.def_dict.get(definition) + return definition, field + + def get(self, def_name_or_idx, default=None): + """ + Retrieve a field by definition, name or register index. + + Args: + def_name_or_idx (LuxtronikDefinition | str | int): + Definition, name, or register index to be used to search for the field. + + Returns: + Base | None: The field found or the provided default if not found. + + Note: + If multiple fields added for the same index/name, + the last added takes precedence. + """ + obsolete_entry = self._obsolete.get(def_name_or_idx, None) if obsolete_entry: - return None, obsolete_entry - for index, entry in self._data.items(): - check_result = entry.check_name(name) - if check_result == LUXTRONIK_NAME_CHECK_PREFERRED: - return index, None - elif check_result == LUXTRONIK_NAME_CHECK_OBSOLETE: - return index, entry.name - return None, None - - def _lookup(self, target, with_index=False): - """ - Lookup an entry - - "target" could either be its id or its name. - - In case "with_index" is set, also the index is returned. - """ - if isinstance(target, str): - try: - # Try to get entry by id - target_index = int(target) - except ValueError: - # Get entry by name - target_index, new_name = self._name_lookup(target) - if new_name is not None: - raise KeyError(f"The name '{target}' is obsolete! Use '{new_name}' instead.") - elif isinstance(target, int): - # Get entry by id - target_index = target - else: - target_index = None - - target_entry = self._data.get(target_index, None) - if target_entry is None: - LOGGER.warning("entry '%s' not found", target) - if with_index: - return target_index, target_entry - return target_entry - - def get(self, target): - """Get entry by id or name.""" - entry = self._lookup(target) - return entry - - def set(self, target, value): - "TODO: Placeholder for future changes" - pass + raise KeyError(f"The name '{def_name_or_idx}' is obsolete! Use '{obsolete_entry}' instead.") + field = self._data.get(def_name_or_idx, default) + if field is None: + self.logger.warning(f"entry '{def_name_or_idx}' not found") + return field + + def set(self, def_field_name_or_idx, value): + """ + Set field to new value. + + The value is set, even if the field marked as non-writeable. + No data validation is performed either. + + Args: + def_field_name_or_idx (LuxtronikDefinition | Base | int | str): + Definition, name, or register index to be used to search for the field. + It is also possible to pass the field itself. + value (int | List[int]): Value to set + """ + field = def_field_name_or_idx + if not isinstance(field, Base): + field = self.get(def_field_name_or_idx) + if field is not None: + field.value = value \ No newline at end of file diff --git a/luxtronik/definitions/__init__.py b/luxtronik/definitions/__init__.py index 9afa9318..c5b1924f 100644 --- a/luxtronik/definitions/__init__.py +++ b/luxtronik/definitions/__init__.py @@ -38,17 +38,10 @@ class LuxtronikDefinition: "names": [], "since": "", "until": "", - "datatype": "", - "bit_offset": None, - "bit_count": None, + "datatype": "UINT32", "description": "", } - # It is permissible not to specify a data type. - # In this case, all functions based on it will be disabled. - VALID_DATA_TYPES = ("", "UINT16", "UINT32", "UINT64", "INT16", "INT32", "INT64") - - def __init__(self, data_dict, type_name, offset): """ Initialize a definition from a data-dictionary. @@ -90,23 +83,14 @@ def __init__(self, data_dict, type_name, offset): self._offset = int(offset) self._addr = self._offset + self._index self._data_type = data_dict["datatype"] - data_type_valid = self._data_type in self.VALID_DATA_TYPES - self._valid &= data_type_valid - data_type_valid &= self._data_type != "" - self._bit_offset = data_dict["bit_offset"] - bit_count = data_dict["bit_count"] - if bit_count: - self._num_bits = bit_count - else: - self._num_bits = int(self._data_type.replace('U', '').replace('INT', '')) \ - if data_type_valid else 0 + self._num_bits = int(self._data_type.replace('U', '').replace('INT', '')) except Exception as e: self._valid = False self._index = 0 LOGGER.error(f"Failed to create LuxtronikDefinition: '{e}' with {data_dict}") @classmethod - def unknown(cls, index, type_name, offset, data_type=""): + def unknown(cls, index, type_name, offset): """ Create an "unknown" definition. @@ -114,15 +98,13 @@ def unknown(cls, index, type_name, offset, data_type=""): index (int): The register index of the "unknown" definition. type_name (str): The type name e.g. 'holding', 'input', ... . offset (str): Offset of the address from the specified index. - data_type (str): Data type of the field (see VALID_DATA_TYPES). Returns: LuxtronikDefinition: A definition marked as unknown. """ return cls({ "index": index, - "names": [f"unknown_{type_name.lower()}_{index}"], - "datatype": data_type, + "names": [f"unknown_{type_name.lower()}_{index}"] }, type_name, offset) def __bool__(self): @@ -167,18 +149,15 @@ def field_type(self): def writeable(self): return self._writeable - @property - def data_type(self): - return self._data_type - - @property - def bit_offset(self): - return self._bit_offset - @property def num_bits(self): return self._num_bits + @property + def reg_bits(self): + """Return the number of bits per register.""" + return self._num_bits // self._count + @property def names(self): return self._names @@ -249,7 +228,7 @@ def __getitem__(self, name_or_idx): def __contains__(self, def_name_or_idx): if isinstance(def_name_or_idx, LuxtronikDefinition): - return any(def_name_or_idx is d for d in self._name_dict.values()) + return any(def_name_or_idx is d for d in self._index_dict.values()) return self._get(def_name_or_idx) is not None def _add_alias(self, definition, alias): @@ -437,17 +416,16 @@ class LuxtronikDefinitionsList: (locally = only valid for that dictionary). """ - def _init_instance(self, name, offset, default_data_type, version): + def _init_instance(self, name, offset, version): """Re-usable method to initialize all instance variables.""" self._name = name self._offset = offset - self._default_data_type = default_data_type self._version = version # sorted list of all definitions self._definitions = [] self._lookup = LuxtronikDefinitionsDictionary() - def __init__(self, definitions_list, name, offset, default_data_type): + def __init__(self, definitions_list, name, offset): """ Initialize the (by index sorted) definitions list. @@ -464,7 +442,7 @@ def __init__(self, definitions_list, name, offset, default_data_type): - The value of count must always be greater than or equal to 1 - All names should be unique """ - self._init_instance(name, offset, default_data_type, None) + self._init_instance(name, offset, None) # Add definition objects only for valid items. # The correct sorting has already been ensured by the pytest @@ -486,7 +464,7 @@ def filtered(cls, definitions, version): If None is passed, all available fields are added. """ obj = cls.__new__(cls) # this don't call __init__() - obj._init_instance(definitions.name, definitions.offset, definitions._default_data_type, version) + obj._init_instance(definitions.name, definitions.offset, version) for d in definitions: if d.valid and version_in_range(obj._version, d.since, d.until): @@ -520,7 +498,7 @@ def create_unknown_definition(self, index): Returns: LuxtronikDefinition: A definition marked as unknown. """ - return LuxtronikDefinition.unknown(index, self._name, self._offset, self._default_data_type) + return LuxtronikDefinition.unknown(index, self._name, self._offset) def register_alias(self, def_name_or_idx, alias): """ diff --git a/luxtronik/shi/contiguous.py b/luxtronik/shi/contiguous.py index fcb6c500..7c598a82 100644 --- a/luxtronik/shi/contiguous.py +++ b/luxtronik/shi/contiguous.py @@ -6,8 +6,7 @@ import logging -from luxtronik.collections import LuxtronikDefFieldPair -from luxtronik.shi.constants import LUXTRONIK_SHI_REGISTER_BIT_SIZE +from luxtronik.data_vector import LuxtronikDefFieldPair LOGGER = logging.getLogger(__name__) @@ -171,7 +170,7 @@ def integrate_data(self, data_arr): first = self.first_index for part in self._parts: data_offset = part.index - first - part.integrate_data(data_arr, LUXTRONIK_SHI_REGISTER_BIT_SIZE, data_offset) + part.integrate_data(data_arr, data_offset) return True @@ -192,7 +191,7 @@ def get_data_arr(self): valid = True for part in self._parts: data_offset = part.index - first - data = part.get_data_arr(LUXTRONIK_SHI_REGISTER_BIT_SIZE) + data = part.get_data_arr() if data is None: valid = False diff --git a/luxtronik/shi/interface.py b/luxtronik/shi/interface.py index 025bbc0c..b924a84c 100644 --- a/luxtronik/shi/interface.py +++ b/luxtronik/shi/interface.py @@ -2,17 +2,14 @@ import logging -from luxtronik.collections import get_data_arr from luxtronik.common import classproperty, version_in_range from luxtronik.datatypes import Base +from luxtronik.data_vector import get_data_arr from luxtronik.definitions import ( LuxtronikDefinition, LuxtronikDefinitionsList, ) -from luxtronik.shi.constants import ( - LUXTRONIK_LATEST_SHI_VERSION, - LUXTRONIK_SHI_REGISTER_BIT_SIZE -) +from luxtronik.shi.constants import LUXTRONIK_LATEST_SHI_VERSION from luxtronik.shi.common import ( LuxtronikSmartHomeReadHoldingsTelegram, LuxtronikSmartHomeReadInputsTelegram, @@ -390,7 +387,7 @@ def _prepare_write_field(self, definition, field, safe, data): field.value = data # Abort if insufficient data is provided - if not get_data_arr(definition, field, LUXTRONIK_SHI_REGISTER_BIT_SIZE): + if not get_data_arr(definition, field): LOGGER.warning("Data error / insufficient data provided: " \ + f"name={definition.name}, data={field.raw}") return False diff --git a/luxtronik/shi/vector.py b/luxtronik/shi/vector.py index 36e7d39b..33882480 100644 --- a/luxtronik/shi/vector.py +++ b/luxtronik/shi/vector.py @@ -2,8 +2,7 @@ import logging from luxtronik.common import version_in_range -from luxtronik.collections import LuxtronikFieldsDictionary -from luxtronik.data_vector import DataVector +from luxtronik.data_vector import LuxtronikFieldsDictionary, DataVector from luxtronik.datatypes import Base, Unknown from luxtronik.definitions import LuxtronikDefinition @@ -18,73 +17,7 @@ ############################################################################### class DataVectorSmartHome(DataVector): - """ - Specialized DataVector for Luxtronik smart home fields. - - Provides access to fields by name, index or alias. - To use aliases, they must first be registered here (locally = only valid - for this vector) or directly in the `LuxtronikDefinitionsList` - (globally = valid for all newly created vector). - """ - - # DataVector specific list of definitions as `LuxtronikDefinitionsList` - definitions = None # override this - -# Field construction methods ################################################## - - @classmethod - def create_unknown_field(cls, idx): - """ - Create an unknown field object. - Be careful! The used controller firmware - may not support this field. - - Args: - idx (int): Register index. - - Returns: - Unknown: A field instance of type 'Unknown'. - """ - return Unknown(f"unknown_{cls.name}_{idx}", False) - - @classmethod - def create_any_field(cls, name_or_idx): - """ - Create a field object from an available definition - (= included in class variable `cls.definitions`). - Be careful! The used controller firmware - may not support this field. - - Args: - name_or_idx (str | int): Field name or register index. - - Returns: - Base | None: The created field, or None if not found or not valid. - """ - # The definitions object hold all available definitions - definition = cls.definitions.get(name_or_idx) - if definition is not None and definition.valid: - return definition.create_field() - return None - - def create_field(self, name_or_idx): - """ - Create a field object from a version-dependent definition (= included in - class variable `cls.definitions` and is valid for `self.version`). - - Args: - name_or_idx (str | int): Field name or register index. - - Returns: - Base | None: The created field, or None if not found or not valid. - """ - definition, _ = self._get_definition(name_or_idx, False) - if definition is not None and definition.valid: - return definition.create_field() - return None - - -# Constructors and magic methods ############################################## + """Specialized DataVector for Luxtronik smart home fields.""" def _init_instance(self, version, safe): """Re-usable method to initialize all instance variables.""" @@ -143,57 +76,22 @@ def empty(cls, version=LUXTRONIK_LATEST_SHI_VERSION, safe=True): obj._init_instance(version, safe) return obj - def __len__(self): - return len(self._data.pairs()) - - def __iter__(self): - return iter([definition for definition, _ in self._data.pairs()]) - - -# properties and access methods ############################################### - @property def version(self): return self._version - def values(self): - return iter([field for _, field in self._data.pairs()]) - - def items(self): - return iter(self._data.pairs()) - - -# Find, add and alias methods ################################################# - - def _get_definition(self, def_field_name_or_idx, all_not_version_dependent): + def update_read_blocks(self): """ - Look-up a definition by name, index, a field instance or by the definition itself. - - Args: - def_field_name_or_idx (LuxtronikDefinition | Base | str | int): - Definition object, field object, field name or register index. - all_not_version_dependent (bool): If true, look up the definition - within the `cls.definitions` otherwise within `self.def_dict` (which - contain all definitions related to all added fields) + (Re-)Create the data block list (`ContiguousDataBlockList`) for read-operations. - Returns: - tuple[LuxtronikDefinition | None, Base | None]: - A definition-field-pair tuple: - Index 0: Return the found or given definitions, otherwise None - Index 1: Return the given field, otherwise None + Since the data blocks do not change as long as no new fields are added, + it is sufficient to regenerate them only when a change occurs. """ - definition = def_field_name_or_idx - field = None - if isinstance(def_field_name_or_idx, Base): - definition = def_field_name_or_idx.name - field = def_field_name_or_idx - if not isinstance(def_field_name_or_idx, LuxtronikDefinition): - if all_not_version_dependent: - definition = self.definitions.get(definition) - else: - # def_dict contains only valid and addable definitions - definition = self._data.def_dict.get(definition) - return definition, field + if not self._read_blocks_up_to_date: + self._read_blocks.clear() + for definition, field in self._data.pairs(): + self._read_blocks.collect(definition, field) + self._read_blocks_up_to_date = True def add(self, def_field_name_or_idx, alias=None): """ @@ -234,76 +132,4 @@ def add(self, def_field_name_or_idx, alias=None): self._read_blocks_up_to_date = False self._data.add_sorted(definition, field, alias) return field - return None - - def register_alias(self, def_field_name_or_idx, alias): - """ - Add an alternative name (or anything hashable else) - that can be used to access a specific field. - - Args: - def_field_name_or_idx (LuxtronikDefinition | Base | str | int): - Field to which the alias is to be added. - Either by definition, name, register index, or the field itself. - alias (Hashable): Alias, which can be used to access the field again. - - Returns: - Base | None: The field to which the alias was added, - or None if not possible - """ - return self._data.register_alias(def_field_name_or_idx, alias) - - -# Data-blocks methods ######################################################### - - def update_read_blocks(self): - """ - (Re-)Create the data block list (`ContiguousDataBlockList`) for read-operations. - - Since the data blocks do not change as long as no new fields are added, - it is sufficient to regenerate them only when a change occurs. - """ - if not self._read_blocks_up_to_date: - self._read_blocks.clear() - for definition, field in self._data.pairs(): - self._read_blocks.collect(definition, field) - self._read_blocks_up_to_date = True - - -# Data and access methods ##################################################### - - def get(self, def_name_or_idx, default=None): - """ - Retrieve a field by definition, name or register index. - - Args: - def_name_or_idx (LuxtronikDefinition | str | int): - Definition, name, or register index to be used to search for the field. - - Returns: - Base | None: The field found or the provided default if not found. - - Note: - If multiple fields added for the same index/name, - the last added takes precedence. - """ - return self._data.get(def_name_or_idx, default) - - def set(self, def_field_name_or_idx, value): - """ - Set field to new value. - - The value is set, even if the field marked as non-writeable. - No data validation is performed either. - - Args: - def_field_name_or_idx (LuxtronikDefinition | Base | int | str): - Definition, name, or register index to be used to search for the field. - It is also possible to pass the field itself. - value (int | List[int]): Value to set - """ - field = def_field_name_or_idx - if not isinstance(field, Base): - field = self.get(def_field_name_or_idx) - if field is not None: - field.value = value \ No newline at end of file + return None \ No newline at end of file diff --git a/tests/cfi/test_cfi_parameters.py b/tests/cfi/test_cfi_parameters.py index 417e146c..dc2f55c9 100644 --- a/tests/cfi/test_cfi_parameters.py +++ b/tests/cfi/test_cfi_parameters.py @@ -15,11 +15,9 @@ def test_init(self): assert parameters.name == "parameter" assert parameters.parameters == parameters._data assert parameters.safe - assert len(parameters.queue) == 0 parameters = Parameters(False) assert not parameters.safe - assert len(parameters.queue) == 0 def test_data(self): """Test cases for the data dictionary""" @@ -84,18 +82,21 @@ def test_set(self): # Set something which does not exist parameters.set("BarFoo", 0) - assert len(parameters.queue) == 0 + assert paramters["BarFoo"] is not None - # Set something which is not allowed to be set - parameters.set("ID_Transfert_LuxNet", 0) - assert len(parameters.queue) == 0 + # Set something which was previously not allowed to be set + parameters.set("ID_Transfert_LuxNet", 1) + assert paramters["ID_Transfert_LuxNet"].raw == 1 + assert paramters["ID_Transfert_LuxNet"].write_pending # Set something which is allowed to be set - parameters.set("ID_Einst_WK_akt", 0) - assert len(parameters.queue) == 1 + parameters.set("ID_Einst_WK_akt", 2) + assert paramters["ID_Einst_WK_akt"].raw == 2 + assert paramters["ID_Einst_WK_akt"].write_pending parameters = Parameters(safe=False) - # Set something which is not allowed to be set, but we are brave. - parameters.set("ID_Transfert_LuxNet", 0) - assert len(parameters.queue) == 1 + # Set something which was previously not allowed to be set, but we are brave. + parameters.set("ID_Transfert_LuxNet", 4) + assert paramters["ID_Transfert_LuxNet"].raw == 4 + assert paramters["ID_Transfert_LuxNet"].write_pending diff --git a/tests/shi/test_shi_contiguous.py b/tests/shi/test_shi_contiguous.py index 62a27d50..888ff675 100644 --- a/tests/shi/test_shi_contiguous.py +++ b/tests/shi/test_shi_contiguous.py @@ -2,7 +2,6 @@ from luxtronik.constants import LUXTRONIK_VALUE_FUNCTION_NOT_AVAILABLE from luxtronik.datatypes import Base from luxtronik.definitions import LuxtronikDefinition -from luxtronik.shi.constants import LUXTRONIK_SHI_REGISTER_BIT_SIZE from luxtronik.shi.contiguous import ( ContiguousDataPart, ContiguousDataBlock, @@ -20,32 +19,26 @@ def_a1 = LuxtronikDefinition({ 'index': 1, 'count': 1, - 'datatype': 'INT16', }, 'test', 100) def_a = LuxtronikDefinition({ 'index': 1, 'count': 2, - 'datatype': 'INT16', }, 'test', 100) def_b = LuxtronikDefinition({ 'index': 3, 'count': 1, - 'datatype': 'INT16', }, 'test', 100) def_c = LuxtronikDefinition({ 'index': 4, 'count': 3, - 'datatype': 'INT16', }, 'test', 100) def_c1 = LuxtronikDefinition({ 'index': 4, 'count': 1, - 'datatype': 'INT16', }, 'test', 100) def_c2 = LuxtronikDefinition({ 'index': 5, 'count': 1, - 'datatype': 'INT16', }, 'test', 100) defs = [] @@ -74,49 +67,49 @@ def test_repr(self): def test_get_data(self): part = ContiguousDataPart(def_a, field_a) field_a.raw = [4, 2] - assert part.get_data_arr(LUXTRONIK_SHI_REGISTER_BIT_SIZE) == [4, 2] + assert part.get_data_arr() == [4, 2] field_a.raw = [1, 3, 5] - assert part.get_data_arr(LUXTRONIK_SHI_REGISTER_BIT_SIZE) is None + assert part.get_data_arr() is None field_a.raw = [9] - assert part.get_data_arr(LUXTRONIK_SHI_REGISTER_BIT_SIZE) is None + assert part.get_data_arr() is None part = ContiguousDataPart(def_a1, field_a1) field_a1.raw = [8] - assert part.get_data_arr(LUXTRONIK_SHI_REGISTER_BIT_SIZE) == [8] + assert part.get_data_arr() == [8] field_a1.raw = 7 - assert part.get_data_arr(LUXTRONIK_SHI_REGISTER_BIT_SIZE) == [7] + assert part.get_data_arr() == [7] def test_integrate_data(self): part = ContiguousDataPart(def_a, field_a) - part.integrate_data([1, 5, 7, 9], LUXTRONIK_SHI_REGISTER_BIT_SIZE, 0) + part.integrate_data([1, 5, 7, 9], 0) assert part.field.raw == [1, 5] - part.integrate_data([1, 5, 7, 9], LUXTRONIK_SHI_REGISTER_BIT_SIZE) + part.integrate_data([1, 5, 7, 9]) assert part.field.raw == [5, 7] - part.integrate_data([1, 5, 7, 9], LUXTRONIK_SHI_REGISTER_BIT_SIZE, 2) + part.integrate_data([1, 5, 7, 9], 2) assert part.field.raw == [7, 9] - part.integrate_data([1, 5, 7, 9], LUXTRONIK_SHI_REGISTER_BIT_SIZE, 3) + part.integrate_data([1, 5, 7, 9], 3) assert part.field.raw is None - part.integrate_data([1, 5, LUXTRONIK_VALUE_FUNCTION_NOT_AVAILABLE, 9], LUXTRONIK_SHI_REGISTER_BIT_SIZE, 1) - assert part.field.raw == [5, LUXTRONIK_VALUE_FUNCTION_NOT_AVAILABLE] + part.integrate_data([1, 5, LUXTRONIK_VALUE_FUNCTION_NOT_AVAILABLE, 9], 1) + assert part.field.raw is None part = ContiguousDataPart(def_c1, field_c1) - part.integrate_data([2, 4, 6], LUXTRONIK_SHI_REGISTER_BIT_SIZE, 1) + part.integrate_data([2, 4, 6], 1) assert part.field.raw == 4 - part.integrate_data([2, 4, LUXTRONIK_VALUE_FUNCTION_NOT_AVAILABLE], LUXTRONIK_SHI_REGISTER_BIT_SIZE, 2) + part.integrate_data([2, 4, LUXTRONIK_VALUE_FUNCTION_NOT_AVAILABLE], 2) assert part.field.raw is None - part.integrate_data([2, 4, 6], LUXTRONIK_SHI_REGISTER_BIT_SIZE, 5) + part.integrate_data([2, 4, 6], 5) assert part.field.raw is None diff --git a/tests/shi/test_shi_definitions.py b/tests/shi/test_shi_definitions.py new file mode 100644 index 00000000..d4297420 --- /dev/null +++ b/tests/shi/test_shi_definitions.py @@ -0,0 +1,121 @@ +from luxtronik.constants import LUXTRONIK_VALUE_FUNCTION_NOT_AVAILABLE +from luxtronik.definitions import LuxtronikDefinition +from luxtronik.data_vector import ( + get_data_arr, + integrate_data, +) + +############################################################################### +# Tests +############################################################################### + +class TestDefinitionFieldPair: + + def test_data_arr(self): + definition = LuxtronikDefinition.unknown(2, 'Foo', 30) + field = definition.create_field() + field.concatenate_multiple_data_chunks = False + + # get from value + definition._count = 1 + field.raw = 5 + arr = get_data_arr(definition, field) + assert arr == [5] + assert check_data(definition, field) + + # get from array + definition._count = 2 + field.raw = [7, 3] + arr = get_data_arr(definition, field) + assert arr == [7, 3] + assert check_data(definition, field) + + # too much data + definition._count = 2 + field.raw = [4, 8, 1] + arr = get_data_arr(definition, field) + assert arr is None + assert not check_data(definition, field) + + # insufficient data + definition._count = 2 + field.raw = [9] + arr = get_data_arr(definition, field) + assert arr is None + assert not check_data(definition, field) + + field.concatenate_multiple_data_chunks = True + + # get from array + definition._count = 2 + field.raw = 0x0007_0003 + arr = get_data_arr(definition, field) + assert arr == [7, 3] + assert check_data(definition, field) + + # too much data + definition._count = 2 + field.raw = 0x0004_0008_0001 + arr = get_data_arr(definition, field) + assert arr == [8, 1] + assert check_data(definition, field) + + # insufficient data + definition._count = 2 + field.raw = 0x0009 + arr = get_data_arr(definition, field) + assert arr == [0, 9] + assert check_data(definition, field) + + def test_integrate(self): + definition = LuxtronikDefinition.unknown(2, 'Foo', 30) + field = definition.create_field() + field.concatenate_multiple_data_chunks = False + + data = [1, LUXTRONIK_VALUE_FUNCTION_NOT_AVAILABLE, 3, 4, 5, 6, 7] + + # set array + definition._count = 2 + integrate_data(definition, field, data) + assert field.raw == [3, 4] + integrate_data(definition, field, data, 4) + assert field.raw == [5, 6] + integrate_data(definition, field, data, 7) + assert field.raw is None + integrate_data(definition, field, data, 0) + assert field.raw is None + + # set value + definition._count = 1 + integrate_data(definition, field, data) + assert field.raw == 3 + integrate_data(definition, field, data, 5) + assert field.raw == 6 + integrate_data(definition, field, data, 9) + assert field.raw is None + integrate_data(definition, field, data, 1) + assert field.raw is None + + field.concatenate_multiple_data_chunks = True + + # set array + definition._count = 2 + integrate_data(definition, field, data) + assert field.raw == 0x0003_0004 + integrate_data(definition, field, data, 4) + assert field.raw == 0x0005_0006 + integrate_data(definition, field, data, 7) + assert field.raw is None + integrate_data(definition, field, data, 0) + assert field.raw is None + + # set value + definition._count = 1 + integrate_data(definition, field, data) + assert field.raw == 0x0003 + integrate_data(definition, field, data, 5) + assert field.raw == 0x0006 + integrate_data(definition, field, data, 9) + assert field.raw is None + integrate_data(definition, field, data, 1) + assert field.raw is None \ No newline at end of file diff --git a/tests/test_compatibility.py b/tests/test_compatibility.py index 4a0f80c3..a6eeb019 100644 --- a/tests/test_compatibility.py +++ b/tests/test_compatibility.py @@ -1204,9 +1204,7 @@ def test_compatibilities(self): "Unknown_Parameter_1155": 1155, "Unknown_Parameter_1156": 1156, "Unknown_Parameter_1157": 1157, - "Unknown_Parameter_1158": 1158, "POWER_LIMIT_SWITCH": 1158, - "Unknown_Parameter_1159": 1159, "POWER_LIMIT_VALUE": 1159, } @@ -1913,12 +1911,12 @@ def test_compatibilities(self): # First, we check if we can find all entries of the above dicts. ok = True - for mapping, data_vector, caption in values: + for mapping, obj, caption in values: print_caption = True for old_name, old_idx in mapping.items(): - cur_idx, new_name = data_vector._name_lookup(old_name) - cur_name = data_vector.get(old_idx).name - if cur_idx != old_idx or (new_name is not None and new_name != cur_name): + def_by_name = obj.definitions.get(old_name) + def_by_idx = obj.definitions.get(old_idx) + if (def_by_name.index != old_idx) or (def_by_idx.name != def_by_name.name): # We do not use assert here, in order to catch all incompatibilities at once. if print_caption: print(f"### Incompatibilities - {caption}:") @@ -1929,16 +1927,15 @@ def test_compatibilities(self): # Second, we check if all names are present in the above dicts. ok = True - for mapping, data_vector, caption in values: + for mapping, obj, caption in values: print_caption = True - for definition in data_vector.definitions: - for name in definition.names: - if name not in mapping: - # We do not use assert here, in order to catch all incompatibilities at once. - # The output can be copied to the dicts above - if print_caption: - print(f"### Missing - {caption}:") - print_caption = False - print(f'"{name}": {definition.index},') - ok = False - assert ok, "Found missing entries. Please consider to add them to the test suite." \ No newline at end of file + for cur_idx, entry in obj: + if entry.name not in mapping: + # We do not use assert here, in order to catch all incompatibilities at once. + # The output can be copied to the dicts above + if print_caption: + print(f"### Missing - {caption}:") + print_caption = False + print(f'"{entry.name}": {cur_idx},') + ok = False + assert ok, f"Found missing {obj.name}. Please consider to add them to the test suite." \ No newline at end of file diff --git a/tests/test_definition_list.py b/tests/test_definition_list.py index a84c7f06..67fff156 100644 --- a/tests/test_definition_list.py +++ b/tests/test_definition_list.py @@ -2,7 +2,6 @@ from luxtronik.common import parse_version from luxtronik.datatypes import Base -from luxtronik.definitions import LuxtronikDefinition from luxtronik.definitions.calculations import CALCULATIONS_DEFINITIONS_LIST from luxtronik.definitions.holdings import HOLDINGS_DEFINITIONS_LIST from luxtronik.definitions.inputs import INPUTS_DEFINITIONS_LIST @@ -25,6 +24,8 @@ KEY_UNTIL = "until" KEY_DESC = "description" +VALID_DATA_TYPES = ("UINT16", "UINT32", "INT16", "INT32") + class RunTestDefinitionList: @@ -185,7 +186,7 @@ def test_data_type(self): for definition in self.definitions: if KEY_DATATYPE in definition: data_type = definition[KEY_DATATYPE] - assert data_type in LuxtronikDefinition.VALID_DATA_TYPES, \ + assert data_type in VALID_DATA_TYPES, \ f"Datatype must be set correctly: {definition}" def test_since(self): diff --git a/tests/test_socket_interaction.py b/tests/test_socket_interaction.py index bf0a1577..c6e50dbb 100644 --- a/tests/test_socket_interaction.py +++ b/tests/test_socket_interaction.py @@ -3,7 +3,6 @@ import unittest.mock as mock from luxtronik import Luxtronik, LuxtronikSocketInterface, Parameters, Calculations, Visibilities -from luxtronik.collections import integrate_data from tests.fake import ( fake_create_connection, fake_parameter_value, @@ -17,7 +16,6 @@ @mock.patch("socket.create_connection", fake_create_connection) @mock.patch("luxtronik.LuxtronikModbusTcpInterface", FakeModbus) class TestSocketInteraction: - def check_luxtronik_data(self, lux, check_for_true=True): cp = self.check_data_vector(lux.parameters) cc = self.check_data_vector(lux.calculations) @@ -34,12 +32,8 @@ def check_data_vector(self, data_vector): fct = fake_calculation_value elif type(data_vector) is Visibilities: fct = fake_visibility_value - for d, f in data_vector.data.pairs(): - # get raw data - raw = [fct(idx) for idx in range(d.index, d.index + d.count)] - temp_field = d.create_field() - integrate_data(d, temp_field, raw, 32, 0) - if f.raw != temp_field.raw: + for idx, entry in data_vector.items(): + if entry.raw != fct(idx): return False return True @@ -49,7 +43,7 @@ def clear_luxtronik_data(self, lux): self.clear_data_vector(lux.visibilities) def clear_data_vector(self, data_vector): - for idx, entry in data_vector: + for idx, entry in data_vector.items(): entry.raw = 0 def test_luxtronik_socket_interface(self): @@ -96,21 +90,29 @@ def test_luxtronik_socket_interface(self): # Finally, writing p = Parameters() - p.queue = {0: 100, 1: 200} + p[0].raw = 100 + p[0].write_pending = True + p[1].raw = 200 + p[1].write_pending = True lux.write(p) s = FakeSocket.last_instance assert s.written_values[0] == 100 assert s.written_values[1] == 200 - assert len(p.queue) == 0 + assert not p[0].write_pending + assert not p[1].write_pending p = Parameters() - p.queue = {2: 300, 3: "test"} + p[2].raw = 300 + p[2].write_pending = True + p[3].raw = "test" + p[3].write_pending = True d = lux.write_and_read(p) s = FakeSocket.last_instance assert s.written_values[2] == 300 # Make sure that the non-int value is not written: assert 3 not in s.written_values - assert len(p.queue) == 0 + assert not p[2].write_pending + assert not p[3].write_pending assert self.check_luxtronik_data(d) def test_luxtronik(self): @@ -141,13 +143,15 @@ def test_luxtronik(self): ########################## # Test the write routine # ########################## - lux.parameters.queue = {0: 500} + lux.parameters[0].raw = 500 + lux.parameters[0].write_pending = True lux.write() s = FakeSocket.last_instance assert s.written_values[0] == 500 p = Parameters() - p.queue = {1: 501} + p[1].raw = 501 + p[1].write_pending = True lux.write(p) s = FakeSocket.last_instance assert s.written_values[1] == 501 @@ -158,7 +162,8 @@ def test_luxtronik(self): ################################### # Test the write_and_read routine # ################################### - lux.parameters.queue = {2: 502} + lux.parameters[2].raw = 502 + lux.parameters[2].write_pending = True lux.write_and_read() # Currently write_and_read triggers two separate connections/operations s = FakeSocket.prev_instance @@ -169,7 +174,8 @@ def test_luxtronik(self): self.clear_luxtronik_data(lux) - p.queue = {3: 503} + p[3].raw = 503 + p[3].write_pending = True lux.write_and_read(p) # Currently write_and_read triggers two separate connections/operations s = FakeSocket.prev_instance From 9a4a3113255cd21ba4bb5f89529bdb10579e95fe Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Tue, 20 Jan 2026 21:09:01 +0100 Subject: [PATCH 10/68] wip --- luxtronik/data_vector.py | 1 + tests/shi/test_shi_contiguous.py | 8 +- tests/shi/test_shi_definitions.py | 79 +++++++++++++-- tests/test_compatibility.py | 8 +- tests/test_data_vector.py | 163 +++++++++++++++++++++++++++++- 5 files changed, 244 insertions(+), 15 deletions(-) diff --git a/luxtronik/data_vector.py b/luxtronik/data_vector.py index 902a3167..248ab5f4 100644 --- a/luxtronik/data_vector.py +++ b/luxtronik/data_vector.py @@ -101,6 +101,7 @@ def integrate_data(definition, field, raw_data, data_offset=-1): if field.concatenate_multiple_data_chunks and raw is not None: # Usually big-endian (reverse=True) is used raw = pack_values(raw, definition.reg_bits) + raw = raw if definition.check_raw_not_none(raw) else None field.raw = raw diff --git a/tests/shi/test_shi_contiguous.py b/tests/shi/test_shi_contiguous.py index 888ff675..f74f5bf1 100644 --- a/tests/shi/test_shi_contiguous.py +++ b/tests/shi/test_shi_contiguous.py @@ -19,26 +19,32 @@ def_a1 = LuxtronikDefinition({ 'index': 1, 'count': 1, + 'datatype': 'INT16', }, 'test', 100) def_a = LuxtronikDefinition({ 'index': 1, 'count': 2, + 'datatype': 'INT16', }, 'test', 100) def_b = LuxtronikDefinition({ 'index': 3, 'count': 1, + 'datatype': 'INT16', }, 'test', 100) def_c = LuxtronikDefinition({ 'index': 4, 'count': 3, + 'datatype': 'INT16', }, 'test', 100) def_c1 = LuxtronikDefinition({ 'index': 4, 'count': 1, + 'datatype': 'INT16', }, 'test', 100) def_c2 = LuxtronikDefinition({ 'index': 5, 'count': 1, + 'datatype': 'INT16', }, 'test', 100) defs = [] @@ -99,7 +105,7 @@ def test_integrate_data(self): assert part.field.raw is None part.integrate_data([1, 5, LUXTRONIK_VALUE_FUNCTION_NOT_AVAILABLE, 9], 1) - assert part.field.raw is None + assert part.field.raw == [5, LUXTRONIK_VALUE_FUNCTION_NOT_AVAILABLE] part = ContiguousDataPart(def_c1, field_c1) diff --git a/tests/shi/test_shi_definitions.py b/tests/shi/test_shi_definitions.py index d4297420..592fca6f 100644 --- a/tests/shi/test_shi_definitions.py +++ b/tests/shi/test_shi_definitions.py @@ -21,28 +21,24 @@ def test_data_arr(self): field.raw = 5 arr = get_data_arr(definition, field) assert arr == [5] - assert check_data(definition, field) # get from array definition._count = 2 field.raw = [7, 3] arr = get_data_arr(definition, field) assert arr == [7, 3] - assert check_data(definition, field) # too much data definition._count = 2 field.raw = [4, 8, 1] arr = get_data_arr(definition, field) assert arr is None - assert not check_data(definition, field) # insufficient data definition._count = 2 field.raw = [9] arr = get_data_arr(definition, field) assert arr is None - assert not check_data(definition, field) field.concatenate_multiple_data_chunks = True @@ -51,21 +47,18 @@ def test_data_arr(self): field.raw = 0x0007_0003 arr = get_data_arr(definition, field) assert arr == [7, 3] - assert check_data(definition, field) # too much data definition._count = 2 field.raw = 0x0004_0008_0001 arr = get_data_arr(definition, field) assert arr == [8, 1] - assert check_data(definition, field) # insufficient data definition._count = 2 field.raw = 0x0009 arr = get_data_arr(definition, field) assert arr == [0, 9] - assert check_data(definition, field) def test_integrate(self): definition = LuxtronikDefinition.unknown(2, 'Foo', 30) @@ -76,6 +69,8 @@ def test_integrate(self): # set array definition._count = 2 + definition._num_bits = 64 + definition._data_type = 'INT64' integrate_data(definition, field, data) assert field.raw == [3, 4] integrate_data(definition, field, data, 4) @@ -83,10 +78,70 @@ def test_integrate(self): integrate_data(definition, field, data, 7) assert field.raw is None integrate_data(definition, field, data, 0) + assert field.raw == [1, LUXTRONIK_VALUE_FUNCTION_NOT_AVAILABLE] + + # set value + definition._count = 1 + definition._num_bits = 32 + definition._data_type = 'INT32' + integrate_data(definition, field, data) + assert field.raw == 3 + integrate_data(definition, field, data, 5) + assert field.raw == 6 + integrate_data(definition, field, data, 9) + assert field.raw is None + integrate_data(definition, field, data, 1) + # Currently there is no magic "not available" value for 32 bit values -> not None + # This applies also to similar lines below + assert field.raw == LUXTRONIK_VALUE_FUNCTION_NOT_AVAILABLE + + field.concatenate_multiple_data_chunks = True + + # set array + definition._count = 2 + definition._num_bits = 64 + definition._data_type = 'INT64' + integrate_data(definition, field, data) + assert field.raw == 0x00000003_00000004 + integrate_data(definition, field, data, 4) + assert field.raw == 0x00000005_00000006 + integrate_data(definition, field, data, 7) assert field.raw is None + integrate_data(definition, field, data, 0) + assert field.raw == 0x00000001_00007FFF # set value definition._count = 1 + definition._num_bits = 32 + definition._data_type = 'INT32' + integrate_data(definition, field, data) + assert field.raw == 0x00000003 + integrate_data(definition, field, data, 5) + assert field.raw == 0x00000006 + integrate_data(definition, field, data, 9) + assert field.raw is None + integrate_data(definition, field, data, 1) + assert field.raw == 0x00007FFF + + field.concatenate_multiple_data_chunks = False + + # set array + definition._count = 2 + definition._num_bits = 32 + definition._data_type = 'INT32' + integrate_data(definition, field, data) + assert field.raw == [3, 4] + integrate_data(definition, field, data, 4) + assert field.raw == [5, 6] + integrate_data(definition, field, data, 7) + assert field.raw is None + integrate_data(definition, field, data, 0) + assert field.raw == [1, LUXTRONIK_VALUE_FUNCTION_NOT_AVAILABLE] + + # set value + definition._count = 1 + definition._num_bits = 16 + definition._data_type = 'INT16' integrate_data(definition, field, data) assert field.raw == 3 integrate_data(definition, field, data, 5) @@ -100,6 +155,8 @@ def test_integrate(self): # set array definition._count = 2 + definition._num_bits = 32 + definition._data_type = 'INT32' integrate_data(definition, field, data) assert field.raw == 0x0003_0004 integrate_data(definition, field, data, 4) @@ -107,10 +164,12 @@ def test_integrate(self): integrate_data(definition, field, data, 7) assert field.raw is None integrate_data(definition, field, data, 0) - assert field.raw is None + assert field.raw == 0x0001_7FFF # set value definition._count = 1 + definition._num_bits = 16 + definition._data_type = 'INT16' integrate_data(definition, field, data) assert field.raw == 0x0003 integrate_data(definition, field, data, 5) @@ -118,4 +177,6 @@ def test_integrate(self): integrate_data(definition, field, data, 9) assert field.raw is None integrate_data(definition, field, data, 1) - assert field.raw is None \ No newline at end of file + assert field.raw is None + + field.concatenate_multiple_data_chunks = False diff --git a/tests/test_compatibility.py b/tests/test_compatibility.py index a6eeb019..49e58b15 100644 --- a/tests/test_compatibility.py +++ b/tests/test_compatibility.py @@ -1915,8 +1915,12 @@ def test_compatibilities(self): print_caption = True for old_name, old_idx in mapping.items(): def_by_name = obj.definitions.get(old_name) - def_by_idx = obj.definitions.get(old_idx) - if (def_by_name.index != old_idx) or (def_by_idx.name != def_by_name.name): + field_by_name = obj.get(old_name) + if (def_by_name is None) \ + or (field_by_name is None) \ + or (def_by_name.index != old_idx) \ + or (def_by_name.name != field_by_name.name) \ + or (old_name not in def_by_name.names): # We do not use assert here, in order to catch all incompatibilities at once. if print_caption: print(f"### Incompatibilities - {caption}:") diff --git a/tests/test_data_vector.py b/tests/test_data_vector.py index 9a13632e..e88e0bd8 100644 --- a/tests/test_data_vector.py +++ b/tests/test_data_vector.py @@ -3,9 +3,166 @@ # pylint: disable=too-few-public-methods,invalid-name,too-many-lines import pytest +from luxtronik.definitions import LuxtronikDefinition, LuxtronikDefinitionsDictionary +from luxtronik.data_vector import LuxtronikFieldsDictionary, DataVector -from luxtronik.data_vector import DataVector -from luxtronik.datatypes import Base +from luxtronik.datatypes import ( + Base, + Unknown, +) + + +class TestLuxtronikFieldsDictionary: + + def test_init(self): + d = LuxtronikFieldsDictionary() + + assert type(d._def_lookup) is LuxtronikDefinitionsDictionary + assert type(d._field_lookup) is dict + assert len(d._field_lookup.values()) == 0 + assert type(d._pairs) is list + assert len(d._pairs) == 0 + + def test_add(self): + d = LuxtronikFieldsDictionary() + assert len(d) == 0 + assert len(d._pairs) == 0 + + u = LuxtronikDefinition.unknown(1, "test", 0) + f = u.create_field() + d.add(u, f) + assert len(d) == 1 + assert len(d._pairs) == 1 + assert d._pairs[0].definition is u + assert d._pairs[0].field is f + + u = LuxtronikDefinition.unknown(2, "test", 0) + f = u.create_field() + d.add(u, f) + assert len(d) == 2 + assert len(d._pairs) == 2 + assert d._pairs[1].definition is u + assert d._pairs[1].field is f + + u = LuxtronikDefinition.unknown(0, "test", 0) + f = u.create_field() + d.add_sorted(u, f) + assert len(d) == 3 + assert len(d._pairs) == 3 + assert d._pairs[0].definition is u + assert d._pairs[0].field is f + + def create_instance(self): + d = LuxtronikFieldsDictionary() + u = LuxtronikDefinition.unknown(1, "test", 0) + d.add(u, u.create_field()) + u = LuxtronikDefinition.unknown(2, "test", 0) + d.add(u, u.create_field()) + b = LuxtronikDefinition({ + "index": 2, + "type": Base, + "names": ["base2"], + }, "test", 0) + f = b.create_field() + d.add(b, f) + b = LuxtronikDefinition({ + "index": 3, + "type": Base, + "names": ["base3"], + }, "test", 0) + d.add(b, b.create_field(), "base4") + return d, u, f + + def test_len(self): + d, _, _ = self.create_instance() + # 3 different indices + assert len(d) == 3 + assert len(d._pairs) == 4 + + def test_get_contains(self): + d, u, f = self.create_instance() + assert "1" in d + assert d["1"].name == "unknown_test_1" + assert "unknown_test_1" in d + assert d["unknown_test_1"].name == "unknown_test_1" + assert 2 in d + assert d[2].name == "base2" + assert "unknown_test_2" in d + assert d["unknown_test_2"].name == "unknown_test_2" + assert "base2" in d + assert d["base2"].name == "base2" + assert "base3" in d + assert d.get("base3").name == "base3" + assert "base4" in d + assert d.get("base4").name == "base3" + assert u in d + assert d[u].name == "unknown_test_2" + assert f in d + assert d[f].name == "base2" + assert 4 not in d + + def test_iter(self): + d, _, _ = self.create_instance() + for idx, key in enumerate(d): + if idx == 0: + assert key == 1 + if idx == 1: + assert key == 2 + if idx == 2: + assert key == 3 + + def test_values(self): + d, _, _ = self.create_instance() + for idx, value in enumerate(d.values()): + if idx == 0: + assert type(value) is Unknown + assert value.name == "unknown_test_1" + if idx == 1: + assert type(value) is Base + assert value.name == "base2" + if idx == 2: + assert type(value) is Base + assert value.name == "base3" + + def test_pairs(self): + d, _, _ = self.create_instance() + for idx, (key, value) in enumerate(d.items()): + if idx == 0: + assert key == 1 + assert type(value) is Unknown + assert value.name == "unknown_test_1" + if idx == 1: + assert key == 2 + assert type(value) is Base + assert value.name == "base2" + if idx == 2: + assert key == 3 + assert type(value) is Base + assert value.name == "base3" + + class MyTestClass: + pass + + def test_alias(self): + d, u, f = self.create_instance() + my = self.MyTestClass() + + d.register_alias(0, "abc") + assert d["abc"] is d[0] + + field = d.register_alias("unknown_test_1", 6) + assert d[6] is field + + field = d.register_alias(u, my) + assert d[my] is d[u] + + d.register_alias(f, my) + assert d[my] is not d[u] + assert d[my] is d[f] + + field = d.register_alias(9, my) + assert field is None + assert d[my] is d[f] class ObsoleteDataVector(DataVector): @@ -28,7 +185,7 @@ class TestDataVector: @pytest.mark.parametrize("name, exception_expected", [ ("foo", False), - ("bar", True), + ("bar", False), ("baz", True), ("qux", False), ]) From db7a186731f9e39934ebf74fa632821604fb3f8f Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Sun, 11 Jan 2026 20:12:48 +0100 Subject: [PATCH 11/68] wip --- tests/shi/test_shi_vector.py | 41 +++++++++++++++--------------------- 1 file changed, 17 insertions(+), 24 deletions(-) diff --git a/tests/shi/test_shi_vector.py b/tests/shi/test_shi_vector.py index a232c32d..8a4b734a 100644 --- a/tests/shi/test_shi_vector.py +++ b/tests/shi/test_shi_vector.py @@ -91,8 +91,8 @@ def test_create(self): # create versioned data vector data_vector = DataVectorTest(parse_version("1.2")) assert data_vector.version == (1, 2, 0, 0) - assert len(data_vector) == 3 - assert len(data_vector._data.pairs()) == 3 + assert len(data_vector) == 2 + assert len(data_vector._data._items) == 3 assert not data_vector._read_blocks_up_to_date assert len(data_vector._read_blocks) == 0 @@ -215,8 +215,8 @@ def test_add(self): def_9a = data_vector.definitions['field_9a'] field = data_vector.add(def_9a) assert def_9a in data_vector - assert len(data_vector) == 3 - assert len(data_vector.data._pairs) == 3 + assert len(data_vector) == 2 + assert len(data_vector.data._items) == 3 assert field.name == 'field_9a' # Get via index (last added) @@ -249,38 +249,31 @@ def test_iter(self): data_vector.add(5) data_vector.add(9) - for index, definition in enumerate(data_vector): + for index, idx in enumerate(data_vector): if index == 0: - assert definition.index == 5 - assert definition.name == 'field_5' + assert idx == 5 if index == 1: - assert definition.index == 9 - assert definition.name == 'field_9a' + assert idx == 9 # field_9 if index == 2: - assert definition.index == 9 - assert definition.name == 'field_9' + assert False for index, field in enumerate(data_vector.values()): if index == 0: assert field.name == 'field_5' if index == 1: - assert field.name == 'field_9a' - if index == 2: assert field.name == 'field_9' + if index == 2: + assert False - for index, (definition, field) in enumerate(data_vector.items()): + for index, (idx, field) in enumerate(data_vector.items()): if index == 0: - assert definition.index == 5 - assert definition.name == 'field_5' + assert idx == 5 assert field.name == 'field_5' if index == 1: - assert definition.index == 9 - assert definition.name == 'field_9a' - assert field.name == 'field_9a' - if index == 2: - assert definition.index == 9 - assert definition.name == 'field_9' + assert idx == 9 assert field.name == 'field_9' + if index == 2: + assert False def test_set(self): data_vector = DataVectorTest(parse_version("1.1.2")) @@ -405,8 +398,8 @@ def test_version_none(self): data_vector.add("field_invalid") assert len(data_vector) == 3 data_vector.add(10) # field_9a alias - assert len(data_vector) == 4 - assert len(data_vector._data._pairs) == 4 + assert len(data_vector) == 3 + assert len(data_vector._data._items) == 4 class TestHoldings: From 393efabe12d590d034749a9cbf8d6fb5ecfac1c0 Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Tue, 20 Jan 2026 22:20:09 +0100 Subject: [PATCH 12/68] wip --- luxtronik/data_vector.py | 14 ++++++----- luxtronik/datatypes.py | 41 +++++++++++++++++++++++++------ luxtronik/definitions/__init__.py | 30 +++++++++++++++------- luxtronik/shi/holdings.py | 2 +- tests/cfi/test_cfi_parameters.py | 34 ++++++++++--------------- tests/shi/test_shi_vector.py | 6 ++--- tests/test_definition_list.py | 2 -- 7 files changed, 80 insertions(+), 49 deletions(-) diff --git a/luxtronik/data_vector.py b/luxtronik/data_vector.py index 248ab5f4..e7574528 100644 --- a/luxtronik/data_vector.py +++ b/luxtronik/data_vector.py @@ -8,7 +8,7 @@ LUXTRONIK_VALUE_FUNCTION_NOT_AVAILABLE, ) -from luxtronik.datatypes import Base +from luxtronik.datatypes import Base, Unknown from luxtronik.definitions import LuxtronikDefinition, LuxtronikDefinitionsDictionary @@ -98,7 +98,9 @@ def integrate_data(definition, field, raw_data, data_offset=-1): else: raw = raw_data[data_offset : data_offset + definition.count] raw = raw if len(raw) == definition.count else None - if field.concatenate_multiple_data_chunks and raw is not None: + should_pack = field.concatenate_multiple_data_chunks \ + and definition.reg_bits > 0 # and definition.count > 1 + if should_pack and raw is not None : # Usually big-endian (reverse=True) is used raw = pack_values(raw, definition.reg_bits) @@ -120,8 +122,9 @@ def get_data_arr(definition, field): data = field.raw if data is None: return None - if not isinstance(data, list) and definition.count > 1 \ - and field.concatenate_multiple_data_chunks: + should_unpack = field.concatenate_multiple_data_chunks \ + and definition.reg_bits > 0 and definition.count > 1 + if should_unpack and not isinstance(data, list): # Usually big-endian (reverse=True) is used data = unpack_values(data, definition.count, definition.reg_bits) if not isinstance(data, list): @@ -500,11 +503,10 @@ def parse(self, raw_data): for index in range(definition.index, next_idx): undefined.discard(index) integrate_data(definition, field, raw_data) - field.write_pending = False # create an unknown field for additional data for index in undefined: # self.logger.warning(f"Entry '%d' not in list of {self.name}", index) - definition = LuxtronikDefinition.unknown(index, self.name, self.definitions.offset) + definition = self.definitions.create_unknown_definition(index) field = definition.create_field() field.raw = raw_data[index] self._data.add_sorted(definition, field) diff --git a/luxtronik/datatypes.py b/luxtronik/datatypes.py index f8431c4b..7f34e169 100755 --- a/luxtronik/datatypes.py +++ b/luxtronik/datatypes.py @@ -44,11 +44,15 @@ def __init__(self, names, writeable=False): @classmethod def to_heatpump(cls, value): """Converts value into heatpump units.""" + if not isinstance(value, int): + return None return value @classmethod def from_heatpump(cls, value): """Converts value from heatpump units.""" + if not isinstance(value, int): + return None return value @classproperty @@ -165,7 +169,7 @@ def sanitize_option(cls, option): @classmethod def from_heatpump(cls, value): - if value is None: + if not isinstance(value, int): return None if value in cls.codes: return cls.codes.get(value) @@ -319,11 +323,16 @@ class Bool(Base): @classmethod def from_heatpump(cls, value): + if not isinstance(value, int): + return None return bool(value) @classmethod def to_heatpump(cls, value): - return int(value) + try: + return int(bool(value)) + except Exception: + return None class Frequency(Base): @@ -347,10 +356,14 @@ class IPv4Address(Base): @classmethod def from_heatpump(cls, value): + if not isinstance(value, int): + return None return socket.inet_ntoa(struct.pack(">i", value)) @classmethod def to_heatpump(cls, value): + if not isinstance(value, str): + return None return struct.unpack(">i", socket.inet_aton(value))[0] @@ -361,7 +374,7 @@ class Timestamp(Base): @classmethod def from_heatpump(cls, value): - if value is None: + if not isinstance(value, int): return None if value <= 0: return datetime.datetime.fromtimestamp(0) @@ -369,6 +382,8 @@ def from_heatpump(cls, value): @classmethod def to_heatpump(cls, value): + if not isinstance(value, float): + return None return datetime.datetime.timestamp(value) @@ -560,12 +575,14 @@ class Hours2(Base): @classmethod def from_heatpump(cls, value): - if value is None: + if not isinstance(value, int): return None return 1 + value / 2 @classmethod def to_heatpump(cls, value): + if not isinstance(value, int): + return None return round((value - 1) * 2) @@ -602,6 +619,8 @@ class Character(Base): @classmethod def from_heatpump(cls, value): + if not isinstance(value, int): + return None if value == 0: return "" return chr(value) @@ -614,6 +633,8 @@ class MajorMinorVersion(Base): @classmethod def from_heatpump(cls, value): + if not isinstance(value, int): + return None if value > 0: major = value // 100 minor = value % 100 @@ -932,7 +953,7 @@ class TimeOfDay(Base): @classmethod def from_heatpump(cls, value): - if value is None: + if not isinstance(value, int): return None hours = value // 3600 minutes = (value // 60) % 60 @@ -942,6 +963,8 @@ def from_heatpump(cls, value): @classmethod def to_heatpump(cls, value): + if not isinstance(value, str): + return None d = [int(v) for v in value.split(":")] val = d[0] * 3600 + d[1] * 60 @@ -958,7 +981,7 @@ class TimeOfDay2(Base): @classmethod def from_heatpump(cls, value): - if value is None: + if not isinstance(value, int): return None value_low = value & 0xFFFF @@ -972,6 +995,8 @@ def from_heatpump(cls, value): @classmethod def to_heatpump(cls, value): + if not isinstance(value, str): + return None d = value.split("-") low = [int(v) for v in d[0].split(":")] high = [int(v) for v in d[1].split(":")] @@ -1087,7 +1112,9 @@ class FullVersion(Base): @classmethod def from_heatpump(cls, value): - if isinstance(value, list) and len(value) >= 3: + if not isinstance(value, list): + return None + if len(value) >= 3: return f"{value[0]}.{value[1]}.{value[2]}" else: return "0" diff --git a/luxtronik/definitions/__init__.py b/luxtronik/definitions/__init__.py index c5b1924f..d92090c4 100644 --- a/luxtronik/definitions/__init__.py +++ b/luxtronik/definitions/__init__.py @@ -38,10 +38,15 @@ class LuxtronikDefinition: "names": [], "since": "", "until": "", - "datatype": "UINT32", + "datatype": "", "description": "", } + # It is permissible not to specify a data type. + # In this case, all functions based on it will be disabled. + VALID_DATA_TYPES = ("", "UINT16", "UINT32", "UINT64", "INT16", "INT32", "INT64") + + def __init__(self, data_dict, type_name, offset): """ Initialize a definition from a data-dictionary. @@ -83,14 +88,18 @@ def __init__(self, data_dict, type_name, offset): self._offset = int(offset) self._addr = self._offset + self._index self._data_type = data_dict["datatype"] - self._num_bits = int(self._data_type.replace('U', '').replace('INT', '')) + data_type_valid = self._data_type in self.VALID_DATA_TYPES + self._valid &= data_type_valid + data_type_valid &= self._data_type != "" + self._num_bits = int(self._data_type.replace('U', '').replace('INT', '')) \ + if data_type_valid else 0 except Exception as e: self._valid = False self._index = 0 LOGGER.error(f"Failed to create LuxtronikDefinition: '{e}' with {data_dict}") @classmethod - def unknown(cls, index, type_name, offset): + def unknown(cls, index, type_name, offset, data_type=""): """ Create an "unknown" definition. @@ -98,13 +107,15 @@ def unknown(cls, index, type_name, offset): index (int): The register index of the "unknown" definition. type_name (str): The type name e.g. 'holding', 'input', ... . offset (str): Offset of the address from the specified index. + data_type (str): Data type of the field (see VALID_DATA_TYPES). Returns: LuxtronikDefinition: A definition marked as unknown. """ return cls({ "index": index, - "names": [f"unknown_{type_name.lower()}_{index}"] + "names": [f"unknown_{type_name.lower()}_{index}"], + "datatype": data_type, }, type_name, offset) def __bool__(self): @@ -416,16 +427,17 @@ class LuxtronikDefinitionsList: (locally = only valid for that dictionary). """ - def _init_instance(self, name, offset, version): + def _init_instance(self, name, offset, default_data_type, version): """Re-usable method to initialize all instance variables.""" self._name = name self._offset = offset + self._default_data_type = default_data_type self._version = version # sorted list of all definitions self._definitions = [] self._lookup = LuxtronikDefinitionsDictionary() - def __init__(self, definitions_list, name, offset): + def __init__(self, definitions_list, name, offset, default_data_type): """ Initialize the (by index sorted) definitions list. @@ -442,7 +454,7 @@ def __init__(self, definitions_list, name, offset): - The value of count must always be greater than or equal to 1 - All names should be unique """ - self._init_instance(name, offset, None) + self._init_instance(name, offset, default_data_type, None) # Add definition objects only for valid items. # The correct sorting has already been ensured by the pytest @@ -464,7 +476,7 @@ def filtered(cls, definitions, version): If None is passed, all available fields are added. """ obj = cls.__new__(cls) # this don't call __init__() - obj._init_instance(definitions.name, definitions.offset, version) + obj._init_instance(definitions.name, definitions.offset, definitions._default_data_type, version) for d in definitions: if d.valid and version_in_range(obj._version, d.since, d.until): @@ -498,7 +510,7 @@ def create_unknown_definition(self, index): Returns: LuxtronikDefinition: A definition marked as unknown. """ - return LuxtronikDefinition.unknown(index, self._name, self._offset) + return LuxtronikDefinition.unknown(index, self._name, self._offset, self._default_data_type) def register_alias(self, def_name_or_idx, alias): """ diff --git a/luxtronik/shi/holdings.py b/luxtronik/shi/holdings.py index 1df95e68..53f6e0d4 100644 --- a/luxtronik/shi/holdings.py +++ b/luxtronik/shi/holdings.py @@ -7,7 +7,7 @@ from luxtronik.definitions.holdings import ( HOLDINGS_DEFINITIONS_LIST, HOLDINGS_OFFSET, - HOLDINGS_DEFAULT_DATA_TYPE, + HOLDINGS_DEFAULT_DATA_TYPE ) from luxtronik.shi.constants import HOLDINGS_FIELD_NAME diff --git a/tests/cfi/test_cfi_parameters.py b/tests/cfi/test_cfi_parameters.py index dc2f55c9..9a033f24 100644 --- a/tests/cfi/test_cfi_parameters.py +++ b/tests/cfi/test_cfi_parameters.py @@ -43,26 +43,18 @@ def test_get(self): assert parameters.get("0").name == s assert parameters.get(s).name == s - def test__lookup(self): - """Test cases for _lookup""" - parameters = Parameters() - s = "ID_Transfert_LuxNet" - assert parameters._lookup(0).name == s - assert parameters._lookup("0").name == s - assert parameters._lookup(s).name == s - - p0 = parameters._lookup(0) - assert parameters._lookup(0, True) == (0, p0) - assert parameters._lookup("0", True) == (0, p0) - assert parameters._lookup(s, True) == (0, p0) + p0 = parameters.get(0) + assert parameters[0] is p0 + assert parameters["0"] is p0 + assert parameters[s] is p0 # Look for a name which does not exist s = "ID_BarFoo" - assert parameters._lookup(s, True)[0] is None + assert parameters.get(s) is None # Look for something which is not an int and not a string j = 0.0 - assert parameters._lookup(j) is None + assert parameters.get(j) is None def test___iter__(self): """Test cases for __iter__""" @@ -82,21 +74,21 @@ def test_set(self): # Set something which does not exist parameters.set("BarFoo", 0) - assert paramters["BarFoo"] is not None + assert parameters["BarFoo"] is None # Set something which was previously not allowed to be set parameters.set("ID_Transfert_LuxNet", 1) - assert paramters["ID_Transfert_LuxNet"].raw == 1 - assert paramters["ID_Transfert_LuxNet"].write_pending + assert parameters["ID_Transfert_LuxNet"].raw == 1 + assert parameters["ID_Transfert_LuxNet"].write_pending # Set something which is allowed to be set parameters.set("ID_Einst_WK_akt", 2) - assert paramters["ID_Einst_WK_akt"].raw == 2 - assert paramters["ID_Einst_WK_akt"].write_pending + assert parameters["ID_Einst_WK_akt"].raw == 20 + assert parameters["ID_Einst_WK_akt"].write_pending parameters = Parameters(safe=False) # Set something which was previously not allowed to be set, but we are brave. parameters.set("ID_Transfert_LuxNet", 4) - assert paramters["ID_Transfert_LuxNet"].raw == 4 - assert paramters["ID_Transfert_LuxNet"].write_pending + assert parameters["ID_Transfert_LuxNet"].raw == 4 + assert parameters["ID_Transfert_LuxNet"].write_pending diff --git a/tests/shi/test_shi_vector.py b/tests/shi/test_shi_vector.py index 8a4b734a..b1bd5af3 100644 --- a/tests/shi/test_shi_vector.py +++ b/tests/shi/test_shi_vector.py @@ -92,7 +92,7 @@ def test_create(self): data_vector = DataVectorTest(parse_version("1.2")) assert data_vector.version == (1, 2, 0, 0) assert len(data_vector) == 2 - assert len(data_vector._data._items) == 3 + assert len(data_vector._data._pairs) == 3 assert not data_vector._read_blocks_up_to_date assert len(data_vector._read_blocks) == 0 @@ -216,7 +216,7 @@ def test_add(self): field = data_vector.add(def_9a) assert def_9a in data_vector assert len(data_vector) == 2 - assert len(data_vector.data._items) == 3 + assert len(data_vector.data._pairs) == 3 assert field.name == 'field_9a' # Get via index (last added) @@ -399,7 +399,7 @@ def test_version_none(self): assert len(data_vector) == 3 data_vector.add(10) # field_9a alias assert len(data_vector) == 3 - assert len(data_vector._data._items) == 4 + assert len(data_vector._data._pairs) == 4 class TestHoldings: diff --git a/tests/test_definition_list.py b/tests/test_definition_list.py index 67fff156..b0cfef34 100644 --- a/tests/test_definition_list.py +++ b/tests/test_definition_list.py @@ -24,8 +24,6 @@ KEY_UNTIL = "until" KEY_DESC = "description" -VALID_DATA_TYPES = ("UINT16", "UINT32", "INT16", "INT32") - class RunTestDefinitionList: From dbcb669ce6374ec889ec8988f5fac10114491d1e Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Wed, 21 Jan 2026 20:26:17 +0100 Subject: [PATCH 13/68] wip --- luxtronik/cfi/parameters.py | 1 - luxtronik/cfi/vector.py | 56 ++++++ luxtronik/cfi/visibilities.py | 5 - luxtronik/data_vector.py | 350 ++-------------------------------- luxtronik/datatypes.py | 4 - luxtronik/shi/contiguous.py | 2 +- luxtronik/shi/interface.py | 2 +- luxtronik/shi/vector.py | 9 +- 8 files changed, 76 insertions(+), 353 deletions(-) create mode 100644 luxtronik/cfi/vector.py diff --git a/luxtronik/cfi/parameters.py b/luxtronik/cfi/parameters.py index f0976028..d3906369 100644 --- a/luxtronik/cfi/parameters.py +++ b/luxtronik/cfi/parameters.py @@ -26,7 +26,6 @@ class Parameters(DataVectorConfig): """Class that holds all parameters.""" - logger = LOGGER name = PARAMETERS_FIELD_NAME definitions = PARAMETERS_DEFINITIONS diff --git a/luxtronik/cfi/vector.py b/luxtronik/cfi/vector.py new file mode 100644 index 00000000..4f8b5206 --- /dev/null +++ b/luxtronik/cfi/vector.py @@ -0,0 +1,56 @@ + +import logging + +from luxtronik.data_vector import DataVector + +LOGGER = logging.getLogger(__name__) + +############################################################################### +# Configuration interface data-vector +############################################################################### + +class DataVectorConfig(DataVector): + """Specialized DataVector for Luxtronik configuration fields.""" + + def __init__(self, safe=True): + """Initialize config interface data-vector class.""" + super()._init_instance(safe) + + # Add all available fields + for d in self.definitions: + self._data.add(d, d.create_field()) + + def add(self, def_field_name_or_idx, alias=None): + """ + Adds an additional field to this data vector. + + Args: + def_field_name_or_idx (LuxtronikDefinition | Base | str | int): + Field to add. Either by definition, name or index, or the field itself. + alias (Hashable | None): Alias, which can be used to access the field again. + + Returns: + Base | None: The added field object if this could be added or + the existing field, otherwise None. In case a field + + Note: + It is not possible to add fields which are not defined. + To add custom fields, add them to the used `LuxtronikDefinitionsList` + (`cls.definitions`) first. + If multiple fields added for the same index/name, the last added takes precedence. + """ + # Look-up the related definition + definition, field = self._get_definition(def_field_name_or_idx, True) + if definition is None: + return None + + # Check if the field already exists + existing_field = self._data.get(definition, None) + if existing_field is not None: + return existing_field + + # Add a (new) field + if field is None: + field = definition.create_field() + self._data.add_sorted(definition, field, alias) + return field \ No newline at end of file diff --git a/luxtronik/cfi/visibilities.py b/luxtronik/cfi/visibilities.py index ec87c3bf..99ceb3e2 100644 --- a/luxtronik/cfi/visibilities.py +++ b/luxtronik/cfi/visibilities.py @@ -29,11 +29,6 @@ class Visibilities(DataVectorConfig): name = VISIBILITIES_FIELD_NAME definitions = VISIBILITIES_DEFINITIONS - def __init__(self): - super().__init__() - for d in VISIBILITIES_DEFINITIONS: - self._data.add(d, d.create_field()) - @property def visibilities(self): return self._data diff --git a/luxtronik/data_vector.py b/luxtronik/data_vector.py index e7574528..2a057e33 100644 --- a/luxtronik/data_vector.py +++ b/luxtronik/data_vector.py @@ -7,6 +7,7 @@ LUXTRONIK_NAME_CHECK_OBSOLETE, LUXTRONIK_VALUE_FUNCTION_NOT_AVAILABLE, ) +from luxtronik.collections import LuxtronikFieldsDictionary from luxtronik.datatypes import Base, Unknown from luxtronik.definitions import LuxtronikDefinition, LuxtronikDefinitionsDictionary @@ -15,334 +16,6 @@ LOGGER = logging.getLogger(__name__) -############################################################################### -# Common functions -############################################################################### - -def pack_values(values, num_bits, reverse=True): - """ - Packs a list of data chunks into one integer. - - Args: - values (list[int]): raw data; distributed across multiple registers. - num_bits (int): Number of bits per chunk. - reverse (bool): Use big-endian/MSB-first if true, - otherwise use little-endian/LSB-first order. - - Returns: - int: Packed raw data as a single integer value. - - Note: - The smart home interface uses a chunk size of 16 bits. - """ - count = len(values) - mask = (1 << num_bits) - 1 - - result = 0 - for idx, value in enumerate(values): - # normal: idx = 0..n-1 - # reversed index: highest chunk first - bit_index = (count - 1 - idx) if reverse else idx - - result |= (value & mask) << (num_bits * bit_index) - - return result - -def unpack_values(packed, count, num_bits, reverse=True): - """ - Unpacks 'count' chunks from a packed integer. - - Args: - packed (int): Packed raw data as a single integer value. - count (int): Number of chunks to unpack. - num_bits (int): Number of bits per chunk. - reverse (bool): Use big-endian/MSB-first if true, - otherwise use little-endian/LSB-first order. - - Returns: - list[int]: List of unpacked raw data values. - - Note: - The smart home interface uses a chunk size of 16 bits. - """ - values = [] - mask = (1 << num_bits) - 1 - - for idx in range(count): - # normal: idx = 0..n-1 - # reversed: highest chunk first - bit_index = (count - 1 - idx) if reverse else idx - - chunk = (packed >> (num_bits * bit_index)) & mask - values.append(chunk) - - return values - -def integrate_data(definition, field, raw_data, data_offset=-1): - """ - Integrate raw values from a data array into the field. - - Args: - definition (LuxtronikDefinition): Meta-data of the field. - field (Base): Field object where to integrate the data. - raw_data (list): Source array of bytes/words. - data_offset (int): Optional offset. Defaults to `definition.index`. - """ - # Use data_offset if provided, otherwise the index - data_offset = data_offset if data_offset >= 0 else definition.index - # Use the information of the definition to extract the raw-value - if (data_offset + definition.count - 1) >= len(raw_data): - raw = None - elif definition.count == 1: - raw = raw_data[data_offset] - else: - raw = raw_data[data_offset : data_offset + definition.count] - raw = raw if len(raw) == definition.count else None - should_pack = field.concatenate_multiple_data_chunks \ - and definition.reg_bits > 0 # and definition.count > 1 - if should_pack and raw is not None : - # Usually big-endian (reverse=True) is used - raw = pack_values(raw, definition.reg_bits) - - raw = raw if definition.check_raw_not_none(raw) else None - field.raw = raw - -def get_data_arr(definition, field): - """ - Normalize the field's data to a list of the correct size. - - Args: - definition (LuxtronikDefinition): Meta-data of the field. - field (Base): Field object that contains data to get. - - Returns: - list[int] | None: List of length `definition.count`, - or None if the data size does not match. - """ - data = field.raw - if data is None: - return None - should_unpack = field.concatenate_multiple_data_chunks \ - and definition.reg_bits > 0 and definition.count > 1 - if should_unpack and not isinstance(data, list): - # Usually big-endian (reverse=True) is used - data = unpack_values(data, definition.count, definition.reg_bits) - if not isinstance(data, list): - data = [data] - return data if len(data) == definition.count else None - -############################################################################### -# Definition / field pair -############################################################################### - -class LuxtronikDefFieldPair: - """ - Combines a definition and a field into a single iterable object. - """ - - def __init__(self, definition, field): - """ - Initialize a definition-field-pair. - - Args: - field (Base): The field object. - definition (LuxtronikDefinition): The definition for this field. - """ - self.field = field - self.definition = definition - - def __iter__(self): - yield self.definition - yield self.field - - @property - def index(self): - return self.definition.index - - @property - def addr(self): - return self.definition.addr - - @property - def count(self): - return self.definition.count - - def get_data_arr(self): - """ - Normalize the field's data to a list of the correct size. - - Returns: - list[int] | None: List of length `definition.count`, or None if insufficient. - """ - return get_data_arr(self.definition, self.field) - - def integrate_data(self, raw_data, data_offset=-1): - """ - Integrate the related parts of the `raw_data` into the field - - Args: - raw_data (list): Source array of bytes/words. - data_offset (int): Optional offset. Defaults to `definition.index`. - """ - integrate_data(self.definition, self.field, raw_data, data_offset) - -############################################################################### -# Field dictionary for data vectors -############################################################################### - -class LuxtronikFieldsDictionary: - """ - Dictionary that behaves like the earlier data vector dictionaries (index-field-dictionary), - with the addition that obsolete fields are also supported and can be addressed by name. - Aliases are also supported. - """ - - def __init__(self): - # There may be several names or alias that points to one definition. - # So in order to spare memory we split the name/index-to-field-lookup - # into a name/index-to-definition-lookup and a definition-to-field-lookup - self._def_lookup = LuxtronikDefinitionsDictionary() - self._field_lookup = {} - # Furthermore stores the definition-to-field-lookup separate from the - # field-definition pairs to keep the index-sorted order when adding new entries - self._pairs = [] # list of LuxtronikDefFieldPair - - def __getitem__(self, def_field_name_or_idx): - return self.get(def_field_name_or_idx) - - def __setitem__(self, def_name_or_idx, value): - assert False, "__setitem__ not implemented." - - def __len__(self): - return len(self._def_lookup._index_dict) - - def __iter__(self): - """ - Iterate over all non-obsolete indices. If an index is assigned multiple times, - only the index of the preferred definition will be output. - """ - all_related_defs = self._def_lookup._index_dict.values() - return iter([d.index for d in self._pairs if d in all_related_defs]) - - def __contains__(self, def_field_name_or_idx): - """ - Check whether the data vector contains a name, index, - or definition matching an added field, or the field itself. - - Args: - def_field_name_or_idx (LuxtronikDefinition | Base | str | int): - Definition object, field object, field name or register index. - - Returns: - True if the searched element was found, otherwise False. - """ - if isinstance(def_field_name_or_idx, Base): - return any(def_field_name_or_idx is field for field in self._field_lookup.values()) - elif isinstance(def_field_name_or_idx, LuxtronikDefinition): - # speed-up the look-up by search only the name-dict - return def_field_name_or_idx.name in self._def_lookup._name_dict - else: - return def_field_name_or_idx in self._def_lookup - - def values(self): - """ - Iterator for all added non-obsolete fields. If an index is assigned multiple times, - only the field of the preferred definition will be output. - """ - all_related_defs = self._def_lookup._index_dict.values() - return iter([f for d, f in self._pairs if d in all_related_defs]) - - def items(self): - """ - Iterator for all non-obsolete index-field-pairs (list of tuples with - 0: index, 1: field) contained herein. If an index is assigned multiple times, - only the index-field-pair of the preferred definition will be output. - """ - all_related_defs = self._def_lookup._index_dict.values() - return iter([(d.index, f) for d, f in self._pairs if d in all_related_defs]) - - def pairs(self): - """ - Return all definition-field-pairs contained herein. - """ - return self._pairs - - @property - def def_dict(self): - """Return the internal definition dictionary""" - return self._def_lookup - - def add(self, definition, field, alias=None): - """ - Add a definition-field-pair to the internal dictionaries. - - Args: - definition (LuxtronikDefinition): Definition related to the field. - field (Base): Field to add. - alias (Hashable | None): Alias, which can be used to access the field again. - """ - if definition.valid: - self._def_lookup.add(definition, alias) - self._field_lookup[definition] = field - self._pairs.append(LuxtronikDefFieldPair(definition, field)) - - def add_sorted(self, definition, field, alias=None): - if definition.valid: - self.add(definition, field, alias) - # sort _pairs by definition.index - self._pairs.sort(key=lambda pair: pair.definition.index) - - def register_alias(self, def_field_name_or_idx, alias): - """ - Add an alternative name (or anything hashable else) - that can be used to access a specific field. - - Args: - def_field_name_or_idx (LuxtronikDefinition | Base | str | int): - Field to which the alias is to be added. - Either by definition, name, register index, or the field itself. - alias (Hashable): Alias, which can be used to access the field again. - - Returns: - Base | None: The field to which the alias was added, - or None if not possible - """ - # Resolve a field input - def_name_or_idx = def_field_name_or_idx - if isinstance(def_name_or_idx, Base): - def_name_or_idx = def_name_or_idx.name - # register alias - definition = self._def_lookup.register_alias(def_name_or_idx, alias) - if definition is None: - return None - return self._field_lookup.get(definition, None) - - def get(self, def_field_name_or_idx, default=None): - """ - Retrieve a field by definition, name or register index. - - Args: - def_field_name_or_idx (LuxtronikDefinition | str | int): - Definition, name, or register index to be used to search for the field. - - Returns: - Base | None: The field found or the provided default if not found. - - Note: - If multiple fields added for the same index/name, - the last added takes precedence. - """ - def_name_or_idx = def_field_name_or_idx - if isinstance(def_name_or_idx, Base): - def_name_or_idx = def_name_or_idx.name - if isinstance(def_name_or_idx, LuxtronikDefinition): - definition = def_name_or_idx - else: - definition = self._def_lookup.get(def_name_or_idx) - if definition is not None: - return self._field_lookup.get(definition, default) - return default - ############################################################################### # Base class for all luxtronik data vectors ############################################################################### @@ -357,7 +30,6 @@ class DataVector: (globally = valid for all newly created vector). """ - logger = LOGGER name = "DataVector" # DataVector specific list of definitions as `LuxtronikDefinitionsList` @@ -422,9 +94,16 @@ class variable `cls.definitions` and is valid for `self.version`). # constructor, magic methods and iterators #################################### + def _init_instance(self, safe): + """Re-usable method to initialize all instance variables.""" + self.safe = safe + + # Dictionary that holds all fields + self._data = LuxtronikFieldsDictionary() + def __init__(self): """Initialize DataVector class.""" - self._data = LuxtronikFieldsDictionary() + self._init_instance(True) @property def data(self): @@ -495,17 +174,18 @@ def parse(self, raw_data): """ raw_len = len(raw_data) undefined = {i for i in range(0, raw_len)} - for definition, field in self._data.pairs(): + for pair in self._data.pairs(): + definition, field = pair next_idx = definition.index + definition.count if next_idx >= raw_len: # not enough registers continue for index in range(definition.index, next_idx): undefined.discard(index) - integrate_data(definition, field, raw_data) + pair.integrate_data(raw_data) # create an unknown field for additional data for index in undefined: - # self.logger.warning(f"Entry '%d' not in list of {self.name}", index) + # LOGGER.warning(f"Entry '%d' not in list of {self.name}", index) definition = self.definitions.create_unknown_definition(index) field = definition.create_field() field.raw = raw_data[index] @@ -564,7 +244,7 @@ def get(self, def_name_or_idx, default=None): raise KeyError(f"The name '{def_name_or_idx}' is obsolete! Use '{obsolete_entry}' instead.") field = self._data.get(def_name_or_idx, default) if field is None: - self.logger.warning(f"entry '{def_name_or_idx}' not found") + LOGGER.warning(f"entry '{def_name_or_idx}' not found") return field def set(self, def_field_name_or_idx, value): @@ -581,7 +261,9 @@ def set(self, def_field_name_or_idx, value): value (int | List[int]): Value to set """ field = def_field_name_or_idx + print(field) if not isinstance(field, Base): field = self.get(def_field_name_or_idx) + print(field) if field is not None: field.value = value \ No newline at end of file diff --git a/luxtronik/datatypes.py b/luxtronik/datatypes.py index 7f34e169..74dc3d16 100755 --- a/luxtronik/datatypes.py +++ b/luxtronik/datatypes.py @@ -44,15 +44,11 @@ def __init__(self, names, writeable=False): @classmethod def to_heatpump(cls, value): """Converts value into heatpump units.""" - if not isinstance(value, int): - return None return value @classmethod def from_heatpump(cls, value): """Converts value from heatpump units.""" - if not isinstance(value, int): - return None return value @classproperty diff --git a/luxtronik/shi/contiguous.py b/luxtronik/shi/contiguous.py index 7c598a82..52ec1f8d 100644 --- a/luxtronik/shi/contiguous.py +++ b/luxtronik/shi/contiguous.py @@ -6,7 +6,7 @@ import logging -from luxtronik.data_vector import LuxtronikDefFieldPair +from luxtronik.collections import LuxtronikDefFieldPair LOGGER = logging.getLogger(__name__) diff --git a/luxtronik/shi/interface.py b/luxtronik/shi/interface.py index b924a84c..66977abc 100644 --- a/luxtronik/shi/interface.py +++ b/luxtronik/shi/interface.py @@ -3,8 +3,8 @@ import logging from luxtronik.common import classproperty, version_in_range +from luxtronik.collections import get_data_arr from luxtronik.datatypes import Base -from luxtronik.data_vector import get_data_arr from luxtronik.definitions import ( LuxtronikDefinition, LuxtronikDefinitionsList, diff --git a/luxtronik/shi/vector.py b/luxtronik/shi/vector.py index 33882480..2b23f298 100644 --- a/luxtronik/shi/vector.py +++ b/luxtronik/shi/vector.py @@ -2,9 +2,7 @@ import logging from luxtronik.common import version_in_range -from luxtronik.data_vector import LuxtronikFieldsDictionary, DataVector -from luxtronik.datatypes import Base, Unknown -from luxtronik.definitions import LuxtronikDefinition +from luxtronik.data_vector import DataVector from luxtronik.shi.constants import LUXTRONIK_LATEST_SHI_VERSION from luxtronik.shi.contiguous import ContiguousDataBlockList @@ -21,12 +19,9 @@ class DataVectorSmartHome(DataVector): def _init_instance(self, version, safe): """Re-usable method to initialize all instance variables.""" - self.safe = safe + super()._init_instance(safe) self._version = version - # Dictionary that holds all fields - self._data = LuxtronikFieldsDictionary() - # Instead of re-create the block-list on every read, we just update it # on first time used or on next time used if some fields are added. self._read_blocks_up_to_date = False From 85a44991cfc6482583c2c2920e722c25f20c32b9 Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Wed, 21 Jan 2026 20:29:07 +0100 Subject: [PATCH 14/68] wip --- luxtronik/collections.py | 167 ++++++++++++++------------------------- 1 file changed, 60 insertions(+), 107 deletions(-) diff --git a/luxtronik/collections.py b/luxtronik/collections.py index 9190bdf7..67389dcf 100644 --- a/luxtronik/collections.py +++ b/luxtronik/collections.py @@ -2,7 +2,13 @@ import logging -from luxtronik.datatypes import Base +from luxtronik.constants import ( + LUXTRONIK_NAME_CHECK_PREFERRED, + LUXTRONIK_NAME_CHECK_OBSOLETE, + LUXTRONIK_VALUE_FUNCTION_NOT_AVAILABLE, +) + +from luxtronik.datatypes import Base, Unknown from luxtronik.definitions import LuxtronikDefinition, LuxtronikDefinitionsDictionary @@ -10,7 +16,7 @@ ############################################################################### -# Common methods +# Common functions ############################################################################### def pack_values(values, num_bits, reverse=True): @@ -72,50 +78,19 @@ def unpack_values(packed, count, num_bits, reverse=True): return values -def get_data_arr(definition, field, num_bits): - """ - Normalize the field's data to a list of the correct size. - - Args: - definition (LuxtronikDefinition): Meta-data of the field. - field (Base): Field object that contains data to get. - num_bits (int): Number of bits per register. - - Returns: - list[int] | None: List of length `definition.count`, - or None if the data size does not match. - """ - data = field.raw - if data is None: - return None - # Currently, no read-modify-write function is implemented. - # For this reason, we cannot write (and retrieve the data to write) - # from a field with a bit_offset. - # -> no additional code here like in `integrate_data` - should_unpack = field.concatenate_multiple_data_chunks \ - and definition.count > 1 - if should_unpack and not isinstance(data, list): - # Usually big-endian (reverse=True) is used - data = unpack_values(data, definition.count, num_bits) - if not isinstance(data, list): - data = [data] - return data if len(data) == definition.count else None - -def integrate_data(definition, field, raw_data, num_bits, data_offset=-1): +def integrate_data(definition, field, raw_data, data_offset=-1): """ - Integrate the related parts of the `raw_data` into the field. + Integrate raw values from a data array into the field. Args: definition (LuxtronikDefinition): Meta-data of the field. field (Base): Field object where to integrate the data. - raw_data (list): Source array of register values. - num_bits (int): Number of bits per register. + raw_data (list): Source array of bytes/words. data_offset (int): Optional offset. Defaults to `definition.index`. """ # Use data_offset if provided, otherwise the index data_offset = data_offset if data_offset >= 0 else definition.index # Use the information of the definition to extract the raw-value - use_bit_offset = definition.bit_offset and definition.num_bits if (data_offset + definition.count - 1) >= len(raw_data): raw = None elif definition.count == 1: @@ -123,17 +98,39 @@ def integrate_data(definition, field, raw_data, num_bits, data_offset=-1): else: raw = raw_data[data_offset : data_offset + definition.count] raw = raw if len(raw) == definition.count else None - should_pack = field.concatenate_multiple_data_chunks + should_pack = field.concatenate_multiple_data_chunks \ + and definition.reg_bits > 0 # and definition.count > 1 if should_pack and raw is not None : # Usually big-endian (reverse=True) is used - raw = pack_values(raw, num_bits) + raw = pack_values(raw, definition.reg_bits) raw = raw if definition.check_raw_not_none(raw) else None - # Perform bit shift operations - if use_bit_offset and isinstance(raw, int): - raw = (raw >> definition.bit_offset) & ((1 << definition.num_bits) - 1) field.raw = raw +def get_data_arr(definition, field): + """ + Normalize the field's data to a list of the correct size. + + Args: + definition (LuxtronikDefinition): Meta-data of the field. + field (Base): Field object that contains data to get. + + Returns: + list[int] | None: List of length `definition.count`, + or None if the data size does not match. + """ + data = field.raw + if data is None: + return None + should_unpack = field.concatenate_multiple_data_chunks \ + and definition.reg_bits > 0 and definition.count > 1 + if should_unpack and not isinstance(data, list): + # Usually big-endian (reverse=True) is used + data = unpack_values(data, definition.count, definition.reg_bits) + if not isinstance(data, list): + data = [data] + return data if len(data) == definition.count else None + ############################################################################### # Definition / field pair ############################################################################### @@ -155,49 +152,39 @@ def __init__(self, definition, field): self.definition = definition def __iter__(self): - """ - Yield the definition and the field to unpack the object like `d, f = pair`. - """ yield self.definition yield self.field @property def index(self): - """ - Forward the `LuxtronikDefinition.index` property. - Please check its documentation. - """ return self.definition.index @property def addr(self): - """ - Forward the `LuxtronikDefinition.addr` property. - Please check its documentation. - """ return self.definition.addr @property def count(self): - """ - Forward the `LuxtronikDefinition.count` property. - Please check its documentation. - """ return self.definition.count - def get_data_arr(self, num_bits): + def get_data_arr(self): """ - Forward the `get_data_arr` method with the stored objects. - Please check its documentation. + Normalize the field's data to a list of the correct size. + + Returns: + list[int] | None: List of length `definition.count`, or None if insufficient. """ - return get_data_arr(self.definition, self.field, num_bits) + return get_data_arr(self.definition, self.field) - def integrate_data(self, raw_data, num_bits, data_offset=-1): + def integrate_data(self, raw_data, data_offset=-1): """ - Forward the `integrate_data` method with the stored objects. - Please check its documentation. + Integrate the related parts of the `raw_data` into the field + + Args: + raw_data (list): Source array of bytes/words. + data_offset (int): Optional offset. Defaults to `definition.index`. """ - integrate_data(self.definition, self.field, raw_data, num_bits, data_offset) + integrate_data(self.definition, self.field, raw_data, data_offset) ############################################################################### # Field dictionary for data vectors @@ -211,7 +198,7 @@ class LuxtronikFieldsDictionary: """ def __init__(self): - # There may be several names or alias that points to one definition and field. + # There may be several names or alias that points to one definition. # So in order to spare memory we split the name/index-to-field-lookup # into a name/index-to-definition-lookup and a definition-to-field-lookup self._def_lookup = LuxtronikDefinitionsDictionary() @@ -221,12 +208,11 @@ def __init__(self): self._pairs = [] # list of LuxtronikDefFieldPair def __getitem__(self, def_field_name_or_idx): - """ - Array-style access to method `get`. - Please check its documentation. - """ return self.get(def_field_name_or_idx) + def __setitem__(self, def_name_or_idx, value): + assert False, "__setitem__ not implemented." + def __len__(self): return len(self._def_lookup._index_dict) @@ -243,12 +229,6 @@ def __contains__(self, def_field_name_or_idx): Check whether the data vector contains a name, index, or definition matching an added field, or the field itself. - If `def_field_name_or_idx` - - is a definition -> check whether a field with this definition has been added - - is a field -> check whether this field has been added - - is a name -> check whether a field with this name has been added - - is a idx -> check whether a field with this index has been added - Args: def_field_name_or_idx (LuxtronikDefinition | Base | str | int): Definition object, field object, field name or register index. @@ -289,20 +269,9 @@ def pairs(self): @property def def_dict(self): - """ - Return the internal definition dictionary, - containing all definitions related to the added fields. - """ + """Return the internal definition dictionary""" return self._def_lookup - @property - def field_dict(self): - """ - Return the internal field dictionary, - containing all added fields. - """ - return self._field_lookup - def add(self, definition, field, alias=None): """ Add a definition-field-pair to the internal dictionaries. @@ -311,8 +280,6 @@ def add(self, definition, field, alias=None): definition (LuxtronikDefinition): Definition related to the field. field (Base): Field to add. alias (Hashable | None): Alias, which can be used to access the field again. - - Note: Only use this method if the definitions order is already correct. """ if definition.valid: self._def_lookup.add(definition, alias) @@ -320,14 +287,6 @@ def add(self, definition, field, alias=None): self._pairs.append(LuxtronikDefFieldPair(definition, field)) def add_sorted(self, definition, field, alias=None): - """ - Behaves like the normal `add` but then sorts the pairs. - - Args: - definition (LuxtronikDefinition): Definition related to the field. - field (Base): Field to add. - alias (Hashable | None): Alias, which can be used to access the field again. - """ if definition.valid: self.add(definition, field, alias) # sort _pairs by definition.index @@ -348,8 +307,8 @@ def register_alias(self, def_field_name_or_idx, alias): Base | None: The field to which the alias was added, or None if not possible """ + # Resolve a field input def_name_or_idx = def_field_name_or_idx - # Resolve a field argument if isinstance(def_name_or_idx, Base): def_name_or_idx = def_name_or_idx.name # register alias @@ -360,17 +319,11 @@ def register_alias(self, def_field_name_or_idx, alias): def get(self, def_field_name_or_idx, default=None): """ - Retrieve an added field by definition, name or register index, or the field itself. - - If `def_field_name_or_idx` - - is a definition -> lookup the field by the definition - - is a field -> lookup the field by the field's name - - is a name -> lookup the field by the name - - is a idx -> lookup the field by the index + Retrieve a field by definition, name or register index. Args: - def_field_name_or_idx (LuxtronikDefinition | Base | str | int): - Definition, field, name, or register index to be used to search for the field. + def_field_name_or_idx (LuxtronikDefinition | str | int): + Definition, name, or register index to be used to search for the field. Returns: Base | None: The field found or the provided default if not found. From e33bc45766187c4a7f908cd806dfedb9746cab33 Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Wed, 21 Jan 2026 20:41:13 +0100 Subject: [PATCH 15/68] wip --- tests/shi/test_shi_definitions.py | 119 +++++++++++++++++++----------- 1 file changed, 77 insertions(+), 42 deletions(-) diff --git a/tests/shi/test_shi_definitions.py b/tests/shi/test_shi_definitions.py index 592fca6f..eb68142c 100644 --- a/tests/shi/test_shi_definitions.py +++ b/tests/shi/test_shi_definitions.py @@ -1,9 +1,9 @@ from luxtronik.constants import LUXTRONIK_VALUE_FUNCTION_NOT_AVAILABLE -from luxtronik.definitions import LuxtronikDefinition -from luxtronik.data_vector import ( +from luxtronik.collections import ( get_data_arr, integrate_data, ) +from luxtronik.definitions import LuxtronikDefinition ############################################################################### # Tests @@ -14,28 +14,53 @@ class TestDefinitionFieldPair: def test_data_arr(self): definition = LuxtronikDefinition.unknown(2, 'Foo', 30) field = definition.create_field() + field.concatenate_multiple_data_chunks = False # get from value definition._count = 1 + definition._num_bits = 32 + definition._data_type = 'INT32' + field.raw = 5 + arr = get_data_arr(definition, field) + assert arr == [5] + + # get from value + definition._count = 1 + definition._num_bits = 16 + definition._data_type = 'INT16' field.raw = 5 arr = get_data_arr(definition, field) assert arr == [5] # get from array definition._count = 2 + definition._num_bits = 64 + definition._data_type = 'INT64' + field.raw = [7, 3] + arr = get_data_arr(definition, field) + assert arr == [7, 3] + + # get from array + definition._count = 2 + definition._num_bits = 32 + definition._data_type = 'INT32' field.raw = [7, 3] arr = get_data_arr(definition, field) assert arr == [7, 3] # too much data definition._count = 2 + definition._num_bits = 32 + definition._data_type = 'INT32' field.raw = [4, 8, 1] arr = get_data_arr(definition, field) assert arr is None # insufficient data definition._count = 2 + definition._num_bits = 32 + definition._data_type = 'INT32' field.raw = [9] arr = get_data_arr(definition, field) assert arr is None @@ -44,18 +69,32 @@ def test_data_arr(self): # get from array definition._count = 2 + definition._num_bits = 64 + definition._data_type = 'INT64' + field.raw = 0x00000007_00000003 + arr = get_data_arr(definition, field) + assert arr == [7, 3] + + # get from array + definition._count = 2 + definition._num_bits = 32 + definition._data_type = 'INT32' field.raw = 0x0007_0003 arr = get_data_arr(definition, field) assert arr == [7, 3] # too much data definition._count = 2 + definition._num_bits = 32 + definition._data_type = 'INT32' field.raw = 0x0004_0008_0001 arr = get_data_arr(definition, field) assert arr == [8, 1] # insufficient data definition._count = 2 + definition._num_bits = 32 + definition._data_type = 'INT32' field.raw = 0x0009 arr = get_data_arr(definition, field) assert arr == [0, 9] @@ -63,10 +102,10 @@ def test_data_arr(self): def test_integrate(self): definition = LuxtronikDefinition.unknown(2, 'Foo', 30) field = definition.create_field() - field.concatenate_multiple_data_chunks = False - data = [1, LUXTRONIK_VALUE_FUNCTION_NOT_AVAILABLE, 3, 4, 5, 6, 7] + field.concatenate_multiple_data_chunks = False + # set array definition._count = 2 definition._num_bits = 64 @@ -80,6 +119,19 @@ def test_integrate(self): integrate_data(definition, field, data, 0) assert field.raw == [1, LUXTRONIK_VALUE_FUNCTION_NOT_AVAILABLE] + # set array + definition._count = 2 + definition._num_bits = 32 + definition._data_type = 'INT32' + integrate_data(definition, field, data) + assert field.raw == [3, 4] + integrate_data(definition, field, data, 4) + assert field.raw == [5, 6] + integrate_data(definition, field, data, 7) + assert field.raw is None + integrate_data(definition, field, data, 0) + assert field.raw == [1, LUXTRONIK_VALUE_FUNCTION_NOT_AVAILABLE] + # set value definition._count = 1 definition._num_bits = 32 @@ -95,6 +147,19 @@ def test_integrate(self): # This applies also to similar lines below assert field.raw == LUXTRONIK_VALUE_FUNCTION_NOT_AVAILABLE + # set value + definition._count = 1 + definition._num_bits = 16 + definition._data_type = 'INT16' + integrate_data(definition, field, data) + assert field.raw == 3 + integrate_data(definition, field, data, 5) + assert field.raw == 6 + integrate_data(definition, field, data, 9) + assert field.raw is None + integrate_data(definition, field, data, 1) + assert field.raw is None + field.concatenate_multiple_data_chunks = True # set array @@ -110,61 +175,31 @@ def test_integrate(self): integrate_data(definition, field, data, 0) assert field.raw == 0x00000001_00007FFF - # set value - definition._count = 1 - definition._num_bits = 32 - definition._data_type = 'INT32' - integrate_data(definition, field, data) - assert field.raw == 0x00000003 - integrate_data(definition, field, data, 5) - assert field.raw == 0x00000006 - integrate_data(definition, field, data, 9) - assert field.raw is None - integrate_data(definition, field, data, 1) - assert field.raw == 0x00007FFF - - field.concatenate_multiple_data_chunks = False - # set array definition._count = 2 definition._num_bits = 32 definition._data_type = 'INT32' integrate_data(definition, field, data) - assert field.raw == [3, 4] + assert field.raw == 0x0003_0004 integrate_data(definition, field, data, 4) - assert field.raw == [5, 6] + assert field.raw == 0x0005_0006 integrate_data(definition, field, data, 7) assert field.raw is None integrate_data(definition, field, data, 0) - assert field.raw == [1, LUXTRONIK_VALUE_FUNCTION_NOT_AVAILABLE] + assert field.raw == 0x0001_7FFF # set value definition._count = 1 - definition._num_bits = 16 - definition._data_type = 'INT16' + definition._num_bits = 32 + definition._data_type = 'INT32' integrate_data(definition, field, data) - assert field.raw == 3 + assert field.raw == 0x00000003 integrate_data(definition, field, data, 5) - assert field.raw == 6 + assert field.raw == 0x00000006 integrate_data(definition, field, data, 9) assert field.raw is None integrate_data(definition, field, data, 1) - assert field.raw is None - - field.concatenate_multiple_data_chunks = True - - # set array - definition._count = 2 - definition._num_bits = 32 - definition._data_type = 'INT32' - integrate_data(definition, field, data) - assert field.raw == 0x0003_0004 - integrate_data(definition, field, data, 4) - assert field.raw == 0x0005_0006 - integrate_data(definition, field, data, 7) - assert field.raw is None - integrate_data(definition, field, data, 0) - assert field.raw == 0x0001_7FFF + assert field.raw == 0x00007FFF # set value definition._count = 1 From f85fb30b0285ad672b9439b0b7fa48e3ecbc1999 Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Wed, 21 Jan 2026 21:31:10 +0100 Subject: [PATCH 16/68] wip --- luxtronik/datatypes.py | 6 ++---- tests/test_datatypes.py | 8 ++++---- tests/test_definition_list.py | 3 ++- 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/luxtronik/datatypes.py b/luxtronik/datatypes.py index 74dc3d16..be3a1d17 100755 --- a/luxtronik/datatypes.py +++ b/luxtronik/datatypes.py @@ -378,7 +378,7 @@ def from_heatpump(cls, value): @classmethod def to_heatpump(cls, value): - if not isinstance(value, float): + if not isinstance(value, (int, float, datetime.datetime)): return None return datetime.datetime.timestamp(value) @@ -1108,12 +1108,10 @@ class FullVersion(Base): @classmethod def from_heatpump(cls, value): - if not isinstance(value, list): + if not isinstance(value, list) or len(value) <= 2: return None if len(value) >= 3: return f"{value[0]}.{value[1]}.{value[2]}" - else: - return "0" class Unknown(Base): diff --git a/tests/test_datatypes.py b/tests/test_datatypes.py index 5da5cc7e..b3852fa0 100644 --- a/tests/test_datatypes.py +++ b/tests/test_datatypes.py @@ -620,7 +620,7 @@ def test_from_heatpump(self): # pylint: disable=fixme # TODO Consider to drop microseconds when dealing with this datatype? b = datetime.datetime.now() - assert a.from_heatpump(datetime.datetime.timestamp(b)) == b + assert a.from_heatpump(datetime.datetime.timestamp(b)) is None def test_to_heatpump(self): """Test cases for to_heatpump function""" @@ -1009,9 +1009,9 @@ def test_init(self): def test_from_heatpump(self): """Test cases for from_heatpump function""" - assert FullVersion.from_heatpump(112) == "0" - assert FullVersion.from_heatpump(0) == "0" - assert FullVersion.from_heatpump([0, 12]) == "0" + assert FullVersion.from_heatpump(112) is None + assert FullVersion.from_heatpump(0) is None + assert FullVersion.from_heatpump([0, 12]) is None assert FullVersion.from_heatpump([0, 12, 3]) == "0.12.3" class TestIcon: diff --git a/tests/test_definition_list.py b/tests/test_definition_list.py index b0cfef34..a84c7f06 100644 --- a/tests/test_definition_list.py +++ b/tests/test_definition_list.py @@ -2,6 +2,7 @@ from luxtronik.common import parse_version from luxtronik.datatypes import Base +from luxtronik.definitions import LuxtronikDefinition from luxtronik.definitions.calculations import CALCULATIONS_DEFINITIONS_LIST from luxtronik.definitions.holdings import HOLDINGS_DEFINITIONS_LIST from luxtronik.definitions.inputs import INPUTS_DEFINITIONS_LIST @@ -184,7 +185,7 @@ def test_data_type(self): for definition in self.definitions: if KEY_DATATYPE in definition: data_type = definition[KEY_DATATYPE] - assert data_type in VALID_DATA_TYPES, \ + assert data_type in LuxtronikDefinition.VALID_DATA_TYPES, \ f"Datatype must be set correctly: {definition}" def test_since(self): From 9fdf239e73686020e0dbfc361891b4b8e3eaa553 Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Wed, 21 Jan 2026 21:34:54 +0100 Subject: [PATCH 17/68] wip --- luxtronik/collections.py | 8 +------- luxtronik/data_vector.py | 8 +------- tests/test_compatibility.py | 2 +- 3 files changed, 3 insertions(+), 15 deletions(-) diff --git a/luxtronik/collections.py b/luxtronik/collections.py index 67389dcf..0766f990 100644 --- a/luxtronik/collections.py +++ b/luxtronik/collections.py @@ -2,13 +2,7 @@ import logging -from luxtronik.constants import ( - LUXTRONIK_NAME_CHECK_PREFERRED, - LUXTRONIK_NAME_CHECK_OBSOLETE, - LUXTRONIK_VALUE_FUNCTION_NOT_AVAILABLE, -) - -from luxtronik.datatypes import Base, Unknown +from luxtronik.datatypes import Base from luxtronik.definitions import LuxtronikDefinition, LuxtronikDefinitionsDictionary diff --git a/luxtronik/data_vector.py b/luxtronik/data_vector.py index 2a057e33..ff1cb6ab 100644 --- a/luxtronik/data_vector.py +++ b/luxtronik/data_vector.py @@ -2,15 +2,9 @@ import logging -from luxtronik.constants import ( - LUXTRONIK_NAME_CHECK_PREFERRED, - LUXTRONIK_NAME_CHECK_OBSOLETE, - LUXTRONIK_VALUE_FUNCTION_NOT_AVAILABLE, -) from luxtronik.collections import LuxtronikFieldsDictionary - from luxtronik.datatypes import Base, Unknown -from luxtronik.definitions import LuxtronikDefinition, LuxtronikDefinitionsDictionary +from luxtronik.definitions import LuxtronikDefinition LOGGER = logging.getLogger(__name__) diff --git a/tests/test_compatibility.py b/tests/test_compatibility.py index 49e58b15..d7b6c941 100644 --- a/tests/test_compatibility.py +++ b/tests/test_compatibility.py @@ -1925,7 +1925,7 @@ def test_compatibilities(self): if print_caption: print(f"### Incompatibilities - {caption}:") print_caption = False - print(f'"{old_name}" is not registered for {old_idx}: "{cur_name}",') + print(f'"{old_name}" is not registered for {old_idx}: "{def_by_name.name}",') ok = False assert ok, "Found incompatibilities. Please consider to add them to compatibilities.py" From d61a5a63a9f5af57a7bd3a4b530122975f5ff2a3 Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Wed, 21 Jan 2026 21:43:21 +0100 Subject: [PATCH 18/68] wip --- luxtronik/collections.py | 5 +---- luxtronik/data_vector.py | 4 ++-- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/luxtronik/collections.py b/luxtronik/collections.py index 0766f990..fe467937 100644 --- a/luxtronik/collections.py +++ b/luxtronik/collections.py @@ -204,9 +204,6 @@ def __init__(self): def __getitem__(self, def_field_name_or_idx): return self.get(def_field_name_or_idx) - def __setitem__(self, def_name_or_idx, value): - assert False, "__setitem__ not implemented." - def __len__(self): return len(self._def_lookup._index_dict) @@ -262,7 +259,7 @@ def pairs(self): return self._pairs @property - def def_dict(self): + def definitions(self): """Return the internal definition dictionary""" return self._def_lookup diff --git a/luxtronik/data_vector.py b/luxtronik/data_vector.py index ff1cb6ab..5e915e5e 100644 --- a/luxtronik/data_vector.py +++ b/luxtronik/data_vector.py @@ -214,8 +214,8 @@ def _get_definition(self, def_field_name_or_idx, all_not_version_dependent): if all_not_version_dependent: definition = self.definitions.get(definition) else: - # def_dict contains only valid and addable definitions - definition = self._data.def_dict.get(definition) + # _data.definitions contains only valid and previously added definitions + definition = self._data.definitions.get(definition) return definition, field def get(self, def_name_or_idx, default=None): From 0d5f38e0fa5ac366cc48b5fe5522b844bbf09db0 Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Wed, 21 Jan 2026 22:06:02 +0100 Subject: [PATCH 19/68] wip --- tests/test_data_vector.py | 161 +------------------------------------- 1 file changed, 2 insertions(+), 159 deletions(-) diff --git a/tests/test_data_vector.py b/tests/test_data_vector.py index e88e0bd8..f12ea2f5 100644 --- a/tests/test_data_vector.py +++ b/tests/test_data_vector.py @@ -3,166 +3,9 @@ # pylint: disable=too-few-public-methods,invalid-name,too-many-lines import pytest -from luxtronik.definitions import LuxtronikDefinition, LuxtronikDefinitionsDictionary -from luxtronik.data_vector import LuxtronikFieldsDictionary, DataVector -from luxtronik.datatypes import ( - Base, - Unknown, -) - - -class TestLuxtronikFieldsDictionary: - - def test_init(self): - d = LuxtronikFieldsDictionary() - - assert type(d._def_lookup) is LuxtronikDefinitionsDictionary - assert type(d._field_lookup) is dict - assert len(d._field_lookup.values()) == 0 - assert type(d._pairs) is list - assert len(d._pairs) == 0 - - def test_add(self): - d = LuxtronikFieldsDictionary() - assert len(d) == 0 - assert len(d._pairs) == 0 - - u = LuxtronikDefinition.unknown(1, "test", 0) - f = u.create_field() - d.add(u, f) - assert len(d) == 1 - assert len(d._pairs) == 1 - assert d._pairs[0].definition is u - assert d._pairs[0].field is f - - u = LuxtronikDefinition.unknown(2, "test", 0) - f = u.create_field() - d.add(u, f) - assert len(d) == 2 - assert len(d._pairs) == 2 - assert d._pairs[1].definition is u - assert d._pairs[1].field is f - - u = LuxtronikDefinition.unknown(0, "test", 0) - f = u.create_field() - d.add_sorted(u, f) - assert len(d) == 3 - assert len(d._pairs) == 3 - assert d._pairs[0].definition is u - assert d._pairs[0].field is f - - def create_instance(self): - d = LuxtronikFieldsDictionary() - u = LuxtronikDefinition.unknown(1, "test", 0) - d.add(u, u.create_field()) - u = LuxtronikDefinition.unknown(2, "test", 0) - d.add(u, u.create_field()) - b = LuxtronikDefinition({ - "index": 2, - "type": Base, - "names": ["base2"], - }, "test", 0) - f = b.create_field() - d.add(b, f) - b = LuxtronikDefinition({ - "index": 3, - "type": Base, - "names": ["base3"], - }, "test", 0) - d.add(b, b.create_field(), "base4") - return d, u, f - - def test_len(self): - d, _, _ = self.create_instance() - # 3 different indices - assert len(d) == 3 - assert len(d._pairs) == 4 - - def test_get_contains(self): - d, u, f = self.create_instance() - assert "1" in d - assert d["1"].name == "unknown_test_1" - assert "unknown_test_1" in d - assert d["unknown_test_1"].name == "unknown_test_1" - assert 2 in d - assert d[2].name == "base2" - assert "unknown_test_2" in d - assert d["unknown_test_2"].name == "unknown_test_2" - assert "base2" in d - assert d["base2"].name == "base2" - assert "base3" in d - assert d.get("base3").name == "base3" - assert "base4" in d - assert d.get("base4").name == "base3" - assert u in d - assert d[u].name == "unknown_test_2" - assert f in d - assert d[f].name == "base2" - assert 4 not in d - - def test_iter(self): - d, _, _ = self.create_instance() - for idx, key in enumerate(d): - if idx == 0: - assert key == 1 - if idx == 1: - assert key == 2 - if idx == 2: - assert key == 3 - - def test_values(self): - d, _, _ = self.create_instance() - for idx, value in enumerate(d.values()): - if idx == 0: - assert type(value) is Unknown - assert value.name == "unknown_test_1" - if idx == 1: - assert type(value) is Base - assert value.name == "base2" - if idx == 2: - assert type(value) is Base - assert value.name == "base3" - - def test_pairs(self): - d, _, _ = self.create_instance() - for idx, (key, value) in enumerate(d.items()): - if idx == 0: - assert key == 1 - assert type(value) is Unknown - assert value.name == "unknown_test_1" - if idx == 1: - assert key == 2 - assert type(value) is Base - assert value.name == "base2" - if idx == 2: - assert key == 3 - assert type(value) is Base - assert value.name == "base3" - - class MyTestClass: - pass - - def test_alias(self): - d, u, f = self.create_instance() - my = self.MyTestClass() - - d.register_alias(0, "abc") - assert d["abc"] is d[0] - - field = d.register_alias("unknown_test_1", 6) - assert d[6] is field - - field = d.register_alias(u, my) - assert d[my] is d[u] - - d.register_alias(f, my) - assert d[my] is not d[u] - assert d[my] is d[f] - - field = d.register_alias(9, my) - assert field is None - assert d[my] is d[f] +from luxtronik.data_vector import DataVector +from luxtronik.datatypes import Base class ObsoleteDataVector(DataVector): From 45e5aa484cb6015bfc0bc485022a497c8fbd09cf Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Wed, 21 Jan 2026 22:06:15 +0100 Subject: [PATCH 20/68] wip --- tests/test_collections.py | 223 +------------------------------------- 1 file changed, 6 insertions(+), 217 deletions(-) diff --git a/tests/test_collections.py b/tests/test_collections.py index a1f41adc..a9966743 100644 --- a/tests/test_collections.py +++ b/tests/test_collections.py @@ -1,223 +1,12 @@ -from luxtronik.collections import ( - get_data_arr, - integrate_data, - LuxtronikDefFieldPair, - LuxtronikFieldsDictionary, -) +import pytest + +from luxtronik.collections import LuxtronikFieldsDictionary from luxtronik.definitions import LuxtronikDefinition, LuxtronikDefinitionsDictionary from luxtronik.datatypes import ( Base, Unknown, ) -from luxtronik.constants import LUXTRONIK_VALUE_FUNCTION_NOT_AVAILABLE - - -############################################################################### -# Tests -############################################################################### - -class TestDefinitionFieldPair: - - def test_init(self): - definition = LuxtronikDefinition.unknown(2, 'Foo', 30) - field = definition.create_field() - pair = LuxtronikDefFieldPair(definition, field) - - assert pair.definition is definition - assert pair.field is field - d, f = pair - assert d is definition - assert f is field - - def test_data_arr(self): - definition = LuxtronikDefinition.unknown(2, 'Foo', 30) - field = definition.create_field() - pair = LuxtronikDefFieldPair(definition, field) - - field.concatenate_multiple_data_chunks = False - - # get from value - definition._count = 1 - field.raw = 5 - arr = get_data_arr(definition, field, 32) - assert arr == [5] - assert arr == pair.get_data_arr(32) - - # get from value - definition._count = 1 - field.raw = 5 - arr = get_data_arr(definition, field, 16) - assert arr == [5] - assert arr == pair.get_data_arr(16) - - # get from array - definition._count = 2 - field.raw = [7, 3] - arr = get_data_arr(definition, field, 32) - assert arr == [7, 3] - assert arr == pair.get_data_arr(32) - - # get from array - definition._count = 2 - field.raw = [7, 3] - arr = get_data_arr(definition, field, 16) - assert arr == [7, 3] - assert arr == pair.get_data_arr(16) - - # too much data - definition._count = 2 - field.raw = [4, 8, 1] - arr = get_data_arr(definition, field, 16) - assert arr is None - assert arr == pair.get_data_arr(16) - - # insufficient data - definition._count = 2 - field.raw = [9] - arr = get_data_arr(definition, field, 16) - assert arr is None - assert arr == pair.get_data_arr(16) - - field.concatenate_multiple_data_chunks = True - - # get from array - definition._count = 2 - field.raw = 0x00000007_00000003 - arr = get_data_arr(definition, field, 32) - assert arr == [7, 3] - assert arr == pair.get_data_arr(32) - - # get from array - definition._count = 2 - field.raw = 0x0007_0003 - arr = get_data_arr(definition, field, 16) - assert arr == [7, 3] - assert arr == pair.get_data_arr(16) - - # too much data - definition._count = 2 - field.raw = 0x0004_0008_0001 - arr = get_data_arr(definition, field, 16) - assert arr == [8, 1] - assert arr == pair.get_data_arr(16) - - # insufficient data - definition._count = 2 - field.raw = 0x0009 - arr = get_data_arr(definition, field, 16) - assert arr == [0, 9] - assert arr == pair.get_data_arr(16) - - def test_integrate(self): - definition = LuxtronikDefinition.unknown(2, 'Foo', 30) - field = definition.create_field() - pair = LuxtronikDefFieldPair(definition, field) - data = [1, LUXTRONIK_VALUE_FUNCTION_NOT_AVAILABLE, 3, 4, 5, 6, 7] - - field.concatenate_multiple_data_chunks = False - - # set array - definition._count = 2 - definition._data_type = 'INT64' - integrate_data(definition, field, data, 32) - assert field.raw == [3, 4] - pair.integrate_data(data, 32, 4) - assert field.raw == [5, 6] - integrate_data(definition, field, data, 32, 7) - assert field.raw is None - pair.integrate_data(data, 32, 0) - assert field.raw == [1, LUXTRONIK_VALUE_FUNCTION_NOT_AVAILABLE] - - # set array - definition._count = 2 - definition._data_type = 'INT32' - integrate_data(definition, field, data, 16) - assert field.raw == [3, 4] - pair.integrate_data(data, 16, 4) - assert field.raw == [5, 6] - integrate_data(definition, field, data, 16, 7) - assert field.raw is None - pair.integrate_data(data, 16, 0) - assert field.raw == [1, LUXTRONIK_VALUE_FUNCTION_NOT_AVAILABLE] - - # set value - definition._count = 1 - definition._data_type = 'INT32' - integrate_data(definition, field, data, 32) - assert field.raw == 3 - pair.integrate_data(data, 32, 5) - assert field.raw == 6 - integrate_data(definition, field, data, 32, 9) - assert field.raw is None - pair.integrate_data(data, 32, 1) - # Currently there is no magic "not available" value for 32 bit values -> not None - # This applies also to similar lines below - assert field.raw == LUXTRONIK_VALUE_FUNCTION_NOT_AVAILABLE - - # set value - definition._count = 1 - definition._data_type = 'INT16' - integrate_data(definition, field, data, 16) - assert field.raw == 3 - pair.integrate_data(data, 16, 5) - assert field.raw == 6 - integrate_data(definition, field, data, 16, 9) - assert field.raw is None - pair.integrate_data(data, 16, 1) - assert field.raw is None - - field.concatenate_multiple_data_chunks = True - - # set array - definition._count = 2 - definition._data_type = 'INT64' - integrate_data(definition, field, data, 32) - assert field.raw == 0x00000003_00000004 - pair.integrate_data(data, 32, 4) - assert field.raw == 0x00000005_00000006 - integrate_data(definition, field, data, 32, 7) - assert field.raw is None - pair.integrate_data(data, 32, 0) - assert field.raw == 0x00000001_00007FFF - - # set array - definition._count = 2 - definition._data_type = 'INT32' - integrate_data(definition, field, data, 16) - assert field.raw == 0x0003_0004 - pair.integrate_data(data, 16, 4) - assert field.raw == 0x0005_0006 - integrate_data(definition, field, data, 16, 7) - assert field.raw is None - pair.integrate_data(data, 16, 0) - assert field.raw == 0x0001_7FFF - - # set value - definition._count = 1 - definition._data_type = 'INT32' - integrate_data(definition, field, data, 32) - assert field.raw == 0x00000003 - pair.integrate_data(data, 32, 5) - assert field.raw == 0x00000006 - integrate_data(definition, field, data, 32, 9) - assert field.raw is None - pair.integrate_data(data, 32, 1) - assert field.raw == 0x00007FFF - - # set value - definition._count = 1 - definition._data_type = 'INT16' - integrate_data(definition, field, data, 16) - assert field.raw == 0x0003 - pair.integrate_data(data, 16, 5) - assert field.raw == 0x0006 - integrate_data(definition, field, data, 16, 9) - assert field.raw is None - pair.integrate_data(data, 16, 1) - assert field.raw is None - - field.concatenate_multiple_data_chunks = False class TestLuxtronikFieldsDictionary: @@ -234,7 +23,7 @@ def test_init(self): def test_add(self): d = LuxtronikFieldsDictionary() assert len(d) == 0 - assert len(d.pairs()) == 0 + assert len(d._pairs) == 0 u = LuxtronikDefinition.unknown(1, "test", 0) f = u.create_field() @@ -285,7 +74,7 @@ def test_len(self): d, _, _ = self.create_instance() # 3 different indices assert len(d) == 3 - assert len(d.pairs()) == 4 + assert len(d._pairs) == 4 def test_get_contains(self): d, u, f = self.create_instance() @@ -332,7 +121,7 @@ def test_values(self): assert type(value) is Base assert value.name == "base3" - def test_items(self): + def test_pairs(self): d, _, _ = self.create_instance() for idx, (key, value) in enumerate(d.items()): if idx == 0: From 1aa06b864354213c92efccb21a20e7c6c05839b3 Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Wed, 21 Jan 2026 22:28:22 +0100 Subject: [PATCH 21/68] wip --- luxtronik/collections.py | 18 +++++++++++++----- luxtronik/data_vector.py | 4 ++-- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/luxtronik/collections.py b/luxtronik/collections.py index fe467937..f71c4d01 100644 --- a/luxtronik/collections.py +++ b/luxtronik/collections.py @@ -259,8 +259,8 @@ def pairs(self): return self._pairs @property - def definitions(self): - """Return the internal definition dictionary""" + def def_dict(self): + """Return the internal definition dictionary, containing all added definitions""" return self._def_lookup def add(self, definition, field, alias=None): @@ -278,6 +278,14 @@ def add(self, definition, field, alias=None): self._pairs.append(LuxtronikDefFieldPair(definition, field)) def add_sorted(self, definition, field, alias=None): + """ + Behaves like the normal `add` but then sorts the pairs. + + Args: + definition (LuxtronikDefinition): Definition related to the field. + field (Base): Field to add. + alias (Hashable | None): Alias, which can be used to access the field again. + """ if definition.valid: self.add(definition, field, alias) # sort _pairs by definition.index @@ -310,11 +318,11 @@ def register_alias(self, def_field_name_or_idx, alias): def get(self, def_field_name_or_idx, default=None): """ - Retrieve a field by definition, name or register index. + Retrieve a field by definition, name or register index, or the field itself. Args: - def_field_name_or_idx (LuxtronikDefinition | str | int): - Definition, name, or register index to be used to search for the field. + def_field_name_or_idx (LuxtronikDefinition | Base | str | int): + Definition, field, name, or register index to be used to search for the field. Returns: Base | None: The field found or the provided default if not found. diff --git a/luxtronik/data_vector.py b/luxtronik/data_vector.py index 5e915e5e..f8023726 100644 --- a/luxtronik/data_vector.py +++ b/luxtronik/data_vector.py @@ -214,8 +214,8 @@ def _get_definition(self, def_field_name_or_idx, all_not_version_dependent): if all_not_version_dependent: definition = self.definitions.get(definition) else: - # _data.definitions contains only valid and previously added definitions - definition = self._data.definitions.get(definition) + # _data.def_dict contains only valid and previously added definitions + definition = self._data.def_dict.get(definition) return definition, field def get(self, def_name_or_idx, default=None): From 10eb6e84d1adff2e5d913291540cf32c1e4ae600 Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Wed, 21 Jan 2026 23:24:31 +0100 Subject: [PATCH 22/68] wip --- tests/shi/test_shi_definitions.py | 217 ------------------------------ tests/test_collections.py | 217 ++++++++++++++++++++++++++++++ 2 files changed, 217 insertions(+), 217 deletions(-) delete mode 100644 tests/shi/test_shi_definitions.py diff --git a/tests/shi/test_shi_definitions.py b/tests/shi/test_shi_definitions.py deleted file mode 100644 index eb68142c..00000000 --- a/tests/shi/test_shi_definitions.py +++ /dev/null @@ -1,217 +0,0 @@ -from luxtronik.constants import LUXTRONIK_VALUE_FUNCTION_NOT_AVAILABLE -from luxtronik.collections import ( - get_data_arr, - integrate_data, -) -from luxtronik.definitions import LuxtronikDefinition - -############################################################################### -# Tests -############################################################################### - -class TestDefinitionFieldPair: - - def test_data_arr(self): - definition = LuxtronikDefinition.unknown(2, 'Foo', 30) - field = definition.create_field() - - field.concatenate_multiple_data_chunks = False - - # get from value - definition._count = 1 - definition._num_bits = 32 - definition._data_type = 'INT32' - field.raw = 5 - arr = get_data_arr(definition, field) - assert arr == [5] - - # get from value - definition._count = 1 - definition._num_bits = 16 - definition._data_type = 'INT16' - field.raw = 5 - arr = get_data_arr(definition, field) - assert arr == [5] - - # get from array - definition._count = 2 - definition._num_bits = 64 - definition._data_type = 'INT64' - field.raw = [7, 3] - arr = get_data_arr(definition, field) - assert arr == [7, 3] - - # get from array - definition._count = 2 - definition._num_bits = 32 - definition._data_type = 'INT32' - field.raw = [7, 3] - arr = get_data_arr(definition, field) - assert arr == [7, 3] - - # too much data - definition._count = 2 - definition._num_bits = 32 - definition._data_type = 'INT32' - field.raw = [4, 8, 1] - arr = get_data_arr(definition, field) - assert arr is None - - # insufficient data - definition._count = 2 - definition._num_bits = 32 - definition._data_type = 'INT32' - field.raw = [9] - arr = get_data_arr(definition, field) - assert arr is None - - field.concatenate_multiple_data_chunks = True - - # get from array - definition._count = 2 - definition._num_bits = 64 - definition._data_type = 'INT64' - field.raw = 0x00000007_00000003 - arr = get_data_arr(definition, field) - assert arr == [7, 3] - - # get from array - definition._count = 2 - definition._num_bits = 32 - definition._data_type = 'INT32' - field.raw = 0x0007_0003 - arr = get_data_arr(definition, field) - assert arr == [7, 3] - - # too much data - definition._count = 2 - definition._num_bits = 32 - definition._data_type = 'INT32' - field.raw = 0x0004_0008_0001 - arr = get_data_arr(definition, field) - assert arr == [8, 1] - - # insufficient data - definition._count = 2 - definition._num_bits = 32 - definition._data_type = 'INT32' - field.raw = 0x0009 - arr = get_data_arr(definition, field) - assert arr == [0, 9] - - def test_integrate(self): - definition = LuxtronikDefinition.unknown(2, 'Foo', 30) - field = definition.create_field() - data = [1, LUXTRONIK_VALUE_FUNCTION_NOT_AVAILABLE, 3, 4, 5, 6, 7] - - field.concatenate_multiple_data_chunks = False - - # set array - definition._count = 2 - definition._num_bits = 64 - definition._data_type = 'INT64' - integrate_data(definition, field, data) - assert field.raw == [3, 4] - integrate_data(definition, field, data, 4) - assert field.raw == [5, 6] - integrate_data(definition, field, data, 7) - assert field.raw is None - integrate_data(definition, field, data, 0) - assert field.raw == [1, LUXTRONIK_VALUE_FUNCTION_NOT_AVAILABLE] - - # set array - definition._count = 2 - definition._num_bits = 32 - definition._data_type = 'INT32' - integrate_data(definition, field, data) - assert field.raw == [3, 4] - integrate_data(definition, field, data, 4) - assert field.raw == [5, 6] - integrate_data(definition, field, data, 7) - assert field.raw is None - integrate_data(definition, field, data, 0) - assert field.raw == [1, LUXTRONIK_VALUE_FUNCTION_NOT_AVAILABLE] - - # set value - definition._count = 1 - definition._num_bits = 32 - definition._data_type = 'INT32' - integrate_data(definition, field, data) - assert field.raw == 3 - integrate_data(definition, field, data, 5) - assert field.raw == 6 - integrate_data(definition, field, data, 9) - assert field.raw is None - integrate_data(definition, field, data, 1) - # Currently there is no magic "not available" value for 32 bit values -> not None - # This applies also to similar lines below - assert field.raw == LUXTRONIK_VALUE_FUNCTION_NOT_AVAILABLE - - # set value - definition._count = 1 - definition._num_bits = 16 - definition._data_type = 'INT16' - integrate_data(definition, field, data) - assert field.raw == 3 - integrate_data(definition, field, data, 5) - assert field.raw == 6 - integrate_data(definition, field, data, 9) - assert field.raw is None - integrate_data(definition, field, data, 1) - assert field.raw is None - - field.concatenate_multiple_data_chunks = True - - # set array - definition._count = 2 - definition._num_bits = 64 - definition._data_type = 'INT64' - integrate_data(definition, field, data) - assert field.raw == 0x00000003_00000004 - integrate_data(definition, field, data, 4) - assert field.raw == 0x00000005_00000006 - integrate_data(definition, field, data, 7) - assert field.raw is None - integrate_data(definition, field, data, 0) - assert field.raw == 0x00000001_00007FFF - - # set array - definition._count = 2 - definition._num_bits = 32 - definition._data_type = 'INT32' - integrate_data(definition, field, data) - assert field.raw == 0x0003_0004 - integrate_data(definition, field, data, 4) - assert field.raw == 0x0005_0006 - integrate_data(definition, field, data, 7) - assert field.raw is None - integrate_data(definition, field, data, 0) - assert field.raw == 0x0001_7FFF - - # set value - definition._count = 1 - definition._num_bits = 32 - definition._data_type = 'INT32' - integrate_data(definition, field, data) - assert field.raw == 0x00000003 - integrate_data(definition, field, data, 5) - assert field.raw == 0x00000006 - integrate_data(definition, field, data, 9) - assert field.raw is None - integrate_data(definition, field, data, 1) - assert field.raw == 0x00007FFF - - # set value - definition._count = 1 - definition._num_bits = 16 - definition._data_type = 'INT16' - integrate_data(definition, field, data) - assert field.raw == 0x0003 - integrate_data(definition, field, data, 5) - assert field.raw == 0x0006 - integrate_data(definition, field, data, 9) - assert field.raw is None - integrate_data(definition, field, data, 1) - assert field.raw is None - - field.concatenate_multiple_data_chunks = False diff --git a/tests/test_collections.py b/tests/test_collections.py index a9966743..20d8797d 100644 --- a/tests/test_collections.py +++ b/tests/test_collections.py @@ -7,6 +7,223 @@ Base, Unknown, ) +from luxtronik.constants import LUXTRONIK_VALUE_FUNCTION_NOT_AVAILABLE +from luxtronik.collections import ( + get_data_arr, + integrate_data, +) +from luxtronik.definitions import LuxtronikDefinition + +############################################################################### +# Tests +############################################################################### + +class TestDefinitionFieldPair: + + def test_data_arr(self): + definition = LuxtronikDefinition.unknown(2, 'Foo', 30) + field = definition.create_field() + + field.concatenate_multiple_data_chunks = False + + # get from value + definition._count = 1 + definition._num_bits = 32 + definition._data_type = 'INT32' + field.raw = 5 + arr = get_data_arr(definition, field) + assert arr == [5] + + # get from value + definition._count = 1 + definition._num_bits = 16 + definition._data_type = 'INT16' + field.raw = 5 + arr = get_data_arr(definition, field) + assert arr == [5] + + # get from array + definition._count = 2 + definition._num_bits = 64 + definition._data_type = 'INT64' + field.raw = [7, 3] + arr = get_data_arr(definition, field) + assert arr == [7, 3] + + # get from array + definition._count = 2 + definition._num_bits = 32 + definition._data_type = 'INT32' + field.raw = [7, 3] + arr = get_data_arr(definition, field) + assert arr == [7, 3] + + # too much data + definition._count = 2 + definition._num_bits = 32 + definition._data_type = 'INT32' + field.raw = [4, 8, 1] + arr = get_data_arr(definition, field) + assert arr is None + + # insufficient data + definition._count = 2 + definition._num_bits = 32 + definition._data_type = 'INT32' + field.raw = [9] + arr = get_data_arr(definition, field) + assert arr is None + + field.concatenate_multiple_data_chunks = True + + # get from array + definition._count = 2 + definition._num_bits = 64 + definition._data_type = 'INT64' + field.raw = 0x00000007_00000003 + arr = get_data_arr(definition, field) + assert arr == [7, 3] + + # get from array + definition._count = 2 + definition._num_bits = 32 + definition._data_type = 'INT32' + field.raw = 0x0007_0003 + arr = get_data_arr(definition, field) + assert arr == [7, 3] + + # too much data + definition._count = 2 + definition._num_bits = 32 + definition._data_type = 'INT32' + field.raw = 0x0004_0008_0001 + arr = get_data_arr(definition, field) + assert arr == [8, 1] + + # insufficient data + definition._count = 2 + definition._num_bits = 32 + definition._data_type = 'INT32' + field.raw = 0x0009 + arr = get_data_arr(definition, field) + assert arr == [0, 9] + + def test_integrate(self): + definition = LuxtronikDefinition.unknown(2, 'Foo', 30) + field = definition.create_field() + data = [1, LUXTRONIK_VALUE_FUNCTION_NOT_AVAILABLE, 3, 4, 5, 6, 7] + + field.concatenate_multiple_data_chunks = False + + # set array + definition._count = 2 + definition._num_bits = 64 + definition._data_type = 'INT64' + integrate_data(definition, field, data) + assert field.raw == [3, 4] + integrate_data(definition, field, data, 4) + assert field.raw == [5, 6] + integrate_data(definition, field, data, 7) + assert field.raw is None + integrate_data(definition, field, data, 0) + assert field.raw == [1, LUXTRONIK_VALUE_FUNCTION_NOT_AVAILABLE] + + # set array + definition._count = 2 + definition._num_bits = 32 + definition._data_type = 'INT32' + integrate_data(definition, field, data) + assert field.raw == [3, 4] + integrate_data(definition, field, data, 4) + assert field.raw == [5, 6] + integrate_data(definition, field, data, 7) + assert field.raw is None + integrate_data(definition, field, data, 0) + assert field.raw == [1, LUXTRONIK_VALUE_FUNCTION_NOT_AVAILABLE] + + # set value + definition._count = 1 + definition._num_bits = 32 + definition._data_type = 'INT32' + integrate_data(definition, field, data) + assert field.raw == 3 + integrate_data(definition, field, data, 5) + assert field.raw == 6 + integrate_data(definition, field, data, 9) + assert field.raw is None + integrate_data(definition, field, data, 1) + # Currently there is no magic "not available" value for 32 bit values -> not None + # This applies also to similar lines below + assert field.raw == LUXTRONIK_VALUE_FUNCTION_NOT_AVAILABLE + + # set value + definition._count = 1 + definition._num_bits = 16 + definition._data_type = 'INT16' + integrate_data(definition, field, data) + assert field.raw == 3 + integrate_data(definition, field, data, 5) + assert field.raw == 6 + integrate_data(definition, field, data, 9) + assert field.raw is None + integrate_data(definition, field, data, 1) + assert field.raw is None + + field.concatenate_multiple_data_chunks = True + + # set array + definition._count = 2 + definition._num_bits = 64 + definition._data_type = 'INT64' + integrate_data(definition, field, data) + assert field.raw == 0x00000003_00000004 + integrate_data(definition, field, data, 4) + assert field.raw == 0x00000005_00000006 + integrate_data(definition, field, data, 7) + assert field.raw is None + integrate_data(definition, field, data, 0) + assert field.raw == 0x00000001_00007FFF + + # set array + definition._count = 2 + definition._num_bits = 32 + definition._data_type = 'INT32' + integrate_data(definition, field, data) + assert field.raw == 0x0003_0004 + integrate_data(definition, field, data, 4) + assert field.raw == 0x0005_0006 + integrate_data(definition, field, data, 7) + assert field.raw is None + integrate_data(definition, field, data, 0) + assert field.raw == 0x0001_7FFF + + # set value + definition._count = 1 + definition._num_bits = 32 + definition._data_type = 'INT32' + integrate_data(definition, field, data) + assert field.raw == 0x00000003 + integrate_data(definition, field, data, 5) + assert field.raw == 0x00000006 + integrate_data(definition, field, data, 9) + assert field.raw is None + integrate_data(definition, field, data, 1) + assert field.raw == 0x00007FFF + + # set value + definition._count = 1 + definition._num_bits = 16 + definition._data_type = 'INT16' + integrate_data(definition, field, data) + assert field.raw == 0x0003 + integrate_data(definition, field, data, 5) + assert field.raw == 0x0006 + integrate_data(definition, field, data, 9) + assert field.raw is None + integrate_data(definition, field, data, 1) + assert field.raw is None + + field.concatenate_multiple_data_chunks = False class TestLuxtronikFieldsDictionary: From 772ab17219549a9819257a4c960140c8afa71227 Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Wed, 21 Jan 2026 23:29:35 +0100 Subject: [PATCH 23/68] wip --- tests/test_collections.py | 75 +++++++++++++++++++++++++-------------- 1 file changed, 49 insertions(+), 26 deletions(-) diff --git a/tests/test_collections.py b/tests/test_collections.py index 20d8797d..df3d59d4 100644 --- a/tests/test_collections.py +++ b/tests/test_collections.py @@ -1,18 +1,18 @@ -import pytest -from luxtronik.collections import LuxtronikFieldsDictionary +from luxtronik.collections import ( + get_data_arr, + integrate_data, + LuxtronikDefFieldPair, + LuxtronikFieldsDictionary, +) from luxtronik.definitions import LuxtronikDefinition, LuxtronikDefinitionsDictionary from luxtronik.datatypes import ( Base, Unknown, ) from luxtronik.constants import LUXTRONIK_VALUE_FUNCTION_NOT_AVAILABLE -from luxtronik.collections import ( - get_data_arr, - integrate_data, -) -from luxtronik.definitions import LuxtronikDefinition + ############################################################################### # Tests @@ -20,9 +20,21 @@ class TestDefinitionFieldPair: + def test_init(self): + definition = LuxtronikDefinition.unknown(2, 'Foo', 30) + field = definition.create_field() + pair = LuxtronikDefFieldPair(definition, field) + + assert pair.definition is definition + assert pair.field is field + d, f = pair + assert d is definition + assert f is field + def test_data_arr(self): definition = LuxtronikDefinition.unknown(2, 'Foo', 30) field = definition.create_field() + pair = LuxtronikDefFieldPair(definition, field) field.concatenate_multiple_data_chunks = False @@ -33,6 +45,7 @@ def test_data_arr(self): field.raw = 5 arr = get_data_arr(definition, field) assert arr == [5] + assert arr == pair.get_data_arr() # get from value definition._count = 1 @@ -41,6 +54,7 @@ def test_data_arr(self): field.raw = 5 arr = get_data_arr(definition, field) assert arr == [5] + assert arr == pair.get_data_arr() # get from array definition._count = 2 @@ -49,6 +63,7 @@ def test_data_arr(self): field.raw = [7, 3] arr = get_data_arr(definition, field) assert arr == [7, 3] + assert arr == pair.get_data_arr() # get from array definition._count = 2 @@ -57,6 +72,7 @@ def test_data_arr(self): field.raw = [7, 3] arr = get_data_arr(definition, field) assert arr == [7, 3] + assert arr == pair.get_data_arr() # too much data definition._count = 2 @@ -65,6 +81,7 @@ def test_data_arr(self): field.raw = [4, 8, 1] arr = get_data_arr(definition, field) assert arr is None + assert arr == pair.get_data_arr() # insufficient data definition._count = 2 @@ -73,6 +90,7 @@ def test_data_arr(self): field.raw = [9] arr = get_data_arr(definition, field) assert arr is None + assert arr == pair.get_data_arr() field.concatenate_multiple_data_chunks = True @@ -83,6 +101,7 @@ def test_data_arr(self): field.raw = 0x00000007_00000003 arr = get_data_arr(definition, field) assert arr == [7, 3] + assert arr == pair.get_data_arr() # get from array definition._count = 2 @@ -91,6 +110,7 @@ def test_data_arr(self): field.raw = 0x0007_0003 arr = get_data_arr(definition, field) assert arr == [7, 3] + assert arr == pair.get_data_arr() # too much data definition._count = 2 @@ -99,6 +119,7 @@ def test_data_arr(self): field.raw = 0x0004_0008_0001 arr = get_data_arr(definition, field) assert arr == [8, 1] + assert arr == pair.get_data_arr() # insufficient data definition._count = 2 @@ -107,10 +128,12 @@ def test_data_arr(self): field.raw = 0x0009 arr = get_data_arr(definition, field) assert arr == [0, 9] + assert arr == pair.get_data_arr() def test_integrate(self): definition = LuxtronikDefinition.unknown(2, 'Foo', 30) field = definition.create_field() + pair = LuxtronikDefFieldPair(definition, field) data = [1, LUXTRONIK_VALUE_FUNCTION_NOT_AVAILABLE, 3, 4, 5, 6, 7] field.concatenate_multiple_data_chunks = False @@ -121,11 +144,11 @@ def test_integrate(self): definition._data_type = 'INT64' integrate_data(definition, field, data) assert field.raw == [3, 4] - integrate_data(definition, field, data, 4) + pair.integrate_data(data, 4) assert field.raw == [5, 6] integrate_data(definition, field, data, 7) assert field.raw is None - integrate_data(definition, field, data, 0) + pair.integrate_data(data, 0) assert field.raw == [1, LUXTRONIK_VALUE_FUNCTION_NOT_AVAILABLE] # set array @@ -134,11 +157,11 @@ def test_integrate(self): definition._data_type = 'INT32' integrate_data(definition, field, data) assert field.raw == [3, 4] - integrate_data(definition, field, data, 4) + pair.integrate_data(data, 4) assert field.raw == [5, 6] integrate_data(definition, field, data, 7) assert field.raw is None - integrate_data(definition, field, data, 0) + pair.integrate_data(data, 0) assert field.raw == [1, LUXTRONIK_VALUE_FUNCTION_NOT_AVAILABLE] # set value @@ -147,11 +170,11 @@ def test_integrate(self): definition._data_type = 'INT32' integrate_data(definition, field, data) assert field.raw == 3 - integrate_data(definition, field, data, 5) + pair.integrate_data(data, 5) assert field.raw == 6 integrate_data(definition, field, data, 9) assert field.raw is None - integrate_data(definition, field, data, 1) + pair.integrate_data(data, 1) # Currently there is no magic "not available" value for 32 bit values -> not None # This applies also to similar lines below assert field.raw == LUXTRONIK_VALUE_FUNCTION_NOT_AVAILABLE @@ -162,11 +185,11 @@ def test_integrate(self): definition._data_type = 'INT16' integrate_data(definition, field, data) assert field.raw == 3 - integrate_data(definition, field, data, 5) + pair.integrate_data(data, 5) assert field.raw == 6 integrate_data(definition, field, data, 9) assert field.raw is None - integrate_data(definition, field, data, 1) + pair.integrate_data(data, 1) assert field.raw is None field.concatenate_multiple_data_chunks = True @@ -177,11 +200,11 @@ def test_integrate(self): definition._data_type = 'INT64' integrate_data(definition, field, data) assert field.raw == 0x00000003_00000004 - integrate_data(definition, field, data, 4) + pair.integrate_data(data, 4) assert field.raw == 0x00000005_00000006 integrate_data(definition, field, data, 7) assert field.raw is None - integrate_data(definition, field, data, 0) + pair.integrate_data(data, 0) assert field.raw == 0x00000001_00007FFF # set array @@ -190,11 +213,11 @@ def test_integrate(self): definition._data_type = 'INT32' integrate_data(definition, field, data) assert field.raw == 0x0003_0004 - integrate_data(definition, field, data, 4) + pair.integrate_data(data, 4) assert field.raw == 0x0005_0006 integrate_data(definition, field, data, 7) assert field.raw is None - integrate_data(definition, field, data, 0) + pair.integrate_data(data, 0) assert field.raw == 0x0001_7FFF # set value @@ -203,11 +226,11 @@ def test_integrate(self): definition._data_type = 'INT32' integrate_data(definition, field, data) assert field.raw == 0x00000003 - integrate_data(definition, field, data, 5) + pair.integrate_data(data, 5) assert field.raw == 0x00000006 integrate_data(definition, field, data, 9) assert field.raw is None - integrate_data(definition, field, data, 1) + pair.integrate_data(data, 1) assert field.raw == 0x00007FFF # set value @@ -216,11 +239,11 @@ def test_integrate(self): definition._data_type = 'INT16' integrate_data(definition, field, data) assert field.raw == 0x0003 - integrate_data(definition, field, data, 5) + pair.integrate_data(data, 5) assert field.raw == 0x0006 integrate_data(definition, field, data, 9) assert field.raw is None - integrate_data(definition, field, data, 1) + pair.integrate_data(data, 1) assert field.raw is None field.concatenate_multiple_data_chunks = False @@ -240,7 +263,7 @@ def test_init(self): def test_add(self): d = LuxtronikFieldsDictionary() assert len(d) == 0 - assert len(d._pairs) == 0 + assert len(d.pairs()) == 0 u = LuxtronikDefinition.unknown(1, "test", 0) f = u.create_field() @@ -291,7 +314,7 @@ def test_len(self): d, _, _ = self.create_instance() # 3 different indices assert len(d) == 3 - assert len(d._pairs) == 4 + assert len(d.pairs()) == 4 def test_get_contains(self): d, u, f = self.create_instance() @@ -338,7 +361,7 @@ def test_values(self): assert type(value) is Base assert value.name == "base3" - def test_pairs(self): + def test_items(self): d, _, _ = self.create_instance() for idx, (key, value) in enumerate(d.items()): if idx == 0: From 095fe1dace65958e8947f288a1c2ec1b2ae33660 Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Thu, 22 Jan 2026 20:25:40 +0100 Subject: [PATCH 24/68] wip --- luxtronik/cfi/calculations.py | 4 --- luxtronik/cfi/parameters.py | 4 --- luxtronik/cfi/visibilities.py | 4 --- luxtronik/collections.py | 52 +++++++++++++++--------------- luxtronik/data_vector.py | 35 ++++++++++++++------ luxtronik/shi/holdings.py | 6 +--- luxtronik/shi/inputs.py | 6 +--- tests/cfi/test_cfi_calculations.py | 3 +- tests/cfi/test_cfi_parameters.py | 3 +- tests/cfi/test_cfi_visibilities.py | 3 +- tests/shi/test_shi_modbus.py | 1 - tests/shi/test_shi_vector.py | 4 +-- 12 files changed, 58 insertions(+), 67 deletions(-) diff --git a/luxtronik/cfi/calculations.py b/luxtronik/cfi/calculations.py index 51d98785..f793869b 100644 --- a/luxtronik/cfi/calculations.py +++ b/luxtronik/cfi/calculations.py @@ -34,10 +34,6 @@ class Calculations(DataVectorConfig): "ID_WEB_SoftStand": "get_firmware_version()" } - @property - def calculations(self): - return self._data - def get_firmware_version(self): """Get the firmware version as string.""" return "".join([super(Calculations, self).get(i).value for i in range(81, 91)]) diff --git a/luxtronik/cfi/parameters.py b/luxtronik/cfi/parameters.py index d3906369..034c3fa8 100644 --- a/luxtronik/cfi/parameters.py +++ b/luxtronik/cfi/parameters.py @@ -28,7 +28,3 @@ class Parameters(DataVectorConfig): name = PARAMETERS_FIELD_NAME definitions = PARAMETERS_DEFINITIONS - - @property - def parameters(self): - return self._data diff --git a/luxtronik/cfi/visibilities.py b/luxtronik/cfi/visibilities.py index 99ceb3e2..0979001f 100644 --- a/luxtronik/cfi/visibilities.py +++ b/luxtronik/cfi/visibilities.py @@ -28,7 +28,3 @@ class Visibilities(DataVectorConfig): name = VISIBILITIES_FIELD_NAME definitions = VISIBILITIES_DEFINITIONS - - @property - def visibilities(self): - return self._data diff --git a/luxtronik/collections.py b/luxtronik/collections.py index f71c4d01..899acdd5 100644 --- a/luxtronik/collections.py +++ b/luxtronik/collections.py @@ -10,7 +10,7 @@ ############################################################################### -# Common functions +# Common methods ############################################################################### def pack_values(values, num_bits, reverse=True): @@ -72,6 +72,30 @@ def unpack_values(packed, count, num_bits, reverse=True): return values +def get_data_arr(definition, field): + """ + Normalize the field's data to a list of the correct size. + + Args: + definition (LuxtronikDefinition): Meta-data of the field. + field (Base): Field object that contains data to get. + + Returns: + list[int] | None: List of length `definition.count`, + or None if the data size does not match. + """ + data = field.raw + if data is None: + return None + should_unpack = field.concatenate_multiple_data_chunks \ + and definition.reg_bits > 0 and definition.count > 1 + if should_unpack and not isinstance(data, list): + # Usually big-endian (reverse=True) is used + data = unpack_values(data, definition.count, definition.reg_bits) + if not isinstance(data, list): + data = [data] + return data if len(data) == definition.count else None + def integrate_data(definition, field, raw_data, data_offset=-1): """ Integrate raw values from a data array into the field. @@ -101,30 +125,6 @@ def integrate_data(definition, field, raw_data, data_offset=-1): raw = raw if definition.check_raw_not_none(raw) else None field.raw = raw -def get_data_arr(definition, field): - """ - Normalize the field's data to a list of the correct size. - - Args: - definition (LuxtronikDefinition): Meta-data of the field. - field (Base): Field object that contains data to get. - - Returns: - list[int] | None: List of length `definition.count`, - or None if the data size does not match. - """ - data = field.raw - if data is None: - return None - should_unpack = field.concatenate_multiple_data_chunks \ - and definition.reg_bits > 0 and definition.count > 1 - if should_unpack and not isinstance(data, list): - # Usually big-endian (reverse=True) is used - data = unpack_values(data, definition.count, definition.reg_bits) - if not isinstance(data, list): - data = [data] - return data if len(data) == definition.count else None - ############################################################################### # Definition / field pair ############################################################################### @@ -175,7 +175,7 @@ def integrate_data(self, raw_data, data_offset=-1): Integrate the related parts of the `raw_data` into the field Args: - raw_data (list): Source array of bytes/words. + raw_data (list): Source array of register values. data_offset (int): Optional offset. Defaults to `definition.index`. """ integrate_data(self.definition, self.field, raw_data, data_offset) diff --git a/luxtronik/data_vector.py b/luxtronik/data_vector.py index f8023726..d3762641 100644 --- a/luxtronik/data_vector.py +++ b/luxtronik/data_vector.py @@ -16,7 +16,7 @@ class DataVector: """ - Class that holds a vector of data entries. + Class that holds a vector of data fields. Provides access to fields by name, index or alias. To use aliases, they must first be registered here (locally = only valid @@ -50,32 +50,43 @@ def create_unknown_field(cls, idx): return Unknown(f"unknown_{cls.name}_{idx}", False) @classmethod - def create_any_field(cls, name_or_idx): + def create_any_field(cls, def_name_or_idx): """ Create a field object from an available definition (= included in class variable `cls.definitions`). Be careful! The used controller firmware may not support this field. + If `def_name_or_idx` + - is a definition -> create the field from the provided definition + - is a name -> lookup the definition by name and create the field + - is a idx -> lookup definition by index and create the field + Args: - name_or_idx (str | int): Field name or register index. + def_name_or_idx (LuxtronikDefinition | str | int): Definitions object, + field name or register index. Returns: Base | None: The created field, or None if not found or not valid. """ - # The definitions object hold all available definitions - definition = cls.definitions.get(name_or_idx) + definition, _ = self._get_definition(def_name_or_idx, True) if definition is not None and definition.valid: return definition.create_field() return None - def create_field(self, name_or_idx): + def create_field(self, def_name_or_idx): """ Create a field object from a version-dependent definition (= included in class variable `cls.definitions` and is valid for `self.version`). + If `def_name_or_idx` + - is a definition -> create the field from the provided definition + - is a name -> lookup the definition by name and create the field + - is a idx -> lookup definition by index and create the field + Args: - name_or_idx (str | int): Field name or register index. + def_name_or_idx (str | int): Definitions object, + field name or register index. Returns: Base | None: The created field, or None if not found or not valid. @@ -120,6 +131,12 @@ def __contains__(self, def_field_name_or_idx): Check whether the data vector contains a name, index, or definition matching an added field, or the field itself. + If `def_field_name_or_idx` + - is a definition -> check whether a field with this definition has been added + - is a field -> check whether this field has been added + - is a name -> check whether a field with this name has been added + - is a idx -> check whether a field with this index has been added + Args: def_field_name_or_idx (LuxtronikDefinition | Base | str | int): Definition object, field object, field name or register index. @@ -218,6 +235,8 @@ def _get_definition(self, def_field_name_or_idx, all_not_version_dependent): definition = self._data.def_dict.get(definition) return definition, field + + def get(self, def_name_or_idx, default=None): """ Retrieve a field by definition, name or register index. @@ -255,9 +274,7 @@ def set(self, def_field_name_or_idx, value): value (int | List[int]): Value to set """ field = def_field_name_or_idx - print(field) if not isinstance(field, Base): field = self.get(def_field_name_or_idx) - print(field) if field is not None: field.value = value \ No newline at end of file diff --git a/luxtronik/shi/holdings.py b/luxtronik/shi/holdings.py index 53f6e0d4..cdc39054 100644 --- a/luxtronik/shi/holdings.py +++ b/luxtronik/shi/holdings.py @@ -27,8 +27,4 @@ class Holdings(DataVectorSmartHome): """Class that holds holding fields.""" name = HOLDINGS_FIELD_NAME - definitions = HOLDINGS_DEFINITIONS - - @property - def holdings(self): - return self._data \ No newline at end of file + definitions = HOLDINGS_DEFINITIONS \ No newline at end of file diff --git a/luxtronik/shi/inputs.py b/luxtronik/shi/inputs.py index 3a87f703..d609e9c4 100644 --- a/luxtronik/shi/inputs.py +++ b/luxtronik/shi/inputs.py @@ -27,8 +27,4 @@ class Inputs(DataVectorSmartHome): """Class that holds input fields.""" name = INPUTS_FIELD_NAME - definitions = INPUTS_DEFINITIONS - - @property - def inputs(self): - return self._data \ No newline at end of file + definitions = INPUTS_DEFINITIONS \ No newline at end of file diff --git a/tests/cfi/test_cfi_calculations.py b/tests/cfi/test_cfi_calculations.py index fd44cbed..3eda49c8 100644 --- a/tests/cfi/test_cfi_calculations.py +++ b/tests/cfi/test_cfi_calculations.py @@ -13,12 +13,11 @@ def test_init(self): """Test cases for initialization""" calculations = Calculations() assert calculations.name == "calculation" - assert calculations.calculations == calculations._data def test_data(self): """Test cases for the data dictionary""" calculations = Calculations() - data = calculations.calculations + data = calculations.data # The Value must be a fields # The key can be an index diff --git a/tests/cfi/test_cfi_parameters.py b/tests/cfi/test_cfi_parameters.py index 9a033f24..74409097 100644 --- a/tests/cfi/test_cfi_parameters.py +++ b/tests/cfi/test_cfi_parameters.py @@ -13,7 +13,6 @@ def test_init(self): """Test cases for initialization""" parameters = Parameters() assert parameters.name == "parameter" - assert parameters.parameters == parameters._data assert parameters.safe parameters = Parameters(False) @@ -22,7 +21,7 @@ def test_init(self): def test_data(self): """Test cases for the data dictionary""" parameters = Parameters() - data = parameters.parameters + data = parameters.data # The Value must be a fields # The key can be an index diff --git a/tests/cfi/test_cfi_visibilities.py b/tests/cfi/test_cfi_visibilities.py index 8ecb6f72..697005bd 100644 --- a/tests/cfi/test_cfi_visibilities.py +++ b/tests/cfi/test_cfi_visibilities.py @@ -13,12 +13,11 @@ def test_init(self): """Test cases for initialization""" visibilities = Visibilities() assert visibilities.name == "visibility" - assert visibilities.visibilities == visibilities._data def test_data(self): """Test cases for the data dictionary""" visibilities = Visibilities() - data = visibilities.visibilities + data = visibilities.data # The Value must be a fields # The key can be an index diff --git a/tests/shi/test_shi_modbus.py b/tests/shi/test_shi_modbus.py index ba432418..1d0145ee 100644 --- a/tests/shi/test_shi_modbus.py +++ b/tests/shi/test_shi_modbus.py @@ -95,7 +95,6 @@ def test_no_connection(self): # Cannot connect to read holdings data = LuxtronikSmartHomeReadHoldingsTelegram(0, 1) result = self.modbus_interface.send(data) - print(data.data) assert not result # Cannot connect to write holdings diff --git a/tests/shi/test_shi_vector.py b/tests/shi/test_shi_vector.py index b1bd5af3..faeff419 100644 --- a/tests/shi/test_shi_vector.py +++ b/tests/shi/test_shi_vector.py @@ -92,7 +92,7 @@ def test_create(self): data_vector = DataVectorTest(parse_version("1.2")) assert data_vector.version == (1, 2, 0, 0) assert len(data_vector) == 2 - assert len(data_vector._data._pairs) == 3 + assert len(data_vector._data.pairs()) == 3 assert not data_vector._read_blocks_up_to_date assert len(data_vector._read_blocks) == 0 @@ -409,7 +409,6 @@ def test_init(self): """Test cases for initialization""" holdings = Holdings() assert holdings.name == "holding" - assert holdings.holdings == holdings._data class TestInputs: @@ -419,4 +418,3 @@ def test_init(self): """Test cases for initialization""" inputs = Inputs() assert inputs.name == "input" - assert inputs.inputs == inputs._data From 0d36cb416e5cfa44797449e93bb8bb3a72ddb8dc Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Thu, 22 Jan 2026 20:40:28 +0100 Subject: [PATCH 25/68] wip --- luxtronik/collections.py | 27 ++++++++++++++++----------- luxtronik/data_vector.py | 5 +++-- luxtronik/definitions/__init__.py | 5 ----- luxtronik/shi/contiguous.py | 3 ++- 4 files changed, 21 insertions(+), 19 deletions(-) diff --git a/luxtronik/collections.py b/luxtronik/collections.py index 899acdd5..3c9eebe9 100644 --- a/luxtronik/collections.py +++ b/luxtronik/collections.py @@ -72,13 +72,14 @@ def unpack_values(packed, count, num_bits, reverse=True): return values -def get_data_arr(definition, field): +def get_data_arr(definition, field, num_bits): """ Normalize the field's data to a list of the correct size. Args: definition (LuxtronikDefinition): Meta-data of the field. field (Base): Field object that contains data to get. + num_bits (int): Number of bits per register. Returns: list[int] | None: List of length `definition.count`, @@ -88,15 +89,15 @@ def get_data_arr(definition, field): if data is None: return None should_unpack = field.concatenate_multiple_data_chunks \ - and definition.reg_bits > 0 and definition.count > 1 + and definition.count > 1 if should_unpack and not isinstance(data, list): # Usually big-endian (reverse=True) is used - data = unpack_values(data, definition.count, definition.reg_bits) + data = unpack_values(data, definition.count, num_bits) if not isinstance(data, list): data = [data] return data if len(data) == definition.count else None -def integrate_data(definition, field, raw_data, data_offset=-1): +def integrate_data(definition, field, raw_data, num_bits, data_offset=-1): """ Integrate raw values from a data array into the field. @@ -104,6 +105,7 @@ def integrate_data(definition, field, raw_data, data_offset=-1): definition (LuxtronikDefinition): Meta-data of the field. field (Base): Field object where to integrate the data. raw_data (list): Source array of bytes/words. + num_bits (int): Number of bits per register. data_offset (int): Optional offset. Defaults to `definition.index`. """ # Use data_offset if provided, otherwise the index @@ -116,11 +118,10 @@ def integrate_data(definition, field, raw_data, data_offset=-1): else: raw = raw_data[data_offset : data_offset + definition.count] raw = raw if len(raw) == definition.count else None - should_pack = field.concatenate_multiple_data_chunks \ - and definition.reg_bits > 0 # and definition.count > 1 + should_pack = field.concatenate_multiple_data_chunks if should_pack and raw is not None : # Usually big-endian (reverse=True) is used - raw = pack_values(raw, definition.reg_bits) + raw = pack_values(raw, num_bits) raw = raw if definition.check_raw_not_none(raw) else None field.raw = raw @@ -161,24 +162,28 @@ def addr(self): def count(self): return self.definition.count - def get_data_arr(self): + def get_data_arr(self, num_bits): """ Normalize the field's data to a list of the correct size. + Args: + num_bits (int): Number of bits per chunk. + Returns: list[int] | None: List of length `definition.count`, or None if insufficient. """ - return get_data_arr(self.definition, self.field) + return get_data_arr(self.definition, self.field, num_bits) - def integrate_data(self, raw_data, data_offset=-1): + def integrate_data(self, raw_data, num_bits, data_offset=-1): """ Integrate the related parts of the `raw_data` into the field Args: raw_data (list): Source array of register values. data_offset (int): Optional offset. Defaults to `definition.index`. + num_bits (int): Number of bits per chunk. """ - integrate_data(self.definition, self.field, raw_data, data_offset) + integrate_data(self.definition, self.field, raw_data, num_bits, data_offset) ############################################################################### # Field dictionary for data vectors diff --git a/luxtronik/data_vector.py b/luxtronik/data_vector.py index d3762641..e3426105 100644 --- a/luxtronik/data_vector.py +++ b/luxtronik/data_vector.py @@ -175,13 +175,14 @@ def register_alias(self, def_field_name_or_idx, alias): # Parse methods ############################################################### - def parse(self, raw_data): + def parse(self, raw_data, num_bits): """ Parse raw data into the corresponding fields. Args: raw_data (list[int]): List of raw register values. The raw data must start at register index 0. + num_bits (int): Number of bits per register. """ raw_len = len(raw_data) undefined = {i for i in range(0, raw_len)} @@ -193,7 +194,7 @@ def parse(self, raw_data): continue for index in range(definition.index, next_idx): undefined.discard(index) - pair.integrate_data(raw_data) + pair.integrate_data(raw_data, num_bits) # create an unknown field for additional data for index in undefined: # LOGGER.warning(f"Entry '%d' not in list of {self.name}", index) diff --git a/luxtronik/definitions/__init__.py b/luxtronik/definitions/__init__.py index d92090c4..ed3b14c5 100644 --- a/luxtronik/definitions/__init__.py +++ b/luxtronik/definitions/__init__.py @@ -164,11 +164,6 @@ def writeable(self): def num_bits(self): return self._num_bits - @property - def reg_bits(self): - """Return the number of bits per register.""" - return self._num_bits // self._count - @property def names(self): return self._names diff --git a/luxtronik/shi/contiguous.py b/luxtronik/shi/contiguous.py index 52ec1f8d..a8de5dc2 100644 --- a/luxtronik/shi/contiguous.py +++ b/luxtronik/shi/contiguous.py @@ -7,6 +7,7 @@ import logging from luxtronik.collections import LuxtronikDefFieldPair +from luxtronik.shi.constants import LUXTRONIK_SHI_REGISTER_BIT_SIZE LOGGER = logging.getLogger(__name__) @@ -170,7 +171,7 @@ def integrate_data(self, data_arr): first = self.first_index for part in self._parts: data_offset = part.index - first - part.integrate_data(data_arr, data_offset) + part.integrate_data(data_arr, data_offset, LUXTRONIK_SHI_REGISTER_BIT_SIZE) return True From dd31d90f43a1d6546255c3285d34ed6ce5dd5ed9 Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Thu, 22 Jan 2026 21:34:31 +0100 Subject: [PATCH 26/68] wip --- luxtronik/collections.py | 77 ++++++++++++++---------- luxtronik/data_vector.py | 112 ++++++++++++++++++++++------------- luxtronik/shi/interface.py | 6 +- luxtronik/shi/vector.py | 2 +- tests/shi/test_shi_vector.py | 2 +- tests/test_collections.py | 4 +- 6 files changed, 125 insertions(+), 78 deletions(-) diff --git a/luxtronik/collections.py b/luxtronik/collections.py index 3c9eebe9..1825f681 100644 --- a/luxtronik/collections.py +++ b/luxtronik/collections.py @@ -167,7 +167,7 @@ def get_data_arr(self, num_bits): Normalize the field's data to a list of the correct size. Args: - num_bits (int): Number of bits per chunk. + num_bits (int): Number of bits per register. Returns: list[int] | None: List of length `definition.count`, or None if insufficient. @@ -181,7 +181,7 @@ def integrate_data(self, raw_data, num_bits, data_offset=-1): Args: raw_data (list): Source array of register values. data_offset (int): Optional offset. Defaults to `definition.index`. - num_bits (int): Number of bits per chunk. + num_bits (int): Number of bits per register. """ integrate_data(self.definition, self.field, raw_data, num_bits, data_offset) @@ -191,13 +191,12 @@ def integrate_data(self, raw_data, num_bits, data_offset=-1): class LuxtronikFieldsDictionary: """ - Dictionary that behaves like the earlier data vector dictionaries (index-field-dictionary), - with the addition that obsolete fields are also supported and can be addressed by name. + Dictionary that maps definitions, names or indices to added fields. Aliases are also supported. """ def __init__(self): - # There may be several names or alias that points to one definition. + # There may be several names or alias that points to one definition and field. # So in order to spare memory we split the name/index-to-field-lookup # into a name/index-to-definition-lookup and a definition-to-field-lookup self._def_lookup = LuxtronikDefinitionsDictionary() @@ -207,24 +206,31 @@ def __init__(self): self._pairs = [] # list of LuxtronikDefFieldPair def __getitem__(self, def_field_name_or_idx): + """ + Array-style access to method `get`. + Please check its documentation. + """ return self.get(def_field_name_or_idx) def __len__(self): - return len(self._def_lookup._index_dict) + """Return the number of added fields.""" + return len(self._pairs) def __iter__(self): - """ - Iterate over all non-obsolete indices. If an index is assigned multiple times, - only the index of the preferred definition will be output. - """ - all_related_defs = self._def_lookup._index_dict.values() - return iter([d.index for d in self._pairs if d in all_related_defs]) + """Return the iterator over all definitions related to the added fields.""" + return iter([d for d, _ in self._pairs]) def __contains__(self, def_field_name_or_idx): """ Check whether the data vector contains a name, index, or definition matching an added field, or the field itself. + If `def_field_name_or_idx` + - is a definition -> check whether a field with this definition has been added + - is a field -> check whether this field has been added + - is a name -> check whether a field with this name has been added + - is a idx -> check whether a field with this index has been added + Args: def_field_name_or_idx (LuxtronikDefinition | Base | str | int): Definition object, field object, field name or register index. @@ -241,33 +247,34 @@ def __contains__(self, def_field_name_or_idx): return def_field_name_or_idx in self._def_lookup def values(self): - """ - Iterator for all added non-obsolete fields. If an index is assigned multiple times, - only the field of the preferred definition will be output. - """ - all_related_defs = self._def_lookup._index_dict.values() - return iter([f for d, f in self._pairs if d in all_related_defs]) + """Return the iterator over all added fields.""" + return iter([f for _, f in self._pairs]) def items(self): - """ - Iterator for all non-obsolete index-field-pairs (list of tuples with - 0: index, 1: field) contained herein. If an index is assigned multiple times, - only the index-field-pair of the preferred definition will be output. - """ - all_related_defs = self._def_lookup._index_dict.values() - return iter([(d.index, f) for d, f in self._pairs if d in all_related_defs]) + """Return the iterator over all added definition-field-pairs.""" + return iter(self._pairs) + @property def pairs(self): - """ - Return all definition-field-pairs contained herein. - """ + """Return all definition-field-pairs contained herein.""" return self._pairs @property def def_dict(self): - """Return the internal definition dictionary, containing all added definitions""" + """ + Return the internal definition dictionary, + containing all definitions related to the added fields. + """ return self._def_lookup + @property + def field_dict(self): + """ + Return the internal field dictionary, + containing all added fields. + """ + return self._field_lookup + def add(self, definition, field, alias=None): """ Add a definition-field-pair to the internal dictionaries. @@ -276,6 +283,8 @@ def add(self, definition, field, alias=None): definition (LuxtronikDefinition): Definition related to the field. field (Base): Field to add. alias (Hashable | None): Alias, which can be used to access the field again. + + Note: Only use this method if the definitions order is already correct. """ if definition.valid: self._def_lookup.add(definition, alias) @@ -311,8 +320,8 @@ def register_alias(self, def_field_name_or_idx, alias): Base | None: The field to which the alias was added, or None if not possible """ - # Resolve a field input def_name_or_idx = def_field_name_or_idx + # Resolve a field argument if isinstance(def_name_or_idx, Base): def_name_or_idx = def_name_or_idx.name # register alias @@ -323,7 +332,13 @@ def register_alias(self, def_field_name_or_idx, alias): def get(self, def_field_name_or_idx, default=None): """ - Retrieve a field by definition, name or register index, or the field itself. + Retrieve an added field by definition, name or register index, or the field itself. + + If `def_field_name_or_idx` + - is a definition -> lookup the field by the definition + - is a field -> lookup the field by the field's name + - is a name -> lookup the field by the name + - is a idx -> lookup the field by the index Args: def_field_name_or_idx (LuxtronikDefinition | Base | str | int): diff --git a/luxtronik/data_vector.py b/luxtronik/data_vector.py index e3426105..c70bc2ef 100644 --- a/luxtronik/data_vector.py +++ b/luxtronik/data_vector.py @@ -45,7 +45,7 @@ def create_unknown_field(cls, idx): idx (int): Register index. Returns: - Unknown: A field instance of type 'Unknown'. + Unknown: A field instance of type `Unknown`. """ return Unknown(f"unknown_{cls.name}_{idx}", False) @@ -112,63 +112,68 @@ def __init__(self): @property def data(self): + """ + Return the internal `LuxtronikFieldsDictionary`. + Please check its documentation. + """ return self._data def __getitem__(self, def_name_or_idx): + """ + Array-style access to method `get`. + Please check its documentation. + """ return self.get(def_name_or_idx) def __setitem__(self, def_name_or_idx, value): + """ + Array-style access to method `set`. + Please check its documentation. + """ return self.set(def_name_or_idx, value) def __len__(self): + """ + Forward the `LuxtronikFieldsDictionary.__len__` method. + Please check its documentation. + """ return len(self._data) def __iter__(self): + """ + Forward the `LuxtronikFieldsDictionary.__iter__` method. + Please check its documentation. + """ return iter(self._data) def __contains__(self, def_field_name_or_idx): """ - Check whether the data vector contains a name, index, - or definition matching an added field, or the field itself. - - If `def_field_name_or_idx` - - is a definition -> check whether a field with this definition has been added - - is a field -> check whether this field has been added - - is a name -> check whether a field with this name has been added - - is a idx -> check whether a field with this index has been added - - Args: - def_field_name_or_idx (LuxtronikDefinition | Base | str | int): - Definition object, field object, field name or register index. - - Returns: - True if the searched element was found, otherwise False. + Forward the `LuxtronikFieldsDictionary.__contains__` method. + Please check its documentation. """ return def_field_name_or_idx in self._data def values(self): - return iter(self._data.values()) + """ + Forward the `LuxtronikFieldsDictionary.values` method. + Please check its documentation. + """ + return self._data.values() def items(self): - return iter(self._data.items()) + """ + Forward the `LuxtronikFieldsDictionary.items` method. + Please check its documentation. + """ + return self._data.items() # Alias methods ############################################################### def register_alias(self, def_field_name_or_idx, alias): """ - Add an alternative name (or anything hashable else) - that can be used to access a specific field. - - Args: - def_field_name_or_idx (LuxtronikDefinition | Base | str | int): - Field to which the alias is to be added. - Either by definition, name, register index, or the field itself. - alias (Hashable): Alias, which can be used to access the field again. - - Returns: - Base | None: The field to which the alias was added, - or None if not possible + Forward the `LuxtronikFieldsDictionary.register_alias` method. + Please check its documentation. """ return self._data.register_alias(def_field_name_or_idx, alias) @@ -185,16 +190,22 @@ def parse(self, raw_data, num_bits): num_bits (int): Number of bits per register. """ raw_len = len(raw_data) + # Prepare a list of undefined indices undefined = {i for i in range(0, raw_len)} - for pair in self._data.pairs(): + + # integrate the data into the fields + for pair in self._data.items(): definition, field = pair + # skip this field if there are not enough data next_idx = definition.index + definition.count if next_idx >= raw_len: # not enough registers continue + # remove all used indices from the list of undefined indices for index in range(definition.index, next_idx): undefined.discard(index) pair.integrate_data(raw_data, num_bits) + # create an unknown field for additional data for index in undefined: # LOGGER.warning(f"Entry '%d' not in list of {self.name}", index) @@ -210,6 +221,12 @@ def _get_definition(self, def_field_name_or_idx, all_not_version_dependent): """ Look-up a definition by name, index, a field instance or by the definition itself. + If `def_field_name_or_idx` + - is a definition -> lookup the definition by the definition's name + - is a field -> lookup the definition by the field's name + - is a name -> lookup the field by the name + - is a idx -> lookup the field by the index + Args: def_field_name_or_idx (LuxtronikDefinition | Base | str | int): Definition object, field object, field name or register index. @@ -226,24 +243,31 @@ def _get_definition(self, def_field_name_or_idx, all_not_version_dependent): definition = def_field_name_or_idx field = None if isinstance(def_field_name_or_idx, Base): + # In case we got a field, search for the description by the field name definition = def_field_name_or_idx.name field = def_field_name_or_idx if not isinstance(def_field_name_or_idx, LuxtronikDefinition): if all_not_version_dependent: + # definitions contains all available definitions definition = self.definitions.get(definition) else: # _data.def_dict contains only valid and previously added definitions definition = self._data.def_dict.get(definition) return definition, field - - - def get(self, def_name_or_idx, default=None): + def get(self, def_field_name_or_idx, default=None): """ - Retrieve a field by definition, name or register index. + Retrieve an added field by definition, field, name or register index. + Triggers a key error when we try to query obsolete fields. + + If `def_field_name_or_idx` + - is a definition -> lookup the field by the definition + - is a field -> lookup the field by the field's name + - is a name -> lookup the field by the name + - is a idx -> lookup the field by the index Args: - def_name_or_idx (LuxtronikDefinition | str | int): + def_field_name_or_idx (LuxtronikDefinition | Base | str | int): Definition, name, or register index to be used to search for the field. Returns: @@ -253,12 +277,14 @@ def get(self, def_name_or_idx, default=None): If multiple fields added for the same index/name, the last added takes precedence. """ - obsolete_entry = self._obsolete.get(def_name_or_idx, None) + # check for obsolete + obsolete_entry = self._obsolete.get(def_field_name_or_idx, None) if obsolete_entry: - raise KeyError(f"The name '{def_name_or_idx}' is obsolete! Use '{obsolete_entry}' instead.") - field = self._data.get(def_name_or_idx, default) + raise KeyError(f"The name '{def_field_name_or_idx}' is obsolete! Use '{obsolete_entry}' instead.") + # look-up the field + field = self._data.get(def_field_name_or_idx, default) if field is None: - LOGGER.warning(f"entry '{def_name_or_idx}' not found") + LOGGER.warning(f"entry '{def_field_name_or_idx}' not found") return field def set(self, def_field_name_or_idx, value): @@ -268,6 +294,12 @@ def set(self, def_field_name_or_idx, value): The value is set, even if the field marked as non-writeable. No data validation is performed either. + If `def_field_name_or_idx` + - is a definition -> lookup the field by the definition and set the value + - is a field -> set the value of this field + - is a name -> lookup the field by the name and set the value + - is a idx -> lookup the field by the index and set the value + Args: def_field_name_or_idx (LuxtronikDefinition | Base | int | str): Definition, name, or register index to be used to search for the field. diff --git a/luxtronik/shi/interface.py b/luxtronik/shi/interface.py index 66977abc..b33b75fa 100644 --- a/luxtronik/shi/interface.py +++ b/luxtronik/shi/interface.py @@ -466,12 +466,12 @@ def _collect_fields(self, blocks_list, data_vector, definitions, read_not_write) # Trial-and-error mode: Add a block for every field blocks = ContiguousDataBlockList(definitions.name, read_not_write) if (read_not_write == READ): - for definition, field in data_vector.data.pairs(): + for definition, field in data_vector.data.items(): # _prepare_read_field will never fail, no need to call it #if self._prepare_read_field(definition, field): blocks.append_single(definition, field) else: - for definition, field in data_vector.data.pairs(): + for definition, field in data_vector.data.items(): if self._prepare_write_field(definition, field, data_vector.safe, None): blocks.append_single(definition, field) if len(blocks) > 0: @@ -485,7 +485,7 @@ def _collect_fields(self, blocks_list, data_vector, definitions, read_not_write) else: blocks = ContiguousDataBlockList(definitions.name, read_not_write) # Organize data into contiguous blocks - for definition, field in data_vector.data.pairs(): + for definition, field in data_vector.data.items(): if self._prepare_write_field(definition, field, data_vector.safe, None): blocks.collect(definition, field) if len(blocks) > 0: diff --git a/luxtronik/shi/vector.py b/luxtronik/shi/vector.py index 2b23f298..9acceab0 100644 --- a/luxtronik/shi/vector.py +++ b/luxtronik/shi/vector.py @@ -84,7 +84,7 @@ def update_read_blocks(self): """ if not self._read_blocks_up_to_date: self._read_blocks.clear() - for definition, field in self._data.pairs(): + for definition, field in self._data.items(): self._read_blocks.collect(definition, field) self._read_blocks_up_to_date = True diff --git a/tests/shi/test_shi_vector.py b/tests/shi/test_shi_vector.py index faeff419..91f07238 100644 --- a/tests/shi/test_shi_vector.py +++ b/tests/shi/test_shi_vector.py @@ -92,7 +92,7 @@ def test_create(self): data_vector = DataVectorTest(parse_version("1.2")) assert data_vector.version == (1, 2, 0, 0) assert len(data_vector) == 2 - assert len(data_vector._data.pairs()) == 3 + assert len(data_vector._data.items()) == 3 assert not data_vector._read_blocks_up_to_date assert len(data_vector._read_blocks) == 0 diff --git a/tests/test_collections.py b/tests/test_collections.py index df3d59d4..3c6a7a84 100644 --- a/tests/test_collections.py +++ b/tests/test_collections.py @@ -263,7 +263,7 @@ def test_init(self): def test_add(self): d = LuxtronikFieldsDictionary() assert len(d) == 0 - assert len(d.pairs()) == 0 + assert len(d.items()) == 0 u = LuxtronikDefinition.unknown(1, "test", 0) f = u.create_field() @@ -314,7 +314,7 @@ def test_len(self): d, _, _ = self.create_instance() # 3 different indices assert len(d) == 3 - assert len(d.pairs()) == 4 + assert len(d.items()) == 4 def test_get_contains(self): d, u, f = self.create_instance() From 4035a8aa93bf1fe5098a222b15ed4a1438251a43 Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Thu, 22 Jan 2026 21:59:38 +0100 Subject: [PATCH 27/68] wip --- tests/test_collections.py | 216 ++++++++++++++++++-------------------- 1 file changed, 102 insertions(+), 114 deletions(-) diff --git a/tests/test_collections.py b/tests/test_collections.py index 3c6a7a84..3dee3e0c 100644 --- a/tests/test_collections.py +++ b/tests/test_collections.py @@ -40,95 +40,75 @@ def test_data_arr(self): # get from value definition._count = 1 - definition._num_bits = 32 - definition._data_type = 'INT32' field.raw = 5 - arr = get_data_arr(definition, field) + arr = get_data_arr(definition, field, 32) assert arr == [5] - assert arr == pair.get_data_arr() + assert arr == pair.get_data_arr(32) # get from value definition._count = 1 - definition._num_bits = 16 - definition._data_type = 'INT16' field.raw = 5 - arr = get_data_arr(definition, field) + arr = get_data_arr(definition, field, 16) assert arr == [5] - assert arr == pair.get_data_arr() + assert arr == pair.get_data_arr(16) # get from array definition._count = 2 - definition._num_bits = 64 - definition._data_type = 'INT64' field.raw = [7, 3] - arr = get_data_arr(definition, field) + arr = get_data_arr(definition, field, 32) assert arr == [7, 3] - assert arr == pair.get_data_arr() + assert arr == pair.get_data_arr(32) # get from array definition._count = 2 - definition._num_bits = 32 - definition._data_type = 'INT32' field.raw = [7, 3] - arr = get_data_arr(definition, field) + arr = get_data_arr(definition, field, 16) assert arr == [7, 3] - assert arr == pair.get_data_arr() + assert arr == pair.get_data_arr(16) # too much data definition._count = 2 - definition._num_bits = 32 - definition._data_type = 'INT32' field.raw = [4, 8, 1] - arr = get_data_arr(definition, field) + arr = get_data_arr(definition, field, 16) assert arr is None - assert arr == pair.get_data_arr() + assert arr == pair.get_data_arr(16) # insufficient data definition._count = 2 - definition._num_bits = 32 - definition._data_type = 'INT32' field.raw = [9] - arr = get_data_arr(definition, field) + arr = get_data_arr(definition, field, 16) assert arr is None - assert arr == pair.get_data_arr() + assert arr == pair.get_data_arr(16) field.concatenate_multiple_data_chunks = True # get from array definition._count = 2 - definition._num_bits = 64 - definition._data_type = 'INT64' field.raw = 0x00000007_00000003 - arr = get_data_arr(definition, field) + arr = get_data_arr(definition, field, 32) assert arr == [7, 3] - assert arr == pair.get_data_arr() + assert arr == pair.get_data_arr(32) # get from array definition._count = 2 - definition._num_bits = 32 - definition._data_type = 'INT32' field.raw = 0x0007_0003 - arr = get_data_arr(definition, field) + arr = get_data_arr(definition, field, 16) assert arr == [7, 3] - assert arr == pair.get_data_arr() + assert arr == pair.get_data_arr(16) # too much data definition._count = 2 - definition._num_bits = 32 - definition._data_type = 'INT32' field.raw = 0x0004_0008_0001 - arr = get_data_arr(definition, field) + arr = get_data_arr(definition, field, 16) assert arr == [8, 1] - assert arr == pair.get_data_arr() + assert arr == pair.get_data_arr(16) # insufficient data definition._count = 2 - definition._num_bits = 32 - definition._data_type = 'INT32' field.raw = 0x0009 - arr = get_data_arr(definition, field) + arr = get_data_arr(definition, field, 16) assert arr == [0, 9] - assert arr == pair.get_data_arr() + assert arr == pair.get_data_arr(16) def test_integrate(self): definition = LuxtronikDefinition.unknown(2, 'Foo', 30) @@ -140,110 +120,102 @@ def test_integrate(self): # set array definition._count = 2 - definition._num_bits = 64 definition._data_type = 'INT64' - integrate_data(definition, field, data) + integrate_data(definition, field, data, 32) assert field.raw == [3, 4] - pair.integrate_data(data, 4) + pair.integrate_data(data, 32, 4) assert field.raw == [5, 6] - integrate_data(definition, field, data, 7) + integrate_data(definition, field, data, 32, 7) assert field.raw is None - pair.integrate_data(data, 0) + pair.integrate_data(data, 32, 0) assert field.raw == [1, LUXTRONIK_VALUE_FUNCTION_NOT_AVAILABLE] # set array definition._count = 2 - definition._num_bits = 32 definition._data_type = 'INT32' - integrate_data(definition, field, data) + integrate_data(definition, field, data, 16) assert field.raw == [3, 4] - pair.integrate_data(data, 4) + pair.integrate_data(data, 16, 4) assert field.raw == [5, 6] - integrate_data(definition, field, data, 7) + integrate_data(definition, field, data, 16, 7) assert field.raw is None - pair.integrate_data(data, 0) + pair.integrate_data(data, 16, 0) assert field.raw == [1, LUXTRONIK_VALUE_FUNCTION_NOT_AVAILABLE] # set value definition._count = 1 - definition._num_bits = 32 definition._data_type = 'INT32' - integrate_data(definition, field, data) + integrate_data(definition, field, data, 32) assert field.raw == 3 - pair.integrate_data(data, 5) + pair.integrate_data(data, 32, 5) assert field.raw == 6 - integrate_data(definition, field, data, 9) + integrate_data(definition, field, data, 32, 9) assert field.raw is None - pair.integrate_data(data, 1) + pair.integrate_data(data, 32, 1) # Currently there is no magic "not available" value for 32 bit values -> not None # This applies also to similar lines below assert field.raw == LUXTRONIK_VALUE_FUNCTION_NOT_AVAILABLE # set value definition._count = 1 - definition._num_bits = 16 definition._data_type = 'INT16' - integrate_data(definition, field, data) + integrate_data(definition, field, data, 16) assert field.raw == 3 - pair.integrate_data(data, 5) + pair.integrate_data(data, 16, 5) assert field.raw == 6 - integrate_data(definition, field, data, 9) + integrate_data(definition, field, data, 16, 9) assert field.raw is None - pair.integrate_data(data, 1) + pair.integrate_data(data, 16, 1) assert field.raw is None field.concatenate_multiple_data_chunks = True # set array definition._count = 2 - definition._num_bits = 64 definition._data_type = 'INT64' - integrate_data(definition, field, data) + integrate_data(definition, field, data, 32) assert field.raw == 0x00000003_00000004 - pair.integrate_data(data, 4) + pair.integrate_data(data, 32, 4) assert field.raw == 0x00000005_00000006 - integrate_data(definition, field, data, 7) + integrate_data(definition, field, data, 32, 7) assert field.raw is None - pair.integrate_data(data, 0) + pair.integrate_data(data, 32, 0) assert field.raw == 0x00000001_00007FFF # set array definition._count = 2 - definition._num_bits = 32 definition._data_type = 'INT32' - integrate_data(definition, field, data) + integrate_data(definition, field, data, 16) assert field.raw == 0x0003_0004 - pair.integrate_data(data, 4) + pair.integrate_data(data, 16, 4) assert field.raw == 0x0005_0006 - integrate_data(definition, field, data, 7) + integrate_data(definition, field, data, 16, 7) assert field.raw is None - pair.integrate_data(data, 0) + pair.integrate_data(data, 16, 0) assert field.raw == 0x0001_7FFF # set value definition._count = 1 - definition._num_bits = 32 definition._data_type = 'INT32' - integrate_data(definition, field, data) + integrate_data(definition, field, data, 32) assert field.raw == 0x00000003 - pair.integrate_data(data, 5) + pair.integrate_data(data, 32, 5) assert field.raw == 0x00000006 - integrate_data(definition, field, data, 9) + integrate_data(definition, field, data, 32, 9) assert field.raw is None - pair.integrate_data(data, 1) + pair.integrate_data(data, 32, 1) assert field.raw == 0x00007FFF # set value definition._count = 1 - definition._num_bits = 16 definition._data_type = 'INT16' - integrate_data(definition, field, data) + integrate_data(definition, field, data, 16) assert field.raw == 0x0003 - pair.integrate_data(data, 5) + pair.integrate_data(data, 16, 5) assert field.raw == 0x0006 - integrate_data(definition, field, data, 9) + integrate_data(definition, field, data, 16, 9) assert field.raw is None - pair.integrate_data(data, 1) + pair.integrate_data(data, 16, 1) assert field.raw is None field.concatenate_multiple_data_chunks = False @@ -255,39 +227,42 @@ def test_init(self): d = LuxtronikFieldsDictionary() assert type(d._def_lookup) is LuxtronikDefinitionsDictionary + assert d.def_dict is d._def_lookup assert type(d._field_lookup) is dict - assert len(d._field_lookup.values()) == 0 + assert d.field_dict is d._field_lookup assert type(d._pairs) is list - assert len(d._pairs) == 0 + assert d.pairs is d._pairs + assert len(d.field_dict) == 0 + assert len(d.pairs) == 0 def test_add(self): d = LuxtronikFieldsDictionary() assert len(d) == 0 - assert len(d.items()) == 0 + assert len(d.pairs) == 0 u = LuxtronikDefinition.unknown(1, "test", 0) f = u.create_field() d.add(u, f) assert len(d) == 1 - assert len(d._pairs) == 1 - assert d._pairs[0].definition is u - assert d._pairs[0].field is f + assert len(d.pairs) == 1 + assert d.pairs[0].definition is u + assert d.pairs[0].field is f u = LuxtronikDefinition.unknown(2, "test", 0) f = u.create_field() d.add(u, f) assert len(d) == 2 - assert len(d._pairs) == 2 - assert d._pairs[1].definition is u - assert d._pairs[1].field is f + assert len(d.pairs) == 2 + assert d.pairs[1].definition is u + assert d.pairs[1].field is f u = LuxtronikDefinition.unknown(0, "test", 0) f = u.create_field() d.add_sorted(u, f) assert len(d) == 3 assert len(d._pairs) == 3 - assert d._pairs[0].definition is u - assert d._pairs[0].field is f + assert d.pairs[0].definition is u + assert d.pairs[0].field is f def create_instance(self): d = LuxtronikFieldsDictionary() @@ -313,8 +288,8 @@ def create_instance(self): def test_len(self): d, _, _ = self.create_instance() # 3 different indices - assert len(d) == 3 - assert len(d.items()) == 4 + assert len(d) == 4 + assert len(d.pairs) == 4 def test_get_contains(self): d, u, f = self.create_instance() @@ -340,42 +315,55 @@ def test_get_contains(self): def test_iter(self): d, _, _ = self.create_instance() - for idx, key in enumerate(d): + for idx, d in enumerate(d): if idx == 0: - assert key == 1 + assert d.name == "unknown_test_1" + assert d.index == 1 if idx == 1: - assert key == 2 + assert d.name == "unknown_test_2" + assert d.index == 2 if idx == 2: - assert key == 3 + assert d.name == "base2" + assert d.index == 2 + if idx == 3: + assert d.name == "base3" + assert d.index == 3 def test_values(self): d, _, _ = self.create_instance() - for idx, value in enumerate(d.values()): + for idx, f in enumerate(d.values()): if idx == 0: - assert type(value) is Unknown - assert value.name == "unknown_test_1" + assert type(f) is Unknown + assert f.name == "unknown_test_1" if idx == 1: - assert type(value) is Base - assert value.name == "base2" + assert type(f) is Unknown + assert f.name == "unknown_test_2" if idx == 2: - assert type(value) is Base - assert value.name == "base3" + assert type(f) is Base + assert f.name == "base2" + if idx == 3: + assert type(f) is Base + assert f.name == "base3" def test_items(self): d, _, _ = self.create_instance() - for idx, (key, value) in enumerate(d.items()): + for idx, (d, f) in enumerate(d.items()): if idx == 0: - assert key == 1 - assert type(value) is Unknown - assert value.name == "unknown_test_1" + assert d.index == 1 + assert type(f) is Unknown + assert f.name == "unknown_test_1" if idx == 1: - assert key == 2 - assert type(value) is Base - assert value.name == "base2" + assert d.index == 2 + assert type(f) is Unknown + assert f.name == "unknown_test_2" if idx == 2: - assert key == 3 - assert type(value) is Base - assert value.name == "base3" + assert d.index == 2 + assert type(f) is Base + assert f.name == "base2" + if idx == 3: + assert d.index == 3 + assert type(f) is Base + assert f.name == "base3" class MyTestClass: pass From 6cee9e4701f6c6dab7aa0ee2ae74a3a4fe01d18b Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Thu, 22 Jan 2026 23:07:05 +0100 Subject: [PATCH 28/68] wip --- luxtronik/cfi/interface.py | 54 +++++------------------------- luxtronik/data_vector.py | 4 +-- luxtronik/scripts/__init__.py | 14 ++++---- luxtronik/shi/contiguous.py | 4 +-- tests/cfi/test_cfi_calculations.py | 9 ++--- tests/cfi/test_cfi_parameters.py | 33 ++++++++++++++---- tests/cfi/test_cfi_visibilities.py | 9 ++--- tests/fake/fake_luxtronik.py | 12 +++---- tests/shi/test_shi_contiguous.py | 27 ++++++++------- tests/shi/test_shi_interface.py | 4 +-- tests/shi/test_shi_vector.py | 54 +++++++++++++++++++++++++----- tests/test_compatibility.py | 6 ++-- tests/test_socket_interaction.py | 9 ++--- 13 files changed, 132 insertions(+), 107 deletions(-) diff --git a/luxtronik/cfi/interface.py b/luxtronik/cfi/interface.py index 7ddcc662..7750d099 100644 --- a/luxtronik/cfi/interface.py +++ b/luxtronik/cfi/interface.py @@ -162,20 +162,20 @@ def _write_and_read(self, parameters, data): return self._read(data) def _write(self, parameters): - for index, field in parameters.items(): + for definition, field in parameters.items(): if field.write_pending: value = field.raw - if not isinstance(index, int) or not isinstance(value, int): + if not isinstance(definition.index, int) or not isinstance(value, int): LOGGER.warning( "%s: Parameter id '%s' or value '%s' invalid!", self._host, - index, + definition.index, value, ) field.write_pending = False continue - LOGGER.info("%s: Parameter '%d' set to '%s'", self._host, index, value) - self._send_ints(LUXTRONIK_PARAMETERS_WRITE, index, value) + LOGGER.info("%s: Parameter '%d' set to '%s'", self._host, definition.index, value) + self._send_ints(LUXTRONIK_PARAMETERS_WRITE, definition.index, value) cmd = self._read_int() LOGGER.debug("%s: Command %s", self._host, cmd) val = self._read_int() @@ -194,7 +194,7 @@ def _read_parameters(self, parameters): for _ in range(0, length): data.append(self._read_int()) LOGGER.info("%s: Read %d parameters", self._host, length) - self._parse(parameters, data) + parameters.parse(data, LUXTRONIK_CFI_REGISTER_BIT_SIZE) return parameters def _read_calculations(self, calculations): @@ -209,7 +209,7 @@ def _read_calculations(self, calculations): for _ in range(0, length): data.append(self._read_int()) LOGGER.info("%s: Read %d calculations", self._host, length) - self._parse(calculations, data) + calculations.parse(data, LUXTRONIK_CFI_REGISTER_BIT_SIZE) return calculations def _read_visibilities(self, visibilities): @@ -222,7 +222,7 @@ def _read_visibilities(self, visibilities): for _ in range(0, length): data.append(self._read_char()) LOGGER.info("%s: Read %d visibilities", self._host, length) - self._parse(visibilities, data) + visibilities.parse(data, LUXTRONIK_CFI_REGISTER_BIT_SIZE) return visibilities def _send_ints(self, *ints): @@ -259,40 +259,4 @@ def _read_int(self): def _read_char(self): "Low-level helper to receive a signed int" reading = self._read_bytes(LUXTRONIK_SOCKET_READ_SIZE_CHAR) - return struct.unpack(">b", reading)[0] - - def _parse(self, data_vector, raw_data): - """ - Parse raw data into the corresponding fields. - - Args: - data_vector (DataVector): Data vector in which - the raw data is to be integrated. - raw_data (list[int]): List of raw register values. - The raw data must start at register index 0. - """ - raw_len = len(raw_data) - # Prepare a list of undefined indices - undefined = {i for i in range(0, raw_len)} - - # integrate the data into the fields - for pair in data_vector.data.pairs(): - definition, field = pair - # skip this field if there are not enough data - next_idx = definition.index + definition.count - if next_idx > raw_len: - # not enough registers - field.raw = None - continue - # remove all used indices from the list of undefined indices - for index in range(definition.index, next_idx): - undefined.discard(index) - pair.integrate_data(raw_data, LUXTRONIK_CFI_REGISTER_BIT_SIZE) - - # create an unknown field for additional data - for index in undefined: - # LOGGER.warning(f"Entry '%d' not in list of {self.name}", index) - definition = data_vector.definitions.create_unknown_definition(index) - field = definition.create_field() - field.raw = raw_data[index] - data_vector.data.add_sorted(definition, field) + return struct.unpack(">b", reading)[0] \ No newline at end of file diff --git a/luxtronik/data_vector.py b/luxtronik/data_vector.py index c70bc2ef..5da6c9e9 100644 --- a/luxtronik/data_vector.py +++ b/luxtronik/data_vector.py @@ -165,7 +165,7 @@ def items(self): Forward the `LuxtronikFieldsDictionary.items` method. Please check its documentation. """ - return self._data.items() + return iter(self._data.items()) # Alias methods ############################################################### @@ -198,7 +198,7 @@ def parse(self, raw_data, num_bits): definition, field = pair # skip this field if there are not enough data next_idx = definition.index + definition.count - if next_idx >= raw_len: + if next_idx > raw_len: # not enough registers continue # remove all used indices from the list of undefined indices diff --git a/luxtronik/scripts/__init__.py b/luxtronik/scripts/__init__.py index c9072d23..86e259bf 100644 --- a/luxtronik/scripts/__init__.py +++ b/luxtronik/scripts/__init__.py @@ -25,8 +25,8 @@ def print_dump_row(number, field): def dump_fields(data_vector): print_dump_header(f"{data_vector.name}s") - for index, field in data_vector.data.items(): - print_dump_row(index, field) + for definition, field in data_vector.data.items(): + print_dump_row(definition.index, field) def print_watch_header(screen, caption): cols, _ = screen.get_visible_size() @@ -41,11 +41,11 @@ def get_watch_row(short_name, number, prev_field, this_field): return text def update_changes(changes, prev_data_vector, this_data_vector): - for index, this_field in this_data_vector.data.items(): + for definition, this_field in this_data_vector.data.items(): short_name = this_data_vector.name[:4] - key = f"{short_name}_{str(index).zfill(5)}" - prev_field = prev_data_vector.get(index) + key = f"{short_name}_{str(definition.index).zfill(5)}" + prev_field = prev_data_vector.get(definition.name) if this_field.raw != prev_field.raw: - changes[key] = get_watch_row(short_name, index, prev_field, this_field) + changes[key] = get_watch_row(short_name, definition.index, prev_field, this_field) elif key in changes: - changes[key] = get_watch_row(short_name, index, prev_field, None) + changes[key] = get_watch_row(short_name, definition.index, prev_field, None) diff --git a/luxtronik/shi/contiguous.py b/luxtronik/shi/contiguous.py index a8de5dc2..fcb6c500 100644 --- a/luxtronik/shi/contiguous.py +++ b/luxtronik/shi/contiguous.py @@ -171,7 +171,7 @@ def integrate_data(self, data_arr): first = self.first_index for part in self._parts: data_offset = part.index - first - part.integrate_data(data_arr, data_offset, LUXTRONIK_SHI_REGISTER_BIT_SIZE) + part.integrate_data(data_arr, LUXTRONIK_SHI_REGISTER_BIT_SIZE, data_offset) return True @@ -192,7 +192,7 @@ def get_data_arr(self): valid = True for part in self._parts: data_offset = part.index - first - data = part.get_data_arr() + data = part.get_data_arr(LUXTRONIK_SHI_REGISTER_BIT_SIZE) if data is None: valid = False diff --git a/tests/cfi/test_cfi_calculations.py b/tests/cfi/test_cfi_calculations.py index 3eda49c8..97f3bb01 100644 --- a/tests/cfi/test_cfi_calculations.py +++ b/tests/cfi/test_cfi_calculations.py @@ -4,6 +4,7 @@ from luxtronik import Calculations from luxtronik.datatypes import Base +from luxtronik.definitions import LuxtronikDefinition class TestCalculations: @@ -22,10 +23,10 @@ def test_data(self): # The Value must be a fields # The key can be an index assert isinstance(data[0], Base) - for k in data: - assert isinstance(k, int) + for d in data: + assert isinstance(d, LuxtronikDefinition) for v in data.values(): assert isinstance(v, Base) - for k, v in data.items(): - assert isinstance(k, int) + for d, v in data.items(): + assert isinstance(d, LuxtronikDefinition) assert isinstance(v, Base) diff --git a/tests/cfi/test_cfi_parameters.py b/tests/cfi/test_cfi_parameters.py index 74409097..e8c7c022 100644 --- a/tests/cfi/test_cfi_parameters.py +++ b/tests/cfi/test_cfi_parameters.py @@ -4,6 +4,8 @@ from luxtronik import Parameters from luxtronik.datatypes import Base +from luxtronik.definitions import LuxtronikDefinition +from luxtronik.cfi.constants import LUXTRONIK_CFI_REGISTER_BIT_SIZE class TestParameters: @@ -26,12 +28,12 @@ def test_data(self): # The Value must be a fields # The key can be an index assert isinstance(data[0], Base) - for k in data: - assert isinstance(k, int) + for d in data: + assert isinstance(d, LuxtronikDefinition) for v in data.values(): assert isinstance(v, Base) - for k, v in data.items(): - assert isinstance(k, int) + for d, v in data.items(): + assert isinstance(d, LuxtronikDefinition) assert isinstance(v, Base) def test_get(self): @@ -55,15 +57,32 @@ def test_get(self): j = 0.0 assert parameters.get(j) is None + def test_parse(self): + """Test cases for _parse""" + parameters = Parameters() + + n = 2000 + t = list(range(0, n + 1)) + parameters.parse(t, LUXTRONIK_CFI_REGISTER_BIT_SIZE) + + p = parameters.get(n) + + assert p.name == f"unknown_parameter_{n}" + assert p.raw == n + def test___iter__(self): """Test cases for __iter__""" parameters = Parameters() - for i, p in parameters: - if i == 0: + for d, p in parameters.items(): + if d.index == 0: assert p.name == "ID_Transfert_LuxNet" - elif i == 1: + assert d is parameters.data.def_dict.get(0) + assert p is parameters.get(0) + elif d.index == 1: assert p.name == "ID_Einst_WK_akt" + assert d is parameters.data.def_dict.get(1) + assert p is parameters.get(1) else: break diff --git a/tests/cfi/test_cfi_visibilities.py b/tests/cfi/test_cfi_visibilities.py index 697005bd..aa5cbc19 100644 --- a/tests/cfi/test_cfi_visibilities.py +++ b/tests/cfi/test_cfi_visibilities.py @@ -4,6 +4,7 @@ from luxtronik import Visibilities from luxtronik.datatypes import Base +from luxtronik.definitions import LuxtronikDefinition class TestVisibilities: @@ -22,10 +23,10 @@ def test_data(self): # The Value must be a fields # The key can be an index assert isinstance(data[0], Base) - for k in data: - assert isinstance(k, int) + for d in data: + assert isinstance(d, LuxtronikDefinition) for v in data.values(): assert isinstance(v, Base) - for k, v in data.items(): - assert isinstance(k, int) + for d, v in data.items(): + assert isinstance(d, LuxtronikDefinition) assert isinstance(v, Base) diff --git a/tests/fake/fake_luxtronik.py b/tests/fake/fake_luxtronik.py index 8aaf38bc..a3968f87 100644 --- a/tests/fake/fake_luxtronik.py +++ b/tests/fake/fake_luxtronik.py @@ -5,9 +5,9 @@ class FakeLuxtronik(Luxtronik): def __init__(self): LuxtronikAllData.__init__(self) - for idx, field in self.parameters: - field.raw = idx - for idx, field in self.calculations: - field.raw = idx - for idx, field in self.visibilities: - field.raw = idx \ No newline at end of file + for definition, field in self.parameters.items(): + field.raw = definition.idx + for definition, field in self.calculations.items(): + field.raw = definition.idx + for definition, field in self.visibilities.items(): + field.raw = definition.idx \ No newline at end of file diff --git a/tests/shi/test_shi_contiguous.py b/tests/shi/test_shi_contiguous.py index f74f5bf1..62a27d50 100644 --- a/tests/shi/test_shi_contiguous.py +++ b/tests/shi/test_shi_contiguous.py @@ -2,6 +2,7 @@ from luxtronik.constants import LUXTRONIK_VALUE_FUNCTION_NOT_AVAILABLE from luxtronik.datatypes import Base from luxtronik.definitions import LuxtronikDefinition +from luxtronik.shi.constants import LUXTRONIK_SHI_REGISTER_BIT_SIZE from luxtronik.shi.contiguous import ( ContiguousDataPart, ContiguousDataBlock, @@ -73,49 +74,49 @@ def test_repr(self): def test_get_data(self): part = ContiguousDataPart(def_a, field_a) field_a.raw = [4, 2] - assert part.get_data_arr() == [4, 2] + assert part.get_data_arr(LUXTRONIK_SHI_REGISTER_BIT_SIZE) == [4, 2] field_a.raw = [1, 3, 5] - assert part.get_data_arr() is None + assert part.get_data_arr(LUXTRONIK_SHI_REGISTER_BIT_SIZE) is None field_a.raw = [9] - assert part.get_data_arr() is None + assert part.get_data_arr(LUXTRONIK_SHI_REGISTER_BIT_SIZE) is None part = ContiguousDataPart(def_a1, field_a1) field_a1.raw = [8] - assert part.get_data_arr() == [8] + assert part.get_data_arr(LUXTRONIK_SHI_REGISTER_BIT_SIZE) == [8] field_a1.raw = 7 - assert part.get_data_arr() == [7] + assert part.get_data_arr(LUXTRONIK_SHI_REGISTER_BIT_SIZE) == [7] def test_integrate_data(self): part = ContiguousDataPart(def_a, field_a) - part.integrate_data([1, 5, 7, 9], 0) + part.integrate_data([1, 5, 7, 9], LUXTRONIK_SHI_REGISTER_BIT_SIZE, 0) assert part.field.raw == [1, 5] - part.integrate_data([1, 5, 7, 9]) + part.integrate_data([1, 5, 7, 9], LUXTRONIK_SHI_REGISTER_BIT_SIZE) assert part.field.raw == [5, 7] - part.integrate_data([1, 5, 7, 9], 2) + part.integrate_data([1, 5, 7, 9], LUXTRONIK_SHI_REGISTER_BIT_SIZE, 2) assert part.field.raw == [7, 9] - part.integrate_data([1, 5, 7, 9], 3) + part.integrate_data([1, 5, 7, 9], LUXTRONIK_SHI_REGISTER_BIT_SIZE, 3) assert part.field.raw is None - part.integrate_data([1, 5, LUXTRONIK_VALUE_FUNCTION_NOT_AVAILABLE, 9], 1) + part.integrate_data([1, 5, LUXTRONIK_VALUE_FUNCTION_NOT_AVAILABLE, 9], LUXTRONIK_SHI_REGISTER_BIT_SIZE, 1) assert part.field.raw == [5, LUXTRONIK_VALUE_FUNCTION_NOT_AVAILABLE] part = ContiguousDataPart(def_c1, field_c1) - part.integrate_data([2, 4, 6], 1) + part.integrate_data([2, 4, 6], LUXTRONIK_SHI_REGISTER_BIT_SIZE, 1) assert part.field.raw == 4 - part.integrate_data([2, 4, LUXTRONIK_VALUE_FUNCTION_NOT_AVAILABLE], 2) + part.integrate_data([2, 4, LUXTRONIK_VALUE_FUNCTION_NOT_AVAILABLE], LUXTRONIK_SHI_REGISTER_BIT_SIZE, 2) assert part.field.raw is None - part.integrate_data([2, 4, 6], 5) + part.integrate_data([2, 4, 6], LUXTRONIK_SHI_REGISTER_BIT_SIZE, 5) assert part.field.raw is None diff --git a/tests/shi/test_shi_interface.py b/tests/shi/test_shi_interface.py index dd1596a6..76fc209d 100644 --- a/tests/shi/test_shi_interface.py +++ b/tests/shi/test_shi_interface.py @@ -1244,7 +1244,7 @@ def check_definitions(self, interface): for d in definitions: assert d.name in vector assert d in interface.holdings - for f in vector: + for f in vector.values(): assert f.name in definitions assert f.name in interface.holdings @@ -1255,7 +1255,7 @@ def check_definitions(self, interface): for d in definitions: assert d.name in vector assert d in interface.inputs - for f in vector: + for f in vector.values(): assert f.name in definitions assert f.name in interface.inputs diff --git a/tests/shi/test_shi_vector.py b/tests/shi/test_shi_vector.py index 91f07238..614861fa 100644 --- a/tests/shi/test_shi_vector.py +++ b/tests/shi/test_shi_vector.py @@ -1,6 +1,7 @@ from luxtronik.common import parse_version from luxtronik.datatypes import Base, Unknown from luxtronik.definitions import LuxtronikDefinitionsList +from luxtronik.shi.constants import LUXTRONIK_SHI_REGISTER_BIT_SIZE from luxtronik.shi.vector import DataVectorSmartHome from luxtronik.shi.holdings import Holdings from luxtronik.shi.inputs import Inputs @@ -249,30 +250,40 @@ def test_iter(self): data_vector.add(5) data_vector.add(9) - for index, idx in enumerate(data_vector): + for index, definition in enumerate(data_vector): if index == 0: - assert idx == 5 + assert definition.idx == 5 + assert definition.name == "field_5" if index == 1: - assert idx == 9 # field_9 + assert definition.idx == 9 + assert definition.name == "field_9a" if index == 2: + assert definition.idx == 9 + assert definition.name == "field_9" + if index == 3: assert False for index, field in enumerate(data_vector.values()): if index == 0: assert field.name == 'field_5' if index == 1: - assert field.name == 'field_9' + assert field.name == 'field_9a' if index == 2: + assert field.name == 'field_9' + if index == 3: assert False - for index, (idx, field) in enumerate(data_vector.items()): + for index, (definition, field) in enumerate(data_vector.items()): if index == 0: - assert idx == 5 + assert definition.idx == 5 assert field.name == 'field_5' if index == 1: - assert idx == 9 - assert field.name == 'field_9' + assert definition.idx == 9 + assert field.name == 'field_9a' if index == 2: + assert definition.idx == 9 + assert field.name == 'field_9' + if index == 3: assert False def test_set(self): @@ -302,6 +313,33 @@ def test_set(self): assert field_9.value == 6 assert field_9.write_pending + def test_parse(self): + data_vector = DataVectorTest(parse_version("1.1.2")) + field_5 = data_vector[5] + field_9 = data_vector[9] + field_9a = data_vector['field_9a'] + + # not enough data + data = [1] + data_vector.parse(data, LUXTRONIK_SHI_REGISTER_BIT_SIZE) + assert field_5.value is None + assert field_9.value is None + assert field_9a.value is None + + # data only for field 5 + data = [1, 2, 3, 4, 5, 6, 7] + data_vector.parse(data, LUXTRONIK_SHI_REGISTER_BIT_SIZE) + assert field_5.value == 6 + assert field_9.value is None + assert field_9a.value is None + + # data for all fields + data = [9, 8, 7, 6, 5, 4, 3, 2, 1, 0, -1, -2] + data_vector.parse(data, LUXTRONIK_SHI_REGISTER_BIT_SIZE) + assert field_5.value == 4 + assert field_9.value == [0, -1] + assert field_9a.value == 0 + def test_alias(self): TEST_DEFINITIONS.register_alias('field_9a', 10) data_vector = DataVectorTest(parse_version("1.1.2")) diff --git a/tests/test_compatibility.py b/tests/test_compatibility.py index d7b6c941..a2f79f46 100644 --- a/tests/test_compatibility.py +++ b/tests/test_compatibility.py @@ -1933,13 +1933,13 @@ def test_compatibilities(self): ok = True for mapping, obj, caption in values: print_caption = True - for cur_idx, entry in obj: - if entry.name not in mapping: + for definition, field in obj.items(): + if field.name not in mapping: # We do not use assert here, in order to catch all incompatibilities at once. # The output can be copied to the dicts above if print_caption: print(f"### Missing - {caption}:") print_caption = False - print(f'"{entry.name}": {cur_idx},') + print(f'"{field.name}": {definition.index},') ok = False assert ok, f"Found missing {obj.name}. Please consider to add them to the test suite." \ No newline at end of file diff --git a/tests/test_socket_interaction.py b/tests/test_socket_interaction.py index c6e50dbb..96948d5f 100644 --- a/tests/test_socket_interaction.py +++ b/tests/test_socket_interaction.py @@ -16,6 +16,7 @@ @mock.patch("socket.create_connection", fake_create_connection) @mock.patch("luxtronik.LuxtronikModbusTcpInterface", FakeModbus) class TestSocketInteraction: + def check_luxtronik_data(self, lux, check_for_true=True): cp = self.check_data_vector(lux.parameters) cc = self.check_data_vector(lux.calculations) @@ -32,8 +33,8 @@ def check_data_vector(self, data_vector): fct = fake_calculation_value elif type(data_vector) is Visibilities: fct = fake_visibility_value - for idx, entry in data_vector.items(): - if entry.raw != fct(idx): + for d, f in data_vector.items(): + if f.raw != fct(d.index): return False return True @@ -43,8 +44,8 @@ def clear_luxtronik_data(self, lux): self.clear_data_vector(lux.visibilities) def clear_data_vector(self, data_vector): - for idx, entry in data_vector.items(): - entry.raw = 0 + for d, f in data_vector.items(): + f.raw = 0 def test_luxtronik_socket_interface(self): host = "my_heatpump" From 4ab1d821849a402cfc1d294c317faac176bfc53a Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Thu, 22 Jan 2026 23:16:39 +0100 Subject: [PATCH 29/68] wip --- luxtronik/data_vector.py | 8 ++++++-- luxtronik/shi/interface.py | 7 +++++-- tests/fake/fake_luxtronik.py | 6 +++--- tests/shi/test_shi_vector.py | 24 ++++++++++++------------ 4 files changed, 26 insertions(+), 19 deletions(-) diff --git a/luxtronik/data_vector.py b/luxtronik/data_vector.py index 5da6c9e9..fe7e1df9 100644 --- a/luxtronik/data_vector.py +++ b/luxtronik/data_vector.py @@ -69,7 +69,11 @@ def create_any_field(cls, def_name_or_idx): Returns: Base | None: The created field, or None if not found or not valid. """ - definition, _ = self._get_definition(def_name_or_idx, True) + if isinstance(def_name_or_idx, LuxtronikDefinition): + definition = def_name_or_idx + else: + # The definitions object hold all available definitions + definition = cls.definitions.get(def_name_or_idx) if definition is not None and definition.valid: return definition.create_field() return None @@ -91,7 +95,7 @@ class variable `cls.definitions` and is valid for `self.version`). Returns: Base | None: The created field, or None if not found or not valid. """ - definition, _ = self._get_definition(name_or_idx, False) + definition, _ = self._get_definition(def_name_or_idx, False) if definition is not None and definition.valid: return definition.create_field() return None diff --git a/luxtronik/shi/interface.py b/luxtronik/shi/interface.py index b33b75fa..2ff751e8 100644 --- a/luxtronik/shi/interface.py +++ b/luxtronik/shi/interface.py @@ -9,7 +9,10 @@ LuxtronikDefinition, LuxtronikDefinitionsList, ) -from luxtronik.shi.constants import LUXTRONIK_LATEST_SHI_VERSION +from luxtronik.shi.constants import ( + LUXTRONIK_LATEST_SHI_VERSION, + LUXTRONIK_SHI_REGISTER_BIT_SIZE +) from luxtronik.shi.common import ( LuxtronikSmartHomeReadHoldingsTelegram, LuxtronikSmartHomeReadInputsTelegram, @@ -387,7 +390,7 @@ def _prepare_write_field(self, definition, field, safe, data): field.value = data # Abort if insufficient data is provided - if not get_data_arr(definition, field): + if not get_data_arr(definition, field, LUXTRONIK_SHI_REGISTER_BIT_SIZE): LOGGER.warning("Data error / insufficient data provided: " \ + f"name={definition.name}, data={field.raw}") return False diff --git a/tests/fake/fake_luxtronik.py b/tests/fake/fake_luxtronik.py index a3968f87..bc9e639f 100644 --- a/tests/fake/fake_luxtronik.py +++ b/tests/fake/fake_luxtronik.py @@ -6,8 +6,8 @@ class FakeLuxtronik(Luxtronik): def __init__(self): LuxtronikAllData.__init__(self) for definition, field in self.parameters.items(): - field.raw = definition.idx + field.raw = definition.index for definition, field in self.calculations.items(): - field.raw = definition.idx + field.raw = definition.index for definition, field in self.visibilities.items(): - field.raw = definition.idx \ No newline at end of file + field.raw = definition.index \ No newline at end of file diff --git a/tests/shi/test_shi_vector.py b/tests/shi/test_shi_vector.py index 614861fa..5ef6d0fc 100644 --- a/tests/shi/test_shi_vector.py +++ b/tests/shi/test_shi_vector.py @@ -92,8 +92,8 @@ def test_create(self): # create versioned data vector data_vector = DataVectorTest(parse_version("1.2")) assert data_vector.version == (1, 2, 0, 0) - assert len(data_vector) == 2 - assert len(data_vector._data.items()) == 3 + assert len(data_vector) == 3 + assert len(data_vector._data.pairs) == 3 assert not data_vector._read_blocks_up_to_date assert len(data_vector._read_blocks) == 0 @@ -216,8 +216,8 @@ def test_add(self): def_9a = data_vector.definitions['field_9a'] field = data_vector.add(def_9a) assert def_9a in data_vector - assert len(data_vector) == 2 - assert len(data_vector.data._pairs) == 3 + assert len(data_vector) == 3 + assert len(data_vector.data.pairs) == 3 assert field.name == 'field_9a' # Get via index (last added) @@ -252,13 +252,13 @@ def test_iter(self): for index, definition in enumerate(data_vector): if index == 0: - assert definition.idx == 5 + assert definition.index == 5 assert definition.name == "field_5" if index == 1: - assert definition.idx == 9 + assert definition.index == 9 assert definition.name == "field_9a" if index == 2: - assert definition.idx == 9 + assert definition.index == 9 assert definition.name == "field_9" if index == 3: assert False @@ -275,13 +275,13 @@ def test_iter(self): for index, (definition, field) in enumerate(data_vector.items()): if index == 0: - assert definition.idx == 5 + assert definition.index == 5 assert field.name == 'field_5' if index == 1: - assert definition.idx == 9 + assert definition.index == 9 assert field.name == 'field_9a' if index == 2: - assert definition.idx == 9 + assert definition.index == 9 assert field.name == 'field_9' if index == 3: assert False @@ -436,8 +436,8 @@ def test_version_none(self): data_vector.add("field_invalid") assert len(data_vector) == 3 data_vector.add(10) # field_9a alias - assert len(data_vector) == 3 - assert len(data_vector._data._pairs) == 4 + assert len(data_vector) == 4 + assert len(data_vector.data.pairs) == 4 class TestHoldings: From f8fc4346c0c95b0b2af2f245cdb388c115244652 Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Fri, 23 Jan 2026 20:24:41 +0100 Subject: [PATCH 30/68] wip --- tests/shi/test_shi_vector.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tests/shi/test_shi_vector.py b/tests/shi/test_shi_vector.py index 5ef6d0fc..c66a062f 100644 --- a/tests/shi/test_shi_vector.py +++ b/tests/shi/test_shi_vector.py @@ -89,6 +89,12 @@ def test_create(self): field = DataVectorTest.create_any_field('BAR') assert field is None + # create field by def + field = DataVectorTest.create_any_field(def_list[3]) + assert field.name == 'field_9a' + assert field.writeable + assert type(field) is Base + # create versioned data vector data_vector = DataVectorTest(parse_version("1.2")) assert data_vector.version == (1, 2, 0, 0) From 116a93835b38cec9113b7c12122594f157b96fb5 Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Fri, 23 Jan 2026 20:30:13 +0100 Subject: [PATCH 31/68] wip --- tests/shi/test_shi_vector.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/shi/test_shi_vector.py b/tests/shi/test_shi_vector.py index c66a062f..795870df 100644 --- a/tests/shi/test_shi_vector.py +++ b/tests/shi/test_shi_vector.py @@ -90,7 +90,7 @@ def test_create(self): assert field is None # create field by def - field = DataVectorTest.create_any_field(def_list[3]) + field = DataVectorTest.create_any_field(TEST_DEFINITIONS._definitions[2]) assert field.name == 'field_9a' assert field.writeable assert type(field) is Base From 8fc1518b102855025a40993ebe2b3556375f4a9d Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Fri, 23 Jan 2026 21:39:19 +0100 Subject: [PATCH 32/68] wip last unify --- luxtronik/cfi/interface.py | 42 +++++++++++++++++++++++++++++--- luxtronik/collections.py | 36 +++++++++++++++------------ luxtronik/constants.py | 8 ------ luxtronik/data_vector.py | 37 ---------------------------- luxtronik/datatypes.py | 18 -------------- tests/cfi/test_cfi_parameters.py | 13 ---------- tests/test_datatypes.py | 14 ----------- 7 files changed, 59 insertions(+), 109 deletions(-) diff --git a/luxtronik/cfi/interface.py b/luxtronik/cfi/interface.py index 7750d099..87ad8c99 100644 --- a/luxtronik/cfi/interface.py +++ b/luxtronik/cfi/interface.py @@ -194,7 +194,7 @@ def _read_parameters(self, parameters): for _ in range(0, length): data.append(self._read_int()) LOGGER.info("%s: Read %d parameters", self._host, length) - parameters.parse(data, LUXTRONIK_CFI_REGISTER_BIT_SIZE) + self._parse(parameters, data) return parameters def _read_calculations(self, calculations): @@ -209,7 +209,7 @@ def _read_calculations(self, calculations): for _ in range(0, length): data.append(self._read_int()) LOGGER.info("%s: Read %d calculations", self._host, length) - calculations.parse(data, LUXTRONIK_CFI_REGISTER_BIT_SIZE) + self._parse(calculations, data) return calculations def _read_visibilities(self, visibilities): @@ -222,7 +222,7 @@ def _read_visibilities(self, visibilities): for _ in range(0, length): data.append(self._read_char()) LOGGER.info("%s: Read %d visibilities", self._host, length) - visibilities.parse(data, LUXTRONIK_CFI_REGISTER_BIT_SIZE) + self._parse(visibilities, data) return visibilities def _send_ints(self, *ints): @@ -259,4 +259,38 @@ def _read_int(self): def _read_char(self): "Low-level helper to receive a signed int" reading = self._read_bytes(LUXTRONIK_SOCKET_READ_SIZE_CHAR) - return struct.unpack(">b", reading)[0] \ No newline at end of file + return struct.unpack(">b", reading)[0] + + def _parse(self, data_vector, raw_data): + """ + Parse raw data into the corresponding fields. + + Args: + raw_data (list[int]): List of raw register values. + The raw data must start at register index 0. + num_bits (int): Number of bits per register. + """ + raw_len = len(raw_data) + # Prepare a list of undefined indices + undefined = {i for i in range(0, raw_len)} + + # integrate the data into the fields + for pair in data_vector.data.items(): + definition, field = pair + # skip this field if there are not enough data + next_idx = definition.index + definition.count + if next_idx > raw_len: + # not enough registers + continue + # remove all used indices from the list of undefined indices + for index in range(definition.index, next_idx): + undefined.discard(index) + pair.integrate_data(raw_data, LUXTRONIK_CFI_REGISTER_BIT_SIZE) + + # create an unknown field for additional data + for index in undefined: + # LOGGER.warning(f"Entry '%d' not in list of {self.name}", index) + definition = data_vector.definitions.create_unknown_definition(index) + field = definition.create_field() + field.raw = raw_data[index] + data_vector.data.add_sorted(definition, field) diff --git a/luxtronik/collections.py b/luxtronik/collections.py index 1825f681..814411ad 100644 --- a/luxtronik/collections.py +++ b/luxtronik/collections.py @@ -99,12 +99,12 @@ def get_data_arr(definition, field, num_bits): def integrate_data(definition, field, raw_data, num_bits, data_offset=-1): """ - Integrate raw values from a data array into the field. + Integrate the related parts of the `raw_data` into the field. Args: definition (LuxtronikDefinition): Meta-data of the field. field (Base): Field object where to integrate the data. - raw_data (list): Source array of bytes/words. + raw_data (list): Source array of register values. num_bits (int): Number of bits per register. data_offset (int): Optional offset. Defaults to `definition.index`. """ @@ -147,41 +147,47 @@ def __init__(self, definition, field): self.definition = definition def __iter__(self): + """ + Yield the definition and the field to unpack the object like `d, f = pair`. + """ yield self.definition yield self.field @property def index(self): + """ + Forward the `LuxtronikDefinition.index` property. + Please check its documentation. + """ return self.definition.index @property def addr(self): + """ + Forward the `LuxtronikDefinition.addr` property. + Please check its documentation. + """ return self.definition.addr @property def count(self): + """ + Forward the `LuxtronikDefinition.count` property. + Please check its documentation. + """ return self.definition.count def get_data_arr(self, num_bits): """ - Normalize the field's data to a list of the correct size. - - Args: - num_bits (int): Number of bits per register. - - Returns: - list[int] | None: List of length `definition.count`, or None if insufficient. + Forward the `get_data_arr` method with the stored objects. + Please check its documentation. """ return get_data_arr(self.definition, self.field, num_bits) def integrate_data(self, raw_data, num_bits, data_offset=-1): """ - Integrate the related parts of the `raw_data` into the field - - Args: - raw_data (list): Source array of register values. - data_offset (int): Optional offset. Defaults to `definition.index`. - num_bits (int): Number of bits per register. + Forward the `integrate_data` method with the stored objects. + Please check its documentation. """ integrate_data(self.definition, self.field, raw_data, num_bits, data_offset) diff --git a/luxtronik/constants.py b/luxtronik/constants.py index 35ddd4a7..bb88c487 100644 --- a/luxtronik/constants.py +++ b/luxtronik/constants.py @@ -14,14 +14,6 @@ # Content of response that is contained in responses to discovery broadcast LUXTRONIK_DISCOVERY_RESPONSE_PREFIX: Final = "2500;111;" -# Since version 3.92.0, all unavailable 16 bit signed data fields -# have been returning this value (0x7FFF) -LUXTRONIK_VALUE_FUNCTION_NOT_AVAILABLE: Final = 32767 - -LUXTRONIK_NAME_CHECK_NONE: Final = "none" -LUXTRONIK_NAME_CHECK_PREFERRED: Final = "preferred" -LUXTRONIK_NAME_CHECK_OBSOLETE: Final = "obsolete" - # Since version 3.92.0, all unavailable 16 bit data fields # have been returning this value (0x7FFF) LUXTRONIK_VALUE_FUNCTION_NOT_AVAILABLE: Final = 32767 diff --git a/luxtronik/data_vector.py b/luxtronik/data_vector.py index fe7e1df9..c440559e 100644 --- a/luxtronik/data_vector.py +++ b/luxtronik/data_vector.py @@ -182,43 +182,6 @@ def register_alias(self, def_field_name_or_idx, alias): return self._data.register_alias(def_field_name_or_idx, alias) -# Parse methods ############################################################### - - def parse(self, raw_data, num_bits): - """ - Parse raw data into the corresponding fields. - - Args: - raw_data (list[int]): List of raw register values. - The raw data must start at register index 0. - num_bits (int): Number of bits per register. - """ - raw_len = len(raw_data) - # Prepare a list of undefined indices - undefined = {i for i in range(0, raw_len)} - - # integrate the data into the fields - for pair in self._data.items(): - definition, field = pair - # skip this field if there are not enough data - next_idx = definition.index + definition.count - if next_idx > raw_len: - # not enough registers - continue - # remove all used indices from the list of undefined indices - for index in range(definition.index, next_idx): - undefined.discard(index) - pair.integrate_data(raw_data, num_bits) - - # create an unknown field for additional data - for index in undefined: - # LOGGER.warning(f"Entry '%d' not in list of {self.name}", index) - definition = self.definitions.create_unknown_definition(index) - field = definition.create_field() - field.raw = raw_data[index] - self._data.add_sorted(definition, field) - - # Get and set methods ######################################################### def _get_definition(self, def_field_name_or_idx, all_not_version_dependent): diff --git a/luxtronik/datatypes.py b/luxtronik/datatypes.py index be3a1d17..a6a79235 100755 --- a/luxtronik/datatypes.py +++ b/luxtronik/datatypes.py @@ -4,11 +4,6 @@ import socket import struct -from luxtronik.constants import ( - LUXTRONIK_NAME_CHECK_NONE, - LUXTRONIK_NAME_CHECK_PREFERRED, - LUXTRONIK_NAME_CHECK_OBSOLETE, -) from luxtronik.common import classproperty from functools import total_ordering @@ -61,19 +56,6 @@ def name(self): """Return the (most common) name of the entry.""" return self._names[0] - def check_name(self, name): - """ - Check whether a name matches one of the supported entry names. - The result string can be used to trigger a exception for obsolete names. - """ - name_lower = name.lower() - if name_lower == self.name.lower(): - return LUXTRONIK_NAME_CHECK_PREFERRED - elif name_lower in (n.lower() for n in self._names): - return LUXTRONIK_NAME_CHECK_OBSOLETE - else: - return LUXTRONIK_NAME_CHECK_NONE - @property def value(self): """Return the stored value converted from heatpump units.""" diff --git a/tests/cfi/test_cfi_parameters.py b/tests/cfi/test_cfi_parameters.py index e8c7c022..3764af8c 100644 --- a/tests/cfi/test_cfi_parameters.py +++ b/tests/cfi/test_cfi_parameters.py @@ -57,19 +57,6 @@ def test_get(self): j = 0.0 assert parameters.get(j) is None - def test_parse(self): - """Test cases for _parse""" - parameters = Parameters() - - n = 2000 - t = list(range(0, n + 1)) - parameters.parse(t, LUXTRONIK_CFI_REGISTER_BIT_SIZE) - - p = parameters.get(n) - - assert p.name == f"unknown_parameter_{n}" - assert p.raw == n - def test___iter__(self): """Test cases for __iter__""" parameters = Parameters() diff --git a/tests/test_datatypes.py b/tests/test_datatypes.py index b3852fa0..29a6bf02 100644 --- a/tests/test_datatypes.py +++ b/tests/test_datatypes.py @@ -4,12 +4,6 @@ import datetime -from luxtronik.constants import ( - LUXTRONIK_NAME_CHECK_NONE, - LUXTRONIK_NAME_CHECK_PREFERRED, - LUXTRONIK_NAME_CHECK_OBSOLETE, -) - from luxtronik.datatypes import ( Base, BitMaskBase, @@ -121,14 +115,6 @@ def test_empty_name(self): except Exception: pass - def test_check_name(self): - """Test cases for check_name() function""" - base = Base(["foo", "bar"]) - - assert base.check_name("foo") == LUXTRONIK_NAME_CHECK_PREFERRED - assert base.check_name("bar") == LUXTRONIK_NAME_CHECK_OBSOLETE - assert base.check_name("baz") == LUXTRONIK_NAME_CHECK_NONE - def test_value_property(self): """Test case for value property""" From 0360b895915cb935b248476b9f1655edb77851cd Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Fri, 23 Jan 2026 22:09:20 +0100 Subject: [PATCH 33/68] add v0.3.14 fields to test compatibility --- luxtronik/datatypes.py | 35 + tests/test_compatibility.py | 3463 ++++++++++++++++++----------------- 2 files changed, 1767 insertions(+), 1731 deletions(-) diff --git a/luxtronik/datatypes.py b/luxtronik/datatypes.py index a6a79235..d060eea7 100755 --- a/luxtronik/datatypes.py +++ b/luxtronik/datatypes.py @@ -1,6 +1,7 @@ """datatype conversions.""" import datetime +import ipaddress import socket import struct @@ -327,6 +328,31 @@ class Seconds(Base): datatype_unit = "s" +class Pulses(Base): + """Pulses datatype, converts from and to Pulses.""" + + datatype_class = "pulses" + + +class IPAddress(Base): + """IP Address datatype, converts from and to an IP Address.""" + + datatype_class = "ipaddress" + + def from_heatpump(self, value): + if value < 0: + return str(ipaddress.IPv4Address(value + 2**32)) + if value > 2**32: + return str(ipaddress.IPv4Address(value - 2**32)) + return str(ipaddress.IPv4Address(value)) + + def to_heatpump(self, value): + result = int(ipaddress.IPv4Address(value)) + if result > 2**32: + return result - 2**32 + return result + + class IPv4Address(Base): """IPv4 address datatype, converts from and to an IPv4 address.""" @@ -590,6 +616,15 @@ class Count(Base): datatype_class = "count" +class Version(Base): + """Version datatype, converts from and to a Heatpump Version.""" + + datatype_class = "version" + + def from_heatpump(self, value): + return "".join([chr(c) for c in value]).strip("\x00") + + class Character(Base): """Character datatype, converts from and to a Character.""" diff --git a/tests/test_compatibility.py b/tests/test_compatibility.py index a2f79f46..4829a295 100644 --- a/tests/test_compatibility.py +++ b/tests/test_compatibility.py @@ -16,1132 +16,1132 @@ def test_compatibilities(self): paras = { # Status of 0.3.14: - "ID_Transfert_LuxNet": 0, - "ID_Einst_WK_akt": 1, - "ID_Einst_BWS_akt": 2, - "ID_Ba_Hz_akt": 3, - "ID_Ba_Bw_akt": 4, - "ID_Ba_Al_akt": 5, - "ID_SU_FrkdHz": 6, - "ID_SU_FrkdBw": 7, - "ID_SU_FrkdAl": 8, - "ID_Einst_HReg_akt": 9, - "ID_Einst_HzHwMAt_akt": 10, - "ID_Einst_HzHwHKE_akt": 11, - "ID_Einst_HzHKRANH_akt": 12, - "ID_Einst_HzHKRABS_akt": 13, - "ID_Einst_HzMK1E_akt": 14, - "ID_Einst_HzMK1ANH_akt": 15, - "ID_Einst_HzMK1ABS_akt": 16, - "ID_Einst_HzFtRl_akt": 17, - "ID_Einst_HzFtMK1Vl_akt": 18, - "ID_Einst_SUBW_akt": 19, - "ID_Einst_BwTDI_akt_MO": 20, - "ID_Einst_BwTDI_akt_DI": 21, - "ID_Einst_BwTDI_akt_MI": 22, - "ID_Einst_BwTDI_akt_DO": 23, - "ID_Einst_BwTDI_akt_FR": 24, - "ID_Einst_BwTDI_akt_SA": 25, - "ID_Einst_BwTDI_akt_SO": 26, - "ID_Einst_BwTDI_akt_AL": 27, - "ID_Einst_AnlKonf_akt": 28, - "ID_Einst_Sprache_akt": 29, - "ID_Switchoff_Zahler": 30, - "ID_Switchoff_index": 31, - "ID_Einst_EvuTyp_akt": 32, - "ID_Einst_RFVEinb_akt": 33, - "ID_Einst_AbtZykMax_akt": 34, - "ID_Einst_HREinb_akt": 35, - "ID_Einst_ZWE1Art_akt": 36, - "ID_Einst_ZWE1Fkt_akt": 37, - "ID_Einst_ZWE2Art_akt": 38, - "ID_Einst_ZWE2Fkt_akt": 39, - "ID_Einst_BWBer_akt": 40, - "ID_Einst_En_Inst": 41, - "ID_Einst_MK1Typ_akt": 42, - "ID_Einst_ABTLuft_akt": 43, - "ID_Einst_TLAbt_akt": 44, - "ID_Einst_LAbtTime_akt": 45, - "ID_Einst_ASDTyp_akt": 46, - "ID_Einst_LGST_akt": 47, - "ID_Einst_BwWpTime_akt": 48, - "ID_Einst_Popt_akt": 49, - "ID_Einst_Kurzprog_akt": 50, - "ID_Timer_Kurzprog_akt": 51, - "ID_Einst_ManAbt_akt": 52, - "ID_Einst_Ahz_akt": 53, - "ID_Einst_TVL_Ahz_1": 54, - "ID_Einst_TVL_Ahz_2": 55, - "ID_Einst_TVL_Ahz_3": 56, - "ID_Einst_TVL_Ahz_4": 57, - "ID_Einst_TVL_Ahz_5": 58, - "ID_Einst_TVL_Ahz_6": 59, - "ID_Einst_TVL_Ahz_7": 60, - "ID_Einst_TVL_Ahz_8": 61, - "ID_Einst_TVL_Ahz_9": 62, - "ID_Einst_TVL_Ahz_10": 63, - "ID_Einst_TVL_Std_1": 64, - "ID_Einst_TVL_Std_2": 65, - "ID_Einst_TVL_Std_3": 66, - "ID_Einst_TVL_Std_4": 67, - "ID_Einst_TVL_Std_5": 68, - "ID_Einst_TVL_Std_6": 69, - "ID_Einst_TVL_Std_7": 70, - "ID_Einst_TVL_Std_8": 71, - "ID_Einst_TVL_Std_9": 72, - "ID_Einst_TVL_Std_10": 73, - "ID_Einst_BWS_Hyst_akt": 74, - "ID_Temp_TBW_BwHD_saved": 75, - "ID_Einst_ABT1_akt": 76, - "ID_Einst_LABTpaus_akt": 77, - "ID_AHZ_state_akt": 78, - "ID_Sollwert_TRL_HZ_AHZ": 79, - "ID_AHP_valid_records": 80, - "ID_Timer_AHZ_akt": 81, - "ID_Einst_BWTINP_akt": 82, - "ID_Einst_ZUPTYP_akt": 83, - "ID_Sollwert_TLG_max": 84, - "ID_Einst_BWZIP_akt": 85, - "ID_Einst_ERRmZWE_akt": 86, - "ID_Einst_TRBegr_akt": 87, - "ID_Einst_HRHyst_akt": 88, - "ID_Einst_TRErhmax_akt": 89, - "ID_Einst_ZWEFreig_akt": 90, - "ID_Einst_TAmax_akt": 91, - "ID_Einst_TAmin_akt": 92, - "ID_Einst_TWQmin_akt": 93, - "ID_Einst_THGmax_akt": 94, - "ID_Einst_FRGT2VD_akt": 95, - "ID_Einst_TV2VDBW_akt": 96, - "ID_Einst_SuAll_akt": 97, - "ID_Einst_TAbtEnd_akt": 98, - "ID_Einst_NrKlingel_akt": 99, - "ID_Einst_BWStyp_akt": 100, - "ID_Einst_ABT2_akt": 101, - "ID_Einst_UeVd_akt": 102, - "ID_Einst_RTyp_akt": 103, - "ID_Einst_AhpM_akt": 104, - "ID_Soll_BWS_akt": 105, - "ID_Timer_Password": 106, - "ID_Einst_Zugangscode": 107, - "ID_Einst_BA_Kuehl_akt": 108, - "ID_Sollwert_Kuehl1_akt": 109, - "ID_Einst_KuehlFreig_akt": 110, - "ID_Einst_TAbsMin_akt": 111, - "ID_TWQmin_saved": 112, - "ID_CWP_saved": 113, - "ID_Einst_Anode_akt": 114, - "ID_Timer_pexoff_akt": 115, - "ID_Einst_AnlPrio_Hzakt": 116, - "ID_Einst_AnlPrio_Bwakt": 117, - "ID_Einst_AnlPrio_Swakt": 118, - "ID_Ba_Sw_akt": 119, - "ID_Einst_RTypMK1_akt": 120, - "ID_Einst_RTypMK2_akt": 121, - "ID_Einst_TDC_Ein_akt": 122, - "ID_Einst_TDC_Aus_akt": 123, - "ID_Einst_TDC_Max_akt": 124, - "ID_Einst_HysHzExEn_akt": 125, - "ID_Einst_HysBwExEn_akt": 126, - "ID_Einst_ZWE3Art_akt": 127, - "ID_Einst_ZWE3Fkt_akt": 128, - "ID_Einst_HzSup_akt": 129, - "ID_Einst_MK2Typ_akt": 130, - "ID_Einst_KuTyp_akt": 131, - "ID_Sollwert_KuCft1_akt": 132, - "ID_Sollwert_KuCft2_akt": 133, - "ID_Sollwert_AtDif1_akt": 134, - "ID_Sollwert_AtDif2_akt": 135, - "ID_SU_FrkdSwb": 136, - "ID_Einst_SwbBer_akt": 137, - "ID_Einst_TV2VDSWB_akt": 138, - "ID_Einst_MinSwan_Time_akt": 139, - "ID_Einst_SuMk2_akt": 140, - "ID_Einst_HzMK2E_akt": 141, - "ID_Einst_HzMK2ANH_akt": 142, - "ID_Einst_HzMK2ABS_akt": 143, - "ID_Einst_HzMK2Hgr_akt": 144, - "ID_Einst_HzFtMK2Vl_akt": 145, - "ID_Temp_THG_BwHD_saved": 146, - "ID_Temp_TA_BwHD_saved": 147, - "ID_Einst_BwHup_akt": 148, - "ID_Einst_TVLmax_akt": 149, - "ID_Einst_MK1LzFaktor_akt": 150, - "ID_Einst_MK2LzFaktor_akt": 151, - "ID_Einst_MK1PerFaktor_akt": 152, - "ID_Einst_MK2PerFaktor_akt": 153, - "ID_Entl_Zyklus_akt": 154, - "ID_Einst_Entl_time_akt": 155, - "ID_Entl_Pause": 156, - "ID_Entl_timer": 157, - "ID_Einst_Entl_akt": 158, - "ID_Ahz_HLeist_confirmed": 159, - "ID_FirstInit_akt": 160, - "ID_Einst_SuAll_akt2": 161, - "ID_Einst_SuAllWo_zeit_0_0": 162, - "ID_Einst_SuAllWo_zeit_0_1": 163, - "ID_Einst_SuAllWo_zeit_1_0": 164, - "ID_Einst_SuAllWo_zeit_1_1": 165, - "ID_Einst_SuAllWo_zeit_2_0": 166, - "ID_Einst_SuAllWo_zeit_2_1": 167, - "ID_Einst_SuAll25_zeit_0_0": 168, - "ID_Einst_SuAll25_zeit_0_1": 169, - "ID_Einst_SuAll25_zeit_1_0": 170, - "ID_Einst_SuAll25_zeit_1_1": 171, - "ID_Einst_SuAll25_zeit_2_0": 172, - "ID_Einst_SuAll25_zeit_2_1": 173, - "ID_Einst_SuAll25_zeit_0_2": 174, - "ID_Einst_SuAll25_zeit_0_3": 175, - "ID_Einst_SuAll25_zeit_1_2": 176, - "ID_Einst_SuAll25_zeit_1_3": 177, - "ID_Einst_SuAll25_zeit_2_2": 178, - "ID_Einst_SuAll25_zeit_2_3": 179, - "ID_Einst_SuAllTg_zeit_0_0": 180, - "ID_Einst_SuAllTg_zeit_0_1": 181, - "ID_Einst_SuAllTg_zeit_1_0": 182, - "ID_Einst_SuAllTg_zeit_1_1": 183, - "ID_Einst_SuAllTg_zeit_2_0": 184, - "ID_Einst_SuAllTg_zeit_2_1": 185, - "ID_Einst_SuAllTg_zeit_0_2": 186, - "ID_Einst_SuAllTg_zeit_0_3": 187, - "ID_Einst_SuAllTg_zeit_1_2": 188, - "ID_Einst_SuAllTg_zeit_1_3": 189, - "ID_Einst_SuAllTg_zeit_2_2": 190, - "ID_Einst_SuAllTg_zeit_2_3": 191, - "ID_Einst_SuAllTg_zeit_0_4": 192, - "ID_Einst_SuAllTg_zeit_0_5": 193, - "ID_Einst_SuAllTg_zeit_1_4": 194, - "ID_Einst_SuAllTg_zeit_1_5": 195, - "ID_Einst_SuAllTg_zeit_2_4": 196, - "ID_Einst_SuAllTg_zeit_2_5": 197, - "ID_Einst_SuAllTg_zeit_0_6": 198, - "ID_Einst_SuAllTg_zeit_0_7": 199, - "ID_Einst_SuAllTg_zeit_1_6": 200, - "ID_Einst_SuAllTg_zeit_1_7": 201, - "ID_Einst_SuAllTg_zeit_2_6": 202, - "ID_Einst_SuAllTg_zeit_2_7": 203, - "ID_Einst_SuAllTg_zeit_0_8": 204, - "ID_Einst_SuAllTg_zeit_0_9": 205, - "ID_Einst_SuAllTg_zeit_1_8": 206, - "ID_Einst_SuAllTg_zeit_1_9": 207, - "ID_Einst_SuAllTg_zeit_2_8": 208, - "ID_Einst_SuAllTg_zeit_2_9": 209, - "ID_Einst_SuAllTg_zeit_0_10": 210, - "ID_Einst_SuAllTg_zeit_0_11": 211, - "ID_Einst_SuAllTg_zeit_1_10": 212, - "ID_Einst_SuAllTg_zeit_1_11": 213, - "ID_Einst_SuAllTg_zeit_2_10": 214, - "ID_Einst_SuAllTg_zeit_2_11": 215, - "ID_Einst_SuAllTg_zeit_0_12": 216, - "ID_Einst_SuAllTg_zeit_0_13": 217, - "ID_Einst_SuAllTg_zeit_1_12": 218, - "ID_Einst_SuAllTg_zeit_1_13": 219, - "ID_Einst_SuAllTg_zeit_2_12": 220, - "ID_Einst_SuAllTg_zeit_2_13": 221, - "ID_Einst_SuHkr_akt": 222, - "ID_Einst_SuHkrW0_zeit_0_0": 223, - "ID_Einst_SuHkrW0_zeit_0_1": 224, - "ID_Einst_SuHkrW0_zeit_1_0": 225, - "ID_Einst_SuHkrW0_zeit_1_1": 226, - "ID_Einst_SuHkrW0_zeit_2_0": 227, - "ID_Einst_SuHkrW0_zeit_2_1": 228, - "ID_Einst_SuHkr25_zeit_0_0": 229, - "ID_Einst_SuHkr25_zeit_0_1": 230, - "ID_Einst_SuHkr25_zeit_1_0": 231, - "ID_Einst_SuHkr25_zeit_1_1": 232, - "ID_Einst_SuHkr25_zeit_2_0": 233, - "ID_Einst_SuHkr25_zeit_2_1": 234, - "ID_Einst_SuHkr25_zeit_0_2": 235, - "ID_Einst_SuHkr25_zeit_0_3": 236, - "ID_Einst_SuHkr25_zeit_1_2": 237, - "ID_Einst_SuHkr25_zeit_1_3": 238, - "ID_Einst_SuHkr25_zeit_2_2": 239, - "ID_Einst_SuHkr25_zeit_2_3": 240, - "ID_Einst_SuHkrTG_zeit_0_0": 241, - "ID_Einst_SuHkrTG_zeit_0_1": 242, - "ID_Einst_SuHkrTG_zeit_1_0": 243, - "ID_Einst_SuHkrTG_zeit_1_1": 244, - "ID_Einst_SuHkrTG_zeit_2_0": 245, - "ID_Einst_SuHkrTG_zeit_2_1": 246, - "ID_Einst_SuHkrTG_zeit_0_2": 247, - "ID_Einst_SuHkrTG_zeit_0_3": 248, - "ID_Einst_SuHkrTG_zeit_1_2": 249, - "ID_Einst_SuHkrTG_zeit_1_3": 250, - "ID_Einst_SuHkrTG_zeit_2_2": 251, - "ID_Einst_SuHkrTG_zeit_2_3": 252, - "ID_Einst_SuHkrTG_zeit_0_4": 253, - "ID_Einst_SuHkrTG_zeit_0_5": 254, - "ID_Einst_SuHkrTG_zeit_1_4": 255, - "ID_Einst_SuHkrTG_zeit_1_5": 256, - "ID_Einst_SuHkrTG_zeit_2_4": 257, - "ID_Einst_SuHkrTG_zeit_2_5": 258, - "ID_Einst_SuHkrTG_zeit_0_6": 259, - "ID_Einst_SuHkrTG_zeit_0_7": 260, - "ID_Einst_SuHkrTG_zeit_1_6": 261, - "ID_Einst_SuHkrTG_zeit_1_7": 262, - "ID_Einst_SuHkrTG_zeit_2_6": 263, - "ID_Einst_SuHkrTG_zeit_2_7": 264, - "ID_Einst_SuHkrTG_zeit_0_8": 265, - "ID_Einst_SuHkrTG_zeit_0_9": 266, - "ID_Einst_SuHkrTG_zeit_1_8": 267, - "ID_Einst_SuHkrTG_zeit_1_9": 268, - "ID_Einst_SuHkrTG_zeit_2_8": 269, - "ID_Einst_SuHkrTG_zeit_2_9": 270, - "ID_Einst_SuHkrTG_zeit_0_10": 271, - "ID_Einst_SuHkrTG_zeit_0_11": 272, - "ID_Einst_SuHkrTG_zeit_1_10": 273, - "ID_Einst_SuHkrTG_zeit_1_11": 274, - "ID_Einst_SuHkrTG_zeit_2_10": 275, - "ID_Einst_SuHkrTG_zeit_2_11": 276, - "ID_Einst_SuHkrTG_zeit_0_12": 277, - "ID_Einst_SuHkrTG_zeit_0_13": 278, - "ID_Einst_SuHkrTG_zeit_1_12": 279, - "ID_Einst_SuHkrTG_zeit_1_13": 280, - "ID_Einst_SuHkrTG_zeit_2_12": 281, - "ID_Einst_SuHkrTG_zeit_2_13": 282, - "ID_Einst_SuMk1_akt": 283, - "ID_Einst_SuMk1W0_zeit_0_0": 284, - "ID_Einst_SuMk1W0_zeit_0_1": 285, - "ID_Einst_SuMk1W0_zeit_1_0": 286, - "ID_Einst_SuMk1W0_zeit_1_1": 287, - "ID_Einst_SuMk1W0_zeit_2_0": 288, - "ID_Einst_SuMk1W0_zeit_2_1": 289, - "ID_Einst_SuMk125_zeit_0_0": 290, - "ID_Einst_SuMk125_zeit_0_1": 291, - "ID_Einst_SuMk125_zeit_1_0": 292, - "ID_Einst_SuMk125_zeit_1_1": 293, - "ID_Einst_SuMk125_zeit_2_0": 294, - "ID_Einst_SuMk125_zeit_2_1": 295, - "ID_Einst_SuMk125_zeit_0_2": 296, - "ID_Einst_SuMk125_zeit_0_3": 297, - "ID_Einst_SuMk125_zeit_1_2": 298, - "ID_Einst_SuMk125_zeit_1_3": 299, - "ID_Einst_SuMk125_zeit_2_2": 300, - "ID_Einst_SuMk125_zeit_2_3": 301, - "ID_Einst_SuMk1TG_zeit_0_0": 302, - "ID_Einst_SuMk1TG_zeit_0_1": 303, - "ID_Einst_SuMk1TG_zeit_1_0": 304, - "ID_Einst_SuMk1TG_zeit_1_1": 305, - "ID_Einst_SuMk1TG_zeit_2_0": 306, - "ID_Einst_SuMk1TG_zeit_2_1": 307, - "ID_Einst_SuMk1TG_zeit_0_2": 308, - "ID_Einst_SuMk1TG_zeit_0_3": 309, - "ID_Einst_SuMk1TG_zeit_1_2": 310, - "ID_Einst_SuMk1TG_zeit_1_3": 311, - "ID_Einst_SuMk1TG_zeit_2_2": 312, - "ID_Einst_SuMk1TG_zeit_2_3": 313, - "ID_Einst_SuMk1TG_zeit_0_4": 314, - "ID_Einst_SuMk1TG_zeit_0_5": 315, - "ID_Einst_SuMk1TG_zeit_1_4": 316, - "ID_Einst_SuMk1TG_zeit_1_5": 317, - "ID_Einst_SuMk1TG_zeit_2_4": 318, - "ID_Einst_SuMk1TG_zeit_2_5": 319, - "ID_Einst_SuMk1TG_zeit_0_6": 320, - "ID_Einst_SuMk1TG_zeit_0_7": 321, - "ID_Einst_SuMk1TG_zeit_1_6": 322, - "ID_Einst_SuMk1TG_zeit_1_7": 323, - "ID_Einst_SuMk1TG_zeit_2_6": 324, - "ID_Einst_SuMk1TG_zeit_2_7": 325, - "ID_Einst_SuMk1TG_zeit_0_8": 326, - "ID_Einst_SuMk1TG_zeit_0_9": 327, - "ID_Einst_SuMk1TG_zeit_1_8": 328, - "ID_Einst_SuMk1TG_zeit_1_9": 329, - "ID_Einst_SuMk1TG_zeit_2_8": 330, - "ID_Einst_SuMk1TG_zeit_2_9": 331, - "ID_Einst_SuMk1TG_zeit_0_10": 332, - "ID_Einst_SuMk1TG_zeit_0_11": 333, - "ID_Einst_SuMk1TG_zeit_1_10": 334, - "ID_Einst_SuMk1TG_zeit_1_11": 335, - "ID_Einst_SuMk1TG_zeit_2_10": 336, - "ID_Einst_SuMk1TG_zeit_2_11": 337, - "ID_Einst_SuMk1TG_zeit_0_12": 338, - "ID_Einst_SuMk1TG_zeit_0_13": 339, - "ID_Einst_SuMk1TG_zeit_1_12": 340, - "ID_Einst_SuMk1TG_zeit_1_13": 341, - "ID_Einst_SuMk1TG_zeit_2_12": 342, - "ID_Einst_SuMk1TG_zeit_2_13": 343, - "ID_Einst_SuMk2_akt2": 344, - "ID_Einst_SuMk2Wo_zeit_0_0": 345, - "ID_Einst_SuMk2Wo_zeit_0_1": 346, - "ID_Einst_SuMk2Wo_zeit_1_0": 347, - "ID_Einst_SuMk2Wo_zeit_1_1": 348, - "ID_Einst_SuMk2Wo_zeit_2_0": 349, - "ID_Einst_SuMk2Wo_zeit_2_1": 350, - "ID_Einst_SuMk225_zeit_0_0": 351, - "ID_Einst_SuMk225_zeit_0_1": 352, - "ID_Einst_SuMk225_zeit_1_0": 353, - "ID_Einst_SuMk225_zeit_1_1": 354, - "ID_Einst_SuMk225_zeit_2_0": 355, - "ID_Einst_SuMk225_zeit_2_1": 356, - "ID_Einst_SuMk225_zeit_0_2": 357, - "ID_Einst_SuMk225_zeit_0_3": 358, - "ID_Einst_SuMk225_zeit_1_2": 359, - "ID_Einst_SuMk225_zeit_1_3": 360, - "ID_Einst_SuMk225_zeit_2_2": 361, - "ID_Einst_SuMk225_zeit_2_3": 362, - "ID_Einst_SuMk2Tg_zeit_0_0": 363, - "ID_Einst_SuMk2Tg_zeit_0_1": 364, - "ID_Einst_SuMk2Tg_zeit_1_0": 365, - "ID_Einst_SuMk2Tg_zeit_1_1": 366, - "ID_Einst_SuMk2Tg_zeit_2_0": 367, - "ID_Einst_SuMk2Tg_zeit_2_1": 368, - "ID_Einst_SuMk2Tg_zeit_0_2": 369, - "ID_Einst_SuMk2Tg_zeit_0_3": 370, - "ID_Einst_SuMk2Tg_zeit_1_2": 371, - "ID_Einst_SuMk2Tg_zeit_1_3": 372, - "ID_Einst_SuMk2Tg_zeit_2_2": 373, - "ID_Einst_SuMk2Tg_zeit_2_3": 374, - "ID_Einst_SuMk2Tg_zeit_0_4": 375, - "ID_Einst_SuMk2Tg_zeit_0_5": 376, - "ID_Einst_SuMk2Tg_zeit_1_4": 377, - "ID_Einst_SuMk2Tg_zeit_1_5": 378, - "ID_Einst_SuMk2Tg_zeit_2_4": 379, - "ID_Einst_SuMk2Tg_zeit_2_5": 380, - "ID_Einst_SuMk2Tg_zeit_0_6": 381, - "ID_Einst_SuMk2Tg_zeit_0_7": 382, - "ID_Einst_SuMk2Tg_zeit_1_6": 383, - "ID_Einst_SuMk2Tg_zeit_1_7": 384, - "ID_Einst_SuMk2Tg_zeit_2_6": 385, - "ID_Einst_SuMk2Tg_zeit_2_7": 386, - "ID_Einst_SuMk2Tg_zeit_0_8": 387, - "ID_Einst_SuMk2Tg_zeit_0_9": 388, - "ID_Einst_SuMk2Tg_zeit_1_8": 389, - "ID_Einst_SuMk2Tg_zeit_1_9": 390, - "ID_Einst_SuMk2Tg_zeit_2_8": 391, - "ID_Einst_SuMk2Tg_zeit_2_9": 392, - "ID_Einst_SuMk2Tg_zeit_0_10": 393, - "ID_Einst_SuMk2Tg_zeit_0_11": 394, - "ID_Einst_SuMk2Tg_zeit_1_10": 395, - "ID_Einst_SuMk2Tg_zeit_1_11": 396, - "ID_Einst_SuMk2Tg_zeit_2_10": 397, - "ID_Einst_SuMk2Tg_zeit_2_11": 398, - "ID_Einst_SuMk2Tg_zeit_0_12": 399, - "ID_Einst_SuMk2Tg_zeit_0_13": 400, - "ID_Einst_SuMk2Tg_zeit_1_12": 401, - "ID_Einst_SuMk2Tg_zeit_1_13": 402, - "ID_Einst_SuMk2Tg_zeit_2_12": 403, - "ID_Einst_SuMk2Tg_zeit_2_13": 404, - "ID_Einst_SUBW_akt2": 405, - "ID_Einst_SuBwWO_zeit_0_0": 406, - "ID_Einst_SuBwWO_zeit_0_1": 407, - "ID_Einst_SuBwWO_zeit_1_0": 408, - "ID_Einst_SuBwWO_zeit_1_1": 409, - "ID_Einst_SuBwWO_zeit_2_0": 410, - "ID_Einst_SuBwWO_zeit_2_1": 411, - "ID_Einst_SuBwWO_zeit_3_0": 412, - "ID_Einst_SuBwWO_zeit_3_1": 413, - "ID_Einst_SuBwWO_zeit_4_0": 414, - "ID_Einst_SuBwWO_zeit_4_1": 415, - "ID_Einst_SuBw25_zeit_0_0": 416, - "ID_Einst_SuBw25_zeit_0_1": 417, - "ID_Einst_SuBw25_zeit_1_0": 418, - "ID_Einst_SuBw25_zeit_1_1": 419, - "ID_Einst_SuBw25_zeit_2_0": 420, - "ID_Einst_SuBw25_zeit_2_1": 421, - "ID_Einst_SuBw25_zeit_3_0": 422, - "ID_Einst_SuBw25_zeit_3_1": 423, - "ID_Einst_SuBw25_zeit_4_0": 424, - "ID_Einst_SuBw25_zeit_4_1": 425, - "ID_Einst_SuBw25_zeit_0_2": 426, - "ID_Einst_SuBw25_zeit_0_3": 427, - "ID_Einst_SuBw25_zeit_1_2": 428, - "ID_Einst_SuBw25_zeit_1_3": 429, - "ID_Einst_SuBw25_zeit_2_2": 430, - "ID_Einst_SuBw25_zeit_2_3": 431, - "ID_Einst_SuBw25_zeit_3_2": 432, - "ID_Einst_SuBw25_zeit_3_3": 433, - "ID_Einst_SuBw25_zeit_4_2": 434, - "ID_Einst_SuBw25_zeit_4_3": 435, - "ID_Einst_SuBwTG_zeit_0_0": 436, - "ID_Einst_SuBwTG_zeit_0_1": 437, - "ID_Einst_SuBwTG_zeit_1_0": 438, - "ID_Einst_SuBwTG_zeit_1_1": 439, - "ID_Einst_SuBwTG_zeit_2_0": 440, - "ID_Einst_SuBwTG_zeit_2_1": 441, - "ID_Einst_SuBwTG_zeit_3_0": 442, - "ID_Einst_SuBwTG_zeit_3_1": 443, - "ID_Einst_SuBwTG_zeit_4_0": 444, - "ID_Einst_SuBwTG_zeit_4_1": 445, - "ID_Einst_SuBwTG_zeit_0_2": 446, - "ID_Einst_SuBwTG_zeit_0_3": 447, - "ID_Einst_SuBwTG_zeit_1_2": 448, - "ID_Einst_SuBwTG_zeit_1_3": 449, - "ID_Einst_SuBwTG_zeit_2_2": 450, - "ID_Einst_SuBwTG_zeit_2_3": 451, - "ID_Einst_SuBwTG_zeit_3_2": 452, - "ID_Einst_SuBwTG_zeit_3_3": 453, - "ID_Einst_SuBwTG_zeit_4_2": 454, - "ID_Einst_SuBwTG_zeit_4_3": 455, - "ID_Einst_SuBwTG_zeit_0_4": 456, - "ID_Einst_SuBwTG_zeit_0_5": 457, - "ID_Einst_SuBwTG_zeit_1_4": 458, - "ID_Einst_SuBwTG_zeit_1_5": 459, - "ID_Einst_SuBwTG_zeit_2_4": 460, - "ID_Einst_SuBwTG_zeit_2_5": 461, - "ID_Einst_SuBwTG_zeit_3_4": 462, - "ID_Einst_SuBwTG_zeit_3_5": 463, - "ID_Einst_SuBwTG_zeit_4_4": 464, - "ID_Einst_SuBwTG_zeit_4_5": 465, - "ID_Einst_SuBwTG_zeit_0_6": 466, - "ID_Einst_SuBwTG_zeit_0_7": 467, - "ID_Einst_SuBwTG_zeit_1_6": 468, - "ID_Einst_SuBwTG_zeit_1_7": 469, - "ID_Einst_SuBwTG_zeit_2_6": 470, - "ID_Einst_SuBwTG_zeit_2_7": 471, - "ID_Einst_SuBwTG_zeit_3_6": 472, - "ID_Einst_SuBwTG_zeit_3_7": 473, - "ID_Einst_SuBwTG_zeit_4_6": 474, - "ID_Einst_SuBwTG_zeit_4_7": 475, - "ID_Einst_SuBwTG_zeit_0_8": 476, - "ID_Einst_SuBwTG_zeit_0_9": 477, - "ID_Einst_SuBwTG_zeit_1_8": 478, - "ID_Einst_SuBwTG_zeit_1_9": 479, - "ID_Einst_SuBwTG_zeit_2_8": 480, - "ID_Einst_SuBwTG_zeit_2_9": 481, - "ID_Einst_SuBwTG_zeit_3_8": 482, - "ID_Einst_SuBwTG_zeit_3_9": 483, - "ID_Einst_SuBwTG_zeit_4_8": 484, - "ID_Einst_SuBwTG_zeit_4_9": 485, - "ID_Einst_SuBwTG_zeit_0_10": 486, - "ID_Einst_SuBwTG_zeit_0_11": 487, - "ID_Einst_SuBwTG_zeit_1_10": 488, - "ID_Einst_SuBwTG_zeit_1_11": 489, - "ID_Einst_SuBwTG_zeit_2_10": 490, - "ID_Einst_SuBwTG_zeit_2_11": 491, - "ID_Einst_SuBwTG_zeit_3_10": 492, - "ID_Einst_SuBwTG_zeit_3_11": 493, - "ID_Einst_SuBwTG_zeit_4_10": 494, - "ID_Einst_SuBwTG_zeit_4_11": 495, - "ID_Einst_SuBwTG_zeit_0_12": 496, - "ID_Einst_SuBwTG_zeit_0_13": 497, - "ID_Einst_SuBwTG_zeit_1_12": 498, - "ID_Einst_SuBwTG_zeit_1_13": 499, - "ID_Einst_SuBwTG_zeit_2_12": 500, - "ID_Einst_SuBwTG_zeit_2_13": 501, - "ID_Einst_SuBwTG_zeit_3_12": 502, - "ID_Einst_SuBwTG_zeit_3_13": 503, - "ID_Einst_SuBwTG_zeit_4_12": 504, - "ID_Einst_SuBwTG_zeit_4_13": 505, - "ID_Einst_SuZIP_akt": 506, - "ID_Einst_SuZIPWo_zeit_0_0": 507, - "ID_Einst_SuZIPWo_zeit_0_1": 508, - "ID_Einst_SuZIPWo_zeit_1_0": 509, - "ID_Einst_SuZIPWo_zeit_1_1": 510, - "ID_Einst_SuZIPWo_zeit_2_0": 511, - "ID_Einst_SuZIPWo_zeit_2_1": 512, - "ID_Einst_SuZIPWo_zeit_3_0": 513, - "ID_Einst_SuZIPWo_zeit_3_1": 514, - "ID_Einst_SuZIPWo_zeit_4_0": 515, - "ID_Einst_SuZIPWo_zeit_4_1": 516, - "ID_Einst_SuZIP25_zeit_0_0": 517, - "ID_Einst_SuZIP25_zeit_0_1": 518, - "ID_Einst_SuZIP25_zeit_1_0": 519, - "ID_Einst_SuZIP25_zeit_1_1": 520, - "ID_Einst_SuZIP25_zeit_2_0": 521, - "ID_Einst_SuZIP25_zeit_2_1": 522, - "ID_Einst_SuZIP25_zeit_3_0": 523, - "ID_Einst_SuZIP25_zeit_3_1": 524, - "ID_Einst_SuZIP25_zeit_4_0": 525, - "ID_Einst_SuZIP25_zeit_4_1": 526, - "ID_Einst_SuZIP25_zeit_0_2": 527, - "ID_Einst_SuZIP25_zeit_0_3": 528, - "ID_Einst_SuZIP25_zeit_1_2": 529, - "ID_Einst_SuZIP25_zeit_1_3": 530, - "ID_Einst_SuZIP25_zeit_2_2": 531, - "ID_Einst_SuZIP25_zeit_2_3": 532, - "ID_Einst_SuZIP25_zeit_3_2": 533, - "ID_Einst_SuZIP25_zeit_3_3": 534, - "ID_Einst_SuZIP25_zeit_4_2": 535, - "ID_Einst_SuZIP25_zeit_4_3": 536, - "ID_Einst_SuZIPTg_zeit_0_0": 537, - "ID_Einst_SuZIPTg_zeit_0_1": 538, - "ID_Einst_SuZIPTg_zeit_1_0": 539, - "ID_Einst_SuZIPTg_zeit_1_1": 540, - "ID_Einst_SuZIPTg_zeit_2_0": 541, - "ID_Einst_SuZIPTg_zeit_2_1": 542, - "ID_Einst_SuZIPTg_zeit_3_0": 543, - "ID_Einst_SuZIPTg_zeit_3_1": 544, - "ID_Einst_SuZIPTg_zeit_4_0": 545, - "ID_Einst_SuZIPTg_zeit_4_1": 546, - "ID_Einst_SuZIPTg_zeit_0_2": 547, - "ID_Einst_SuZIPTg_zeit_0_3": 548, - "ID_Einst_SuZIPTg_zeit_1_2": 549, - "ID_Einst_SuZIPTg_zeit_1_3": 550, - "ID_Einst_SuZIPTg_zeit_2_2": 551, - "ID_Einst_SuZIPTg_zeit_2_3": 552, - "ID_Einst_SuZIPTg_zeit_3_2": 553, - "ID_Einst_SuZIPTg_zeit_3_3": 554, - "ID_Einst_SuZIPTg_zeit_4_2": 555, - "ID_Einst_SuZIPTg_zeit_4_3": 556, - "ID_Einst_SuZIPTg_zeit_0_4": 557, - "ID_Einst_SuZIPTg_zeit_0_5": 558, - "ID_Einst_SuZIPTg_zeit_1_4": 559, - "ID_Einst_SuZIPTg_zeit_1_5": 560, - "ID_Einst_SuZIPTg_zeit_2_4": 561, - "ID_Einst_SuZIPTg_zeit_2_5": 562, - "ID_Einst_SuZIPTg_zeit_3_4": 563, - "ID_Einst_SuZIPTg_zeit_3_5": 564, - "ID_Einst_SuZIPTg_zeit_4_4": 565, - "ID_Einst_SuZIPTg_zeit_4_5": 566, - "ID_Einst_SuZIPTg_zeit_0_6": 567, - "ID_Einst_SuZIPTg_zeit_0_7": 568, - "ID_Einst_SuZIPTg_zeit_1_6": 569, - "ID_Einst_SuZIPTg_zeit_1_7": 570, - "ID_Einst_SuZIPTg_zeit_2_6": 571, - "ID_Einst_SuZIPTg_zeit_2_7": 572, - "ID_Einst_SuZIPTg_zeit_3_6": 573, - "ID_Einst_SuZIPTg_zeit_3_7": 574, - "ID_Einst_SuZIPTg_zeit_4_6": 575, - "ID_Einst_SuZIPTg_zeit_4_7": 576, - "ID_Einst_SuZIPTg_zeit_0_8": 577, - "ID_Einst_SuZIPTg_zeit_0_9": 578, - "ID_Einst_SuZIPTg_zeit_1_8": 579, - "ID_Einst_SuZIPTg_zeit_1_9": 580, - "ID_Einst_SuZIPTg_zeit_2_8": 581, - "ID_Einst_SuZIPTg_zeit_2_9": 582, - "ID_Einst_SuZIPTg_zeit_3_8": 583, - "ID_Einst_SuZIPTg_zeit_3_9": 584, - "ID_Einst_SuZIPTg_zeit_4_8": 585, - "ID_Einst_SuZIPTg_zeit_4_9": 586, - "ID_Einst_SuZIPTg_zeit_0_10": 587, - "ID_Einst_SuZIPTg_zeit_0_11": 588, - "ID_Einst_SuZIPTg_zeit_1_10": 589, - "ID_Einst_SuZIPTg_zeit_1_11": 590, - "ID_Einst_SuZIPTg_zeit_2_10": 591, - "ID_Einst_SuZIPTg_zeit_2_11": 592, - "ID_Einst_SuZIPTg_zeit_3_10": 593, - "ID_Einst_SuZIPTg_zeit_3_11": 594, - "ID_Einst_SuZIPTg_zeit_4_10": 595, - "ID_Einst_SuZIPTg_zeit_4_11": 596, - "ID_Einst_SuZIPTg_zeit_0_12": 597, - "ID_Einst_SuZIPTg_zeit_0_13": 598, - "ID_Einst_SuZIPTg_zeit_1_12": 599, - "ID_Einst_SuZIPTg_zeit_1_13": 600, - "ID_Einst_SuZIPTg_zeit_2_12": 601, - "ID_Einst_SuZIPTg_zeit_2_13": 602, - "ID_Einst_SuZIPTg_zeit_3_12": 603, - "ID_Einst_SuZIPTg_zeit_3_13": 604, - "ID_Einst_SuZIPTg_zeit_4_12": 605, - "ID_Einst_SuZIPTg_zeit_4_13": 606, - "ID_Einst_SuSwb_akt": 607, - "ID_Einst_SuSwbWo_zeit_0_0": 608, - "ID_Einst_SuSwbWo_zeit_0_1": 609, - "ID_Einst_SuSwbWo_zeit_1_0": 610, - "ID_Einst_SuSwbWo_zeit_1_1": 611, - "ID_Einst_SuSwbWo_zeit_2_0": 612, - "ID_Einst_SuSwbWo_zeit_2_1": 613, - "ID_Einst_SuSwb25_zeit_0_0": 614, - "ID_Einst_SuSwb25_zeit_0_1": 615, - "ID_Einst_SuSwb25_zeit_1_0": 616, - "ID_Einst_SuSwb25_zeit_1_1": 617, - "ID_Einst_SuSwb25_zeit_2_0": 618, - "ID_Einst_SuSwb25_zeit_2_1": 619, - "ID_Einst_SuSwb25_zeit_0_2": 620, - "ID_Einst_SuSwb25_zeit_0_3": 621, - "ID_Einst_SuSwb25_zeit_1_2": 622, - "ID_Einst_SuSwb25_zeit_1_3": 623, - "ID_Einst_SuSwb25_zeit_2_2": 624, - "ID_Einst_SuSwb25_zeit_2_3": 625, - "ID_Einst_SuSwbTg_zeit_0_0": 626, - "ID_Einst_SuSwbTg_zeit_0_1": 627, - "ID_Einst_SuSwbTg_zeit_1_0": 628, - "ID_Einst_SuSwbTg_zeit_1_1": 629, - "ID_Einst_SuSwbTg_zeit_2_0": 630, - "ID_Einst_SuSwbTg_zeit_2_1": 631, - "ID_Einst_SuSwbTg_zeit_0_2": 632, - "ID_Einst_SuSwbTg_zeit_0_3": 633, - "ID_Einst_SuSwbTg_zeit_1_2": 634, - "ID_Einst_SuSwbTg_zeit_1_3": 635, - "ID_Einst_SuSwbTg_zeit_2_2": 636, - "ID_Einst_SuSwbTg_zeit_2_3": 637, - "ID_Einst_SuSwbTg_zeit_0_4": 638, - "ID_Einst_SuSwbTg_zeit_0_5": 639, - "ID_Einst_SuSwbTg_zeit_1_4": 640, - "ID_Einst_SuSwbTg_zeit_1_5": 641, - "ID_Einst_SuSwbTg_zeit_2_4": 642, - "ID_Einst_SuSwbTg_zeit_2_5": 643, - "ID_Einst_SuSwbTg_zeit_0_6": 644, - "ID_Einst_SuSwbTg_zeit_0_7": 645, - "ID_Einst_SuSwbTg_zeit_1_6": 646, - "ID_Einst_SuSwbTg_zeit_1_7": 647, - "ID_Einst_SuSwbTg_zeit_2_6": 648, - "ID_Einst_SuSwbTg_zeit_2_7": 649, - "ID_Einst_SuSwbTg_zeit_0_8": 650, - "ID_Einst_SuSwbTg_zeit_0_9": 651, - "ID_Einst_SuSwbTg_zeit_1_8": 652, - "ID_Einst_SuSwbTg_zeit_1_9": 653, - "ID_Einst_SuSwbTg_zeit_2_8": 654, - "ID_Einst_SuSwbTg_zeit_2_9": 655, - "ID_Einst_SuSwbTg_zeit_0_10": 656, - "ID_Einst_SuSwbTg_zeit_0_11": 657, - "ID_Einst_SuSwbTg_zeit_1_10": 658, - "ID_Einst_SuSwbTg_zeit_1_11": 659, - "ID_Einst_SuSwbTg_zeit_2_10": 660, - "ID_Einst_SuSwbTg_zeit_2_11": 661, - "ID_Einst_SuSwbTg_zeit_0_12": 662, - "ID_Einst_SuSwbTg_zeit_0_13": 663, - "ID_Einst_SuSwbTg_zeit_1_12": 664, - "ID_Einst_SuSwbTg_zeit_1_13": 665, - "ID_Einst_SuSwbTg_zeit_2_12": 666, - "ID_Einst_SuSwbTg_zeit_2_13": 667, - "ID_Zaehler_BetrZeitWP": 668, - "ID_Zaehler_BetrZeitVD1": 669, - "ID_Zaehler_BetrZeitVD2": 670, - "ID_Zaehler_BetrZeitZWE1": 671, - "ID_Zaehler_BetrZeitZWE2": 672, - "ID_Zaehler_BetrZeitZWE3": 673, - "ID_Zaehler_BetrZeitImpVD1": 674, - "ID_Zaehler_BetrZeitImpVD2": 675, - "ID_Zaehler_BetrZeitEZMVD1": 676, - "ID_Zaehler_BetrZeitEZMVD2": 677, - "ID_Einst_Entl_Typ_0": 678, - "ID_Einst_Entl_Typ_1": 679, - "ID_Einst_Entl_Typ_2": 680, - "ID_Einst_Entl_Typ_3": 681, - "ID_Einst_Entl_Typ_4": 682, - "ID_Einst_Entl_Typ_5": 683, - "ID_Einst_Entl_Typ_6": 684, - "ID_Einst_Entl_Typ_7": 685, - "ID_Einst_Entl_Typ_8": 686, - "ID_Einst_Entl_Typ_9": 687, - "ID_Einst_Entl_Typ_10": 688, - "ID_Einst_Entl_Typ_11": 689, - "ID_Einst_Entl_Typ_12": 690, - "ID_Einst_Vorl_max_MK1": 691, - "ID_Einst_Vorl_max_MK2": 692, - "ID_SU_FrkdMK1": 693, - "ID_SU_FrkdMK2": 694, - "ID_Ba_Hz_MK1_akt": 695, - "ID_Ba_Hz_MK2_akt": 696, - "ID_Einst_Zirk_Ein_akt": 697, - "ID_Einst_Zirk_Aus_akt": 698, - "ID_Einst_Heizgrenze": 699, - "ID_Einst_Heizgrenze_Temp": 700, - "ID_VariablenIBNgespeichert": 701, - "ID_SchonIBNAssistant": 702, - "ID_Heizgrenze_0": 703, - "ID_Heizgrenze_1": 704, - "ID_Heizgrenze_2": 705, - "ID_Heizgrenze_3": 706, - "ID_Heizgrenze_4": 707, - "ID_Heizgrenze_5": 708, - "ID_Heizgrenze_6": 709, - "ID_Heizgrenze_7": 710, - "ID_Heizgrenze_8": 711, - "ID_Heizgrenze_9": 712, - "ID_Heizgrenze_10": 713, - "ID_Heizgrenze_11": 714, - "ID_SchemenIBNgewahlt": 715, - "ID_Switchoff_file_0_0": 716, - "ID_Switchoff_file_1_0": 717, - "ID_Switchoff_file_2_0": 718, - "ID_Switchoff_file_3_0": 719, - "ID_Switchoff_file_4_0": 720, - "ID_Switchoff_file_0_1": 721, - "ID_Switchoff_file_1_1": 722, - "ID_Switchoff_file_2_1": 723, - "ID_Switchoff_file_3_1": 724, - "ID_Switchoff_file_4_1": 725, - "ID_DauerDatenLoggerAktiv": 726, - "ID_Laufvar_Heizgrenze": 727, - "ID_Zaehler_BetrZeitHz": 728, - "ID_Zaehler_BetrZeitBW": 729, - "ID_Zaehler_BetrZeitKue": 730, - "ID_SU_FstdHz": 731, - "ID_SU_FstdBw": 732, - "ID_SU_FstdSwb": 733, - "ID_SU_FstdMK1": 734, - "ID_SU_FstdMK2": 735, - "ID_FerienAbsenkungHz": 736, - "ID_FerienAbsenkungMK1": 737, - "ID_FerienAbsenkungMK2": 738, - "ID_FerienModusAktivHz": 739, - "ID_FerienModusAktivBw": 740, - "ID_FerienModusAktivSwb": 741, - "ID_FerienModusAktivMk1": 742, - "ID_FerienModusAktivMk2": 743, - "ID_DisplayContrast_akt": 744, - "ID_Ba_Hz_saved": 745, - "ID_Ba_Bw_saved": 746, - "ID_Ba_Sw_saved": 747, - "ID_Ba_Hz_MK1_saved": 748, - "ID_Ba_Hz_MK2_saved": 749, - "ID_AdresseIP_akt": 750, - "ID_SubNetMask_akt": 751, - "ID_Add_Broadcast_akt": 752, - "ID_Add_StdGateway_akt": 753, - "ID_DHCPServerAktiv_akt": 754, - "ID_WebserverPasswort_1_akt": 755, - "ID_WebserverPasswort_2_akt": 756, - "ID_WebserverPasswort_3_akt": 757, - "ID_WebserverPasswort_4_akt": 758, - "ID_WebserverPasswort_5_akt": 759, - "ID_WebserverPasswort_6_akt": 760, - "ID_WebServerWerteBekommen": 761, - "ID_Einst_ParBetr_akt": 762, - "ID_Einst_WpAnz_akt": 763, - "ID_Einst_PhrTime_akt": 764, - "ID_Einst_HysPar_akt": 765, - "ID_IP_PB_Slave_0": 766, - "ID_IP_PB_Slave_1": 767, - "ID_IP_PB_Slave_2": 768, - "ID_IP_PB_Slave_3": 769, - "ID_IP_PB_Slave_4": 770, - "ID_IP_PB_Slave_5": 771, - "ID_Einst_BwHup_akt_backup": 772, - "ID_Einst_SuMk3_akt": 773, - "ID_Einst_HzMK3E_akt": 774, - "ID_Einst_HzMK3ANH_akt": 775, - "ID_Einst_HzMK3ABS_akt": 776, - "ID_Einst_HzMK3Hgr_akt": 777, - "ID_Einst_HzFtMK3Vl_akt": 778, - "ID_Ba_Hz_MK3_akt": 779, - "ID_Einst_MK3Typ_akt": 780, - "ID_Einst_RTypMK3_akt": 781, - "ID_Einst_MK3LzFaktor_akt": 782, - "ID_Einst_MK3PerFaktor_akt": 783, - "ID_FerienModusAktivMk3": 784, - "ID_SU_FrkdMK3": 785, - "ID_FerienAbsenkungMK3": 786, - "ID_SU_FstdMK3": 787, - "ID_Einst_SuMk3_akt2": 788, - "ID_Einst_SuMk3Wo_zeit_0_0": 789, - "ID_Einst_SuMk3Wo_zeit_0_1": 790, - "ID_Einst_SuMk3Wo_zeit_1_0": 791, - "ID_Einst_SuMk3Wo_zeit_1_1": 792, - "ID_Einst_SuMk3Wo_zeit_2_0": 793, - "ID_Einst_SuMk3Wo_zeit_2_1": 794, - "ID_Einst_SuMk325_zeit_0_0": 795, - "ID_Einst_SuMk325_zeit_0_1": 796, - "ID_Einst_SuMk325_zeit_1_0": 797, - "ID_Einst_SuMk325_zeit_1_1": 798, - "ID_Einst_SuMk325_zeit_2_0": 799, - "ID_Einst_SuMk325_zeit_2_1": 800, - "ID_Einst_SuMk325_zeit_0_2": 801, - "ID_Einst_SuMk325_zeit_0_3": 802, - "ID_Einst_SuMk325_zeit_1_2": 803, - "ID_Einst_SuMk325_zeit_1_3": 804, - "ID_Einst_SuMk325_zeit_2_2": 805, - "ID_Einst_SuMk325_zeit_2_3": 806, - "ID_Einst_SuMk3Tg_zeit_0_0": 807, - "ID_Einst_SuMk3Tg_zeit_0_1": 808, - "ID_Einst_SuMk3Tg_zeit_1_0": 809, - "ID_Einst_SuMk3Tg_zeit_1_1": 810, - "ID_Einst_SuMk3Tg_zeit_2_0": 811, - "ID_Einst_SuMk3Tg_zeit_2_1": 812, - "ID_Einst_SuMk3Tg_zeit_0_2": 813, - "ID_Einst_SuMk3Tg_zeit_0_3": 814, - "ID_Einst_SuMk3Tg_zeit_1_2": 815, - "ID_Einst_SuMk3Tg_zeit_1_3": 816, - "ID_Einst_SuMk3Tg_zeit_2_2": 817, - "ID_Einst_SuMk3Tg_zeit_2_3": 818, - "ID_Einst_SuMk3Tg_zeit_0_4": 819, - "ID_Einst_SuMk3Tg_zeit_0_5": 820, - "ID_Einst_SuMk3Tg_zeit_1_4": 821, - "ID_Einst_SuMk3Tg_zeit_1_5": 822, - "ID_Einst_SuMk3Tg_zeit_2_4": 823, - "ID_Einst_SuMk3Tg_zeit_2_5": 824, - "ID_Einst_SuMk3Tg_zeit_0_6": 825, - "ID_Einst_SuMk3Tg_zeit_0_7": 826, - "ID_Einst_SuMk3Tg_zeit_1_6": 827, - "ID_Einst_SuMk3Tg_zeit_1_7": 828, - "ID_Einst_SuMk3Tg_zeit_2_6": 829, - "ID_Einst_SuMk3Tg_zeit_2_7": 830, - "ID_Einst_SuMk3Tg_zeit_0_8": 831, - "ID_Einst_SuMk3Tg_zeit_0_9": 832, - "ID_Einst_SuMk3Tg_zeit_1_8": 833, - "ID_Einst_SuMk3Tg_zeit_1_9": 834, - "ID_Einst_SuMk3Tg_zeit_2_8": 835, - "ID_Einst_SuMk3Tg_zeit_2_9": 836, - "ID_Einst_SuMk3Tg_zeit_0_10": 837, - "ID_Einst_SuMk3Tg_zeit_0_11": 838, - "ID_Einst_SuMk3Tg_zeit_1_10": 839, - "ID_Einst_SuMk3Tg_zeit_1_11": 840, - "ID_Einst_SuMk3Tg_zeit_2_10": 841, - "ID_Einst_SuMk3Tg_zeit_2_11": 842, - "ID_Einst_SuMk3Tg_zeit_0_12": 843, - "ID_Einst_SuMk3Tg_zeit_0_13": 844, - "ID_Einst_SuMk3Tg_zeit_1_12": 845, - "ID_Einst_SuMk3Tg_zeit_1_13": 846, - "ID_Einst_SuMk3Tg_zeit_2_12": 847, - "ID_Einst_SuMk3Tg_zeit_2_13": 848, - "ID_Ba_Hz_MK3_saved": 849, - "ID_Einst_Kuhl_Zeit_Ein_akt": 850, - "ID_Einst_Kuhl_Zeit_Aus_akt": 851, - "ID_Waermemenge_Seit": 852, - "ID_Waermemenge_WQ": 853, - "ID_Waermemenge_Hz": 854, - "ID_Waermemenge_WQ_ges": 855, - "ID_Einst_Entl_Typ_13": 856, - "ID_Einst_Entl_Typ_14": 857, - "ID_Einst_Entl_Typ_15": 858, - "ID_Zaehler_BetrZeitSW": 859, - "ID_Einst_Fernwartung_akt": 860, - "ID_AdresseIPServ_akt": 861, - "ID_Einst_TA_EG_akt": 862, - "ID_Einst_TVLmax_EG_akt": 863, - "ID_Einst_Popt_Nachlauf_akt": 864, - "ID_FernwartungVertrag_akt": 865, - "ID_FernwartungAktuZeit": 866, - "ID_Einst_Effizienzpumpe_Nominal_akt": 867, - "ID_Einst_Effizienzpumpe_Minimal_akt": 868, - "ID_Einst_Effizienzpumpe_akt": 869, - "ID_Einst_Waermemenge_akt": 870, - "ID_Einst_Wm_Versorgung_Korrektur_akt": 871, - "ID_Einst_Wm_Auswertung_Korrektur_akt": 872, - "ID_SoftwareUpdateJetztGemacht_akt": 873, - "ID_WP_SerienNummer_DATUM": 874, - "ID_WP_SerienNummer_HEX": 875, - "ID_WP_SerienNummer_INDEX": 876, - "ID_ProgWerteWebSrvBeobarten": 877, - "ID_Waermemenge_BW": 878, - "ID_Waermemenge_SW": 879, - "ID_Waermemenge_Datum": 880, - "ID_Einst_Solar_akt": 881, - "ID_BSTD_Solar": 882, - "ID_Einst_TDC_Koll_Max_akt": 883, - "ID_Einst_Akt_Kuehlung_akt": 884, - "ID_Einst_Vorlauf_VBO_akt": 885, - "ID_Einst_KRHyst_akt": 886, - "ID_Einst_Akt_Kuehl_Speicher_min_akt": 887, - "ID_Einst_Akt_Kuehl_Freig_WQE_akt": 888, - "ID_NDAB_WW_Anzahl": 889, - "ID_NDS_WW_KD_Quitt": 890, - "ID_Einst_AbtZykMin_akt": 891, - "ID_Einst_VD2_Zeit_Min_akt": 892, - "ID_Einst_Hysterese_HR_verkuerzt_akt": 893, - "ID_Einst_BA_Lueftung_akt": 894, - "ID_Einst_SuLuf_akt": 895, - "ID_Einst_SuLufWo_zeit_0_0_0": 896, - "ID_Einst_SuLufWo_zeit_0_1_0": 897, - "ID_Einst_SuLufWo_zeit_0_2_0": 898, - "ID_Einst_SuLuf25_zeit_0_0_0": 899, - "ID_Einst_SuLuf25_zeit_0_1_0": 900, - "ID_Einst_SuLuf25_zeit_0_2_0": 901, - "ID_Einst_SuLuf25_zeit_0_0_2": 902, - "ID_Einst_SuLuf25_zeit_0_1_2": 903, - "ID_Einst_SuLuf25_zeit_0_2_2": 904, - "ID_Einst_SuLufTg_zeit_0_0_0": 905, - "ID_Einst_SuLufTg_zeit_0_1_0": 906, - "ID_Einst_SuLufTg_zeit_0_2_0": 907, - "ID_Einst_SuLufTg_zeit_0_0_2": 908, - "ID_Einst_SuLufTg_zeit_0_1_2": 909, - "ID_Einst_SuLufTg_zeit_0_2_2": 910, - "ID_Einst_SuLufTg_zeit_0_0_4": 911, - "ID_Einst_SuLufTg_zeit_0_1_4": 912, - "ID_Einst_SuLufTg_zeit_0_2_4": 913, - "ID_Einst_SuLufTg_zeit_0_0_6": 914, - "ID_Einst_SuLufTg_zeit_0_1_6": 915, - "ID_Einst_SuLufTg_zeit_0_2_6": 916, - "ID_Einst_SuLufTg_zeit_0_0_8": 917, - "ID_Einst_SuLufTg_zeit_0_1_8": 918, - "ID_Einst_SuLufTg_zeit_0_2_8": 919, - "ID_Einst_SuLufTg_zeit_0_0_10": 920, - "ID_Einst_SuLufTg_zeit_0_1_10": 921, - "ID_Einst_SuLufTg_zeit_0_2_10": 922, - "ID_Einst_SuLufTg_zeit_0_0_12": 923, - "ID_Einst_SuLufTg_zeit_0_1_12": 924, - "ID_Einst_SuLufTg_zeit_0_2_12": 925, - "ID_Einst_SuLufWo_zeit_1_0_0": 926, - "ID_Einst_SuLufWo_zeit_1_1_0": 927, - "ID_Einst_SuLufWo_zeit_1_2_0": 928, - "ID_Einst_SuLuf25_zeit_1_0_0": 929, - "ID_Einst_SuLuf25_zeit_1_1_0": 930, - "ID_Einst_SuLuf25_zeit_1_2_0": 931, - "ID_Einst_SuLuf25_zeit_1_0_2": 932, - "ID_Einst_SuLuf25_zeit_1_1_2": 933, - "ID_Einst_SuLuf25_zeit_1_2_2": 934, - "ID_Einst_SuLufTg_zeit_1_0_0": 935, - "ID_Einst_SuLufTg_zeit_1_1_0": 936, - "ID_Einst_SuLufTg_zeit_1_2_0": 937, - "ID_Einst_SuLufTg_zeit_1_0_2": 938, - "ID_Einst_SuLufTg_zeit_1_1_2": 939, - "ID_Einst_SuLufTg_zeit_1_2_2": 940, - "ID_Einst_SuLufTg_zeit_1_0_4": 941, - "ID_Einst_SuLufTg_zeit_1_1_4": 942, - "ID_Einst_SuLufTg_zeit_1_2_4": 943, - "ID_Einst_SuLufTg_zeit_1_0_6": 944, - "ID_Einst_SuLufTg_zeit_1_1_6": 945, - "ID_Einst_SuLufTg_zeit_1_2_6": 946, - "ID_Einst_SuLufTg_zeit_1_0_8": 947, - "ID_Einst_SuLufTg_zeit_1_1_8": 948, - "ID_Einst_SuLufTg_zeit_1_2_8": 949, - "ID_Einst_SuLufTg_zeit_1_0_10": 950, - "ID_Einst_SuLufTg_zeit_1_1_10": 951, - "ID_Einst_SuLufTg_zeit_1_2_10": 952, - "ID_Einst_SuLufTg_zeit_1_0_12": 953, - "ID_Einst_SuLufTg_zeit_1_1_12": 954, - "ID_Einst_SuLufTg_zeit_1_2_12": 955, - "ID_FerienModusAktivLueftung": 956, - "ID_Einst_BA_Lueftung_saved": 957, - "ID_SU_FrkdLueftung": 958, - "ID_SU_FstdLueftung": 959, - "ID_Einst_Luf_Feuchteschutz_akt": 960, - "ID_Einst_Luf_Reduziert_akt": 961, - "ID_Einst_Luf_Nennlueftung_akt": 962, - "ID_Einst_Luf_Intensivlueftung_akt": 963, - "ID_Timer_Fil_4Makt": 964, - "ID_Timer_Fil_WoAkt": 965, - "ID_Sollwert_KuCft3_akt": 966, - "ID_Sollwert_AtDif3_akt": 967, - "ID_Bitmaske_0": 968, - "ID_Einst_Lueftungsstufen": 969, - "ID_SysEin_Meldung_TDI": 970, - "ID_SysEin_Typ_WZW": 971, - "ID_Einst_GLT_aktiviert": 972, - "ID_Einst_BW_max": 973, - "ID_Einst_Sollwert_TRL_Kuehlen": 974, - "ID_Einst_Medium_Waermequelle": 975, - "ID_Einst_Photovoltaik_akt": 976, - "ID_Einst_Multispeicher_akt": 977, - "ID_Einst_PKuehlTime_akt": 978, - "ID_Einst_Minimale_Ruecklaufsolltemperatur": 979, - "ID_RBE_Einflussfaktor_RT_akt": 980, - "ID_RBE_Freigabe_Kuehlung_akt": 981, - "ID_RBE_Waermeverteilsystem_akt": 982, - "ID_RBE_Zeit_Heizstab_aktiv": 983, - "ID_SEC_ND_Alarmgrenze": 984, - "ID_SEC_HD_Alarmgrenze": 985, - "ID_SEC_Abtauendtemperatur": 986, - "ID_Einst_Min_RPM_BW": 987, - "ID_Einst_Luf_Feuchteschutz_Faktor_akt": 988, - "ID_Einst_Luf_Reduziert_Faktor_akt": 989, - "ID_Einst_Luf_Nennlueftung_Faktor_akt": 990, - "ID_Einst_Luf_Intensivlueftung_Faktor_akt": 991, - "ID_Einst_Freigabe_Zeit_ZWE": 992, - "ID_Einst_min_VL_Kuehl": 993, - "ID_Einst_Warmwasser_Nachheizung": 994, - "ID_Switchoff_file_LWD2_0_0": 995, - "ID_Switchoff_file_LWD2_1_0": 996, - "ID_Switchoff_file_LWD2_2_0": 997, - "ID_Switchoff_file_LWD2_3_0": 998, - "ID_Switchoff_file_LWD2_4_0": 999, - "ID_Switchoff_file_LWD2_0_1": 1000, - "ID_Switchoff_file_LWD2_1_1": 1001, - "ID_Switchoff_file_LWD2_2_1": 1002, - "ID_Switchoff_file_LWD2_3_1": 1003, - "ID_Switchoff_file_LWD2_4_1": 1004, - "ID_Switchoff_index_LWD2": 1005, - "ID_Einst_Effizienzpumpe_Nominal_2": 1006, - "ID_Einst_Effizienzpumpe_Minimal_2": 1007, - "ID_Einst_Wm_Versorgung_Korrektur_2": 1008, - "ID_Einst_Wm_Auswertung_Korrektur_2": 1009, - "ID_Einst_isTwin": 1010, - "ID_Einst_TAmin_2": 1011, - "ID_Einst_TVLmax_2": 1012, - "ID_Einst_TA_EG_2": 1013, - "ID_Einst_TVLmax_EG_2": 1014, - "ID_Waermemenge_Hz_2": 1015, - "ID_Waermemenge_BW_2": 1016, - "ID_Waermemenge_SW_2": 1017, - "ID_Waermemenge_Seit_2": 1018, - "ID_Einst_Entl_Typ_15_2": 1019, - "ID_Einst_WW_Nachheizung_max": 1020, - "ID_Einst_Kuhl_Zeit_Ein_RT": 1021, - "ID_Einst_ZWE1_Pos": 1022, - "ID_Einst_ZWE2_Pos": 1023, - "ID_Einst_ZWE3_Pos": 1024, - "ID_Einst_Leistung_ZWE": 1025, - "ID_WP_SN2_DATUM": 1026, - "ID_WP_SN2_HEX": 1027, - "ID_WP_SN2_INDEX": 1028, - "ID_CWP_saved2": 1029, - "ID_Einst_SmartGrid": 1030, - "ID_Einst_P155_HDS": 1031, - "ID_Einst_P155_PumpHeat_Max": 1032, - "ID_Einst_P155_PumpHeatCtrl": 1033, - "ID_Einst_P155_PumpDHWCtrl": 1034, - "ID_Einst_P155_PumpDHW_RPM": 1035, - "ID_Einst_P155_PumpPoolCtrl": 1036, - "ID_Einst_P155_PumpPool_RPM": 1037, - "ID_Einst_P155_PumpCool_RPM": 1038, - "ID_Einst_P155_PumpVBOCtrl": 1039, - "ID_Einst_P155_PumpVBO_RPM_C": 1040, - "ID_Einst_P155_PumpDHW_Max": 1041, - "ID_Einst_P155_PumpPool_Max": 1042, - "ID_Einst_P155_Sperrband_1": 1043, - "ID_Einst_P155_Leistungsfreigabe": 1044, - "ID_Einst_P155_DHW_Freq": 1045, - "ID_Einst_SWHUP": 1046, - "ID_Einst_P155_SWB_Freq": 1047, - "ID_Einst_MK1_Regelung": 1048, - "ID_Einst_MK2_Regelung": 1049, - "ID_Einst_MK3_Regelung": 1050, - "ID_Einst_PV_WW_Sperrzeit": 1051, - "ID_Einst_Warmwasser_extra": 1052, - "ID_Einst_Vorl_akt_Kuehl": 1053, - "ID_WP_SN3_DATUM": 1054, - "ID_WP_SN3_HEX": 1055, - "ID_WP_SN3_INDEX": 1056, - "ID_Einst_Vorlauf_ZUP": 1057, - "ID_Einst_Abtauen_im_Warmwasser": 1058, - "ID_Waermemenge_ZWE": 1059, - "ID_Waermemenge_Reset": 1060, - "ID_Waermemenge_Reset_2": 1061, - "ID_Einst_Brunnenpumpe_min": 1062, - "ID_Einst_Brunnenpumpe_max": 1063, - "ID_Einst_SmartHomeID": 1064, - "ID_Einst_SmartHK": 1065, - "ID_Einst_SmartMK1": 1066, - "ID_Einst_SmartMK2": 1067, - "ID_Einst_SmartMK3": 1068, - "ID_Einst_SmartWW": 1069, - "ID_Einst_SmartDefrost": 1070, - "ID_Einst_Empty1071": 1071, - "ID_Einst_MinVLMK1": 1072, - "ID_Einst_MinVLMK2": 1073, - "ID_Einst_MinVLMK3": 1074, - "ID_Einst_MaxVLMK1": 1075, - "ID_Einst_MaxVLMK2": 1076, - "ID_Einst_MaxVLMK3": 1077, - "ID_Einst_SmartPlusHz": 1078, - "ID_Einst_SmartMinusHz": 1079, - "ID_Einst_SmartPlusMK1": 1080, - "ID_Einst_SmartMinusMK1": 1081, - "ID_Einst_SmartPlusMK2": 1082, - "ID_Einst_SmartMinusMK2": 1083, - "ID_Einst_SmartPlusMK3": 1084, - "ID_Einst_SmartMinusMK3": 1085, - "Unknown_Parameter_1086": 1086, - "Unknown_Parameter_1087": 1087, - "Unknown_Parameter_1088": 1088, - "Unknown_Parameter_1089": 1089, - "Unknown_Parameter_1090": 1090, - "Unknown_Parameter_1091": 1091, - "Unknown_Parameter_1092": 1092, - "Unknown_Parameter_1093": 1093, - "Unknown_Parameter_1094": 1094, - "Unknown_Parameter_1095": 1095, - "Unknown_Parameter_1096": 1096, - "Unknown_Parameter_1097": 1097, - "Unknown_Parameter_1098": 1098, - "Unknown_Parameter_1099": 1099, - "Unknown_Parameter_1100": 1100, - "Unknown_Parameter_1101": 1101, - "Unknown_Parameter_1102": 1102, - "Unknown_Parameter_1103": 1103, - "Unknown_Parameter_1104": 1104, - "Unknown_Parameter_1105": 1105, - "Unknown_Parameter_1106": 1106, - "Unknown_Parameter_1107": 1107, - "Unknown_Parameter_1108": 1108, - "Unknown_Parameter_1109": 1109, - "Unknown_Parameter_1110": 1110, - "Unknown_Parameter_1111": 1111, - "Unknown_Parameter_1112": 1112, - "Unknown_Parameter_1113": 1113, - "Unknown_Parameter_1114": 1114, - "Unknown_Parameter_1115": 1115, - "Unknown_Parameter_1116": 1116, - "Unknown_Parameter_1117": 1117, - "Unknown_Parameter_1118": 1118, - "Unknown_Parameter_1119": 1119, - "Unknown_Parameter_1120": 1120, - "Unknown_Parameter_1121": 1121, - "Unknown_Parameter_1122": 1122, - "Unknown_Parameter_1123": 1123, - "Unknown_Parameter_1124": 1124, - "Unknown_Parameter_1125": 1125, + "ID_Transfert_LuxNet": (0, Unknown), + "ID_Einst_WK_akt": (1, Celsius), + "ID_Einst_BWS_akt": (2, Celsius), + "ID_Ba_Hz_akt": (3, HeatingMode), + "ID_Ba_Bw_akt": (4, HotWaterMode), + "ID_Ba_Al_akt": (5, Unknown), + "ID_SU_FrkdHz": (6, Unknown), + "ID_SU_FrkdBw": (7, Unknown), + "ID_SU_FrkdAl": (8, Unknown), + "ID_Einst_HReg_akt": (9, Unknown), + "ID_Einst_HzHwMAt_akt": (10, Unknown), + "ID_Einst_HzHwHKE_akt": (11, Celsius), + "ID_Einst_HzHKRANH_akt": (12, Celsius), + "ID_Einst_HzHKRABS_akt": (13, Celsius), + "ID_Einst_HzMK1E_akt": (14, Unknown), + "ID_Einst_HzMK1ANH_akt": (15, Unknown), + "ID_Einst_HzMK1ABS_akt": (16, Unknown), + "ID_Einst_HzFtRl_akt": (17, Unknown), + "ID_Einst_HzFtMK1Vl_akt": (18, Unknown), + "ID_Einst_SUBW_akt": (19, Unknown), + "ID_Einst_BwTDI_akt_MO": (20, Unknown), + "ID_Einst_BwTDI_akt_DI": (21, Unknown), + "ID_Einst_BwTDI_akt_MI": (22, Unknown), + "ID_Einst_BwTDI_akt_DO": (23, Unknown), + "ID_Einst_BwTDI_akt_FR": (24, Unknown), + "ID_Einst_BwTDI_akt_SA": (25, Unknown), + "ID_Einst_BwTDI_akt_SO": (26, Unknown), + "ID_Einst_BwTDI_akt_AL": (27, Unknown), + "ID_Einst_AnlKonf_akt": (28, Unknown), + "ID_Einst_Sprache_akt": (29, Unknown), + "ID_Switchoff_Zahler": (30, Unknown), + "ID_Switchoff_index": (31, Unknown), + "ID_Einst_EvuTyp_akt": (32, Unknown), + "ID_Einst_RFVEinb_akt": (33, Unknown), + "ID_Einst_AbtZykMax_akt": (34, Unknown), + "ID_Einst_HREinb_akt": (35, Unknown), + "ID_Einst_ZWE1Art_akt": (36, Unknown), + "ID_Einst_ZWE1Fkt_akt": (37, Unknown), + "ID_Einst_ZWE2Art_akt": (38, Unknown), + "ID_Einst_ZWE2Fkt_akt": (39, Unknown), + "ID_Einst_BWBer_akt": (40, Unknown), + "ID_Einst_En_Inst": (41, Unknown), + "ID_Einst_MK1Typ_akt": (42, Unknown), + "ID_Einst_ABTLuft_akt": (43, Unknown), + "ID_Einst_TLAbt_akt": (44, Unknown), + "ID_Einst_LAbtTime_akt": (45, Unknown), + "ID_Einst_ASDTyp_akt": (46, Unknown), + "ID_Einst_LGST_akt": (47, Unknown), + "ID_Einst_BwWpTime_akt": (48, Unknown), + "ID_Einst_Popt_akt": (49, Unknown), + "ID_Einst_Kurzprog_akt": (50, Unknown), + "ID_Timer_Kurzprog_akt": (51, Unknown), + "ID_Einst_ManAbt_akt": (52, Unknown), + "ID_Einst_Ahz_akt": (53, Unknown), + "ID_Einst_TVL_Ahz_1": (54, Unknown), + "ID_Einst_TVL_Ahz_2": (55, Unknown), + "ID_Einst_TVL_Ahz_3": (56, Unknown), + "ID_Einst_TVL_Ahz_4": (57, Unknown), + "ID_Einst_TVL_Ahz_5": (58, Unknown), + "ID_Einst_TVL_Ahz_6": (59, Unknown), + "ID_Einst_TVL_Ahz_7": (60, Unknown), + "ID_Einst_TVL_Ahz_8": (61, Unknown), + "ID_Einst_TVL_Ahz_9": (62, Unknown), + "ID_Einst_TVL_Ahz_10": (63, Unknown), + "ID_Einst_TVL_Std_1": (64, Unknown), + "ID_Einst_TVL_Std_2": (65, Unknown), + "ID_Einst_TVL_Std_3": (66, Unknown), + "ID_Einst_TVL_Std_4": (67, Unknown), + "ID_Einst_TVL_Std_5": (68, Unknown), + "ID_Einst_TVL_Std_6": (69, Unknown), + "ID_Einst_TVL_Std_7": (70, Unknown), + "ID_Einst_TVL_Std_8": (71, Unknown), + "ID_Einst_TVL_Std_9": (72, Unknown), + "ID_Einst_TVL_Std_10": (73, Unknown), + "ID_Einst_BWS_Hyst_akt": (74, Kelvin), + "ID_Temp_TBW_BwHD_saved": (75, Unknown), + "ID_Einst_ABT1_akt": (76, Unknown), + "ID_Einst_LABTpaus_akt": (77, Unknown), + "ID_AHZ_state_akt": (78, Unknown), + "ID_Sollwert_TRL_HZ_AHZ": (79, Celsius), + "ID_AHP_valid_records": (80, Unknown), + "ID_Timer_AHZ_akt": (81, Unknown), + "ID_Einst_BWTINP_akt": (82, Unknown), + "ID_Einst_ZUPTYP_akt": (83, Unknown), + "ID_Sollwert_TLG_max": (84, Unknown), + "ID_Einst_BWZIP_akt": (85, Unknown), + "ID_Einst_ERRmZWE_akt": (86, Unknown), + "ID_Einst_TRBegr_akt": (87, Unknown), + "ID_Einst_HRHyst_akt": (88, Unknown), + "ID_Einst_TRErhmax_akt": (89, Unknown), + "ID_Einst_ZWEFreig_akt": (90, Unknown), + "ID_Einst_TAmax_akt": (91, Unknown), + "ID_Einst_TAmin_akt": (92, Unknown), + "ID_Einst_TWQmin_akt": (93, Unknown), + "ID_Einst_THGmax_akt": (94, Unknown), + "ID_Einst_FRGT2VD_akt": (95, Unknown), + "ID_Einst_TV2VDBW_akt": (96, Unknown), + "ID_Einst_SuAll_akt": (97, Unknown), + "ID_Einst_TAbtEnd_akt": (98, Unknown), + "ID_Einst_NrKlingel_akt": (99, Unknown), + "ID_Einst_BWStyp_akt": (100, Unknown), + "ID_Einst_ABT2_akt": (101, Unknown), + "ID_Einst_UeVd_akt": (102, Unknown), + "ID_Einst_RTyp_akt": (103, Unknown), + "ID_Einst_AhpM_akt": (104, Unknown), + "ID_Soll_BWS_akt": (105, Celsius), + "ID_Timer_Password": (106, Unknown), + "ID_Einst_Zugangscode": (107, Unknown), + "ID_Einst_BA_Kuehl_akt": (108, CoolingMode), + "ID_Sollwert_Kuehl1_akt": (109, Unknown), + "ID_Einst_KuehlFreig_akt": (110, Celsius), + "ID_Einst_TAbsMin_akt": (111, Unknown), + "ID_TWQmin_saved": (112, Unknown), + "ID_CWP_saved": (113, Unknown), + "ID_Einst_Anode_akt": (114, Unknown), + "ID_Timer_pexoff_akt": (115, Unknown), + "ID_Einst_AnlPrio_Hzakt": (116, Unknown), + "ID_Einst_AnlPrio_Bwakt": (117, Unknown), + "ID_Einst_AnlPrio_Swakt": (118, Unknown), + "ID_Ba_Sw_akt": (119, PoolMode), + "ID_Einst_RTypMK1_akt": (120, Unknown), + "ID_Einst_RTypMK2_akt": (121, Unknown), + "ID_Einst_TDC_Ein_akt": (122, Kelvin), + "ID_Einst_TDC_Aus_akt": (123, Kelvin), + "ID_Einst_TDC_Max_akt": (124, Celsius), + "ID_Einst_HysHzExEn_akt": (125, Unknown), + "ID_Einst_HysBwExEn_akt": (126, Unknown), + "ID_Einst_ZWE3Art_akt": (127, Unknown), + "ID_Einst_ZWE3Fkt_akt": (128, Unknown), + "ID_Einst_HzSup_akt": (129, Unknown), + "ID_Einst_MK2Typ_akt": (130, Unknown), + "ID_Einst_KuTyp_akt": (131, Unknown), + "ID_Sollwert_KuCft1_akt": (132, Celsius), + "ID_Sollwert_KuCft2_akt": (133, Celsius), + "ID_Sollwert_AtDif1_akt": (134, Celsius), + "ID_Sollwert_AtDif2_akt": (135, Celsius), + "ID_SU_FrkdSwb": (136, Unknown), + "ID_Einst_SwbBer_akt": (137, Unknown), + "ID_Einst_TV2VDSWB_akt": (138, Unknown), + "ID_Einst_MinSwan_Time_akt": (139, Unknown), + "ID_Einst_SuMk2_akt": (140, Unknown), + "ID_Einst_HzMK2E_akt": (141, Unknown), + "ID_Einst_HzMK2ANH_akt": (142, Unknown), + "ID_Einst_HzMK2ABS_akt": (143, Unknown), + "ID_Einst_HzMK2Hgr_akt": (144, Unknown), + "ID_Einst_HzFtMK2Vl_akt": (145, Unknown), + "ID_Temp_THG_BwHD_saved": (146, Unknown), + "ID_Temp_TA_BwHD_saved": (147, Unknown), + "ID_Einst_BwHup_akt": (148, Unknown), + "ID_Einst_TVLmax_akt": (149, Unknown), + "ID_Einst_MK1LzFaktor_akt": (150, Unknown), + "ID_Einst_MK2LzFaktor_akt": (151, Unknown), + "ID_Einst_MK1PerFaktor_akt": (152, Unknown), + "ID_Einst_MK2PerFaktor_akt": (153, Unknown), + "ID_Entl_Zyklus_akt": (154, Unknown), + "ID_Einst_Entl_time_akt": (155, Unknown), + "ID_Entl_Pause": (156, Unknown), + "ID_Entl_timer": (157, Unknown), + "ID_Einst_Entl_akt": (158, Unknown), + "ID_Ahz_HLeist_confirmed": (159, Unknown), + "ID_FirstInit_akt": (160, Unknown), + "ID_Einst_SuAll_akt2": (161, Unknown), + "ID_Einst_SuAllWo_zeit_0_0": (162, Unknown), + "ID_Einst_SuAllWo_zeit_0_1": (163, Unknown), + "ID_Einst_SuAllWo_zeit_1_0": (164, Unknown), + "ID_Einst_SuAllWo_zeit_1_1": (165, Unknown), + "ID_Einst_SuAllWo_zeit_2_0": (166, Unknown), + "ID_Einst_SuAllWo_zeit_2_1": (167, Unknown), + "ID_Einst_SuAll25_zeit_0_0": (168, Unknown), + "ID_Einst_SuAll25_zeit_0_1": (169, Unknown), + "ID_Einst_SuAll25_zeit_1_0": (170, Unknown), + "ID_Einst_SuAll25_zeit_1_1": (171, Unknown), + "ID_Einst_SuAll25_zeit_2_0": (172, Unknown), + "ID_Einst_SuAll25_zeit_2_1": (173, Unknown), + "ID_Einst_SuAll25_zeit_0_2": (174, Unknown), + "ID_Einst_SuAll25_zeit_0_3": (175, Unknown), + "ID_Einst_SuAll25_zeit_1_2": (176, Unknown), + "ID_Einst_SuAll25_zeit_1_3": (177, Unknown), + "ID_Einst_SuAll25_zeit_2_2": (178, Unknown), + "ID_Einst_SuAll25_zeit_2_3": (179, Unknown), + "ID_Einst_SuAllTg_zeit_0_0": (180, Unknown), + "ID_Einst_SuAllTg_zeit_0_1": (181, Unknown), + "ID_Einst_SuAllTg_zeit_1_0": (182, Unknown), + "ID_Einst_SuAllTg_zeit_1_1": (183, Unknown), + "ID_Einst_SuAllTg_zeit_2_0": (184, Unknown), + "ID_Einst_SuAllTg_zeit_2_1": (185, Unknown), + "ID_Einst_SuAllTg_zeit_0_2": (186, Unknown), + "ID_Einst_SuAllTg_zeit_0_3": (187, Unknown), + "ID_Einst_SuAllTg_zeit_1_2": (188, Unknown), + "ID_Einst_SuAllTg_zeit_1_3": (189, Unknown), + "ID_Einst_SuAllTg_zeit_2_2": (190, Unknown), + "ID_Einst_SuAllTg_zeit_2_3": (191, Unknown), + "ID_Einst_SuAllTg_zeit_0_4": (192, Unknown), + "ID_Einst_SuAllTg_zeit_0_5": (193, Unknown), + "ID_Einst_SuAllTg_zeit_1_4": (194, Unknown), + "ID_Einst_SuAllTg_zeit_1_5": (195, Unknown), + "ID_Einst_SuAllTg_zeit_2_4": (196, Unknown), + "ID_Einst_SuAllTg_zeit_2_5": (197, Unknown), + "ID_Einst_SuAllTg_zeit_0_6": (198, Unknown), + "ID_Einst_SuAllTg_zeit_0_7": (199, Unknown), + "ID_Einst_SuAllTg_zeit_1_6": (200, Unknown), + "ID_Einst_SuAllTg_zeit_1_7": (201, Unknown), + "ID_Einst_SuAllTg_zeit_2_6": (202, Unknown), + "ID_Einst_SuAllTg_zeit_2_7": (203, Unknown), + "ID_Einst_SuAllTg_zeit_0_8": (204, Unknown), + "ID_Einst_SuAllTg_zeit_0_9": (205, Unknown), + "ID_Einst_SuAllTg_zeit_1_8": (206, Unknown), + "ID_Einst_SuAllTg_zeit_1_9": (207, Unknown), + "ID_Einst_SuAllTg_zeit_2_8": (208, Unknown), + "ID_Einst_SuAllTg_zeit_2_9": (209, Unknown), + "ID_Einst_SuAllTg_zeit_0_10": (210, Unknown), + "ID_Einst_SuAllTg_zeit_0_11": (211, Unknown), + "ID_Einst_SuAllTg_zeit_1_10": (212, Unknown), + "ID_Einst_SuAllTg_zeit_1_11": (213, Unknown), + "ID_Einst_SuAllTg_zeit_2_10": (214, Unknown), + "ID_Einst_SuAllTg_zeit_2_11": (215, Unknown), + "ID_Einst_SuAllTg_zeit_0_12": (216, Unknown), + "ID_Einst_SuAllTg_zeit_0_13": (217, Unknown), + "ID_Einst_SuAllTg_zeit_1_12": (218, Unknown), + "ID_Einst_SuAllTg_zeit_1_13": (219, Unknown), + "ID_Einst_SuAllTg_zeit_2_12": (220, Unknown), + "ID_Einst_SuAllTg_zeit_2_13": (221, Unknown), + "ID_Einst_SuHkr_akt": (222, Unknown), + "ID_Einst_SuHkrW0_zeit_0_0": (223, Unknown), + "ID_Einst_SuHkrW0_zeit_0_1": (224, Unknown), + "ID_Einst_SuHkrW0_zeit_1_0": (225, Unknown), + "ID_Einst_SuHkrW0_zeit_1_1": (226, Unknown), + "ID_Einst_SuHkrW0_zeit_2_0": (227, Unknown), + "ID_Einst_SuHkrW0_zeit_2_1": (228, Unknown), + "ID_Einst_SuHkr25_zeit_0_0": (229, Unknown), + "ID_Einst_SuHkr25_zeit_0_1": (230, Unknown), + "ID_Einst_SuHkr25_zeit_1_0": (231, Unknown), + "ID_Einst_SuHkr25_zeit_1_1": (232, Unknown), + "ID_Einst_SuHkr25_zeit_2_0": (233, Unknown), + "ID_Einst_SuHkr25_zeit_2_1": (234, Unknown), + "ID_Einst_SuHkr25_zeit_0_2": (235, Unknown), + "ID_Einst_SuHkr25_zeit_0_3": (236, Unknown), + "ID_Einst_SuHkr25_zeit_1_2": (237, Unknown), + "ID_Einst_SuHkr25_zeit_1_3": (238, Unknown), + "ID_Einst_SuHkr25_zeit_2_2": (239, Unknown), + "ID_Einst_SuHkr25_zeit_2_3": (240, Unknown), + "ID_Einst_SuHkrTG_zeit_0_0": (241, Unknown), + "ID_Einst_SuHkrTG_zeit_0_1": (242, Unknown), + "ID_Einst_SuHkrTG_zeit_1_0": (243, Unknown), + "ID_Einst_SuHkrTG_zeit_1_1": (244, Unknown), + "ID_Einst_SuHkrTG_zeit_2_0": (245, Unknown), + "ID_Einst_SuHkrTG_zeit_2_1": (246, Unknown), + "ID_Einst_SuHkrTG_zeit_0_2": (247, Unknown), + "ID_Einst_SuHkrTG_zeit_0_3": (248, Unknown), + "ID_Einst_SuHkrTG_zeit_1_2": (249, Unknown), + "ID_Einst_SuHkrTG_zeit_1_3": (250, Unknown), + "ID_Einst_SuHkrTG_zeit_2_2": (251, Unknown), + "ID_Einst_SuHkrTG_zeit_2_3": (252, Unknown), + "ID_Einst_SuHkrTG_zeit_0_4": (253, Unknown), + "ID_Einst_SuHkrTG_zeit_0_5": (254, Unknown), + "ID_Einst_SuHkrTG_zeit_1_4": (255, Unknown), + "ID_Einst_SuHkrTG_zeit_1_5": (256, Unknown), + "ID_Einst_SuHkrTG_zeit_2_4": (257, Unknown), + "ID_Einst_SuHkrTG_zeit_2_5": (258, Unknown), + "ID_Einst_SuHkrTG_zeit_0_6": (259, Unknown), + "ID_Einst_SuHkrTG_zeit_0_7": (260, Unknown), + "ID_Einst_SuHkrTG_zeit_1_6": (261, Unknown), + "ID_Einst_SuHkrTG_zeit_1_7": (262, Unknown), + "ID_Einst_SuHkrTG_zeit_2_6": (263, Unknown), + "ID_Einst_SuHkrTG_zeit_2_7": (264, Unknown), + "ID_Einst_SuHkrTG_zeit_0_8": (265, Unknown), + "ID_Einst_SuHkrTG_zeit_0_9": (266, Unknown), + "ID_Einst_SuHkrTG_zeit_1_8": (267, Unknown), + "ID_Einst_SuHkrTG_zeit_1_9": (268, Unknown), + "ID_Einst_SuHkrTG_zeit_2_8": (269, Unknown), + "ID_Einst_SuHkrTG_zeit_2_9": (270, Unknown), + "ID_Einst_SuHkrTG_zeit_0_10": (271, Unknown), + "ID_Einst_SuHkrTG_zeit_0_11": (272, Unknown), + "ID_Einst_SuHkrTG_zeit_1_10": (273, Unknown), + "ID_Einst_SuHkrTG_zeit_1_11": (274, Unknown), + "ID_Einst_SuHkrTG_zeit_2_10": (275, Unknown), + "ID_Einst_SuHkrTG_zeit_2_11": (276, Unknown), + "ID_Einst_SuHkrTG_zeit_0_12": (277, Unknown), + "ID_Einst_SuHkrTG_zeit_0_13": (278, Unknown), + "ID_Einst_SuHkrTG_zeit_1_12": (279, Unknown), + "ID_Einst_SuHkrTG_zeit_1_13": (280, Unknown), + "ID_Einst_SuHkrTG_zeit_2_12": (281, Unknown), + "ID_Einst_SuHkrTG_zeit_2_13": (282, Unknown), + "ID_Einst_SuMk1_akt": (283, Unknown), + "ID_Einst_SuMk1W0_zeit_0_0": (284, Unknown), + "ID_Einst_SuMk1W0_zeit_0_1": (285, Unknown), + "ID_Einst_SuMk1W0_zeit_1_0": (286, Unknown), + "ID_Einst_SuMk1W0_zeit_1_1": (287, Unknown), + "ID_Einst_SuMk1W0_zeit_2_0": (288, Unknown), + "ID_Einst_SuMk1W0_zeit_2_1": (289, Unknown), + "ID_Einst_SuMk125_zeit_0_0": (290, Unknown), + "ID_Einst_SuMk125_zeit_0_1": (291, Unknown), + "ID_Einst_SuMk125_zeit_1_0": (292, Unknown), + "ID_Einst_SuMk125_zeit_1_1": (293, Unknown), + "ID_Einst_SuMk125_zeit_2_0": (294, Unknown), + "ID_Einst_SuMk125_zeit_2_1": (295, Unknown), + "ID_Einst_SuMk125_zeit_0_2": (296, Unknown), + "ID_Einst_SuMk125_zeit_0_3": (297, Unknown), + "ID_Einst_SuMk125_zeit_1_2": (298, Unknown), + "ID_Einst_SuMk125_zeit_1_3": (299, Unknown), + "ID_Einst_SuMk125_zeit_2_2": (300, Unknown), + "ID_Einst_SuMk125_zeit_2_3": (301, Unknown), + "ID_Einst_SuMk1TG_zeit_0_0": (302, Unknown), + "ID_Einst_SuMk1TG_zeit_0_1": (303, Unknown), + "ID_Einst_SuMk1TG_zeit_1_0": (304, Unknown), + "ID_Einst_SuMk1TG_zeit_1_1": (305, Unknown), + "ID_Einst_SuMk1TG_zeit_2_0": (306, Unknown), + "ID_Einst_SuMk1TG_zeit_2_1": (307, Unknown), + "ID_Einst_SuMk1TG_zeit_0_2": (308, Unknown), + "ID_Einst_SuMk1TG_zeit_0_3": (309, Unknown), + "ID_Einst_SuMk1TG_zeit_1_2": (310, Unknown), + "ID_Einst_SuMk1TG_zeit_1_3": (311, Unknown), + "ID_Einst_SuMk1TG_zeit_2_2": (312, Unknown), + "ID_Einst_SuMk1TG_zeit_2_3": (313, Unknown), + "ID_Einst_SuMk1TG_zeit_0_4": (314, Unknown), + "ID_Einst_SuMk1TG_zeit_0_5": (315, Unknown), + "ID_Einst_SuMk1TG_zeit_1_4": (316, Unknown), + "ID_Einst_SuMk1TG_zeit_1_5": (317, Unknown), + "ID_Einst_SuMk1TG_zeit_2_4": (318, Unknown), + "ID_Einst_SuMk1TG_zeit_2_5": (319, Unknown), + "ID_Einst_SuMk1TG_zeit_0_6": (320, Unknown), + "ID_Einst_SuMk1TG_zeit_0_7": (321, Unknown), + "ID_Einst_SuMk1TG_zeit_1_6": (322, Unknown), + "ID_Einst_SuMk1TG_zeit_1_7": (323, Unknown), + "ID_Einst_SuMk1TG_zeit_2_6": (324, Unknown), + "ID_Einst_SuMk1TG_zeit_2_7": (325, Unknown), + "ID_Einst_SuMk1TG_zeit_0_8": (326, Unknown), + "ID_Einst_SuMk1TG_zeit_0_9": (327, Unknown), + "ID_Einst_SuMk1TG_zeit_1_8": (328, Unknown), + "ID_Einst_SuMk1TG_zeit_1_9": (329, Unknown), + "ID_Einst_SuMk1TG_zeit_2_8": (330, Unknown), + "ID_Einst_SuMk1TG_zeit_2_9": (331, Unknown), + "ID_Einst_SuMk1TG_zeit_0_10": (332, Unknown), + "ID_Einst_SuMk1TG_zeit_0_11": (333, Unknown), + "ID_Einst_SuMk1TG_zeit_1_10": (334, Unknown), + "ID_Einst_SuMk1TG_zeit_1_11": (335, Unknown), + "ID_Einst_SuMk1TG_zeit_2_10": (336, Unknown), + "ID_Einst_SuMk1TG_zeit_2_11": (337, Unknown), + "ID_Einst_SuMk1TG_zeit_0_12": (338, Unknown), + "ID_Einst_SuMk1TG_zeit_0_13": (339, Unknown), + "ID_Einst_SuMk1TG_zeit_1_12": (340, Unknown), + "ID_Einst_SuMk1TG_zeit_1_13": (341, Unknown), + "ID_Einst_SuMk1TG_zeit_2_12": (342, Unknown), + "ID_Einst_SuMk1TG_zeit_2_13": (343, Unknown), + "ID_Einst_SuMk2_akt2": (344, Unknown), + "ID_Einst_SuMk2Wo_zeit_0_0": (345, Unknown), + "ID_Einst_SuMk2Wo_zeit_0_1": (346, Unknown), + "ID_Einst_SuMk2Wo_zeit_1_0": (347, Unknown), + "ID_Einst_SuMk2Wo_zeit_1_1": (348, Unknown), + "ID_Einst_SuMk2Wo_zeit_2_0": (349, Unknown), + "ID_Einst_SuMk2Wo_zeit_2_1": (350, Unknown), + "ID_Einst_SuMk225_zeit_0_0": (351, Unknown), + "ID_Einst_SuMk225_zeit_0_1": (352, Unknown), + "ID_Einst_SuMk225_zeit_1_0": (353, Unknown), + "ID_Einst_SuMk225_zeit_1_1": (354, Unknown), + "ID_Einst_SuMk225_zeit_2_0": (355, Unknown), + "ID_Einst_SuMk225_zeit_2_1": (356, Unknown), + "ID_Einst_SuMk225_zeit_0_2": (357, Unknown), + "ID_Einst_SuMk225_zeit_0_3": (358, Unknown), + "ID_Einst_SuMk225_zeit_1_2": (359, Unknown), + "ID_Einst_SuMk225_zeit_1_3": (360, Unknown), + "ID_Einst_SuMk225_zeit_2_2": (361, Unknown), + "ID_Einst_SuMk225_zeit_2_3": (362, Unknown), + "ID_Einst_SuMk2Tg_zeit_0_0": (363, Unknown), + "ID_Einst_SuMk2Tg_zeit_0_1": (364, Unknown), + "ID_Einst_SuMk2Tg_zeit_1_0": (365, Unknown), + "ID_Einst_SuMk2Tg_zeit_1_1": (366, Unknown), + "ID_Einst_SuMk2Tg_zeit_2_0": (367, Unknown), + "ID_Einst_SuMk2Tg_zeit_2_1": (368, Unknown), + "ID_Einst_SuMk2Tg_zeit_0_2": (369, Unknown), + "ID_Einst_SuMk2Tg_zeit_0_3": (370, Unknown), + "ID_Einst_SuMk2Tg_zeit_1_2": (371, Unknown), + "ID_Einst_SuMk2Tg_zeit_1_3": (372, Unknown), + "ID_Einst_SuMk2Tg_zeit_2_2": (373, Unknown), + "ID_Einst_SuMk2Tg_zeit_2_3": (374, Unknown), + "ID_Einst_SuMk2Tg_zeit_0_4": (375, Unknown), + "ID_Einst_SuMk2Tg_zeit_0_5": (376, Unknown), + "ID_Einst_SuMk2Tg_zeit_1_4": (377, Unknown), + "ID_Einst_SuMk2Tg_zeit_1_5": (378, Unknown), + "ID_Einst_SuMk2Tg_zeit_2_4": (379, Unknown), + "ID_Einst_SuMk2Tg_zeit_2_5": (380, Unknown), + "ID_Einst_SuMk2Tg_zeit_0_6": (381, Unknown), + "ID_Einst_SuMk2Tg_zeit_0_7": (382, Unknown), + "ID_Einst_SuMk2Tg_zeit_1_6": (383, Unknown), + "ID_Einst_SuMk2Tg_zeit_1_7": (384, Unknown), + "ID_Einst_SuMk2Tg_zeit_2_6": (385, Unknown), + "ID_Einst_SuMk2Tg_zeit_2_7": (386, Unknown), + "ID_Einst_SuMk2Tg_zeit_0_8": (387, Unknown), + "ID_Einst_SuMk2Tg_zeit_0_9": (388, Unknown), + "ID_Einst_SuMk2Tg_zeit_1_8": (389, Unknown), + "ID_Einst_SuMk2Tg_zeit_1_9": (390, Unknown), + "ID_Einst_SuMk2Tg_zeit_2_8": (391, Unknown), + "ID_Einst_SuMk2Tg_zeit_2_9": (392, Unknown), + "ID_Einst_SuMk2Tg_zeit_0_10": (393, Unknown), + "ID_Einst_SuMk2Tg_zeit_0_11": (394, Unknown), + "ID_Einst_SuMk2Tg_zeit_1_10": (395, Unknown), + "ID_Einst_SuMk2Tg_zeit_1_11": (396, Unknown), + "ID_Einst_SuMk2Tg_zeit_2_10": (397, Unknown), + "ID_Einst_SuMk2Tg_zeit_2_11": (398, Unknown), + "ID_Einst_SuMk2Tg_zeit_0_12": (399, Unknown), + "ID_Einst_SuMk2Tg_zeit_0_13": (400, Unknown), + "ID_Einst_SuMk2Tg_zeit_1_12": (401, Unknown), + "ID_Einst_SuMk2Tg_zeit_1_13": (402, Unknown), + "ID_Einst_SuMk2Tg_zeit_2_12": (403, Unknown), + "ID_Einst_SuMk2Tg_zeit_2_13": (404, Unknown), + "ID_Einst_SUBW_akt2": (405, Unknown), + "ID_Einst_SuBwWO_zeit_0_0": (406, Unknown), + "ID_Einst_SuBwWO_zeit_0_1": (407, Unknown), + "ID_Einst_SuBwWO_zeit_1_0": (408, Unknown), + "ID_Einst_SuBwWO_zeit_1_1": (409, Unknown), + "ID_Einst_SuBwWO_zeit_2_0": (410, Unknown), + "ID_Einst_SuBwWO_zeit_2_1": (411, Unknown), + "ID_Einst_SuBwWO_zeit_3_0": (412, Unknown), + "ID_Einst_SuBwWO_zeit_3_1": (413, Unknown), + "ID_Einst_SuBwWO_zeit_4_0": (414, Unknown), + "ID_Einst_SuBwWO_zeit_4_1": (415, Unknown), + "ID_Einst_SuBw25_zeit_0_0": (416, Unknown), + "ID_Einst_SuBw25_zeit_0_1": (417, Unknown), + "ID_Einst_SuBw25_zeit_1_0": (418, Unknown), + "ID_Einst_SuBw25_zeit_1_1": (419, Unknown), + "ID_Einst_SuBw25_zeit_2_0": (420, Unknown), + "ID_Einst_SuBw25_zeit_2_1": (421, Unknown), + "ID_Einst_SuBw25_zeit_3_0": (422, Unknown), + "ID_Einst_SuBw25_zeit_3_1": (423, Unknown), + "ID_Einst_SuBw25_zeit_4_0": (424, Unknown), + "ID_Einst_SuBw25_zeit_4_1": (425, Unknown), + "ID_Einst_SuBw25_zeit_0_2": (426, Unknown), + "ID_Einst_SuBw25_zeit_0_3": (427, Unknown), + "ID_Einst_SuBw25_zeit_1_2": (428, Unknown), + "ID_Einst_SuBw25_zeit_1_3": (429, Unknown), + "ID_Einst_SuBw25_zeit_2_2": (430, Unknown), + "ID_Einst_SuBw25_zeit_2_3": (431, Unknown), + "ID_Einst_SuBw25_zeit_3_2": (432, Unknown), + "ID_Einst_SuBw25_zeit_3_3": (433, Unknown), + "ID_Einst_SuBw25_zeit_4_2": (434, Unknown), + "ID_Einst_SuBw25_zeit_4_3": (435, Unknown), + "ID_Einst_SuBwTG_zeit_0_0": (436, Unknown), + "ID_Einst_SuBwTG_zeit_0_1": (437, Unknown), + "ID_Einst_SuBwTG_zeit_1_0": (438, Unknown), + "ID_Einst_SuBwTG_zeit_1_1": (439, Unknown), + "ID_Einst_SuBwTG_zeit_2_0": (440, Unknown), + "ID_Einst_SuBwTG_zeit_2_1": (441, Unknown), + "ID_Einst_SuBwTG_zeit_3_0": (442, Unknown), + "ID_Einst_SuBwTG_zeit_3_1": (443, Unknown), + "ID_Einst_SuBwTG_zeit_4_0": (444, Unknown), + "ID_Einst_SuBwTG_zeit_4_1": (445, Unknown), + "ID_Einst_SuBwTG_zeit_0_2": (446, Unknown), + "ID_Einst_SuBwTG_zeit_0_3": (447, Unknown), + "ID_Einst_SuBwTG_zeit_1_2": (448, Unknown), + "ID_Einst_SuBwTG_zeit_1_3": (449, Unknown), + "ID_Einst_SuBwTG_zeit_2_2": (450, Unknown), + "ID_Einst_SuBwTG_zeit_2_3": (451, Unknown), + "ID_Einst_SuBwTG_zeit_3_2": (452, Unknown), + "ID_Einst_SuBwTG_zeit_3_3": (453, Unknown), + "ID_Einst_SuBwTG_zeit_4_2": (454, Unknown), + "ID_Einst_SuBwTG_zeit_4_3": (455, Unknown), + "ID_Einst_SuBwTG_zeit_0_4": (456, Unknown), + "ID_Einst_SuBwTG_zeit_0_5": (457, Unknown), + "ID_Einst_SuBwTG_zeit_1_4": (458, Unknown), + "ID_Einst_SuBwTG_zeit_1_5": (459, Unknown), + "ID_Einst_SuBwTG_zeit_2_4": (460, Unknown), + "ID_Einst_SuBwTG_zeit_2_5": (461, Unknown), + "ID_Einst_SuBwTG_zeit_3_4": (462, Unknown), + "ID_Einst_SuBwTG_zeit_3_5": (463, Unknown), + "ID_Einst_SuBwTG_zeit_4_4": (464, Unknown), + "ID_Einst_SuBwTG_zeit_4_5": (465, Unknown), + "ID_Einst_SuBwTG_zeit_0_6": (466, Unknown), + "ID_Einst_SuBwTG_zeit_0_7": (467, Unknown), + "ID_Einst_SuBwTG_zeit_1_6": (468, Unknown), + "ID_Einst_SuBwTG_zeit_1_7": (469, Unknown), + "ID_Einst_SuBwTG_zeit_2_6": (470, Unknown), + "ID_Einst_SuBwTG_zeit_2_7": (471, Unknown), + "ID_Einst_SuBwTG_zeit_3_6": (472, Unknown), + "ID_Einst_SuBwTG_zeit_3_7": (473, Unknown), + "ID_Einst_SuBwTG_zeit_4_6": (474, Unknown), + "ID_Einst_SuBwTG_zeit_4_7": (475, Unknown), + "ID_Einst_SuBwTG_zeit_0_8": (476, Unknown), + "ID_Einst_SuBwTG_zeit_0_9": (477, Unknown), + "ID_Einst_SuBwTG_zeit_1_8": (478, Unknown), + "ID_Einst_SuBwTG_zeit_1_9": (479, Unknown), + "ID_Einst_SuBwTG_zeit_2_8": (480, Unknown), + "ID_Einst_SuBwTG_zeit_2_9": (481, Unknown), + "ID_Einst_SuBwTG_zeit_3_8": (482, Unknown), + "ID_Einst_SuBwTG_zeit_3_9": (483, Unknown), + "ID_Einst_SuBwTG_zeit_4_8": (484, Unknown), + "ID_Einst_SuBwTG_zeit_4_9": (485, Unknown), + "ID_Einst_SuBwTG_zeit_0_10": (486, Unknown), + "ID_Einst_SuBwTG_zeit_0_11": (487, Unknown), + "ID_Einst_SuBwTG_zeit_1_10": (488, Unknown), + "ID_Einst_SuBwTG_zeit_1_11": (489, Unknown), + "ID_Einst_SuBwTG_zeit_2_10": (490, Unknown), + "ID_Einst_SuBwTG_zeit_2_11": (491, Unknown), + "ID_Einst_SuBwTG_zeit_3_10": (492, Unknown), + "ID_Einst_SuBwTG_zeit_3_11": (493, Unknown), + "ID_Einst_SuBwTG_zeit_4_10": (494, Unknown), + "ID_Einst_SuBwTG_zeit_4_11": (495, Unknown), + "ID_Einst_SuBwTG_zeit_0_12": (496, Unknown), + "ID_Einst_SuBwTG_zeit_0_13": (497, Unknown), + "ID_Einst_SuBwTG_zeit_1_12": (498, Unknown), + "ID_Einst_SuBwTG_zeit_1_13": (499, Unknown), + "ID_Einst_SuBwTG_zeit_2_12": (500, Unknown), + "ID_Einst_SuBwTG_zeit_2_13": (501, Unknown), + "ID_Einst_SuBwTG_zeit_3_12": (502, Unknown), + "ID_Einst_SuBwTG_zeit_3_13": (503, Unknown), + "ID_Einst_SuBwTG_zeit_4_12": (504, Unknown), + "ID_Einst_SuBwTG_zeit_4_13": (505, Unknown), + "ID_Einst_SuZIP_akt": (506, Unknown), + "ID_Einst_SuZIPWo_zeit_0_0": (507, Unknown), + "ID_Einst_SuZIPWo_zeit_0_1": (508, Unknown), + "ID_Einst_SuZIPWo_zeit_1_0": (509, Unknown), + "ID_Einst_SuZIPWo_zeit_1_1": (510, Unknown), + "ID_Einst_SuZIPWo_zeit_2_0": (511, Unknown), + "ID_Einst_SuZIPWo_zeit_2_1": (512, Unknown), + "ID_Einst_SuZIPWo_zeit_3_0": (513, Unknown), + "ID_Einst_SuZIPWo_zeit_3_1": (514, Unknown), + "ID_Einst_SuZIPWo_zeit_4_0": (515, Unknown), + "ID_Einst_SuZIPWo_zeit_4_1": (516, Unknown), + "ID_Einst_SuZIP25_zeit_0_0": (517, Unknown), + "ID_Einst_SuZIP25_zeit_0_1": (518, Unknown), + "ID_Einst_SuZIP25_zeit_1_0": (519, Unknown), + "ID_Einst_SuZIP25_zeit_1_1": (520, Unknown), + "ID_Einst_SuZIP25_zeit_2_0": (521, Unknown), + "ID_Einst_SuZIP25_zeit_2_1": (522, Unknown), + "ID_Einst_SuZIP25_zeit_3_0": (523, Unknown), + "ID_Einst_SuZIP25_zeit_3_1": (524, Unknown), + "ID_Einst_SuZIP25_zeit_4_0": (525, Unknown), + "ID_Einst_SuZIP25_zeit_4_1": (526, Unknown), + "ID_Einst_SuZIP25_zeit_0_2": (527, Unknown), + "ID_Einst_SuZIP25_zeit_0_3": (528, Unknown), + "ID_Einst_SuZIP25_zeit_1_2": (529, Unknown), + "ID_Einst_SuZIP25_zeit_1_3": (530, Unknown), + "ID_Einst_SuZIP25_zeit_2_2": (531, Unknown), + "ID_Einst_SuZIP25_zeit_2_3": (532, Unknown), + "ID_Einst_SuZIP25_zeit_3_2": (533, Unknown), + "ID_Einst_SuZIP25_zeit_3_3": (534, Unknown), + "ID_Einst_SuZIP25_zeit_4_2": (535, Unknown), + "ID_Einst_SuZIP25_zeit_4_3": (536, Unknown), + "ID_Einst_SuZIPTg_zeit_0_0": (537, Unknown), + "ID_Einst_SuZIPTg_zeit_0_1": (538, Unknown), + "ID_Einst_SuZIPTg_zeit_1_0": (539, Unknown), + "ID_Einst_SuZIPTg_zeit_1_1": (540, Unknown), + "ID_Einst_SuZIPTg_zeit_2_0": (541, Unknown), + "ID_Einst_SuZIPTg_zeit_2_1": (542, Unknown), + "ID_Einst_SuZIPTg_zeit_3_0": (543, Unknown), + "ID_Einst_SuZIPTg_zeit_3_1": (544, Unknown), + "ID_Einst_SuZIPTg_zeit_4_0": (545, Unknown), + "ID_Einst_SuZIPTg_zeit_4_1": (546, Unknown), + "ID_Einst_SuZIPTg_zeit_0_2": (547, Unknown), + "ID_Einst_SuZIPTg_zeit_0_3": (548, Unknown), + "ID_Einst_SuZIPTg_zeit_1_2": (549, Unknown), + "ID_Einst_SuZIPTg_zeit_1_3": (550, Unknown), + "ID_Einst_SuZIPTg_zeit_2_2": (551, Unknown), + "ID_Einst_SuZIPTg_zeit_2_3": (552, Unknown), + "ID_Einst_SuZIPTg_zeit_3_2": (553, Unknown), + "ID_Einst_SuZIPTg_zeit_3_3": (554, Unknown), + "ID_Einst_SuZIPTg_zeit_4_2": (555, Unknown), + "ID_Einst_SuZIPTg_zeit_4_3": (556, Unknown), + "ID_Einst_SuZIPTg_zeit_0_4": (557, Unknown), + "ID_Einst_SuZIPTg_zeit_0_5": (558, Unknown), + "ID_Einst_SuZIPTg_zeit_1_4": (559, Unknown), + "ID_Einst_SuZIPTg_zeit_1_5": (560, Unknown), + "ID_Einst_SuZIPTg_zeit_2_4": (561, Unknown), + "ID_Einst_SuZIPTg_zeit_2_5": (562, Unknown), + "ID_Einst_SuZIPTg_zeit_3_4": (563, Unknown), + "ID_Einst_SuZIPTg_zeit_3_5": (564, Unknown), + "ID_Einst_SuZIPTg_zeit_4_4": (565, Unknown), + "ID_Einst_SuZIPTg_zeit_4_5": (566, Unknown), + "ID_Einst_SuZIPTg_zeit_0_6": (567, Unknown), + "ID_Einst_SuZIPTg_zeit_0_7": (568, Unknown), + "ID_Einst_SuZIPTg_zeit_1_6": (569, Unknown), + "ID_Einst_SuZIPTg_zeit_1_7": (570, Unknown), + "ID_Einst_SuZIPTg_zeit_2_6": (571, Unknown), + "ID_Einst_SuZIPTg_zeit_2_7": (572, Unknown), + "ID_Einst_SuZIPTg_zeit_3_6": (573, Unknown), + "ID_Einst_SuZIPTg_zeit_3_7": (574, Unknown), + "ID_Einst_SuZIPTg_zeit_4_6": (575, Unknown), + "ID_Einst_SuZIPTg_zeit_4_7": (576, Unknown), + "ID_Einst_SuZIPTg_zeit_0_8": (577, Unknown), + "ID_Einst_SuZIPTg_zeit_0_9": (578, Unknown), + "ID_Einst_SuZIPTg_zeit_1_8": (579, Unknown), + "ID_Einst_SuZIPTg_zeit_1_9": (580, Unknown), + "ID_Einst_SuZIPTg_zeit_2_8": (581, Unknown), + "ID_Einst_SuZIPTg_zeit_2_9": (582, Unknown), + "ID_Einst_SuZIPTg_zeit_3_8": (583, Unknown), + "ID_Einst_SuZIPTg_zeit_3_9": (584, Unknown), + "ID_Einst_SuZIPTg_zeit_4_8": (585, Unknown), + "ID_Einst_SuZIPTg_zeit_4_9": (586, Unknown), + "ID_Einst_SuZIPTg_zeit_0_10": (587, Unknown), + "ID_Einst_SuZIPTg_zeit_0_11": (588, Unknown), + "ID_Einst_SuZIPTg_zeit_1_10": (589, Unknown), + "ID_Einst_SuZIPTg_zeit_1_11": (590, Unknown), + "ID_Einst_SuZIPTg_zeit_2_10": (591, Unknown), + "ID_Einst_SuZIPTg_zeit_2_11": (592, Unknown), + "ID_Einst_SuZIPTg_zeit_3_10": (593, Unknown), + "ID_Einst_SuZIPTg_zeit_3_11": (594, Unknown), + "ID_Einst_SuZIPTg_zeit_4_10": (595, Unknown), + "ID_Einst_SuZIPTg_zeit_4_11": (596, Unknown), + "ID_Einst_SuZIPTg_zeit_0_12": (597, Unknown), + "ID_Einst_SuZIPTg_zeit_0_13": (598, Unknown), + "ID_Einst_SuZIPTg_zeit_1_12": (599, Unknown), + "ID_Einst_SuZIPTg_zeit_1_13": (600, Unknown), + "ID_Einst_SuZIPTg_zeit_2_12": (601, Unknown), + "ID_Einst_SuZIPTg_zeit_2_13": (602, Unknown), + "ID_Einst_SuZIPTg_zeit_3_12": (603, Unknown), + "ID_Einst_SuZIPTg_zeit_3_13": (604, Unknown), + "ID_Einst_SuZIPTg_zeit_4_12": (605, Unknown), + "ID_Einst_SuZIPTg_zeit_4_13": (606, Unknown), + "ID_Einst_SuSwb_akt": (607, Unknown), + "ID_Einst_SuSwbWo_zeit_0_0": (608, Unknown), + "ID_Einst_SuSwbWo_zeit_0_1": (609, Unknown), + "ID_Einst_SuSwbWo_zeit_1_0": (610, Unknown), + "ID_Einst_SuSwbWo_zeit_1_1": (611, Unknown), + "ID_Einst_SuSwbWo_zeit_2_0": (612, Unknown), + "ID_Einst_SuSwbWo_zeit_2_1": (613, Unknown), + "ID_Einst_SuSwb25_zeit_0_0": (614, Unknown), + "ID_Einst_SuSwb25_zeit_0_1": (615, Unknown), + "ID_Einst_SuSwb25_zeit_1_0": (616, Unknown), + "ID_Einst_SuSwb25_zeit_1_1": (617, Unknown), + "ID_Einst_SuSwb25_zeit_2_0": (618, Unknown), + "ID_Einst_SuSwb25_zeit_2_1": (619, Unknown), + "ID_Einst_SuSwb25_zeit_0_2": (620, Unknown), + "ID_Einst_SuSwb25_zeit_0_3": (621, Unknown), + "ID_Einst_SuSwb25_zeit_1_2": (622, Unknown), + "ID_Einst_SuSwb25_zeit_1_3": (623, Unknown), + "ID_Einst_SuSwb25_zeit_2_2": (624, Unknown), + "ID_Einst_SuSwb25_zeit_2_3": (625, Unknown), + "ID_Einst_SuSwbTg_zeit_0_0": (626, Unknown), + "ID_Einst_SuSwbTg_zeit_0_1": (627, Unknown), + "ID_Einst_SuSwbTg_zeit_1_0": (628, Unknown), + "ID_Einst_SuSwbTg_zeit_1_1": (629, Unknown), + "ID_Einst_SuSwbTg_zeit_2_0": (630, Unknown), + "ID_Einst_SuSwbTg_zeit_2_1": (631, Unknown), + "ID_Einst_SuSwbTg_zeit_0_2": (632, Unknown), + "ID_Einst_SuSwbTg_zeit_0_3": (633, Unknown), + "ID_Einst_SuSwbTg_zeit_1_2": (634, Unknown), + "ID_Einst_SuSwbTg_zeit_1_3": (635, Unknown), + "ID_Einst_SuSwbTg_zeit_2_2": (636, Unknown), + "ID_Einst_SuSwbTg_zeit_2_3": (637, Unknown), + "ID_Einst_SuSwbTg_zeit_0_4": (638, Unknown), + "ID_Einst_SuSwbTg_zeit_0_5": (639, Unknown), + "ID_Einst_SuSwbTg_zeit_1_4": (640, Unknown), + "ID_Einst_SuSwbTg_zeit_1_5": (641, Unknown), + "ID_Einst_SuSwbTg_zeit_2_4": (642, Unknown), + "ID_Einst_SuSwbTg_zeit_2_5": (643, Unknown), + "ID_Einst_SuSwbTg_zeit_0_6": (644, Unknown), + "ID_Einst_SuSwbTg_zeit_0_7": (645, Unknown), + "ID_Einst_SuSwbTg_zeit_1_6": (646, Unknown), + "ID_Einst_SuSwbTg_zeit_1_7": (647, Unknown), + "ID_Einst_SuSwbTg_zeit_2_6": (648, Unknown), + "ID_Einst_SuSwbTg_zeit_2_7": (649, Unknown), + "ID_Einst_SuSwbTg_zeit_0_8": (650, Unknown), + "ID_Einst_SuSwbTg_zeit_0_9": (651, Unknown), + "ID_Einst_SuSwbTg_zeit_1_8": (652, Unknown), + "ID_Einst_SuSwbTg_zeit_1_9": (653, Unknown), + "ID_Einst_SuSwbTg_zeit_2_8": (654, Unknown), + "ID_Einst_SuSwbTg_zeit_2_9": (655, Unknown), + "ID_Einst_SuSwbTg_zeit_0_10": (656, Unknown), + "ID_Einst_SuSwbTg_zeit_0_11": (657, Unknown), + "ID_Einst_SuSwbTg_zeit_1_10": (658, Unknown), + "ID_Einst_SuSwbTg_zeit_1_11": (659, Unknown), + "ID_Einst_SuSwbTg_zeit_2_10": (660, Unknown), + "ID_Einst_SuSwbTg_zeit_2_11": (661, Unknown), + "ID_Einst_SuSwbTg_zeit_0_12": (662, Unknown), + "ID_Einst_SuSwbTg_zeit_0_13": (663, Unknown), + "ID_Einst_SuSwbTg_zeit_1_12": (664, Unknown), + "ID_Einst_SuSwbTg_zeit_1_13": (665, Unknown), + "ID_Einst_SuSwbTg_zeit_2_12": (666, Unknown), + "ID_Einst_SuSwbTg_zeit_2_13": (667, Unknown), + "ID_Zaehler_BetrZeitWP": (668, Unknown), + "ID_Zaehler_BetrZeitVD1": (669, Unknown), + "ID_Zaehler_BetrZeitVD2": (670, Unknown), + "ID_Zaehler_BetrZeitZWE1": (671, Unknown), + "ID_Zaehler_BetrZeitZWE2": (672, Unknown), + "ID_Zaehler_BetrZeitZWE3": (673, Unknown), + "ID_Zaehler_BetrZeitImpVD1": (674, Unknown), + "ID_Zaehler_BetrZeitImpVD2": (675, Unknown), + "ID_Zaehler_BetrZeitEZMVD1": (676, Unknown), + "ID_Zaehler_BetrZeitEZMVD2": (677, Unknown), + "ID_Einst_Entl_Typ_0": (678, Unknown), + "ID_Einst_Entl_Typ_1": (679, Unknown), + "ID_Einst_Entl_Typ_2": (680, Unknown), + "ID_Einst_Entl_Typ_3": (681, Unknown), + "ID_Einst_Entl_Typ_4": (682, Unknown), + "ID_Einst_Entl_Typ_5": (683, Unknown), + "ID_Einst_Entl_Typ_6": (684, Unknown), + "ID_Einst_Entl_Typ_7": (685, Unknown), + "ID_Einst_Entl_Typ_8": (686, Unknown), + "ID_Einst_Entl_Typ_9": (687, Unknown), + "ID_Einst_Entl_Typ_10": (688, Unknown), + "ID_Einst_Entl_Typ_11": (689, Unknown), + "ID_Einst_Entl_Typ_12": (690, Unknown), + "ID_Einst_Vorl_max_MK1": (691, Unknown), + "ID_Einst_Vorl_max_MK2": (692, Unknown), + "ID_SU_FrkdMK1": (693, Unknown), + "ID_SU_FrkdMK2": (694, Unknown), + "ID_Ba_Hz_MK1_akt": (695, Unknown), + "ID_Ba_Hz_MK2_akt": (696, Unknown), + "ID_Einst_Zirk_Ein_akt": (697, Unknown), + "ID_Einst_Zirk_Aus_akt": (698, Unknown), + "ID_Einst_Heizgrenze": (699, Unknown), + "ID_Einst_Heizgrenze_Temp": (700, Celsius), + "ID_VariablenIBNgespeichert": (701, Unknown), + "ID_SchonIBNAssistant": (702, Unknown), + "ID_Heizgrenze_0": (703, Unknown), + "ID_Heizgrenze_1": (704, Unknown), + "ID_Heizgrenze_2": (705, Unknown), + "ID_Heizgrenze_3": (706, Unknown), + "ID_Heizgrenze_4": (707, Unknown), + "ID_Heizgrenze_5": (708, Unknown), + "ID_Heizgrenze_6": (709, Unknown), + "ID_Heizgrenze_7": (710, Unknown), + "ID_Heizgrenze_8": (711, Unknown), + "ID_Heizgrenze_9": (712, Unknown), + "ID_Heizgrenze_10": (713, Unknown), + "ID_Heizgrenze_11": (714, Unknown), + "ID_SchemenIBNgewahlt": (715, Unknown), + "ID_Switchoff_file_0_0": (716, Unknown), + "ID_Switchoff_file_1_0": (717, Unknown), + "ID_Switchoff_file_2_0": (718, Unknown), + "ID_Switchoff_file_3_0": (719, Unknown), + "ID_Switchoff_file_4_0": (720, Unknown), + "ID_Switchoff_file_0_1": (721, Unknown), + "ID_Switchoff_file_1_1": (722, Unknown), + "ID_Switchoff_file_2_1": (723, Unknown), + "ID_Switchoff_file_3_1": (724, Unknown), + "ID_Switchoff_file_4_1": (725, Unknown), + "ID_DauerDatenLoggerAktiv": (726, Unknown), + "ID_Laufvar_Heizgrenze": (727, Unknown), + "ID_Zaehler_BetrZeitHz": (728, Unknown), + "ID_Zaehler_BetrZeitBW": (729, Unknown), + "ID_Zaehler_BetrZeitKue": (730, Unknown), + "ID_SU_FstdHz": (731, Unknown), + "ID_SU_FstdBw": (732, Unknown), + "ID_SU_FstdSwb": (733, Unknown), + "ID_SU_FstdMK1": (734, Unknown), + "ID_SU_FstdMK2": (735, Unknown), + "ID_FerienAbsenkungHz": (736, Unknown), + "ID_FerienAbsenkungMK1": (737, Unknown), + "ID_FerienAbsenkungMK2": (738, Unknown), + "ID_FerienModusAktivHz": (739, Unknown), + "ID_FerienModusAktivBw": (740, Unknown), + "ID_FerienModusAktivSwb": (741, Unknown), + "ID_FerienModusAktivMk1": (742, Unknown), + "ID_FerienModusAktivMk2": (743, Unknown), + "ID_DisplayContrast_akt": (744, Unknown), + "ID_Ba_Hz_saved": (745, Unknown), + "ID_Ba_Bw_saved": (746, Unknown), + "ID_Ba_Sw_saved": (747, Unknown), + "ID_Ba_Hz_MK1_saved": (748, Unknown), + "ID_Ba_Hz_MK2_saved": (749, Unknown), + "ID_AdresseIP_akt": (750, Unknown), + "ID_SubNetMask_akt": (751, Unknown), + "ID_Add_Broadcast_akt": (752, Unknown), + "ID_Add_StdGateway_akt": (753, Unknown), + "ID_DHCPServerAktiv_akt": (754, Unknown), + "ID_WebserverPasswort_1_akt": (755, Unknown), + "ID_WebserverPasswort_2_akt": (756, Unknown), + "ID_WebserverPasswort_3_akt": (757, Unknown), + "ID_WebserverPasswort_4_akt": (758, Unknown), + "ID_WebserverPasswort_5_akt": (759, Unknown), + "ID_WebserverPasswort_6_akt": (760, Unknown), + "ID_WebServerWerteBekommen": (761, Unknown), + "ID_Einst_ParBetr_akt": (762, Unknown), + "ID_Einst_WpAnz_akt": (763, Unknown), + "ID_Einst_PhrTime_akt": (764, Unknown), + "ID_Einst_HysPar_akt": (765, Unknown), + "ID_IP_PB_Slave_0": (766, Unknown), + "ID_IP_PB_Slave_1": (767, Unknown), + "ID_IP_PB_Slave_2": (768, Unknown), + "ID_IP_PB_Slave_3": (769, Unknown), + "ID_IP_PB_Slave_4": (770, Unknown), + "ID_IP_PB_Slave_5": (771, Unknown), + "ID_Einst_BwHup_akt_backup": (772, Unknown), + "ID_Einst_SuMk3_akt": (773, Unknown), + "ID_Einst_HzMK3E_akt": (774, Unknown), + "ID_Einst_HzMK3ANH_akt": (775, Unknown), + "ID_Einst_HzMK3ABS_akt": (776, Unknown), + "ID_Einst_HzMK3Hgr_akt": (777, Unknown), + "ID_Einst_HzFtMK3Vl_akt": (778, Unknown), + "ID_Ba_Hz_MK3_akt": (779, MixedCircuitMode), + "ID_Einst_MK3Typ_akt": (780, Unknown), + "ID_Einst_RTypMK3_akt": (781, Unknown), + "ID_Einst_MK3LzFaktor_akt": (782, Unknown), + "ID_Einst_MK3PerFaktor_akt": (783, Unknown), + "ID_FerienModusAktivMk3": (784, Unknown), + "ID_SU_FrkdMK3": (785, Unknown), + "ID_FerienAbsenkungMK3": (786, Unknown), + "ID_SU_FstdMK3": (787, Unknown), + "ID_Einst_SuMk3_akt2": (788, Unknown), + "ID_Einst_SuMk3Wo_zeit_0_0": (789, Unknown), + "ID_Einst_SuMk3Wo_zeit_0_1": (790, Unknown), + "ID_Einst_SuMk3Wo_zeit_1_0": (791, Unknown), + "ID_Einst_SuMk3Wo_zeit_1_1": (792, Unknown), + "ID_Einst_SuMk3Wo_zeit_2_0": (793, Unknown), + "ID_Einst_SuMk3Wo_zeit_2_1": (794, Unknown), + "ID_Einst_SuMk325_zeit_0_0": (795, Unknown), + "ID_Einst_SuMk325_zeit_0_1": (796, Unknown), + "ID_Einst_SuMk325_zeit_1_0": (797, Unknown), + "ID_Einst_SuMk325_zeit_1_1": (798, Unknown), + "ID_Einst_SuMk325_zeit_2_0": (799, Unknown), + "ID_Einst_SuMk325_zeit_2_1": (800, Unknown), + "ID_Einst_SuMk325_zeit_0_2": (801, Unknown), + "ID_Einst_SuMk325_zeit_0_3": (802, Unknown), + "ID_Einst_SuMk325_zeit_1_2": (803, Unknown), + "ID_Einst_SuMk325_zeit_1_3": (804, Unknown), + "ID_Einst_SuMk325_zeit_2_2": (805, Unknown), + "ID_Einst_SuMk325_zeit_2_3": (806, Unknown), + "ID_Einst_SuMk3Tg_zeit_0_0": (807, Unknown), + "ID_Einst_SuMk3Tg_zeit_0_1": (808, Unknown), + "ID_Einst_SuMk3Tg_zeit_1_0": (809, Unknown), + "ID_Einst_SuMk3Tg_zeit_1_1": (810, Unknown), + "ID_Einst_SuMk3Tg_zeit_2_0": (811, Unknown), + "ID_Einst_SuMk3Tg_zeit_2_1": (812, Unknown), + "ID_Einst_SuMk3Tg_zeit_0_2": (813, Unknown), + "ID_Einst_SuMk3Tg_zeit_0_3": (814, Unknown), + "ID_Einst_SuMk3Tg_zeit_1_2": (815, Unknown), + "ID_Einst_SuMk3Tg_zeit_1_3": (816, Unknown), + "ID_Einst_SuMk3Tg_zeit_2_2": (817, Unknown), + "ID_Einst_SuMk3Tg_zeit_2_3": (818, Unknown), + "ID_Einst_SuMk3Tg_zeit_0_4": (819, Unknown), + "ID_Einst_SuMk3Tg_zeit_0_5": (820, Unknown), + "ID_Einst_SuMk3Tg_zeit_1_4": (821, Unknown), + "ID_Einst_SuMk3Tg_zeit_1_5": (822, Unknown), + "ID_Einst_SuMk3Tg_zeit_2_4": (823, Unknown), + "ID_Einst_SuMk3Tg_zeit_2_5": (824, Unknown), + "ID_Einst_SuMk3Tg_zeit_0_6": (825, Unknown), + "ID_Einst_SuMk3Tg_zeit_0_7": (826, Unknown), + "ID_Einst_SuMk3Tg_zeit_1_6": (827, Unknown), + "ID_Einst_SuMk3Tg_zeit_1_7": (828, Unknown), + "ID_Einst_SuMk3Tg_zeit_2_6": (829, Unknown), + "ID_Einst_SuMk3Tg_zeit_2_7": (830, Unknown), + "ID_Einst_SuMk3Tg_zeit_0_8": (831, Unknown), + "ID_Einst_SuMk3Tg_zeit_0_9": (832, Unknown), + "ID_Einst_SuMk3Tg_zeit_1_8": (833, Unknown), + "ID_Einst_SuMk3Tg_zeit_1_9": (834, Unknown), + "ID_Einst_SuMk3Tg_zeit_2_8": (835, Unknown), + "ID_Einst_SuMk3Tg_zeit_2_9": (836, Unknown), + "ID_Einst_SuMk3Tg_zeit_0_10": (837, Unknown), + "ID_Einst_SuMk3Tg_zeit_0_11": (838, Unknown), + "ID_Einst_SuMk3Tg_zeit_1_10": (839, Unknown), + "ID_Einst_SuMk3Tg_zeit_1_11": (840, Unknown), + "ID_Einst_SuMk3Tg_zeit_2_10": (841, Unknown), + "ID_Einst_SuMk3Tg_zeit_2_11": (842, Unknown), + "ID_Einst_SuMk3Tg_zeit_0_12": (843, Unknown), + "ID_Einst_SuMk3Tg_zeit_0_13": (844, Unknown), + "ID_Einst_SuMk3Tg_zeit_1_12": (845, Unknown), + "ID_Einst_SuMk3Tg_zeit_1_13": (846, Unknown), + "ID_Einst_SuMk3Tg_zeit_2_12": (847, Unknown), + "ID_Einst_SuMk3Tg_zeit_2_13": (848, Unknown), + "ID_Ba_Hz_MK3_saved": (849, Unknown), + "ID_Einst_Kuhl_Zeit_Ein_akt": (850, Hours), + "ID_Einst_Kuhl_Zeit_Aus_akt": (851, Hours), + "ID_Waermemenge_Seit": (852, Unknown), + "ID_Waermemenge_WQ": (853, Unknown), + "ID_Waermemenge_Hz": (854, Unknown), + "ID_Waermemenge_WQ_ges": (855, Unknown), + "ID_Einst_Entl_Typ_13": (856, Unknown), + "ID_Einst_Entl_Typ_14": (857, Unknown), + "ID_Einst_Entl_Typ_15": (858, Unknown), + "ID_Zaehler_BetrZeitSW": (859, Unknown), + "ID_Einst_Fernwartung_akt": (860, Unknown), + "ID_AdresseIPServ_akt": (861, Unknown), + "ID_Einst_TA_EG_akt": (862, Unknown), + "ID_Einst_TVLmax_EG_akt": (863, Unknown), + "ID_Einst_Popt_Nachlauf_akt": (864, Unknown), + "ID_FernwartungVertrag_akt": (865, Unknown), + "ID_FernwartungAktuZeit": (866, Unknown), + "ID_Einst_Effizienzpumpe_Nominal_akt": (867, Unknown), + "ID_Einst_Effizienzpumpe_Minimal_akt": (868, Unknown), + "ID_Einst_Effizienzpumpe_akt": (869, Unknown), + "ID_Einst_Waermemenge_akt": (870, Unknown), + "ID_Einst_Wm_Versorgung_Korrektur_akt": (871, Unknown), + "ID_Einst_Wm_Auswertung_Korrektur_akt": (872, Unknown), + "ID_SoftwareUpdateJetztGemacht_akt": (873, Unknown), + "ID_WP_SerienNummer_DATUM": (874, Unknown), + "ID_WP_SerienNummer_HEX": (875, Unknown), + "ID_WP_SerienNummer_INDEX": (876, Unknown), + "ID_ProgWerteWebSrvBeobarten": (877, Unknown), + "ID_Waermemenge_BW": (878, Unknown), + "ID_Waermemenge_SW": (879, Unknown), + "ID_Waermemenge_Datum": (880, Unknown), + "ID_Einst_Solar_akt": (881, SolarMode), + "ID_BSTD_Solar": (882, Unknown), + "ID_Einst_TDC_Koll_Max_akt": (883, Celsius), + "ID_Einst_Akt_Kuehlung_akt": (884, Unknown), + "ID_Einst_Vorlauf_VBO_akt": (885, Unknown), + "ID_Einst_KRHyst_akt": (886, Unknown), + "ID_Einst_Akt_Kuehl_Speicher_min_akt": (887, Unknown), + "ID_Einst_Akt_Kuehl_Freig_WQE_akt": (888, Unknown), + "ID_NDAB_WW_Anzahl": (889, Unknown), + "ID_NDS_WW_KD_Quitt": (890, Unknown), + "ID_Einst_AbtZykMin_akt": (891, Unknown), + "ID_Einst_VD2_Zeit_Min_akt": (892, Unknown), + "ID_Einst_Hysterese_HR_verkuerzt_akt": (893, Unknown), + "ID_Einst_BA_Lueftung_akt": (894, VentilationMode), + "ID_Einst_SuLuf_akt": (895, Unknown), + "ID_Einst_SuLufWo_zeit_0_0_0": (896, Unknown), + "ID_Einst_SuLufWo_zeit_0_1_0": (897, Unknown), + "ID_Einst_SuLufWo_zeit_0_2_0": (898, Unknown), + "ID_Einst_SuLuf25_zeit_0_0_0": (899, Unknown), + "ID_Einst_SuLuf25_zeit_0_1_0": (900, Unknown), + "ID_Einst_SuLuf25_zeit_0_2_0": (901, Unknown), + "ID_Einst_SuLuf25_zeit_0_0_2": (902, Unknown), + "ID_Einst_SuLuf25_zeit_0_1_2": (903, Unknown), + "ID_Einst_SuLuf25_zeit_0_2_2": (904, Unknown), + "ID_Einst_SuLufTg_zeit_0_0_0": (905, Unknown), + "ID_Einst_SuLufTg_zeit_0_1_0": (906, Unknown), + "ID_Einst_SuLufTg_zeit_0_2_0": (907, Unknown), + "ID_Einst_SuLufTg_zeit_0_0_2": (908, Unknown), + "ID_Einst_SuLufTg_zeit_0_1_2": (909, Unknown), + "ID_Einst_SuLufTg_zeit_0_2_2": (910, Unknown), + "ID_Einst_SuLufTg_zeit_0_0_4": (911, Unknown), + "ID_Einst_SuLufTg_zeit_0_1_4": (912, Unknown), + "ID_Einst_SuLufTg_zeit_0_2_4": (913, Unknown), + "ID_Einst_SuLufTg_zeit_0_0_6": (914, Unknown), + "ID_Einst_SuLufTg_zeit_0_1_6": (915, Unknown), + "ID_Einst_SuLufTg_zeit_0_2_6": (916, Unknown), + "ID_Einst_SuLufTg_zeit_0_0_8": (917, Unknown), + "ID_Einst_SuLufTg_zeit_0_1_8": (918, Unknown), + "ID_Einst_SuLufTg_zeit_0_2_8": (919, Unknown), + "ID_Einst_SuLufTg_zeit_0_0_10": (920, Unknown), + "ID_Einst_SuLufTg_zeit_0_1_10": (921, Unknown), + "ID_Einst_SuLufTg_zeit_0_2_10": (922, Unknown), + "ID_Einst_SuLufTg_zeit_0_0_12": (923, Unknown), + "ID_Einst_SuLufTg_zeit_0_1_12": (924, Unknown), + "ID_Einst_SuLufTg_zeit_0_2_12": (925, Unknown), + "ID_Einst_SuLufWo_zeit_1_0_0": (926, Unknown), + "ID_Einst_SuLufWo_zeit_1_1_0": (927, Unknown), + "ID_Einst_SuLufWo_zeit_1_2_0": (928, Unknown), + "ID_Einst_SuLuf25_zeit_1_0_0": (929, Unknown), + "ID_Einst_SuLuf25_zeit_1_1_0": (930, Unknown), + "ID_Einst_SuLuf25_zeit_1_2_0": (931, Unknown), + "ID_Einst_SuLuf25_zeit_1_0_2": (932, Unknown), + "ID_Einst_SuLuf25_zeit_1_1_2": (933, Unknown), + "ID_Einst_SuLuf25_zeit_1_2_2": (934, Unknown), + "ID_Einst_SuLufTg_zeit_1_0_0": (935, Unknown), + "ID_Einst_SuLufTg_zeit_1_1_0": (936, Unknown), + "ID_Einst_SuLufTg_zeit_1_2_0": (937, Unknown), + "ID_Einst_SuLufTg_zeit_1_0_2": (938, Unknown), + "ID_Einst_SuLufTg_zeit_1_1_2": (939, Unknown), + "ID_Einst_SuLufTg_zeit_1_2_2": (940, Unknown), + "ID_Einst_SuLufTg_zeit_1_0_4": (941, Unknown), + "ID_Einst_SuLufTg_zeit_1_1_4": (942, Unknown), + "ID_Einst_SuLufTg_zeit_1_2_4": (943, Unknown), + "ID_Einst_SuLufTg_zeit_1_0_6": (944, Unknown), + "ID_Einst_SuLufTg_zeit_1_1_6": (945, Unknown), + "ID_Einst_SuLufTg_zeit_1_2_6": (946, Unknown), + "ID_Einst_SuLufTg_zeit_1_0_8": (947, Unknown), + "ID_Einst_SuLufTg_zeit_1_1_8": (948, Unknown), + "ID_Einst_SuLufTg_zeit_1_2_8": (949, Unknown), + "ID_Einst_SuLufTg_zeit_1_0_10": (950, Unknown), + "ID_Einst_SuLufTg_zeit_1_1_10": (951, Unknown), + "ID_Einst_SuLufTg_zeit_1_2_10": (952, Unknown), + "ID_Einst_SuLufTg_zeit_1_0_12": (953, Unknown), + "ID_Einst_SuLufTg_zeit_1_1_12": (954, Unknown), + "ID_Einst_SuLufTg_zeit_1_2_12": (955, Unknown), + "ID_FerienModusAktivLueftung": (956, Unknown), + "ID_Einst_BA_Lueftung_saved": (957, Unknown), + "ID_SU_FrkdLueftung": (958, Unknown), + "ID_SU_FstdLueftung": (959, Unknown), + "ID_Einst_Luf_Feuchteschutz_akt": (960, Unknown), + "ID_Einst_Luf_Reduziert_akt": (961, Unknown), + "ID_Einst_Luf_Nennlueftung_akt": (962, Unknown), + "ID_Einst_Luf_Intensivlueftung_akt": (963, Unknown), + "ID_Timer_Fil_4Makt": (964, Unknown), + "ID_Timer_Fil_WoAkt": (965, Unknown), + "ID_Sollwert_KuCft3_akt": (966, Celsius), + "ID_Sollwert_AtDif3_akt": (967, Celsius), + "ID_Bitmaske_0": (968, Unknown), + "ID_Einst_Lueftungsstufen": (969, Unknown), + "ID_SysEin_Meldung_TDI": (970, Unknown), + "ID_SysEin_Typ_WZW": (971, Unknown), + "ID_Einst_GLT_aktiviert": (972, Unknown), + "ID_Einst_BW_max": (973, Unknown), + "ID_Einst_Sollwert_TRL_Kuehlen": (974, Unknown), + "ID_Einst_Medium_Waermequelle": (975, Unknown), + "ID_Einst_Photovoltaik_akt": (976, Unknown), + "ID_Einst_Multispeicher_akt": (977, Unknown), + "ID_Einst_PKuehlTime_akt": (978, Unknown), + "ID_Einst_Minimale_Ruecklaufsolltemperatur": (979, Unknown), + "ID_RBE_Einflussfaktor_RT_akt": (980, Unknown), + "ID_RBE_Freigabe_Kuehlung_akt": (981, Unknown), + "ID_RBE_Waermeverteilsystem_akt": (982, Unknown), + "ID_RBE_Zeit_Heizstab_aktiv": (983, Unknown), + "ID_SEC_ND_Alarmgrenze": (984, Unknown), + "ID_SEC_HD_Alarmgrenze": (985, Unknown), + "ID_SEC_Abtauendtemperatur": (986, Unknown), + "ID_Einst_Min_RPM_BW": (987, Unknown), + "ID_Einst_Luf_Feuchteschutz_Faktor_akt": (988, Unknown), + "ID_Einst_Luf_Reduziert_Faktor_akt": (989, Unknown), + "ID_Einst_Luf_Nennlueftung_Faktor_akt": (990, Unknown), + "ID_Einst_Luf_Intensivlueftung_Faktor_akt": (991, Unknown), + "ID_Einst_Freigabe_Zeit_ZWE": (992, Unknown), + "ID_Einst_min_VL_Kuehl": (993, Unknown), + "ID_Einst_Warmwasser_Nachheizung": (994, Unknown), + "ID_Switchoff_file_LWD2_0_0": (995, Unknown), + "ID_Switchoff_file_LWD2_1_0": (996, Unknown), + "ID_Switchoff_file_LWD2_2_0": (997, Unknown), + "ID_Switchoff_file_LWD2_3_0": (998, Unknown), + "ID_Switchoff_file_LWD2_4_0": (999, Unknown), + "ID_Switchoff_file_LWD2_0_1": (1000, Unknown), + "ID_Switchoff_file_LWD2_1_1": (1001, Unknown), + "ID_Switchoff_file_LWD2_2_1": (1002, Unknown), + "ID_Switchoff_file_LWD2_3_1": (1003, Unknown), + "ID_Switchoff_file_LWD2_4_1": (1004, Unknown), + "ID_Switchoff_index_LWD2": (1005, Unknown), + "ID_Einst_Effizienzpumpe_Nominal_2": (1006, Unknown), + "ID_Einst_Effizienzpumpe_Minimal_2": (1007, Unknown), + "ID_Einst_Wm_Versorgung_Korrektur_2": (1008, Unknown), + "ID_Einst_Wm_Auswertung_Korrektur_2": (1009, Unknown), + "ID_Einst_isTwin": (1010, Unknown), + "ID_Einst_TAmin_2": (1011, Unknown), + "ID_Einst_TVLmax_2": (1012, Unknown), + "ID_Einst_TA_EG_2": (1013, Unknown), + "ID_Einst_TVLmax_EG_2": (1014, Unknown), + "ID_Waermemenge_Hz_2": (1015, Unknown), + "ID_Waermemenge_BW_2": (1016, Unknown), + "ID_Waermemenge_SW_2": (1017, Unknown), + "ID_Waermemenge_Seit_2": (1018, Unknown), + "ID_Einst_Entl_Typ_15_2": (1019, Unknown), + "ID_Einst_WW_Nachheizung_max": (1020, Unknown), + "ID_Einst_Kuhl_Zeit_Ein_RT": (1021, Unknown), + "ID_Einst_ZWE1_Pos": (1022, Unknown), + "ID_Einst_ZWE2_Pos": (1023, Unknown), + "ID_Einst_ZWE3_Pos": (1024, Unknown), + "ID_Einst_Leistung_ZWE": (1025, Unknown), + "ID_WP_SN2_DATUM": (1026, Unknown), + "ID_WP_SN2_HEX": (1027, Unknown), + "ID_WP_SN2_INDEX": (1028, Unknown), + "ID_CWP_saved2": (1029, Unknown), + "ID_Einst_SmartGrid": (1030, Unknown), + "ID_Einst_P155_HDS": (1031, Unknown), + "ID_Einst_P155_PumpHeat_Max": (1032, Unknown), + "ID_Einst_P155_PumpHeatCtrl": (1033, Unknown), + "ID_Einst_P155_PumpDHWCtrl": (1034, Unknown), + "ID_Einst_P155_PumpDHW_RPM": (1035, Unknown), + "ID_Einst_P155_PumpPoolCtrl": (1036, Unknown), + "ID_Einst_P155_PumpPool_RPM": (1037, Unknown), + "ID_Einst_P155_PumpCool_RPM": (1038, Unknown), + "ID_Einst_P155_PumpVBOCtrl": (1039, Unknown), + "ID_Einst_P155_PumpVBO_RPM_C": (1040, Unknown), + "ID_Einst_P155_PumpDHW_Max": (1041, Unknown), + "ID_Einst_P155_PumpPool_Max": (1042, Unknown), + "ID_Einst_P155_Sperrband_1": (1043, Unknown), + "ID_Einst_P155_Leistungsfreigabe": (1044, Unknown), + "ID_Einst_P155_DHW_Freq": (1045, Unknown), + "ID_Einst_SWHUP": (1046, Unknown), + "ID_Einst_P155_SWB_Freq": (1047, Unknown), + "ID_Einst_MK1_Regelung": (1048, Unknown), + "ID_Einst_MK2_Regelung": (1049, Unknown), + "ID_Einst_MK3_Regelung": (1050, Unknown), + "ID_Einst_PV_WW_Sperrzeit": (1051, Unknown), + "ID_Einst_Warmwasser_extra": (1052, Unknown), + "ID_Einst_Vorl_akt_Kuehl": (1053, Unknown), + "ID_WP_SN3_DATUM": (1054, Unknown), + "ID_WP_SN3_HEX": (1055, Unknown), + "ID_WP_SN3_INDEX": (1056, Unknown), + "ID_Einst_Vorlauf_ZUP": (1057, Unknown), + "ID_Einst_Abtauen_im_Warmwasser": (1058, Unknown), + "ID_Waermemenge_ZWE": (1059, Unknown), + "ID_Waermemenge_Reset": (1060, Unknown), + "ID_Waermemenge_Reset_2": (1061, Unknown), + "ID_Einst_Brunnenpumpe_min": (1062, Unknown), + "ID_Einst_Brunnenpumpe_max": (1063, Unknown), + "ID_Einst_SmartHomeID": (1064, Unknown), + "ID_Einst_SmartHK": (1065, Unknown), + "ID_Einst_SmartMK1": (1066, Unknown), + "ID_Einst_SmartMK2": (1067, Unknown), + "ID_Einst_SmartMK3": (1068, Unknown), + "ID_Einst_SmartWW": (1069, Unknown), + "ID_Einst_SmartDefrost": (1070, Unknown), + "ID_Einst_Empty1071": (1071, Unknown), + "ID_Einst_MinVLMK1": (1072, Unknown), + "ID_Einst_MinVLMK2": (1073, Unknown), + "ID_Einst_MinVLMK3": (1074, Unknown), + "ID_Einst_MaxVLMK1": (1075, Unknown), + "ID_Einst_MaxVLMK2": (1076, Unknown), + "ID_Einst_MaxVLMK3": (1077, Unknown), + "ID_Einst_SmartPlusHz": (1078, Unknown), + "ID_Einst_SmartMinusHz": (1079, Unknown), + "ID_Einst_SmartPlusMK1": (1080, Unknown), + "ID_Einst_SmartMinusMK1": (1081, Unknown), + "ID_Einst_SmartPlusMK2": (1082, Unknown), + "ID_Einst_SmartMinusMK2": (1083, Unknown), + "ID_Einst_SmartPlusMK3": (1084, Unknown), + "ID_Einst_SmartMinusMK3": (1085, Unknown), + "Unknown_Parameter_1086": (1086, Unknown), + "Unknown_Parameter_1087": (1087, Unknown), + "Unknown_Parameter_1088": (1088, Unknown), + "Unknown_Parameter_1089": (1089, Unknown), + "Unknown_Parameter_1090": (1090, Unknown), + "Unknown_Parameter_1091": (1091, Unknown), + "Unknown_Parameter_1092": (1092, Unknown), + "Unknown_Parameter_1093": (1093, Unknown), + "Unknown_Parameter_1094": (1094, Unknown), + "Unknown_Parameter_1095": (1095, Unknown), + "Unknown_Parameter_1096": (1096, Unknown), + "Unknown_Parameter_1097": (1097, Unknown), + "Unknown_Parameter_1098": (1098, Unknown), + "Unknown_Parameter_1099": (1099, Unknown), + "Unknown_Parameter_1100": (1100, Unknown), + "Unknown_Parameter_1101": (1101, Unknown), + "Unknown_Parameter_1102": (1102, Unknown), + "Unknown_Parameter_1103": (1103, Unknown), + "Unknown_Parameter_1104": (1104, Unknown), + "Unknown_Parameter_1105": (1105, Unknown), + "Unknown_Parameter_1106": (1106, Unknown), + "Unknown_Parameter_1107": (1107, Unknown), + "Unknown_Parameter_1108": (1108, Unknown), + "Unknown_Parameter_1109": (1109, Unknown), + "Unknown_Parameter_1110": (1110, Unknown), + "Unknown_Parameter_1111": (1111, Unknown), + "Unknown_Parameter_1112": (1112, Unknown), + "Unknown_Parameter_1113": (1113, Unknown), + "Unknown_Parameter_1114": (1114, Unknown), + "Unknown_Parameter_1115": (1115, Unknown), + "Unknown_Parameter_1116": (1116, Unknown), + "Unknown_Parameter_1117": (1117, Unknown), + "Unknown_Parameter_1118": (1118, Unknown), + "Unknown_Parameter_1119": (1119, Unknown), + "Unknown_Parameter_1120": (1120, Unknown), + "Unknown_Parameter_1121": (1121, Unknown), + "Unknown_Parameter_1122": (1122, Unknown), + "Unknown_Parameter_1123": (1123, Unknown), + "Unknown_Parameter_1124": (1124, Unknown), + "Unknown_Parameter_1125": (1125, Unknown), # New in 'main' branch: "SILENT_MODE": 1087, "ID_Einst_SuSilence": 1092, @@ -1210,256 +1210,257 @@ def test_compatibilities(self): calcs = { # Status of 0.3.14: - "Unknown_Calculation_0": 0, - "Unknown_Calculation_1": 1, - "Unknown_Calculation_2": 2, - "Unknown_Calculation_3": 3, - "Unknown_Calculation_4": 4, - "Unknown_Calculation_5": 5, - "Unknown_Calculation_6": 6, - "Unknown_Calculation_7": 7, - "Unknown_Calculation_8": 8, - "Unknown_Calculation_9": 9, - "ID_WEB_Temperatur_TVL": 10, - "ID_WEB_Temperatur_TRL": 11, - "ID_WEB_Sollwert_TRL_HZ": 12, - "ID_WEB_Temperatur_TRL_ext": 13, - "ID_WEB_Temperatur_THG": 14, - "ID_WEB_Temperatur_TA": 15, - "ID_WEB_Mitteltemperatur": 16, - "ID_WEB_Temperatur_TBW": 17, - "ID_WEB_Einst_BWS_akt": 18, - "ID_WEB_Temperatur_TWE": 19, - "ID_WEB_Temperatur_TWA": 20, - "ID_WEB_Temperatur_TFB1": 21, - "ID_WEB_Sollwert_TVL_MK1": 22, - "ID_WEB_Temperatur_RFV": 23, - "ID_WEB_Temperatur_TFB2": 24, - "ID_WEB_Sollwert_TVL_MK2": 25, - "ID_WEB_Temperatur_TSK": 26, - "ID_WEB_Temperatur_TSS": 27, - "ID_WEB_Temperatur_TEE": 28, - "ID_WEB_ASDin": 29, - "ID_WEB_BWTin": 30, - "ID_WEB_EVUin": 31, - "ID_WEB_HDin": 32, - "ID_WEB_MOTin": 33, - "ID_WEB_NDin": 34, - "ID_WEB_PEXin": 35, - "ID_WEB_SWTin": 36, - "ID_WEB_AVout": 37, - "ID_WEB_BUPout": 38, - "ID_WEB_HUPout": 39, - "ID_WEB_MA1out": 40, - "ID_WEB_MZ1out": 41, - "ID_WEB_VENout": 42, - "ID_WEB_VBOout": 43, - "ID_WEB_VD1out": 44, - "ID_WEB_VD2out": 45, - "ID_WEB_ZIPout": 46, - "ID_WEB_ZUPout": 47, - "ID_WEB_ZW1out": 48, - "ID_WEB_ZW2SSTout": 49, - "ID_WEB_ZW3SSTout": 50, - "ID_WEB_FP2out": 51, - "ID_WEB_SLPout": 52, - "ID_WEB_SUPout": 53, - "ID_WEB_MZ2out": 54, - "ID_WEB_MA2out": 55, - "ID_WEB_Zaehler_BetrZeitVD1": 56, - "ID_WEB_Zaehler_BetrZeitImpVD1": 57, - "ID_WEB_Zaehler_BetrZeitVD2": 58, - "ID_WEB_Zaehler_BetrZeitImpVD2": 59, - "ID_WEB_Zaehler_BetrZeitZWE1": 60, - "ID_WEB_Zaehler_BetrZeitZWE2": 61, - "ID_WEB_Zaehler_BetrZeitZWE3": 62, - "ID_WEB_Zaehler_BetrZeitWP": 63, - "ID_WEB_Zaehler_BetrZeitHz": 64, - "ID_WEB_Zaehler_BetrZeitBW": 65, - "ID_WEB_Zaehler_BetrZeitKue": 66, - "ID_WEB_Time_WPein_akt": 67, - "ID_WEB_Time_ZWE1_akt": 68, - "ID_WEB_Time_ZWE2_akt": 69, - "ID_WEB_Timer_EinschVerz": 70, - "ID_WEB_Time_SSPAUS_akt": 71, - "ID_WEB_Time_SSPEIN_akt": 72, - "ID_WEB_Time_VDStd_akt": 73, - "ID_WEB_Time_HRM_akt": 74, - "ID_WEB_Time_HRW_akt": 75, - "ID_WEB_Time_LGS_akt": 76, - "ID_WEB_Time_SBW_akt": 77, - "ID_WEB_Code_WP_akt": 78, - "ID_WEB_BIV_Stufe_akt": 79, - "ID_WEB_WP_BZ_akt": 80, - "ID_WEB_AdresseIP_akt": 91, - "ID_WEB_SubNetMask_akt": 92, - "ID_WEB_Add_Broadcast": 93, - "ID_WEB_Add_StdGateway": 94, - "ID_WEB_ERROR_Time0": 95, - "ID_WEB_ERROR_Time1": 96, - "ID_WEB_ERROR_Time2": 97, - "ID_WEB_ERROR_Time3": 98, - "ID_WEB_ERROR_Time4": 99, - "ID_WEB_ERROR_Nr0": 100, - "ID_WEB_ERROR_Nr1": 101, - "ID_WEB_ERROR_Nr2": 102, - "ID_WEB_ERROR_Nr3": 103, - "ID_WEB_ERROR_Nr4": 104, - "ID_WEB_AnzahlFehlerInSpeicher": 105, - "ID_WEB_Switchoff_file_Nr0": 106, - "ID_WEB_Switchoff_file_Nr1": 107, - "ID_WEB_Switchoff_file_Nr2": 108, - "ID_WEB_Switchoff_file_Nr3": 109, - "ID_WEB_Switchoff_file_Nr4": 110, - "ID_WEB_Switchoff_file_Time0": 111, - "ID_WEB_Switchoff_file_Time1": 112, - "ID_WEB_Switchoff_file_Time2": 113, - "ID_WEB_Switchoff_file_Time3": 114, - "ID_WEB_Switchoff_file_Time4": 115, - "ID_WEB_Comfort_exists": 116, - "ID_WEB_HauptMenuStatus_Zeile1": 117, - "ID_WEB_HauptMenuStatus_Zeile2": 118, - "ID_WEB_HauptMenuStatus_Zeile3": 119, - "ID_WEB_HauptMenuStatus_Zeit": 120, - "ID_WEB_HauptMenuAHP_Stufe": 121, - "ID_WEB_HauptMenuAHP_Temp": 122, - "ID_WEB_HauptMenuAHP_Zeit": 123, - "ID_WEB_SH_BWW": 124, - "ID_WEB_SH_HZ": 125, - "ID_WEB_SH_MK1": 126, - "ID_WEB_SH_MK2": 127, - "ID_WEB_Einst_Kurzrpgramm": 128, - "ID_WEB_StatusSlave_1": 129, - "ID_WEB_StatusSlave_2": 130, - "ID_WEB_StatusSlave_3": 131, - "ID_WEB_StatusSlave_4": 132, - "ID_WEB_StatusSlave_5": 133, - "ID_WEB_AktuelleTimeStamp": 134, - "ID_WEB_SH_MK3": 135, - "ID_WEB_Sollwert_TVL_MK3": 136, - "ID_WEB_Temperatur_TFB3": 137, - "ID_WEB_MZ3out": 138, - "ID_WEB_MA3out": 139, - "ID_WEB_FP3out": 140, - "ID_WEB_Time_AbtIn": 141, - "ID_WEB_Temperatur_RFV2": 142, - "ID_WEB_Temperatur_RFV3": 143, - "ID_WEB_SH_SW": 144, - "ID_WEB_Zaehler_BetrZeitSW": 145, - "ID_WEB_FreigabKuehl": 146, - "ID_WEB_AnalogIn": 147, - "ID_WEB_SonderZeichen": 148, - "ID_WEB_SH_ZIP": 149, - "ID_WEB_WebsrvProgrammWerteBeobarten": 150, - "ID_WEB_WMZ_Heizung": 151, - "ID_WEB_WMZ_Brauchwasser": 152, - "ID_WEB_WMZ_Schwimmbad": 153, - "ID_WEB_WMZ_Seit": 154, - "ID_WEB_WMZ_Durchfluss": 155, - "ID_WEB_AnalogOut1": 156, - "ID_WEB_AnalogOut2": 157, - "ID_WEB_Time_Heissgas": 158, - "ID_WEB_Temp_Lueftung_Zuluft": 159, - "ID_WEB_Temp_Lueftung_Abluft": 160, - "ID_WEB_Zaehler_BetrZeitSolar": 161, - "ID_WEB_AnalogOut3": 162, - "ID_WEB_AnalogOut4": 163, - "ID_WEB_Out_VZU": 164, - "ID_WEB_Out_VAB": 165, - "ID_WEB_Out_VSK": 166, - "ID_WEB_Out_FRH": 167, - "ID_WEB_AnalogIn2": 168, - "ID_WEB_AnalogIn3": 169, - "ID_WEB_SAXin": 170, - "ID_WEB_SPLin": 171, - "ID_WEB_Compact_exists": 172, - "ID_WEB_Durchfluss_WQ": 173, - "ID_WEB_LIN_exists": 174, - "ID_WEB_LIN_ANSAUG_VERDAMPFER": 175, - "ID_WEB_LIN_ANSAUG_VERDICHTER": 176, - "ID_WEB_LIN_VDH": 177, - "ID_WEB_LIN_UH": 178, - "ID_WEB_LIN_UH_Soll": 179, - "ID_WEB_LIN_HD": 180, - "ID_WEB_LIN_ND": 181, - "ID_WEB_LIN_VDH_out": 182, - "ID_WEB_HZIO_PWM": 183, - "ID_WEB_HZIO_VEN": 184, - "ID_WEB_HZIO_EVU2": 185, - "ID_WEB_HZIO_STB": 186, - "ID_WEB_SEC_Qh_Soll": 187, - "ID_WEB_SEC_Qh_Ist": 188, - "ID_WEB_SEC_TVL_Soll": 189, - "ID_WEB_SEC_Software": 190, - "ID_WEB_SEC_BZ": 191, - "ID_WEB_SEC_VWV": 192, - "ID_WEB_SEC_VD": 193, - "ID_WEB_SEC_VerdEVI": 194, - "ID_WEB_SEC_AnsEVI": 195, - "ID_WEB_SEC_UEH_EVI": 196, - "ID_WEB_SEC_UEH_EVI_S": 197, - "ID_WEB_SEC_KondTemp": 198, - "ID_WEB_SEC_FlussigEx": 199, - "ID_WEB_SEC_UK_EEV": 200, - "ID_WEB_SEC_EVI_Druck": 201, - "ID_WEB_SEC_U_Inv": 202, - "ID_WEB_Temperatur_THG_2": 203, - "ID_WEB_Temperatur_TWE_2": 204, - "ID_WEB_LIN_ANSAUG_VERDAMPFER_2": 205, - "ID_WEB_LIN_ANSAUG_VERDICHTER_2": 206, - "ID_WEB_LIN_VDH_2": 207, - "ID_WEB_LIN_UH_2": 208, - "ID_WEB_LIN_UH_Soll_2": 209, - "ID_WEB_LIN_HD_2": 210, - "ID_WEB_LIN_ND_2": 211, - "ID_WEB_HDin_2": 212, - "ID_WEB_AVout_2": 213, - "ID_WEB_VBOout_2": 214, - "ID_WEB_VD1out_2": 215, - "ID_WEB_LIN_VDH_out_2": 216, - "ID_WEB_Switchoff2_file_Nr0": 217, - "ID_WEB_Switchoff2_file_Nr1": 218, - "ID_WEB_Switchoff2_file_Nr2": 219, - "ID_WEB_Switchoff2_file_Nr3": 220, - "ID_WEB_Switchoff2_file_Nr4": 221, - "ID_WEB_Switchoff2_file_Time0": 222, - "ID_WEB_Switchoff2_file_Time1": 223, - "ID_WEB_Switchoff2_file_Time2": 224, - "ID_WEB_Switchoff2_file_Time3": 225, - "ID_WEB_Switchoff2_file_Time4": 226, - "ID_WEB_RBE_RT_Ist": 227, - "ID_WEB_RBE_RT_Soll": 228, - "ID_WEB_Temperatur_BW_oben": 229, - "ID_WEB_Code_WP_akt_2": 230, - "ID_WEB_Freq_VD": 231, - "Unknown_Calculation_232": 232, - "Unknown_Calculation_233": 233, - "Unknown_Calculation_234": 234, - "Unknown_Calculation_235": 235, - "Unknown_Calculation_236": 236, - "Unknown_Calculation_237": 237, - "Unknown_Calculation_238": 238, - "Unknown_Calculation_239": 239, - "Unknown_Calculation_240": 240, - "Circulation_Pump": 241, - "Unknown_Calculation_242": 242, - "Unknown_Calculation_243": 243, - "Unknown_Calculation_244": 244, - "Unknown_Calculation_245": 245, - "Unknown_Calculation_246": 246, - "Unknown_Calculation_247": 247, - "Unknown_Calculation_248": 248, - "Unknown_Calculation_249": 249, - "Unknown_Calculation_250": 250, - "Unknown_Calculation_251": 251, - "Unknown_Calculation_252": 252, - "Unknown_Calculation_253": 253, - "Flow_Rate_254": 254, - "Unknown_Calculation_255": 255, - "Unknown_Calculation_256": 256, - "Heat_Output": 257, - "Unknown_Calculation_258": 258, - "Unknown_Calculation_259": 259, + "Unknown_Calculation_0": (0, Unknown), + "Unknown_Calculation_1": (1, Unknown), + "Unknown_Calculation_2": (2, Unknown), + "Unknown_Calculation_3": (3, Unknown), + "Unknown_Calculation_4": (4, Unknown), + "Unknown_Calculation_5": (5, Unknown), + "Unknown_Calculation_6": (6, Unknown), + "Unknown_Calculation_7": (7, Unknown), + "Unknown_Calculation_8": (8, Unknown), + "Unknown_Calculation_9": (9, Unknown), + "ID_WEB_Temperatur_TVL": (10, Celsius), + "ID_WEB_Temperatur_TRL": (11, Celsius), + "ID_WEB_Sollwert_TRL_HZ": (12, Celsius), + "ID_WEB_Temperatur_TRL_ext": (13, Celsius), + "ID_WEB_Temperatur_THG": (14, Celsius), + "ID_WEB_Temperatur_TA": (15, Celsius), + "ID_WEB_Mitteltemperatur": (16, Celsius), + "ID_WEB_Temperatur_TBW": (17, Celsius), + "ID_WEB_Einst_BWS_akt": (18, Celsius), + "ID_WEB_Temperatur_TWE": (19, Celsius), + "ID_WEB_Temperatur_TWA": (20, Celsius), + "ID_WEB_Temperatur_TFB1": (21, Celsius), + "ID_WEB_Sollwert_TVL_MK1": (22, Celsius), + "ID_WEB_Temperatur_RFV": (23, Celsius), + "ID_WEB_Temperatur_TFB2": (24, Celsius), + "ID_WEB_Sollwert_TVL_MK2": (25, Celsius), + "ID_WEB_Temperatur_TSK": (26, Celsius), + "ID_WEB_Temperatur_TSS": (27, Celsius), + "ID_WEB_Temperatur_TEE": (28, Celsius), + "ID_WEB_ASDin": (29, Bool), + "ID_WEB_BWTin": (30, Bool), + "ID_WEB_EVUin": (31, Bool), + "ID_WEB_HDin": (32, Bool), + "ID_WEB_MOTin": (33, Bool), + "ID_WEB_NDin": (34, Bool), + "ID_WEB_PEXin": (35, Bool), + "ID_WEB_SWTin": (36, Bool), + "ID_WEB_AVout": (37, Bool), + "ID_WEB_BUPout": (38, Bool), + "ID_WEB_HUPout": (39, Bool), + "ID_WEB_MA1out": (40, Bool), + "ID_WEB_MZ1out": (41, Bool), + "ID_WEB_VENout": (42, Bool), + "ID_WEB_VBOout": (43, Bool), + "ID_WEB_VD1out": (44, Bool), + "ID_WEB_VD2out": (45, Bool), + "ID_WEB_ZIPout": (46, Bool), + "ID_WEB_ZUPout": (47, Bool), + "ID_WEB_ZW1out": (48, Bool), + "ID_WEB_ZW2SSTout": (49, Bool), + "ID_WEB_ZW3SSTout": (50, Bool), + "ID_WEB_FP2out": (51, Bool), + "ID_WEB_SLPout": (52, Bool), + "ID_WEB_SUPout": (53, Bool), + "ID_WEB_MZ2out": (54, Bool), + "ID_WEB_MA2out": (55, Bool), + "ID_WEB_Zaehler_BetrZeitVD1": (56, Seconds), + "ID_WEB_Zaehler_BetrZeitImpVD1": (57, Pulses), + "ID_WEB_Zaehler_BetrZeitVD2": (58, Seconds), + "ID_WEB_Zaehler_BetrZeitImpVD2": (59, Pulses), + "ID_WEB_Zaehler_BetrZeitZWE1": (60, Seconds), + "ID_WEB_Zaehler_BetrZeitZWE2": (61, Seconds), + "ID_WEB_Zaehler_BetrZeitZWE3": (62, Seconds), + "ID_WEB_Zaehler_BetrZeitWP": (63, Seconds), + "ID_WEB_Zaehler_BetrZeitHz": (64, Seconds), + "ID_WEB_Zaehler_BetrZeitBW": (65, Seconds), + "ID_WEB_Zaehler_BetrZeitKue": (66, Seconds), + "ID_WEB_Time_WPein_akt": (67, Seconds), + "ID_WEB_Time_ZWE1_akt": (68, Seconds), + "ID_WEB_Time_ZWE2_akt": (69, Seconds), + "ID_WEB_Timer_EinschVerz": (70, Seconds), + "ID_WEB_Time_SSPAUS_akt": (71, Seconds), + "ID_WEB_Time_SSPEIN_akt": (72, Seconds), + "ID_WEB_Time_VDStd_akt": (73, Seconds), + "ID_WEB_Time_HRM_akt": (74, Seconds), + "ID_WEB_Time_HRW_akt": (75, Seconds), + "ID_WEB_Time_LGS_akt": (76, Seconds), + "ID_WEB_Time_SBW_akt": (77, Seconds), + "ID_WEB_Code_WP_akt": (78, HeatpumpCode), + "ID_WEB_BIV_Stufe_akt": (79, BivalenceLevel), + "ID_WEB_WP_BZ_akt": (80, OperationMode), + "ID_WEB_SoftStand": (81, Version), + "ID_WEB_AdresseIP_akt": (91, IPAddress), + "ID_WEB_SubNetMask_akt": (92, IPAddress), + "ID_WEB_Add_Broadcast": (93, IPAddress), + "ID_WEB_Add_StdGateway": (94, IPAddress), + "ID_WEB_ERROR_Time0": (95, Timestamp), + "ID_WEB_ERROR_Time1": (96, Timestamp), + "ID_WEB_ERROR_Time2": (97, Timestamp), + "ID_WEB_ERROR_Time3": (98, Timestamp), + "ID_WEB_ERROR_Time4": (99, Timestamp), + "ID_WEB_ERROR_Nr0": (100, Errorcode), + "ID_WEB_ERROR_Nr1": (101, Errorcode), + "ID_WEB_ERROR_Nr2": (102, Errorcode), + "ID_WEB_ERROR_Nr3": (103, Errorcode), + "ID_WEB_ERROR_Nr4": (104, Errorcode), + "ID_WEB_AnzahlFehlerInSpeicher": (105, Count), + "ID_WEB_Switchoff_file_Nr0": (106, SwitchoffFile), + "ID_WEB_Switchoff_file_Nr1": (107, SwitchoffFile), + "ID_WEB_Switchoff_file_Nr2": (108, SwitchoffFile), + "ID_WEB_Switchoff_file_Nr3": (109, SwitchoffFile), + "ID_WEB_Switchoff_file_Nr4": (110, SwitchoffFile), + "ID_WEB_Switchoff_file_Time0": (111, Timestamp), + "ID_WEB_Switchoff_file_Time1": (112, Timestamp), + "ID_WEB_Switchoff_file_Time2": (113, Timestamp), + "ID_WEB_Switchoff_file_Time3": (114, Timestamp), + "ID_WEB_Switchoff_file_Time4": (115, Timestamp), + "ID_WEB_Comfort_exists": (116, Bool), + "ID_WEB_HauptMenuStatus_Zeile1": (117, MainMenuStatusLine1), + "ID_WEB_HauptMenuStatus_Zeile2": (118, MainMenuStatusLine2), + "ID_WEB_HauptMenuStatus_Zeile3": (119, MainMenuStatusLine3), + "ID_WEB_HauptMenuStatus_Zeit": (120, Seconds), + "ID_WEB_HauptMenuAHP_Stufe": (121, Level), + "ID_WEB_HauptMenuAHP_Temp": (122, Celsius), + "ID_WEB_HauptMenuAHP_Zeit": (123, Seconds), + "ID_WEB_SH_BWW": (124, Bool), + "ID_WEB_SH_HZ": (125, Icon), + "ID_WEB_SH_MK1": (126, Icon), + "ID_WEB_SH_MK2": (127, Icon), + "ID_WEB_Einst_Kurzrpgramm": (128, Unknown), + "ID_WEB_StatusSlave_1": (129, Unknown), + "ID_WEB_StatusSlave_2": (130, Unknown), + "ID_WEB_StatusSlave_3": (131, Unknown), + "ID_WEB_StatusSlave_4": (132, Unknown), + "ID_WEB_StatusSlave_5": (133, Unknown), + "ID_WEB_AktuelleTimeStamp": (134, Timestamp), + "ID_WEB_SH_MK3": (135, Icon), + "ID_WEB_Sollwert_TVL_MK3": (136, Celsius), + "ID_WEB_Temperatur_TFB3": (137, Celsius), + "ID_WEB_MZ3out": (138, Bool), + "ID_WEB_MA3out": (139, Bool), + "ID_WEB_FP3out": (140, Bool), + "ID_WEB_Time_AbtIn": (141, Seconds), + "ID_WEB_Temperatur_RFV2": (142, Celsius), + "ID_WEB_Temperatur_RFV3": (143, Celsius), + "ID_WEB_SH_SW": (144, Icon), + "ID_WEB_Zaehler_BetrZeitSW": (145, Unknown), + "ID_WEB_FreigabKuehl": (146, Bool), + "ID_WEB_AnalogIn": (147, Voltage), + "ID_WEB_SonderZeichen": (148, Unknown), + "ID_WEB_SH_ZIP": (149, Icon), + "ID_WEB_WebsrvProgrammWerteBeobarten": (150, Icon), + "ID_WEB_WMZ_Heizung": (151, Energy), + "ID_WEB_WMZ_Brauchwasser": (152, Energy), + "ID_WEB_WMZ_Schwimmbad": (153, Energy), + "ID_WEB_WMZ_Seit": (154, Energy), + "ID_WEB_WMZ_Durchfluss": (155, Flow), + "ID_WEB_AnalogOut1": (156, Voltage), + "ID_WEB_AnalogOut2": (157, Voltage), + "ID_WEB_Time_Heissgas": (158, Seconds), + "ID_WEB_Temp_Lueftung_Zuluft": (159, Celsius), + "ID_WEB_Temp_Lueftung_Abluft": (160, Celsius), + "ID_WEB_Zaehler_BetrZeitSolar": (161, Seconds), + "ID_WEB_AnalogOut3": (162, Voltage), + "ID_WEB_AnalogOut4": (163, Voltage), + "ID_WEB_Out_VZU": (164, Voltage), + "ID_WEB_Out_VAB": (165, Voltage), + "ID_WEB_Out_VSK": (166, Bool), + "ID_WEB_Out_FRH": (167, Bool), + "ID_WEB_AnalogIn2": (168, Voltage), + "ID_WEB_AnalogIn3": (169, Voltage), + "ID_WEB_SAXin": (170, Bool), + "ID_WEB_SPLin": (171, Bool), + "ID_WEB_Compact_exists": (172, Bool), + "ID_WEB_Durchfluss_WQ": (173, Flow), + "ID_WEB_LIN_exists": (174, Bool), + "ID_WEB_LIN_ANSAUG_VERDAMPFER": (175, Celsius), + "ID_WEB_LIN_ANSAUG_VERDICHTER": (176, Celsius), + "ID_WEB_LIN_VDH": (177, Celsius), + "ID_WEB_LIN_UH": (178, Kelvin), + "ID_WEB_LIN_UH_Soll": (179, Kelvin), + "ID_WEB_LIN_HD": (180, Pressure), + "ID_WEB_LIN_ND": (181, Pressure), + "ID_WEB_LIN_VDH_out": (182, Bool), + "ID_WEB_HZIO_PWM": (183, Percent2), + "ID_WEB_HZIO_VEN": (184, Speed), + "ID_WEB_HZIO_EVU2": (185, Unknown), + "ID_WEB_HZIO_STB": (186, Bool), + "ID_WEB_SEC_Qh_Soll": (187, Energy), + "ID_WEB_SEC_Qh_Ist": (188, Energy), + "ID_WEB_SEC_TVL_Soll": (189, Celsius), + "ID_WEB_SEC_Software": (190, Unknown), + "ID_WEB_SEC_BZ": (191, SecOperationMode), + "ID_WEB_SEC_VWV": (192, Unknown), + "ID_WEB_SEC_VD": (193, Speed), + "ID_WEB_SEC_VerdEVI": (194, Celsius), + "ID_WEB_SEC_AnsEVI": (195, Celsius), + "ID_WEB_SEC_UEH_EVI": (196, Kelvin), + "ID_WEB_SEC_UEH_EVI_S": (197, Kelvin), + "ID_WEB_SEC_KondTemp": (198, Celsius), + "ID_WEB_SEC_FlussigEx": (199, Celsius), + "ID_WEB_SEC_UK_EEV": (200, Celsius), + "ID_WEB_SEC_EVI_Druck": (201, Pressure), + "ID_WEB_SEC_U_Inv": (202, Voltage), + "ID_WEB_Temperatur_THG_2": (203, Celsius), + "ID_WEB_Temperatur_TWE_2": (204, Celsius), + "ID_WEB_LIN_ANSAUG_VERDAMPFER_2": (205, Celsius), + "ID_WEB_LIN_ANSAUG_VERDICHTER_2": (206, Celsius), + "ID_WEB_LIN_VDH_2": (207, Celsius), + "ID_WEB_LIN_UH_2": (208, Kelvin), + "ID_WEB_LIN_UH_Soll_2": (209, Kelvin), + "ID_WEB_LIN_HD_2": (210, Pressure), + "ID_WEB_LIN_ND_2": (211, Pressure), + "ID_WEB_HDin_2": (212, Bool), + "ID_WEB_AVout_2": (213, Bool), + "ID_WEB_VBOout_2": (214, Bool), + "ID_WEB_VD1out_2": (215, Bool), + "ID_WEB_LIN_VDH_out_2": (216, Bool), + "ID_WEB_Switchoff2_file_Nr0": (217, SwitchoffFile), + "ID_WEB_Switchoff2_file_Nr1": (218, SwitchoffFile), + "ID_WEB_Switchoff2_file_Nr2": (219, SwitchoffFile), + "ID_WEB_Switchoff2_file_Nr3": (220, SwitchoffFile), + "ID_WEB_Switchoff2_file_Nr4": (221, SwitchoffFile), + "ID_WEB_Switchoff2_file_Time0": (222, Timestamp), + "ID_WEB_Switchoff2_file_Time1": (223, Timestamp), + "ID_WEB_Switchoff2_file_Time2": (224, Timestamp), + "ID_WEB_Switchoff2_file_Time3": (225, Timestamp), + "ID_WEB_Switchoff2_file_Time4": (226, Timestamp), + "ID_WEB_RBE_RT_Ist": (227, Celsius), + "ID_WEB_RBE_RT_Soll": (228, Celsius), + "ID_WEB_Temperatur_BW_oben": (229, Celsius), + "ID_WEB_Code_WP_akt_2": (230, HeatpumpCode), + "ID_WEB_Freq_VD": (231, Frequency), + "Unknown_Calculation_232": (232, Unknown), + "Unknown_Calculation_233": (233, Unknown), + "Unknown_Calculation_234": (234, Unknown), + "Unknown_Calculation_235": (235, Unknown), + "Unknown_Calculation_236": (236, Unknown), + "Unknown_Calculation_237": (237, Unknown), + "Unknown_Calculation_238": (238, Unknown), + "Unknown_Calculation_239": (239, Unknown), + "Unknown_Calculation_240": (240, Unknown), + "Circulation_Pump": (241, Percent2), + "Unknown_Calculation_242": (242, Unknown), + "Unknown_Calculation_243": (243, Unknown), + "Unknown_Calculation_244": (244, Unknown), + "Unknown_Calculation_245": (245, Unknown), + "Unknown_Calculation_246": (246, Unknown), + "Unknown_Calculation_247": (247, Unknown), + "Unknown_Calculation_248": (248, Unknown), + "Unknown_Calculation_249": (249, Unknown), + "Unknown_Calculation_250": (250, Unknown), + "Unknown_Calculation_251": (251, Unknown), + "Unknown_Calculation_252": (252, Unknown), + "Unknown_Calculation_253": (253, Unknown), + "Flow_Rate_254": (254, Flow), + "Unknown_Calculation_255": (255, Unknown), + "Unknown_Calculation_256": (256, Unknown), + "Heat_Output": (257, Power), + "Unknown_Calculation_258": (258, Unknown), + "Unknown_Calculation_259": (259, Unknown), # New in 'main' branch: "ID_WEB_SoftStand_0": 81, "ID_WEB_SoftStand_1": 82, @@ -1496,361 +1497,361 @@ def test_compatibilities(self): visis = { # Status of 0.3.14: - "ID_Visi_NieAnzeigen": 0, - "ID_Visi_ImmerAnzeigen": 1, - "ID_Visi_Heizung": 2, - "ID_Visi_Brauwasser": 3, - "ID_Visi_Schwimmbad": 4, - "ID_Visi_Kuhlung": 5, - "ID_Visi_Lueftung": 6, - "ID_Visi_MK1": 7, - "ID_Visi_MK2": 8, - "ID_Visi_ThermDesinfekt": 9, - "ID_Visi_Zirkulation": 10, - "ID_Visi_KuhlTemp_SolltempMK1": 11, - "ID_Visi_KuhlTemp_SolltempMK2": 12, - "ID_Visi_KuhlTemp_ATDiffMK1": 13, - "ID_Visi_KuhlTemp_ATDiffMK2": 14, - "ID_Visi_Service_Information": 15, - "ID_Visi_Service_Einstellung": 16, - "ID_Visi_Service_Sprache": 17, - "ID_Visi_Service_DatumUhrzeit": 18, - "ID_Visi_Service_Ausheiz": 19, - "ID_Visi_Service_Anlagenkonfiguration": 20, - "ID_Visi_Service_IBNAssistant": 21, - "ID_Visi_Service_ParameterIBNZuruck": 22, - "ID_Visi_Temp_Vorlauf": 23, - "ID_Visi_Temp_Rucklauf": 24, - "ID_Visi_Temp_RL_Soll": 25, - "ID_Visi_Temp_Ruecklext": 26, - "ID_Visi_Temp_Heissgas": 27, - "ID_Visi_Temp_Aussent": 28, - "ID_Visi_Temp_BW_Ist": 29, - "ID_Visi_Temp_BW_Soll": 30, - "ID_Visi_Temp_WQ_Ein": 31, - "ID_Visi_Temp_Kaltekreis": 32, - "ID_Visi_Temp_MK1_Vorlauf": 33, - "ID_Visi_Temp_MK1VL_Soll": 34, - "ID_Visi_Temp_Raumstation": 35, - "ID_Visi_Temp_MK2_Vorlauf": 36, - "ID_Visi_Temp_MK2VL_Soll": 37, - "ID_Visi_Temp_Solarkoll": 38, - "ID_Visi_Temp_Solarsp": 39, - "ID_Visi_Temp_Ext_Energ": 40, - "ID_Visi_IN_ASD": 41, - "ID_Visi_IN_BWT": 42, - "ID_Visi_IN_EVU": 43, - "ID_Visi_IN_HD": 44, - "ID_Visi_IN_MOT": 45, - "ID_Visi_IN_ND": 46, - "ID_Visi_IN_PEX": 47, - "ID_Visi_IN_SWT": 48, - "ID_Visi_OUT_Abtauventil": 49, - "ID_Visi_OUT_BUP": 50, - "ID_Visi_OUT_FUP1": 51, - "ID_Visi_OUT_HUP": 52, - "ID_Visi_OUT_Mischer1Auf": 53, - "ID_Visi_OUT_Mischer1Zu": 54, - "ID_Visi_OUT_Ventilation": 55, - "ID_Visi_OUT_Ventil_BOSUP": 56, - "ID_Visi_OUT_Verdichter1": 57, - "ID_Visi_OUT_Verdichter2": 58, - "ID_Visi_OUT_ZIP": 59, - "ID_Visi_OUT_ZUP": 60, - "ID_Visi_OUT_ZWE1": 61, - "ID_Visi_OUT_ZWE2_SST": 62, - "ID_Visi_OUT_ZWE3": 63, - "ID_Visi_OUT_FUP2": 64, - "ID_Visi_OUT_SLP": 65, - "ID_Visi_OUT_SUP": 66, - "ID_Visi_OUT_Mischer2Auf": 67, - "ID_Visi_OUT_Mischer2Zu": 68, - "ID_Visi_AblaufZ_WP_Seit": 69, - "ID_Visi_AblaufZ_ZWE1_seit": 70, - "ID_Visi_AblaufZ_ZWE2_seit": 71, - "ID_Visi_AblaufZ_ZWE3_seit": 72, - "ID_Visi_AblaufZ_Netzeinv": 73, - "ID_Visi_AblaufZ_SSP_Zeit1": 74, - "ID_Visi_AblaufZ_VD_Stand": 75, - "ID_Visi_AblaufZ_HRM_Zeit": 76, - "ID_Visi_AblaufZ_HRW_Zeit": 77, - "ID_Visi_AblaufZ_TDI_seit": 78, - "ID_Visi_AblaufZ_Sperre_BW": 79, - "ID_Visi_Bst_BStdVD1": 80, - "ID_Visi_Bst_ImpVD1": 81, - "ID_Visi_Bst_dEZVD1": 82, - "ID_Visi_Bst_BStdVD2": 83, - "ID_Visi_Bst_ImpVD2": 84, - "ID_Visi_Bst_dEZVD2": 85, - "ID_Visi_Bst_BStdZWE1": 86, - "ID_Visi_Bst_BStdZWE2": 87, - "ID_Visi_Bst_BStdZWE3": 88, - "ID_Visi_Bst_BStdWP": 89, - "ID_Visi_Text_Kurzprogramme": 90, - "ID_Visi_Text_Zwangsheizung": 91, - "ID_Visi_Text_Zwangsbrauchwasser": 92, - "ID_Visi_Text_Abtauen": 93, - "ID_Visi_EinstTemp_RucklBegr": 94, - "ID_Visi_EinstTemp_HystereseHR": 95, - "ID_Visi_EinstTemp_TRErhmax": 96, - "ID_Visi_EinstTemp_Freig2VD": 97, - "ID_Visi_EinstTemp_FreigZWE": 98, - "ID_Visi_EinstTemp_Tluftabt": 99, - "ID_Visi_EinstTemp_TDISolltemp": 100, - "ID_Visi_EinstTemp_HystereseBW": 101, - "ID_Visi_EinstTemp_Vorl2VDBW": 102, - "ID_Visi_EinstTemp_TAussenmax": 103, - "ID_Visi_EinstTemp_TAussenmin": 104, - "ID_Visi_EinstTemp_TWQmin": 105, - "ID_Visi_EinstTemp_THGmax": 106, - "ID_Visi_EinstTemp_TLABTEnde": 107, - "ID_Visi_EinstTemp_Absenkbis": 108, - "ID_Visi_EinstTemp_Vorlaufmax": 109, - "ID_Visi_EinstTemp_TDiffEin": 110, - "ID_Visi_EinstTemp_TDiffAus": 111, - "ID_Visi_EinstTemp_TDiffmax": 112, - "ID_Visi_EinstTemp_TEEHeizung": 113, - "ID_Visi_EinstTemp_TEEBrauchw": 114, - "ID_Visi_EinstTemp_Vorl2VDSW": 115, - "ID_Visi_EinstTemp_VLMaxMk1": 116, - "ID_Visi_EinstTemp_VLMaxMk2": 117, - "ID_Visi_Priori_Brauchwasser": 118, - "ID_Visi_Priori_Heizung": 119, - "ID_Visi_Priori_Schwimmbad": 120, - "ID_Visi_SysEin_EVUSperre": 121, - "ID_Visi_SysEin_Raumstation": 122, - "ID_Visi_SysEin_Einbindung": 123, - "ID_Visi_SysEin_Mischkreis1": 124, - "ID_Visi_SysEin_Mischkreis2": 125, - "ID_Visi_SysEin_ZWE1Art": 126, - "ID_Visi_SysEin_ZWE1Fkt": 127, - "ID_Visi_SysEin_ZWE2Art": 128, - "ID_Visi_SysEin_ZWE2Fkt": 129, - "ID_Visi_SysEin_ZWE3Art": 130, - "ID_Visi_SysEin_ZWE3Fkt": 131, - "ID_Visi_SysEin_Stoerung": 132, - "ID_Visi_SysEin_Brauchwasser1": 133, - "ID_Visi_SysEin_Brauchwasser2": 134, - "ID_Visi_SysEin_Brauchwasser3": 135, - "ID_Visi_SysEin_Brauchwasser4": 136, - "ID_Visi_SysEin_Brauchwasser5": 137, - "ID_Visi_SysEin_BWWPmax": 138, - "ID_Visi_SysEin_Abtzykmax": 139, - "ID_Visi_SysEin_Luftabt": 140, - "ID_Visi_SysEin_LuftAbtmax": 141, - "ID_Visi_SysEin_Abtauen1": 142, - "ID_Visi_SysEin_Abtauen2": 143, - "ID_Visi_SysEin_Pumpenoptim": 144, - "ID_Visi_SysEin_Zusatzpumpe": 145, - "ID_Visi_SysEin_Zugang": 146, - "ID_Visi_SysEin_SoledrDurchf": 147, - "ID_Visi_SysEin_UberwachungVD": 148, - "ID_Visi_SysEin_RegelungHK": 149, - "ID_Visi_SysEin_RegelungMK1": 150, - "ID_Visi_SysEin_RegelungMK2": 151, - "ID_Visi_SysEin_Kuhlung": 152, - "ID_Visi_SysEin_Ausheizen": 153, - "ID_Visi_SysEin_ElektrAnode": 154, - "ID_Visi_SysEin_SWBBer": 155, - "ID_Visi_SysEin_SWBMin": 156, - "ID_Visi_SysEin_Heizung": 157, - "ID_Visi_SysEin_PeriodeMk1": 158, - "ID_Visi_SysEin_LaufzeitMk1": 159, - "ID_Visi_SysEin_PeriodeMk2": 160, - "ID_Visi_SysEin_LaufzeitMk2": 161, - "ID_Visi_SysEin_Heizgrenze": 162, - "ID_Visi_Enlt_HUP": 163, - "ID_Visi_Enlt_ZUP": 164, - "ID_Visi_Enlt_BUP": 165, - "ID_Visi_Enlt_Ventilator_BOSUP": 166, - "ID_Visi_Enlt_MA1": 167, - "ID_Visi_Enlt_MZ1": 168, - "ID_Visi_Enlt_ZIP": 169, - "ID_Visi_Enlt_MA2": 170, - "ID_Visi_Enlt_MZ2": 171, - "ID_Visi_Enlt_SUP": 172, - "ID_Visi_Enlt_SLP": 173, - "ID_Visi_Enlt_FP2": 174, - "ID_Visi_Enlt_Laufzeit": 175, - "ID_Visi_Anlgkonf_Heizung": 176, - "ID_Visi_Anlgkonf_Brauchwarmwasser": 177, - "ID_Visi_Anlgkonf_Schwimmbad": 178, - "ID_Visi_Heizung_Betriebsart": 179, - "ID_Visi_Heizung_TemperaturPlusMinus": 180, - "ID_Visi_Heizung_Heizkurven": 181, - "ID_Visi_Heizung_Zeitschlaltprogramm": 182, - "ID_Visi_Heizung_Heizgrenze": 183, - "ID_Visi_Mitteltemperatur": 184, - "ID_Visi_Dataenlogger": 185, - "ID_Visi_Sprachen_DEUTSCH": 186, - "ID_Visi_Sprachen_ENGLISH": 187, - "ID_Visi_Sprachen_FRANCAIS": 188, - "ID_Visi_Sprachen_NORWAY": 189, - "ID_Visi_Sprachen_TCHECH": 190, - "ID_Visi_Sprachen_ITALIANO": 191, - "ID_Visi_Sprachen_NEDERLANDS": 192, - "ID_Visi_Sprachen_SVENSKA": 193, - "ID_Visi_Sprachen_POLSKI": 194, - "ID_Visi_Sprachen_MAGYARUL": 195, - "ID_Visi_ErrorUSBspeichern": 196, - "ID_Visi_Bst_BStdHz": 197, - "ID_Visi_Bst_BStdBW": 198, - "ID_Visi_Bst_BStdKue": 199, - "ID_Visi_Service_Systemsteuerung": 200, - "ID_Visi_Service_Systemsteuerung_Contrast": 201, - "ID_Visi_Service_Systemsteuerung_Webserver": 202, - "ID_Visi_Service_Systemsteuerung_IPAdresse": 203, - "ID_Visi_Service_Systemsteuerung_Fernwartung": 204, - "ID_Visi_Paralleleschaltung": 205, - "ID_Visi_SysEin_Paralleleschaltung": 206, - "ID_Visi_Sprachen_DANSK": 207, - "ID_Visi_Sprachen_PORTUGES": 208, - "ID_Visi_Heizkurve_Heizung": 209, - "ID_Visi_SysEin_Mischkreis3": 210, - "ID_Visi_MK3": 211, - "ID_Visi_Temp_MK3_Vorlauf": 212, - "ID_Visi_Temp_MK3VL_Soll": 213, - "ID_Visi_OUT_Mischer3Auf": 214, - "ID_Visi_OUT_Mischer3Zu": 215, - "ID_Visi_SysEin_RegelungMK3": 216, - "ID_Visi_SysEin_PeriodeMk3": 217, - "ID_Visi_SysEin_LaufzeitMk3": 218, - "ID_Visi_SysEin_Kuhl_Zeit_Ein": 219, - "ID_Visi_SysEin_Kuhl_Zeit_Aus": 220, - "ID_Visi_AblaufZ_AbtauIn": 221, - "ID_Visi_Waermemenge_WS": 222, - "ID_Visi_Waermemenge_WQ": 223, - "ID_Visi_Enlt_MA3": 224, - "ID_Visi_Enlt_MZ3": 225, - "ID_Visi_Enlt_FP3": 226, - "ID_Visi_OUT_FUP3": 227, - "ID_Visi_Temp_Raumstation2": 228, - "ID_Visi_Temp_Raumstation3": 229, - "ID_Visi_Bst_BStdSW": 230, - "ID_Visi_Sprachen_LITAUISCH": 231, - "ID_Visi_Sprachen_ESTNICH": 232, - "ID_Visi_SysEin_Fernwartung": 233, - "ID_Visi_Sprachen_SLOVENISCH": 234, - "ID_Visi_EinstTemp_TA_EG": 235, - "ID_Visi_Einst_TVLmax_EG": 236, - "ID_Visi_SysEin_PoptNachlauf": 237, - "ID_Visi_RFV_K_Kuehlin": 238, - "ID_Visi_SysEin_EffizienzpumpeNom": 239, - "ID_Visi_SysEin_EffizienzpumpeMin": 240, - "ID_Visi_SysEin_Effizienzpumpe": 241, - "ID_Visi_SysEin_Waermemenge": 242, - "ID_Visi_Service_WMZ_Effizienz": 243, - "ID_Visi_SysEin_Wm_Versorgung_Korrektur": 244, - "ID_Visi_SysEin_Wm_Auswertung_Korrektur": 245, - "ID_Visi_IN_AnalogIn": 246, - "ID_Visi_Eins_SN_Eingabe": 247, - "ID_Visi_OUT_Analog_1": 248, - "ID_Visi_OUT_Analog_2": 249, - "ID_Visi_Solar": 250, - "ID_Visi_SysEin_Solar": 251, - "ID_Visi_EinstTemp_TDiffKollmax": 252, - "ID_Visi_AblaufZ_HG_Sperre": 253, - "ID_Visi_SysEin_Akt_Kuehlung": 254, - "ID_Visi_SysEin_Vorlauf_VBO": 255, - "ID_Visi_Einst_KRHyst": 256, - "ID_Visi_Einst_Akt_Kuehl_Speicher_min": 257, - "ID_Visi_Einst_Akt_Kuehl_Freig_WQE": 258, - "ID_Visi_SysEin_AbtZykMin": 259, - "ID_Visi_SysEin_VD2_Zeit_Min": 260, - "ID_Visi_EinstTemp_Hysterese_HR_verkuerzt": 261, - "ID_Visi_Einst_Luf_Feuchteschutz_akt": 262, - "ID_Visi_Einst_Luf_Reduziert_akt": 263, - "ID_Visi_Einst_Luf_Nennlueftung_akt": 264, - "ID_Visi_Einst_Luf_Intensivlueftung_akt": 265, - "ID_Visi_Temperatur_Lueftung_Zuluft": 266, - "ID_Visi_Temperatur_Lueftung_Abluft": 267, - "ID_Visi_OUT_Analog_3": 268, - "ID_Visi_OUT_Analog_4": 269, - "ID_Visi_IN_Analog_2": 270, - "ID_Visi_IN_Analog_3": 271, - "ID_Visi_IN_SAX": 272, - "ID_Visi_OUT_VZU": 273, - "ID_Visi_OUT_VAB": 274, - "ID_Visi_OUT_VSK": 275, - "ID_Visi_OUT_FRH": 276, - "ID_Visi_KuhlTemp_SolltempMK3": 277, - "ID_Visi_KuhlTemp_ATDiffMK3": 278, - "ID_Visi_IN_SPL": 279, - "ID_Visi_SysEin_Lueftungsstufen": 280, - "ID_Visi_SysEin_Meldung_TDI": 281, - "ID_Visi_SysEin_Typ_WZW": 282, - "ID_Visi_BACnet": 283, - "ID_Visi_Sprachen_SLOWAKISCH": 284, - "ID_Visi_Sprachen_LETTISCH": 285, - "ID_Visi_Sprachen_FINNISCH": 286, - "ID_Visi_Kalibrierung_LWD": 287, - "ID_Visi_IN_Durchfluss": 288, - "ID_Visi_LIN_ANSAUG_VERDICHTER": 289, - "ID_Visi_LIN_VDH": 290, - "ID_Visi_LIN_UH": 291, - "ID_Visi_LIN_Druck": 292, - "ID_Visi_Einst_Sollwert_TRL_Kuehlen": 293, - "ID_Visi_Entl_ExVentil": 294, - "ID_Visi_Einst_Medium_Waermequelle": 295, - "ID_Visi_Einst_Multispeicher": 296, - "ID_Visi_Einst_Minimale_Ruecklaufsolltemperatur": 297, - "ID_Visi_Einst_PKuehlTime": 298, - "ID_Visi_Sprachen_TUERKISCH": 299, - "ID_Visi_RBE": 300, - "ID_Visi_Einst_Luf_Stufen_Faktor": 301, - "ID_Visi_Freigabe_Zeit_ZWE": 302, - "ID_Visi_Einst_min_VL_Kuehl": 303, - "ID_Visi_ZWE1": 304, - "ID_Visi_ZWE2": 305, - "ID_Visi_ZWE3": 306, - "ID_Visi_SEC": 307, - "ID_Visi_HZIO": 308, - "ID_Visi_WPIO": 309, - "ID_Visi_LIN_ANSAUG_VERDAMPFER": 310, - "ID_Visi_LIN_MULTI1": 311, - "ID_Visi_LIN_MULTI2": 312, - "ID_Visi_Einst_Leistung_ZWE": 313, - "ID_Visi_Sprachen_ESPANOL": 314, - "ID_Visi_Temp_BW_oben": 315, - "ID_Visi_MAXIO": 316, - "ID_Visi_OUT_Abtauwunsch": 317, - "ID_Visi_SmartGrid": 318, - "ID_Visi_Drehzahlgeregelt": 319, - "ID_Visi_P155_Inverter": 320, - "ID_Visi_Leistungsfreigabe": 321, - "ID_Visi_Einst_Vorl_akt_Kuehl": 322, - "ID_Visi_Einst_Abtauen_im_Warmwasser": 323, - "ID_Visi_Waermemenge_ZWE": 324, - "Unknown_Visibility_325": 325, - "Unknown_Visibility_326": 326, - "Unknown_Visibility_327": 327, - "Unknown_Visibility_328": 328, - "Unknown_Visibility_329": 329, - "Unknown_Visibility_330": 330, - "Unknown_Visibility_331": 331, - "Unknown_Visibility_332": 332, - "Unknown_Visibility_333": 333, - "Unknown_Visibility_334": 334, - "Unknown_Visibility_335": 335, - "Unknown_Visibility_336": 336, - "Unknown_Visibility_337": 337, - "Unknown_Visibility_338": 338, - "Unknown_Visibility_339": 339, - "Unknown_Visibility_340": 340, - "Unknown_Visibility_341": 341, - "Unknown_Visibility_342": 342, - "Unknown_Visibility_343": 343, - "Unknown_Visibility_344": 344, - "Unknown_Visibility_345": 345, - "Unknown_Visibility_346": 346, - "Unknown_Visibility_347": 347, - "Unknown_Visibility_348": 348, - "Unknown_Visibility_349": 349, - "Unknown_Visibility_350": 350, - "Unknown_Visibility_351": 351, - "Unknown_Visibility_352": 352, - "Unknown_Visibility_353": 353, - "Unknown_Visibility_354": 354, + "ID_Visi_NieAnzeigen": (0, Unknown), + "ID_Visi_ImmerAnzeigen": (1, Unknown), + "ID_Visi_Heizung": (2, Unknown), + "ID_Visi_Brauwasser": (3, Unknown), + "ID_Visi_Schwimmbad": (4, Unknown), + "ID_Visi_Kuhlung": (5, Unknown), + "ID_Visi_Lueftung": (6, Unknown), + "ID_Visi_MK1": (7, Unknown), + "ID_Visi_MK2": (8, Unknown), + "ID_Visi_ThermDesinfekt": (9, Unknown), + "ID_Visi_Zirkulation": (10, Unknown), + "ID_Visi_KuhlTemp_SolltempMK1": (11, Unknown), + "ID_Visi_KuhlTemp_SolltempMK2": (12, Unknown), + "ID_Visi_KuhlTemp_ATDiffMK1": (13, Unknown), + "ID_Visi_KuhlTemp_ATDiffMK2": (14, Unknown), + "ID_Visi_Service_Information": (15, Unknown), + "ID_Visi_Service_Einstellung": (16, Unknown), + "ID_Visi_Service_Sprache": (17, Unknown), + "ID_Visi_Service_DatumUhrzeit": (18, Unknown), + "ID_Visi_Service_Ausheiz": (19, Unknown), + "ID_Visi_Service_Anlagenkonfiguration": (20, Unknown), + "ID_Visi_Service_IBNAssistant": (21, Unknown), + "ID_Visi_Service_ParameterIBNZuruck": (22, Unknown), + "ID_Visi_Temp_Vorlauf": (23, Unknown), + "ID_Visi_Temp_Rucklauf": (24, Unknown), + "ID_Visi_Temp_RL_Soll": (25, Unknown), + "ID_Visi_Temp_Ruecklext": (26, Unknown), + "ID_Visi_Temp_Heissgas": (27, Unknown), + "ID_Visi_Temp_Aussent": (28, Unknown), + "ID_Visi_Temp_BW_Ist": (29, Unknown), + "ID_Visi_Temp_BW_Soll": (30, Unknown), + "ID_Visi_Temp_WQ_Ein": (31, Unknown), + "ID_Visi_Temp_Kaltekreis": (32, Unknown), + "ID_Visi_Temp_MK1_Vorlauf": (33, Unknown), + "ID_Visi_Temp_MK1VL_Soll": (34, Unknown), + "ID_Visi_Temp_Raumstation": (35, Unknown), + "ID_Visi_Temp_MK2_Vorlauf": (36, Unknown), + "ID_Visi_Temp_MK2VL_Soll": (37, Unknown), + "ID_Visi_Temp_Solarkoll": (38, Unknown), + "ID_Visi_Temp_Solarsp": (39, Unknown), + "ID_Visi_Temp_Ext_Energ": (40, Unknown), + "ID_Visi_IN_ASD": (41, Unknown), + "ID_Visi_IN_BWT": (42, Unknown), + "ID_Visi_IN_EVU": (43, Unknown), + "ID_Visi_IN_HD": (44, Unknown), + "ID_Visi_IN_MOT": (45, Unknown), + "ID_Visi_IN_ND": (46, Unknown), + "ID_Visi_IN_PEX": (47, Unknown), + "ID_Visi_IN_SWT": (48, Unknown), + "ID_Visi_OUT_Abtauventil": (49, Unknown), + "ID_Visi_OUT_BUP": (50, Unknown), + "ID_Visi_OUT_FUP1": (51, Unknown), + "ID_Visi_OUT_HUP": (52, Unknown), + "ID_Visi_OUT_Mischer1Auf": (53, Unknown), + "ID_Visi_OUT_Mischer1Zu": (54, Unknown), + "ID_Visi_OUT_Ventilation": (55, Unknown), + "ID_Visi_OUT_Ventil_BOSUP": (56, Unknown), + "ID_Visi_OUT_Verdichter1": (57, Unknown), + "ID_Visi_OUT_Verdichter2": (58, Unknown), + "ID_Visi_OUT_ZIP": (59, Unknown), + "ID_Visi_OUT_ZUP": (60, Unknown), + "ID_Visi_OUT_ZWE1": (61, Unknown), + "ID_Visi_OUT_ZWE2_SST": (62, Unknown), + "ID_Visi_OUT_ZWE3": (63, Unknown), + "ID_Visi_OUT_FUP2": (64, Unknown), + "ID_Visi_OUT_SLP": (65, Unknown), + "ID_Visi_OUT_SUP": (66, Unknown), + "ID_Visi_OUT_Mischer2Auf": (67, Unknown), + "ID_Visi_OUT_Mischer2Zu": (68, Unknown), + "ID_Visi_AblaufZ_WP_Seit": (69, Unknown), + "ID_Visi_AblaufZ_ZWE1_seit": (70, Unknown), + "ID_Visi_AblaufZ_ZWE2_seit": (71, Unknown), + "ID_Visi_AblaufZ_ZWE3_seit": (72, Unknown), + "ID_Visi_AblaufZ_Netzeinv": (73, Unknown), + "ID_Visi_AblaufZ_SSP_Zeit1": (74, Unknown), + "ID_Visi_AblaufZ_VD_Stand": (75, Unknown), + "ID_Visi_AblaufZ_HRM_Zeit": (76, Unknown), + "ID_Visi_AblaufZ_HRW_Zeit": (77, Unknown), + "ID_Visi_AblaufZ_TDI_seit": (78, Unknown), + "ID_Visi_AblaufZ_Sperre_BW": (79, Unknown), + "ID_Visi_Bst_BStdVD1": (80, Unknown), + "ID_Visi_Bst_ImpVD1": (81, Unknown), + "ID_Visi_Bst_dEZVD1": (82, Unknown), + "ID_Visi_Bst_BStdVD2": (83, Unknown), + "ID_Visi_Bst_ImpVD2": (84, Unknown), + "ID_Visi_Bst_dEZVD2": (85, Unknown), + "ID_Visi_Bst_BStdZWE1": (86, Unknown), + "ID_Visi_Bst_BStdZWE2": (87, Unknown), + "ID_Visi_Bst_BStdZWE3": (88, Unknown), + "ID_Visi_Bst_BStdWP": (89, Unknown), + "ID_Visi_Text_Kurzprogramme": (90, Unknown), + "ID_Visi_Text_Zwangsheizung": (91, Unknown), + "ID_Visi_Text_Zwangsbrauchwasser": (92, Unknown), + "ID_Visi_Text_Abtauen": (93, Unknown), + "ID_Visi_EinstTemp_RucklBegr": (94, Unknown), + "ID_Visi_EinstTemp_HystereseHR": (95, Unknown), + "ID_Visi_EinstTemp_TRErhmax": (96, Unknown), + "ID_Visi_EinstTemp_Freig2VD": (97, Unknown), + "ID_Visi_EinstTemp_FreigZWE": (98, Unknown), + "ID_Visi_EinstTemp_Tluftabt": (99, Unknown), + "ID_Visi_EinstTemp_TDISolltemp": (100, Unknown), + "ID_Visi_EinstTemp_HystereseBW": (101, Unknown), + "ID_Visi_EinstTemp_Vorl2VDBW": (102, Unknown), + "ID_Visi_EinstTemp_TAussenmax": (103, Unknown), + "ID_Visi_EinstTemp_TAussenmin": (104, Unknown), + "ID_Visi_EinstTemp_TWQmin": (105, Unknown), + "ID_Visi_EinstTemp_THGmax": (106, Unknown), + "ID_Visi_EinstTemp_TLABTEnde": (107, Unknown), + "ID_Visi_EinstTemp_Absenkbis": (108, Unknown), + "ID_Visi_EinstTemp_Vorlaufmax": (109, Unknown), + "ID_Visi_EinstTemp_TDiffEin": (110, Unknown), + "ID_Visi_EinstTemp_TDiffAus": (111, Unknown), + "ID_Visi_EinstTemp_TDiffmax": (112, Unknown), + "ID_Visi_EinstTemp_TEEHeizung": (113, Unknown), + "ID_Visi_EinstTemp_TEEBrauchw": (114, Unknown), + "ID_Visi_EinstTemp_Vorl2VDSW": (115, Unknown), + "ID_Visi_EinstTemp_VLMaxMk1": (116, Unknown), + "ID_Visi_EinstTemp_VLMaxMk2": (117, Unknown), + "ID_Visi_Priori_Brauchwasser": (118, Unknown), + "ID_Visi_Priori_Heizung": (119, Unknown), + "ID_Visi_Priori_Schwimmbad": (120, Unknown), + "ID_Visi_SysEin_EVUSperre": (121, Unknown), + "ID_Visi_SysEin_Raumstation": (122, Unknown), + "ID_Visi_SysEin_Einbindung": (123, Unknown), + "ID_Visi_SysEin_Mischkreis1": (124, Unknown), + "ID_Visi_SysEin_Mischkreis2": (125, Unknown), + "ID_Visi_SysEin_ZWE1Art": (126, Unknown), + "ID_Visi_SysEin_ZWE1Fkt": (127, Unknown), + "ID_Visi_SysEin_ZWE2Art": (128, Unknown), + "ID_Visi_SysEin_ZWE2Fkt": (129, Unknown), + "ID_Visi_SysEin_ZWE3Art": (130, Unknown), + "ID_Visi_SysEin_ZWE3Fkt": (131, Unknown), + "ID_Visi_SysEin_Stoerung": (132, Unknown), + "ID_Visi_SysEin_Brauchwasser1": (133, Unknown), + "ID_Visi_SysEin_Brauchwasser2": (134, Unknown), + "ID_Visi_SysEin_Brauchwasser3": (135, Unknown), + "ID_Visi_SysEin_Brauchwasser4": (136, Unknown), + "ID_Visi_SysEin_Brauchwasser5": (137, Unknown), + "ID_Visi_SysEin_BWWPmax": (138, Unknown), + "ID_Visi_SysEin_Abtzykmax": (139, Unknown), + "ID_Visi_SysEin_Luftabt": (140, Unknown), + "ID_Visi_SysEin_LuftAbtmax": (141, Unknown), + "ID_Visi_SysEin_Abtauen1": (142, Unknown), + "ID_Visi_SysEin_Abtauen2": (143, Unknown), + "ID_Visi_SysEin_Pumpenoptim": (144, Unknown), + "ID_Visi_SysEin_Zusatzpumpe": (145, Unknown), + "ID_Visi_SysEin_Zugang": (146, Unknown), + "ID_Visi_SysEin_SoledrDurchf": (147, Unknown), + "ID_Visi_SysEin_UberwachungVD": (148, Unknown), + "ID_Visi_SysEin_RegelungHK": (149, Unknown), + "ID_Visi_SysEin_RegelungMK1": (150, Unknown), + "ID_Visi_SysEin_RegelungMK2": (151, Unknown), + "ID_Visi_SysEin_Kuhlung": (152, Unknown), + "ID_Visi_SysEin_Ausheizen": (153, Unknown), + "ID_Visi_SysEin_ElektrAnode": (154, Unknown), + "ID_Visi_SysEin_SWBBer": (155, Unknown), + "ID_Visi_SysEin_SWBMin": (156, Unknown), + "ID_Visi_SysEin_Heizung": (157, Unknown), + "ID_Visi_SysEin_PeriodeMk1": (158, Unknown), + "ID_Visi_SysEin_LaufzeitMk1": (159, Unknown), + "ID_Visi_SysEin_PeriodeMk2": (160, Unknown), + "ID_Visi_SysEin_LaufzeitMk2": (161, Unknown), + "ID_Visi_SysEin_Heizgrenze": (162, Unknown), + "ID_Visi_Enlt_HUP": (163, Unknown), + "ID_Visi_Enlt_ZUP": (164, Unknown), + "ID_Visi_Enlt_BUP": (165, Unknown), + "ID_Visi_Enlt_Ventilator_BOSUP": (166, Unknown), + "ID_Visi_Enlt_MA1": (167, Unknown), + "ID_Visi_Enlt_MZ1": (168, Unknown), + "ID_Visi_Enlt_ZIP": (169, Unknown), + "ID_Visi_Enlt_MA2": (170, Unknown), + "ID_Visi_Enlt_MZ2": (171, Unknown), + "ID_Visi_Enlt_SUP": (172, Unknown), + "ID_Visi_Enlt_SLP": (173, Unknown), + "ID_Visi_Enlt_FP2": (174, Unknown), + "ID_Visi_Enlt_Laufzeit": (175, Unknown), + "ID_Visi_Anlgkonf_Heizung": (176, Unknown), + "ID_Visi_Anlgkonf_Brauchwarmwasser": (177, Unknown), + "ID_Visi_Anlgkonf_Schwimmbad": (178, Unknown), + "ID_Visi_Heizung_Betriebsart": (179, Unknown), + "ID_Visi_Heizung_TemperaturPlusMinus": (180, Unknown), + "ID_Visi_Heizung_Heizkurven": (181, Unknown), + "ID_Visi_Heizung_Zeitschlaltprogramm": (182, Unknown), + "ID_Visi_Heizung_Heizgrenze": (183, Unknown), + "ID_Visi_Mitteltemperatur": (184, Unknown), + "ID_Visi_Dataenlogger": (185, Unknown), + "ID_Visi_Sprachen_DEUTSCH": (186, Unknown), + "ID_Visi_Sprachen_ENGLISH": (187, Unknown), + "ID_Visi_Sprachen_FRANCAIS": (188, Unknown), + "ID_Visi_Sprachen_NORWAY": (189, Unknown), + "ID_Visi_Sprachen_TCHECH": (190, Unknown), + "ID_Visi_Sprachen_ITALIANO": (191, Unknown), + "ID_Visi_Sprachen_NEDERLANDS": (192, Unknown), + "ID_Visi_Sprachen_SVENSKA": (193, Unknown), + "ID_Visi_Sprachen_POLSKI": (194, Unknown), + "ID_Visi_Sprachen_MAGYARUL": (195, Unknown), + "ID_Visi_ErrorUSBspeichern": (196, Unknown), + "ID_Visi_Bst_BStdHz": (197, Unknown), + "ID_Visi_Bst_BStdBW": (198, Unknown), + "ID_Visi_Bst_BStdKue": (199, Unknown), + "ID_Visi_Service_Systemsteuerung": (200, Unknown), + "ID_Visi_Service_Systemsteuerung_Contrast": (201, Unknown), + "ID_Visi_Service_Systemsteuerung_Webserver": (202, Unknown), + "ID_Visi_Service_Systemsteuerung_IPAdresse": (203, Unknown), + "ID_Visi_Service_Systemsteuerung_Fernwartung": (204, Unknown), + "ID_Visi_Paralleleschaltung": (205, Unknown), + "ID_Visi_SysEin_Paralleleschaltung": (206, Unknown), + "ID_Visi_Sprachen_DANSK": (207, Unknown), + "ID_Visi_Sprachen_PORTUGES": (208, Unknown), + "ID_Visi_Heizkurve_Heizung": (209, Unknown), + "ID_Visi_SysEin_Mischkreis3": (210, Unknown), + "ID_Visi_MK3": (211, Unknown), + "ID_Visi_Temp_MK3_Vorlauf": (212, Unknown), + "ID_Visi_Temp_MK3VL_Soll": (213, Unknown), + "ID_Visi_OUT_Mischer3Auf": (214, Unknown), + "ID_Visi_OUT_Mischer3Zu": (215, Unknown), + "ID_Visi_SysEin_RegelungMK3": (216, Unknown), + "ID_Visi_SysEin_PeriodeMk3": (217, Unknown), + "ID_Visi_SysEin_LaufzeitMk3": (218, Unknown), + "ID_Visi_SysEin_Kuhl_Zeit_Ein": (219, Unknown), + "ID_Visi_SysEin_Kuhl_Zeit_Aus": (220, Unknown), + "ID_Visi_AblaufZ_AbtauIn": (221, Unknown), + "ID_Visi_Waermemenge_WS": (222, Unknown), + "ID_Visi_Waermemenge_WQ": (223, Unknown), + "ID_Visi_Enlt_MA3": (224, Unknown), + "ID_Visi_Enlt_MZ3": (225, Unknown), + "ID_Visi_Enlt_FP3": (226, Unknown), + "ID_Visi_OUT_FUP3": (227, Unknown), + "ID_Visi_Temp_Raumstation2": (228, Unknown), + "ID_Visi_Temp_Raumstation3": (229, Unknown), + "ID_Visi_Bst_BStdSW": (230, Unknown), + "ID_Visi_Sprachen_LITAUISCH": (231, Unknown), + "ID_Visi_Sprachen_ESTNICH": (232, Unknown), + "ID_Visi_SysEin_Fernwartung": (233, Unknown), + "ID_Visi_Sprachen_SLOVENISCH": (234, Unknown), + "ID_Visi_EinstTemp_TA_EG": (235, Unknown), + "ID_Visi_Einst_TVLmax_EG": (236, Unknown), + "ID_Visi_SysEin_PoptNachlauf": (237, Unknown), + "ID_Visi_RFV_K_Kuehlin": (238, Unknown), + "ID_Visi_SysEin_EffizienzpumpeNom": (239, Unknown), + "ID_Visi_SysEin_EffizienzpumpeMin": (240, Unknown), + "ID_Visi_SysEin_Effizienzpumpe": (241, Unknown), + "ID_Visi_SysEin_Waermemenge": (242, Unknown), + "ID_Visi_Service_WMZ_Effizienz": (243, Unknown), + "ID_Visi_SysEin_Wm_Versorgung_Korrektur": (244, Unknown), + "ID_Visi_SysEin_Wm_Auswertung_Korrektur": (245, Unknown), + "ID_Visi_IN_AnalogIn": (246, Unknown), + "ID_Visi_Eins_SN_Eingabe": (247, Unknown), + "ID_Visi_OUT_Analog_1": (248, Unknown), + "ID_Visi_OUT_Analog_2": (249, Unknown), + "ID_Visi_Solar": (250, Unknown), + "ID_Visi_SysEin_Solar": (251, Unknown), + "ID_Visi_EinstTemp_TDiffKollmax": (252, Unknown), + "ID_Visi_AblaufZ_HG_Sperre": (253, Unknown), + "ID_Visi_SysEin_Akt_Kuehlung": (254, Unknown), + "ID_Visi_SysEin_Vorlauf_VBO": (255, Unknown), + "ID_Visi_Einst_KRHyst": (256, Unknown), + "ID_Visi_Einst_Akt_Kuehl_Speicher_min": (257, Unknown), + "ID_Visi_Einst_Akt_Kuehl_Freig_WQE": (258, Unknown), + "ID_Visi_SysEin_AbtZykMin": (259, Unknown), + "ID_Visi_SysEin_VD2_Zeit_Min": (260, Unknown), + "ID_Visi_EinstTemp_Hysterese_HR_verkuerzt": (261, Unknown), + "ID_Visi_Einst_Luf_Feuchteschutz_akt": (262, Unknown), + "ID_Visi_Einst_Luf_Reduziert_akt": (263, Unknown), + "ID_Visi_Einst_Luf_Nennlueftung_akt": (264, Unknown), + "ID_Visi_Einst_Luf_Intensivlueftung_akt": (265, Unknown), + "ID_Visi_Temperatur_Lueftung_Zuluft": (266, Unknown), + "ID_Visi_Temperatur_Lueftung_Abluft": (267, Unknown), + "ID_Visi_OUT_Analog_3": (268, Unknown), + "ID_Visi_OUT_Analog_4": (269, Unknown), + "ID_Visi_IN_Analog_2": (270, Unknown), + "ID_Visi_IN_Analog_3": (271, Unknown), + "ID_Visi_IN_SAX": (272, Unknown), + "ID_Visi_OUT_VZU": (273, Unknown), + "ID_Visi_OUT_VAB": (274, Unknown), + "ID_Visi_OUT_VSK": (275, Unknown), + "ID_Visi_OUT_FRH": (276, Unknown), + "ID_Visi_KuhlTemp_SolltempMK3": (277, Unknown), + "ID_Visi_KuhlTemp_ATDiffMK3": (278, Unknown), + "ID_Visi_IN_SPL": (279, Unknown), + "ID_Visi_SysEin_Lueftungsstufen": (280, Unknown), + "ID_Visi_SysEin_Meldung_TDI": (281, Unknown), + "ID_Visi_SysEin_Typ_WZW": (282, Unknown), + "ID_Visi_BACnet": (283, Unknown), + "ID_Visi_Sprachen_SLOWAKISCH": (284, Unknown), + "ID_Visi_Sprachen_LETTISCH": (285, Unknown), + "ID_Visi_Sprachen_FINNISCH": (286, Unknown), + "ID_Visi_Kalibrierung_LWD": (287, Unknown), + "ID_Visi_IN_Durchfluss": (288, Unknown), + "ID_Visi_LIN_ANSAUG_VERDICHTER": (289, Unknown), + "ID_Visi_LIN_VDH": (290, Unknown), + "ID_Visi_LIN_UH": (291, Unknown), + "ID_Visi_LIN_Druck": (292, Unknown), + "ID_Visi_Einst_Sollwert_TRL_Kuehlen": (293, Unknown), + "ID_Visi_Entl_ExVentil": (294, Unknown), + "ID_Visi_Einst_Medium_Waermequelle": (295, Unknown), + "ID_Visi_Einst_Multispeicher": (296, Unknown), + "ID_Visi_Einst_Minimale_Ruecklaufsolltemperatur": (297, Unknown), + "ID_Visi_Einst_PKuehlTime": (298, Unknown), + "ID_Visi_Sprachen_TUERKISCH": (299, Unknown), + "ID_Visi_RBE": (300, Unknown), + "ID_Visi_Einst_Luf_Stufen_Faktor": (301, Unknown), + "ID_Visi_Freigabe_Zeit_ZWE": (302, Unknown), + "ID_Visi_Einst_min_VL_Kuehl": (303, Unknown), + "ID_Visi_ZWE1": (304, Unknown), + "ID_Visi_ZWE2": (305, Unknown), + "ID_Visi_ZWE3": (306, Unknown), + "ID_Visi_SEC": (307, Unknown), + "ID_Visi_HZIO": (308, Unknown), + "ID_Visi_WPIO": (309, Unknown), + "ID_Visi_LIN_ANSAUG_VERDAMPFER": (310, Unknown), + "ID_Visi_LIN_MULTI1": (311, Unknown), + "ID_Visi_LIN_MULTI2": (312, Unknown), + "ID_Visi_Einst_Leistung_ZWE": (313, Unknown), + "ID_Visi_Sprachen_ESPANOL": (314, Unknown), + "ID_Visi_Temp_BW_oben": (315, Unknown), + "ID_Visi_MAXIO": (316, Unknown), + "ID_Visi_OUT_Abtauwunsch": (317, Unknown), + "ID_Visi_SmartGrid": (318, Unknown), + "ID_Visi_Drehzahlgeregelt": (319, Unknown), + "ID_Visi_P155_Inverter": (320, Unknown), + "ID_Visi_Leistungsfreigabe": (321, Unknown), + "ID_Visi_Einst_Vorl_akt_Kuehl": (322, Unknown), + "ID_Visi_Einst_Abtauen_im_Warmwasser": (323, Unknown), + "ID_Visi_Waermemenge_ZWE": (324, Unknown), + "Unknown_Visibility_325": (325, Unknown), + "Unknown_Visibility_326": (326, Unknown), + "Unknown_Visibility_327": (327, Unknown), + "Unknown_Visibility_328": (328, Unknown), + "Unknown_Visibility_329": (329, Unknown), + "Unknown_Visibility_330": (330, Unknown), + "Unknown_Visibility_331": (331, Unknown), + "Unknown_Visibility_332": (332, Unknown), + "Unknown_Visibility_333": (333, Unknown), + "Unknown_Visibility_334": (334, Unknown), + "Unknown_Visibility_335": (335, Unknown), + "Unknown_Visibility_336": (336, Unknown), + "Unknown_Visibility_337": (337, Unknown), + "Unknown_Visibility_338": (338, Unknown), + "Unknown_Visibility_339": (339, Unknown), + "Unknown_Visibility_340": (340, Unknown), + "Unknown_Visibility_341": (341, Unknown), + "Unknown_Visibility_342": (342, Unknown), + "Unknown_Visibility_343": (343, Unknown), + "Unknown_Visibility_344": (344, Unknown), + "Unknown_Visibility_345": (345, Unknown), + "Unknown_Visibility_346": (346, Unknown), + "Unknown_Visibility_347": (347, Unknown), + "Unknown_Visibility_348": (348, Unknown), + "Unknown_Visibility_349": (349, Unknown), + "Unknown_Visibility_350": (350, Unknown), + "Unknown_Visibility_351": (351, Unknown), + "Unknown_Visibility_352": (352, Unknown), + "Unknown_Visibility_353": (353, Unknown), + "Unknown_Visibility_354": (354, Unknown), # New in 'main' branch: "ID_Visi_Heizung_Zeitschaltprogramm": 182, "Unknown_Visibility_355": 355, From 9fc3e32d9d062f494aca739772665bc9e3420734 Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Sat, 24 Jan 2026 21:02:46 +0100 Subject: [PATCH 34/68] wip --- luxtronik/cfi/calculations.py | 6 +- luxtronik/datatypes.py | 2 + luxtronik/definitions/calculations.py | 71 +++- luxtronik/definitions/parameters.py | 158 ++++++-- luxtronik/definitions/visibilities.py | 2 +- tests/cfi/test_cfi_interface.py | 21 +- tests/test_compatibility.py | 560 ++++++++++++++++++-------- 7 files changed, 578 insertions(+), 242 deletions(-) diff --git a/luxtronik/cfi/calculations.py b/luxtronik/cfi/calculations.py index f793869b..5c2868af 100644 --- a/luxtronik/cfi/calculations.py +++ b/luxtronik/cfi/calculations.py @@ -30,13 +30,9 @@ class Calculations(DataVectorConfig): name = CALCULATIONS_FIELD_NAME definitions = CALCULATIONS_DEFINITIONS - _obsolete = { - "ID_WEB_SoftStand": "get_firmware_version()" - } - def get_firmware_version(self): """Get the firmware version as string.""" - return "".join([super(Calculations, self).get(i).value for i in range(81, 91)]) + return "".join([str(super(Calculations, self).get(i).value) for i in range(81, 91)]) def _get_firmware_version(self): """Get the firmware version as string like in previous versions.""" diff --git a/luxtronik/datatypes.py b/luxtronik/datatypes.py index d060eea7..a2862298 100755 --- a/luxtronik/datatypes.py +++ b/luxtronik/datatypes.py @@ -621,6 +621,8 @@ class Version(Base): datatype_class = "version" + concatenate_multiple_data_chunks = False + def from_heatpump(self, value): return "".join([chr(c) for c in value]).strip("\x00") diff --git a/luxtronik/definitions/calculations.py b/luxtronik/definitions/calculations.py index 0530ab85..fcc7bd24 100644 --- a/luxtronik/definitions/calculations.py +++ b/luxtronik/definitions/calculations.py @@ -41,6 +41,7 @@ Timestamp, Unknown, MajorMinorVersion, + Version, Voltage, ) @@ -860,6 +861,16 @@ "unit": 'enum', "description": '', }, + { + "index": 81, + "count": 10, + "names": ['ID_WEB_SoftStand'], + "type": Version, + "writeable": False, + "datatype": 'UINT32', + "unit": '', + "description": '', + }, { "index": 81, "count": 1, @@ -2370,20 +2381,28 @@ "unit": 'Hz', "description": '', }, + { + "index": 232, + "names": ['Unknown_Calculation_232'], + }, { "index": 232, "count": 1, - "names": ['Vapourisation_Temperature', 'Unknown_Calculation_232'], + "names": ['Vapourisation_Temperature'], "type": Celsius, "writeable": False, "datatype": 'INT32', "unit": '°C/10', "description": '', }, + { + "index": 233, + "names": ['Unknown_Calculation_233'], + }, { "index": 233, "count": 1, - "names": ['Liquefaction_Temperature', 'Unknown_Calculation_233'], + "names": ['Liquefaction_Temperature'], "type": Celsius, "writeable": False, "datatype": 'INT32', @@ -2410,50 +2429,70 @@ "unit": '', "description": '', }, + { + "index": 236, + "names": ['Unknown_Calculation_236'], + }, { "index": 236, "count": 1, - "names": ['ID_WEB_Freq_VD_Soll', 'Unknown_Calculation_236'], + "names": ['ID_WEB_Freq_VD_Soll'], "type": Frequency, "writeable": False, "datatype": 'UINT32', "unit": 'Hz', "description": '', }, + { + "index": 237, + "names": ['Unknown_Calculation_237'], + }, { "index": 237, "count": 1, - "names": ['ID_WEB_Freq_VD_Min', 'Unknown_Calculation_237'], + "names": ['ID_WEB_Freq_VD_Min'], "type": Frequency, "writeable": False, "datatype": 'UINT32', "unit": 'Hz', "description": '', }, + { + "index": 238, + "names": ['Unknown_Calculation_238'], + }, { "index": 238, "count": 1, - "names": ['ID_WEB_Freq_VD_Max', 'Unknown_Calculation_238'], + "names": ['ID_WEB_Freq_VD_Max'], "type": Frequency, "writeable": False, "datatype": 'UINT32', "unit": 'Hz', "description": '', }, + { + "index": 239, + "names": ['Unknown_Calculation_239'], + }, { "index": 239, "count": 1, - "names": ['VBO_Temp_Spread_Soll', 'Unknown_Calculation_239'], + "names": ['VBO_Temp_Spread_Soll'], "type": Kelvin, "writeable": False, "datatype": 'INT32', "unit": 'K/10', "description": '', }, + { + "index": 240, + "names": ['Unknown_Calculation_240'], + }, { "index": 240, "count": 1, - "names": ['VBO_Temp_Spread_Ist', 'Unknown_Calculation_240'], + "names": ['VBO_Temp_Spread_Ist'], "type": Kelvin, "writeable": False, "datatype": 'INT32', @@ -2470,20 +2509,28 @@ "unit": '%', "description": '', }, + { + "index": 242, + "names": ['Unknown_Calculation_242'], + }, { "index": 242, "count": 1, - "names": ['HUP_Temp_Spread_Soll', 'Unknown_Calculation_242'], + "names": ['HUP_Temp_Spread_Soll'], "type": Kelvin, "writeable": False, "datatype": 'INT32', "unit": 'K/10', "description": '', }, + { + "index": 243, + "names": ['Unknown_Calculation_243'], + }, { "index": 243, "count": 1, - "names": ['HUP_Temp_Spread_Ist', 'Unknown_Calculation_243'], + "names": ['HUP_Temp_Spread_Ist'], "type": Kelvin, "writeable": False, "datatype": 'INT32', @@ -2630,10 +2677,14 @@ "unit": 'W', "description": '', }, + { + "index": 258, + "names": ['Unknown_Calculation_258'], + }, { "index": 258, "count": 1, - "names": ['RBE_Version', 'Unknown_Calculation_258'], + "names": ['RBE_Version'], "type": MajorMinorVersion, "writeable": False, "datatype": 'UINT32', diff --git a/luxtronik/definitions/parameters.py b/luxtronik/definitions/parameters.py index d5b5040e..49a3f2fd 100644 --- a/luxtronik/definitions/parameters.py +++ b/luxtronik/definitions/parameters.py @@ -10914,10 +10914,14 @@ "unit": '', "description": '', }, + { + "index": 1087, + "names": ['Unknown_Parameter_1087'], + }, { "index": 1087, "count": 1, - "names": ['SILENT_MODE', 'Unknown_Parameter_1087'], + "names": ['SILENT_MODE'], "type": OnOffMode, "writeable": False, "datatype": 'UINT32', @@ -10964,220 +10968,308 @@ "unit": '', "description": '', }, + { + "index": 1092, + "names": ['Unknown_Parameter_1092'], + }, { "index": 1092, "count": 1, - "names": ['ID_Einst_SuSilence', 'Unknown_Parameter_1092'], + "names": ['ID_Einst_SuSilence'], "type": TimerProgram, "writeable": False, "datatype": 'UINT32', "unit": 'enum', "description": '', }, + { + "index": 1093, + "names": ['Unknown_Parameter_1093'], + }, { "index": 1093, "count": 1, - "names": ['ID_Einst_SilenceTimer_0', 'Unknown_Parameter_1093'], + "names": ['ID_Einst_SilenceTimer_0'], "type": TimeOfDay2, "writeable": False, "datatype": 'UINT32', "unit": '', "description": '', }, + { + "index": 1094, + "names": ['Unknown_Parameter_1094'], + }, { "index": 1094, "count": 1, - "names": ['ID_Einst_SilenceTimer_1', 'Unknown_Parameter_1094'], + "names": ['ID_Einst_SilenceTimer_1'], "type": TimeOfDay2, "writeable": False, "datatype": 'UINT32', "unit": '', "description": '', }, + { + "index": 1095, + "names": ['Unknown_Parameter_1095'], + }, { "index": 1095, "count": 1, - "names": ['ID_Einst_SilenceTimer_2', 'Unknown_Parameter_1095'], + "names": ['ID_Einst_SilenceTimer_2'], "type": TimeOfDay2, "writeable": False, "datatype": 'UINT32', "unit": '', "description": '', }, + { + "index": 1096, + "names": ['Unknown_Parameter_1096'], + }, { "index": 1096, "count": 1, - "names": ['ID_Einst_SilenceTimer_3', 'Unknown_Parameter_1096'], + "names": ['ID_Einst_SilenceTimer_3'], "type": TimeOfDay2, "writeable": False, "datatype": 'UINT32', "unit": '', "description": '', }, + { + "index": 1097, + "names": ['Unknown_Parameter_1097'], + }, { "index": 1097, "count": 1, - "names": ['ID_Einst_SilenceTimer_4', 'Unknown_Parameter_1097'], + "names": ['ID_Einst_SilenceTimer_4'], "type": TimeOfDay2, "writeable": False, "datatype": 'UINT32', "unit": '', "description": '', }, + { + "index": 1098, + "names": ['Unknown_Parameter_1098'], + }, { "index": 1098, "count": 1, - "names": ['ID_Einst_SilenceTimer_5', 'Unknown_Parameter_1098'], + "names": ['ID_Einst_SilenceTimer_5'], "type": TimeOfDay2, "writeable": False, "datatype": 'UINT32', "unit": '', "description": '', }, + { + "index": 1099, + "names": ['Unknown_Parameter_1099'], + }, { "index": 1099, "count": 1, - "names": ['ID_Einst_SilenceTimer_6', 'Unknown_Parameter_1099'], + "names": ['ID_Einst_SilenceTimer_6'], "type": TimeOfDay2, "writeable": False, "datatype": 'UINT32', "unit": '', "description": '', }, + { + "index": 1100, + "names": ['Unknown_Parameter_1100'], + }, { "index": 1100, "count": 1, - "names": ['ID_Einst_SilenceTimer_7', 'Unknown_Parameter_1100'], + "names": ['ID_Einst_SilenceTimer_7'], "type": TimeOfDay2, "writeable": False, "datatype": 'UINT32', "unit": '', "description": '', }, + { + "index": 1101, + "names": ['Unknown_Parameter_1101'], + }, { "index": 1101, "count": 1, - "names": ['ID_Einst_SilenceTimer_8', 'Unknown_Parameter_1101'], + "names": ['ID_Einst_SilenceTimer_8'], "type": TimeOfDay2, "writeable": False, "datatype": 'UINT32', "unit": '', "description": '', }, + { + "index": 1102, + "names": ['Unknown_Parameter_1102'], + }, { "index": 1102, "count": 1, - "names": ['ID_Einst_SilenceTimer_9', 'Unknown_Parameter_1102'], + "names": ['ID_Einst_SilenceTimer_9'], "type": TimeOfDay2, "writeable": False, "datatype": 'UINT32', "unit": '', "description": '', }, + { + "index": 1103, + "names": ['Unknown_Parameter_1103'], + }, { "index": 1103, "count": 1, - "names": ['ID_Einst_SilenceTimer_10', 'Unknown_Parameter_1103'], + "names": ['ID_Einst_SilenceTimer_10'], "type": TimeOfDay2, "writeable": False, "datatype": 'UINT32', "unit": '', "description": '', }, + { + "index": 1104, + "names": ['Unknown_Parameter_1104'], + }, { "index": 1104, "count": 1, - "names": ['ID_Einst_SilenceTimer_11', 'Unknown_Parameter_1104'], + "names": ['ID_Einst_SilenceTimer_11'], "type": TimeOfDay2, "writeable": False, "datatype": 'UINT32', "unit": '', "description": '', }, + { + "index": 1105, + "names": ['Unknown_Parameter_1105'], + }, { "index": 1105, "count": 1, - "names": ['ID_Einst_SilenceTimer_12', 'Unknown_Parameter_1105'], + "names": ['ID_Einst_SilenceTimer_12'], "type": TimeOfDay2, "writeable": False, "datatype": 'UINT32', "unit": '', "description": '', }, + { + "index": 1106, + "names": ['Unknown_Parameter_1106'], + }, { "index": 1106, "count": 1, - "names": ['ID_Einst_SilenceTimer_13', 'Unknown_Parameter_1106'], + "names": ['ID_Einst_SilenceTimer_13'], "type": TimeOfDay2, "writeable": False, "datatype": 'UINT32', "unit": '', "description": '', }, + { + "index": 1107, + "names": ['Unknown_Parameter_1107'], + }, { "index": 1107, "count": 1, - "names": ['ID_Einst_SilenceTimer_14', 'Unknown_Parameter_1107'], + "names": ['ID_Einst_SilenceTimer_14'], "type": TimeOfDay2, "writeable": False, "datatype": 'UINT32', "unit": '', "description": '', }, + { + "index": 1108, + "names": ['Unknown_Parameter_1108'], + }, { "index": 1108, "count": 1, - "names": ['ID_Einst_SilenceTimer_15', 'Unknown_Parameter_1108'], + "names": ['ID_Einst_SilenceTimer_15'], "type": TimeOfDay2, "writeable": False, "datatype": 'UINT32', "unit": '', "description": '', }, + { + "index": 1109, + "names": ['Unknown_Parameter_1109'], + }, { "index": 1109, "count": 1, - "names": ['ID_Einst_SilenceTimer_16', 'Unknown_Parameter_1109'], + "names": ['ID_Einst_SilenceTimer_16'], "type": TimeOfDay2, "writeable": False, "datatype": 'UINT32', "unit": '', "description": '', }, + { + "index": 1110, + "names": ['Unknown_Parameter_1110'], + }, { "index": 1110, "count": 1, - "names": ['ID_Einst_SilenceTimer_17', 'Unknown_Parameter_1110'], + "names": ['ID_Einst_SilenceTimer_17'], "type": TimeOfDay2, "writeable": False, "datatype": 'UINT32', "unit": '', "description": '', }, + { + "index": 1111, + "names": ['Unknown_Parameter_1111'], + }, { "index": 1111, "count": 1, - "names": ['ID_Einst_SilenceTimer_18', 'Unknown_Parameter_1111'], + "names": ['ID_Einst_SilenceTimer_18'], "type": TimeOfDay2, "writeable": False, "datatype": 'UINT32', "unit": '', "description": '', }, + { + "index": 1112, + "names": ['Unknown_Parameter_1112'], + }, { "index": 1112, "count": 1, - "names": ['ID_Einst_SilenceTimer_19', 'Unknown_Parameter_1112'], + "names": ['ID_Einst_SilenceTimer_19'], "type": TimeOfDay2, "writeable": False, "datatype": 'UINT32', "unit": '', "description": '', }, + { + "index": 1113, + "names": ['Unknown_Parameter_1113'], + }, { "index": 1113, "count": 1, - "names": ['ID_Einst_SilenceTimer_20', 'Unknown_Parameter_1113'], + "names": ['ID_Einst_SilenceTimer_20'], "type": TimeOfDay2, "writeable": False, "datatype": 'UINT32', @@ -11234,10 +11326,14 @@ "unit": '', "description": '', }, + { + "index": 1119, + "names": ['Unknown_Parameter_1119'], + }, { "index": 1119, "count": 1, - "names": ['LAST_DEFROST_TIMESTAMP', 'Unknown_Parameter_1119'], + "names": ['LAST_DEFROST_TIMESTAMP'], "type": Timestamp, "writeable": False, "datatype": 'UINT32', @@ -11407,7 +11503,7 @@ { "index": 1136, "count": 1, - "names": ['HEAT_ENERGY_INPUT', 'Unknown_Parameter_1136'], + "names": ['HEAT_ENERGY_INPUT'], "type": Energy, "writeable": False, "datatype": 'UINT32', @@ -11417,7 +11513,7 @@ { "index": 1137, "count": 1, - "names": ['DHW_ENERGY_INPUT', 'Unknown_Parameter_1137'], + "names": ['DHW_ENERGY_INPUT'], "type": Energy, "writeable": False, "datatype": 'UINT32', @@ -11437,7 +11533,7 @@ { "index": 1139, "count": 1, - "names": ['COOLING_ENERGY_INPUT', 'Unknown_Parameter_1139'], + "names": ['COOLING_ENERGY_INPUT'], "type": Energy, "writeable": False, "datatype": 'UINT32', @@ -11447,7 +11543,7 @@ { "index": 1140, "count": 1, - "names": ['SECOND_HEAT_GENERATOR_AMOUNT_COUNTER', 'Unknown_Parameter_1140'], + "names": ['SECOND_HEAT_GENERATOR_AMOUNT_COUNTER'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -11527,7 +11623,7 @@ { "index": 1148, "count": 1, - "names": ['HEATING_TARGET_TEMP_ROOM_THERMOSTAT', 'Unknown_Parameter_1148'], + "names": ['HEATING_TARGET_TEMP_ROOM_THERMOSTAT'], "type": Celsius, "writeable": True, "datatype": 'INT32', @@ -11627,7 +11723,7 @@ { "index": 1158, "count": 1, - "names": ['POWER_LIMIT_SWITCH', 'Unknown_Parameter_1158'], + "names": ['POWER_LIMIT_SWITCH'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -11637,7 +11733,7 @@ { "index": 1159, "count": 1, - "names": ['POWER_LIMIT_VALUE', 'Unknown_Parameter_1159'], + "names": ['POWER_LIMIT_VALUE'], "type": Unknown, "writeable": False, "datatype": 'UINT32', diff --git a/luxtronik/definitions/visibilities.py b/luxtronik/definitions/visibilities.py index d8df6bbe..83596572 100644 --- a/luxtronik/definitions/visibilities.py +++ b/luxtronik/definitions/visibilities.py @@ -3594,7 +3594,7 @@ { "index": 357, "count": 1, - "names": ['ELECTRICAL_POWER_LIMITATION_SWITCH', 'Unknown_Visibility_357', 'Unknown_Parameter_357'], + "names": ['ELECTRICAL_POWER_LIMITATION_SWITCH', 'Unknown_Parameter_357'], "type": Unknown, "writeable": False, "datatype": 'UINT32', diff --git a/tests/cfi/test_cfi_interface.py b/tests/cfi/test_cfi_interface.py index 755b9e59..a46a2ad4 100644 --- a/tests/cfi/test_cfi_interface.py +++ b/tests/cfi/test_cfi_interface.py @@ -9,6 +9,7 @@ class TestLuxtronikSocketInterface: + def test_parse(self): lux = LuxtronikSocketInterface('host') parameters = Parameters() @@ -31,22 +32,4 @@ def test_parse(self): lux._parse(visibilities, t) v = visibilities.get(n) assert v.name == f"unknown_visibility_{n}" - assert v.raw == n - - n = 10 - t = list(range(0, n + 1)) - - lux._parse(parameters, t) - for definition, field in parameters.data.pairs(): - if definition.index > n: - assert field.raw is None - - lux._parse(calculations, t) - for definition, field in calculations.data.pairs(): - if definition.index > n: - assert field.raw is None - - lux._parse(visibilities, t) - for definition, field in visibilities.data.pairs(): - if definition.index > n: - assert field.raw is None \ No newline at end of file + assert v.raw == n \ No newline at end of file diff --git a/tests/test_compatibility.py b/tests/test_compatibility.py index 4829a295..c4b42e4f 100644 --- a/tests/test_compatibility.py +++ b/tests/test_compatibility.py @@ -2,11 +2,21 @@ # pylint: disable=too-few-public-methods,invalid-name,too-many-lines +import logging +logging.disable(logging.CRITICAL) + from luxtronik import ( Calculations, Parameters, Visibilities, + Inputs, + Holdings, ) +from luxtronik.datatypes import * + + +class Pulses(Base): + pass class TestCompatibility: """Test suite for compatibilities""" @@ -1143,69 +1153,64 @@ def test_compatibilities(self): "Unknown_Parameter_1124": (1124, Unknown), "Unknown_Parameter_1125": (1125, Unknown), # New in 'main' branch: - "SILENT_MODE": 1087, - "ID_Einst_SuSilence": 1092, - "ID_Einst_SilenceTimer_0": 1093, - "ID_Einst_SilenceTimer_1": 1094, - "ID_Einst_SilenceTimer_2": 1095, - "ID_Einst_SilenceTimer_3": 1096, - "ID_Einst_SilenceTimer_4": 1097, - "ID_Einst_SilenceTimer_5": 1098, - "ID_Einst_SilenceTimer_6": 1099, - "ID_Einst_SilenceTimer_7": 1100, - "ID_Einst_SilenceTimer_8": 1101, - "ID_Einst_SilenceTimer_9": 1102, - "ID_Einst_SilenceTimer_10": 1103, - "ID_Einst_SilenceTimer_11": 1104, - "ID_Einst_SilenceTimer_12": 1105, - "ID_Einst_SilenceTimer_13": 1106, - "ID_Einst_SilenceTimer_14": 1107, - "ID_Einst_SilenceTimer_15": 1108, - "ID_Einst_SilenceTimer_16": 1109, - "ID_Einst_SilenceTimer_17": 1110, - "ID_Einst_SilenceTimer_18": 1111, - "ID_Einst_SilenceTimer_19": 1112, - "ID_Einst_SilenceTimer_20": 1113, - "LAST_DEFROST_TIMESTAMP": 1119, - "Unknown_Parameter_1126": 1126, - "Unknown_Parameter_1127": 1127, - "Unknown_Parameter_1128": 1128, - "Unknown_Parameter_1129": 1129, - "Unknown_Parameter_1130": 1130, - "Unknown_Parameter_1131": 1131, - "Unknown_Parameter_1132": 1132, - "Unknown_Parameter_1133": 1133, - "Unknown_Parameter_1134": 1134, - "Unknown_Parameter_1135": 1135, - "Unknown_Parameter_1136": 1136, - "HEAT_ENERGY_INPUT": 1136, - "Unknown_Parameter_1137": 1137, - "DHW_ENERGY_INPUT": 1137, - "Unknown_Parameter_1138": 1138, - "Unknown_Parameter_1139": 1139, - "COOLING_ENERGY_INPUT": 1139, - "Unknown_Parameter_1140": 1140, - "SECOND_HEAT_GENERATOR_AMOUNT_COUNTER": 1140, - "Unknown_Parameter_1141": 1141, - "Unknown_Parameter_1142": 1142, - "Unknown_Parameter_1143": 1143, - "Unknown_Parameter_1144": 1144, - "Unknown_Parameter_1145": 1145, - "Unknown_Parameter_1146": 1146, - "Unknown_Parameter_1147": 1147, - "Unknown_Parameter_1148": 1148, - "HEATING_TARGET_TEMP_ROOM_THERMOSTAT": 1148, - "Unknown_Parameter_1149": 1149, - "Unknown_Parameter_1150": 1150, - "Unknown_Parameter_1151": 1151, - "Unknown_Parameter_1152": 1152, - "Unknown_Parameter_1153": 1153, - "Unknown_Parameter_1154": 1154, - "Unknown_Parameter_1155": 1155, - "Unknown_Parameter_1156": 1156, - "Unknown_Parameter_1157": 1157, - "POWER_LIMIT_SWITCH": 1158, - "POWER_LIMIT_VALUE": 1159, + "SILENT_MODE": (1087, OnOffMode), + "ID_Einst_SuSilence": (1092, TimerProgram), + "ID_Einst_SilenceTimer_0": (1093, TimeOfDay2), + "ID_Einst_SilenceTimer_1": (1094, TimeOfDay2), + "ID_Einst_SilenceTimer_2": (1095, TimeOfDay2), + "ID_Einst_SilenceTimer_3": (1096, TimeOfDay2), + "ID_Einst_SilenceTimer_4": (1097, TimeOfDay2), + "ID_Einst_SilenceTimer_5": (1098, TimeOfDay2), + "ID_Einst_SilenceTimer_6": (1099, TimeOfDay2), + "ID_Einst_SilenceTimer_7": (1100, TimeOfDay2), + "ID_Einst_SilenceTimer_8": (1101, TimeOfDay2), + "ID_Einst_SilenceTimer_9": (1102, TimeOfDay2), + "ID_Einst_SilenceTimer_10": (1103, TimeOfDay2), + "ID_Einst_SilenceTimer_11": (1104, TimeOfDay2), + "ID_Einst_SilenceTimer_12": (1105, TimeOfDay2), + "ID_Einst_SilenceTimer_13": (1106, TimeOfDay2), + "ID_Einst_SilenceTimer_14": (1107, TimeOfDay2), + "ID_Einst_SilenceTimer_15": (1108, TimeOfDay2), + "ID_Einst_SilenceTimer_16": (1109, TimeOfDay2), + "ID_Einst_SilenceTimer_17": (1110, TimeOfDay2), + "ID_Einst_SilenceTimer_18": (1111, TimeOfDay2), + "ID_Einst_SilenceTimer_19": (1112, TimeOfDay2), + "ID_Einst_SilenceTimer_20": (1113, TimeOfDay2), + "LAST_DEFROST_TIMESTAMP": (1119, Timestamp), + "Unknown_Parameter_1126": (1126, Unknown), + "Unknown_Parameter_1127": (1127, Unknown), + "Unknown_Parameter_1128": (1128, Unknown), + "Unknown_Parameter_1129": (1129, Unknown), + "Unknown_Parameter_1130": (1130, Unknown), + "Unknown_Parameter_1131": (1131, Unknown), + "Unknown_Parameter_1132": (1132, Unknown), + "Unknown_Parameter_1133": (1133, Unknown), + "Unknown_Parameter_1134": (1134, Unknown), + "Unknown_Parameter_1135": (1135, Unknown), + "HEAT_ENERGY_INPUT": (1136, Energy), + "DHW_ENERGY_INPUT": (1137, Energy), + "Unknown_Parameter_1138": (1138, Unknown), + "COOLING_ENERGY_INPUT": (1139, Energy), + "SECOND_HEAT_GENERATOR_AMOUNT_COUNTER": (1140, Unknown), + "Unknown_Parameter_1141": (1141, Unknown), + "Unknown_Parameter_1142": (1142, Unknown), + "Unknown_Parameter_1143": (1143, Unknown), + "Unknown_Parameter_1144": (1144, Unknown), + "Unknown_Parameter_1145": (1145, Unknown), + "Unknown_Parameter_1146": (1146, Unknown), + "Unknown_Parameter_1147": (1147, Unknown), + "HEATING_TARGET_TEMP_ROOM_THERMOSTAT": (1148, Celsius), + "Unknown_Parameter_1149": (1149, Unknown), + "Unknown_Parameter_1150": (1150, Unknown), + "Unknown_Parameter_1151": (1151, Unknown), + "Unknown_Parameter_1152": (1152, Unknown), + "Unknown_Parameter_1153": (1153, Unknown), + "Unknown_Parameter_1154": (1154, Unknown), + "Unknown_Parameter_1155": (1155, Unknown), + "Unknown_Parameter_1156": (1156, Unknown), + "Unknown_Parameter_1157": (1157, Unknown), + "POWER_LIMIT_SWITCH": (1158, Unknown), + "POWER_LIMIT_VALUE": (1159, Unknown), } calcs = { @@ -1462,38 +1467,37 @@ def test_compatibilities(self): "Unknown_Calculation_258": (258, Unknown), "Unknown_Calculation_259": (259, Unknown), # New in 'main' branch: - "ID_WEB_SoftStand_0": 81, - "ID_WEB_SoftStand_1": 82, - "ID_WEB_SoftStand_2": 83, - "ID_WEB_SoftStand_3": 84, - "ID_WEB_SoftStand_4": 85, - "ID_WEB_SoftStand_5": 86, - "ID_WEB_SoftStand_6": 87, - "ID_WEB_SoftStand_7": 88, - "ID_WEB_SoftStand_8": 89, - "ID_WEB_SoftStand_9": 90, - "Vapourisation_Temperature": 232, - "Liquefaction_Temperature": 233, - "ID_WEB_Freq_VD_Soll": 236, - "ID_WEB_Freq_VD_Min": 237, - "ID_WEB_Freq_VD_Max": 238, - "VBO_Temp_Spread_Soll": 239, - "VBO_Temp_Spread_Ist": 240, - "HUP_PWM": 241, - "HUP_Temp_Spread_Soll": 242, - "HUP_Temp_Spread_Ist": 243, - "RBE_Version": 258, - "Unknown_Calculation_260": 260, - "Unknown_Calculation_261": 261, - "Unknown_Calculation_262": 262, - "Unknown_Calculation_263": 263, - "Unknown_Calculation_264": 264, - "Unknown_Calculation_265": 265, - "Unknown_Calculation_266": 266, - "Desired_Room_Temperature": 267, - "AC_Power_Input": 268, + "ID_WEB_SoftStand_0": (81, Character), + "ID_WEB_SoftStand_1": (82, Character), + "ID_WEB_SoftStand_2": (83, Character), + "ID_WEB_SoftStand_3": (84, Character), + "ID_WEB_SoftStand_4": (85, Character), + "ID_WEB_SoftStand_5": (86, Character), + "ID_WEB_SoftStand_6": (87, Character), + "ID_WEB_SoftStand_7": (88, Character), + "ID_WEB_SoftStand_8": (89, Character), + "ID_WEB_SoftStand_9": (90, Character), + "Vapourisation_Temperature": (232, Celsius), + "Liquefaction_Temperature": (233, Celsius), + "ID_WEB_Freq_VD_Soll": (236, Frequency), + "ID_WEB_Freq_VD_Min": (237, Frequency), + "ID_WEB_Freq_VD_Max": (238, Frequency), + "VBO_Temp_Spread_Soll": (239, Kelvin), + "VBO_Temp_Spread_Ist": (240, Kelvin), + "HUP_PWM": (241, Percent2), + "HUP_Temp_Spread_Soll": (242, Kelvin), + "HUP_Temp_Spread_Ist": (243, Kelvin), + "RBE_Version": (258, MajorMinorVersion), + "Unknown_Calculation_260": (260, Unknown), + "Unknown_Calculation_261": (261, Unknown), + "Unknown_Calculation_262": (262, Unknown), + "Unknown_Calculation_263": (263, Unknown), + "Unknown_Calculation_264": (264, Unknown), + "Unknown_Calculation_265": (265, Unknown), + "Unknown_Calculation_266": (266, Unknown), + "Desired_Room_Temperature": (267, Celsius), + "AC_Power_Input": (268, Power), } - # Note: "ID_WEB_SoftStand" tested in "test_get_firmware_version()" visis = { # Status of 0.3.14: @@ -1852,95 +1856,299 @@ def test_compatibilities(self): "Unknown_Visibility_352": (352, Unknown), "Unknown_Visibility_353": (353, Unknown), "Unknown_Visibility_354": (354, Unknown), - # New in 'main' branch: - "ID_Visi_Heizung_Zeitschaltprogramm": 182, - "Unknown_Visibility_355": 355, - "Unknown_Visibility_356": 356, - "Unknown_Visibility_357": 357, - "ELECTRICAL_POWER_LIMITATION_SWITCH": 357, - "Unknown_Visibility_358": 358, - "Unknown_Visibility_359": 359, - "Unknown_Visibility_360": 360, - "Unknown_Visibility_361": 361, - "Unknown_Visibility_362": 362, - "Unknown_Visibility_363": 363, - "Unknown_Visibility_364": 364, - "Unknown_Visibility_365": 365, - "Unknown_Visibility_366": 366, - "Unknown_Visibility_367": 367, - "Unknown_Visibility_368": 368, - "Unknown_Visibility_369": 369, - "Unknown_Visibility_370": 370, - "Unknown_Visibility_371": 371, - "Unknown_Visibility_372": 372, - "Unknown_Visibility_373": 373, - "Unknown_Visibility_374": 374, - "Unknown_Visibility_375": 375, - "Unknown_Visibility_376": 376, - "Unknown_Visibility_377": 377, - "Unknown_Visibility_378": 378, - "Unknown_Visibility_379": 379, # Bug in v0.3.14 visibilities parse method - "Unknown_Parameter_355": 355, - "Unknown_Parameter_356": 356, - "Unknown_Parameter_357": 357, - "Unknown_Parameter_358": 358, - "Unknown_Parameter_359": 359, - "Unknown_Parameter_360": 360, - "Unknown_Parameter_361": 361, - "Unknown_Parameter_362": 362, - "Unknown_Parameter_363": 363, - "Unknown_Parameter_364": 364, - "Unknown_Parameter_365": 365, - "Unknown_Parameter_366": 366, - "Unknown_Parameter_367": 367, - "Unknown_Parameter_368": 368, - "Unknown_Parameter_369": 369, - "Unknown_Parameter_370": 370, - "Unknown_Parameter_371": 371, - "Unknown_Parameter_372": 372, - "Unknown_Parameter_373": 373, - "Unknown_Parameter_374": 374, - "Unknown_Parameter_375": 375, - "Unknown_Parameter_376": 376, - "Unknown_Parameter_377": 377, - "Unknown_Parameter_378": 378, - "Unknown_Parameter_379": 379, + "Unknown_Parameter_355": (355, Unknown), + "Unknown_Parameter_356": (356, Unknown), + "Unknown_Parameter_357": (357, Unknown), + "Unknown_Parameter_358": (358, Unknown), + "Unknown_Parameter_359": (359, Unknown), + "Unknown_Parameter_360": (360, Unknown), + "Unknown_Parameter_361": (361, Unknown), + "Unknown_Parameter_362": (362, Unknown), + "Unknown_Parameter_363": (363, Unknown), + "Unknown_Parameter_364": (364, Unknown), + "Unknown_Parameter_365": (365, Unknown), + "Unknown_Parameter_366": (366, Unknown), + "Unknown_Parameter_367": (367, Unknown), + "Unknown_Parameter_368": (368, Unknown), + "Unknown_Parameter_369": (369, Unknown), + "Unknown_Parameter_370": (370, Unknown), + "Unknown_Parameter_371": (371, Unknown), + "Unknown_Parameter_372": (372, Unknown), + "Unknown_Parameter_373": (373, Unknown), + "Unknown_Parameter_374": (374, Unknown), + "Unknown_Parameter_375": (375, Unknown), + "Unknown_Parameter_376": (376, Unknown), + "Unknown_Parameter_377": (377, Unknown), + "Unknown_Parameter_378": (378, Unknown), + "Unknown_Parameter_379": (379, Unknown), + # New in 'main' branch: + "ID_Visi_Heizung_Zeitschaltprogramm": (182, Unknown), + "Unknown_Visibility_355": (355, Unknown), + "Unknown_Visibility_356": (356, Unknown), + "ELECTRICAL_POWER_LIMITATION_SWITCH": (357, Unknown), + "Unknown_Visibility_358": (358, Unknown), + "Unknown_Visibility_359": (359, Unknown), + "Unknown_Visibility_360": (360, Unknown), + "Unknown_Visibility_361": (361, Unknown), + "Unknown_Visibility_362": (362, Unknown), + "Unknown_Visibility_363": (363, Unknown), + "Unknown_Visibility_364": (364, Unknown), + "Unknown_Visibility_365": (365, Unknown), + "Unknown_Visibility_366": (366, Unknown), + "Unknown_Visibility_367": (367, Unknown), + "Unknown_Visibility_368": (368, Unknown), + "Unknown_Visibility_369": (369, Unknown), + "Unknown_Visibility_370": (370, Unknown), + "Unknown_Visibility_371": (371, Unknown), + "Unknown_Visibility_372": (372, Unknown), + "Unknown_Visibility_373": (373, Unknown), + "Unknown_Visibility_374": (374, Unknown), + "Unknown_Visibility_375": (375, Unknown), + "Unknown_Visibility_376": (376, Unknown), + "Unknown_Visibility_377": (377, Unknown), + "Unknown_Visibility_378": (378, Unknown), + "Unknown_Visibility_379": (379, Unknown), } - values = [[paras, Parameters(), "paras"], [calcs, Calculations(), "calcs"], [visis, Visibilities(), "visis"]] + inputs = { + "heatpump_status": (0, HeatPumpStatus), + "operation_mode": (2, OperationMode), + "heating_status": (3, ModeStatus), + "hot_water_status": (4, ModeStatus), + "dhw_status": (4, ModeStatus), + "cooling_status": (6, ModeStatus), + "pool_heating_status": (7, ModeStatus), + "return_line_temp": (100, CelsiusUInt16), + "return_line_target": (101, CelsiusUInt16), + "return_line_ext": (102, CelsiusUInt16), + "return_line_limit": (103, CelsiusInt16), + "return_line_min_target": (104, CelsiusInt16), + "flow_line_temp": (105, CelsiusUInt16), + "room_temperature": (106, CelsiusInt16), + "heating_limit": (107, CelsiusInt16), + "outside_temp": (108, CelsiusInt16), + "outside_temp_average": (109, CelsiusInt16), + "heat_source_input": (110, CelsiusInt16), + "heat_source_output": (111, CelsiusInt16), + "max_flow_temp": (112, CelsiusUInt16), + "unknown_input_113": (113, Unknown), + "hot_water_temp": (120, CelsiusInt16), + "dhw_temp": (120, CelsiusInt16), + "hot_water_target": (121, CelsiusUInt16), + "dhw_target": (121, CelsiusUInt16), + "hot_water_min": (122, CelsiusInt16), + "dhw_min": (122, CelsiusInt16), + "hot_water_max": (123, CelsiusInt16), + "dhw_max": (123, CelsiusInt16), + "hot_water_limit": (124, CelsiusInt16), + "dhw_limit": (124, CelsiusInt16), + "mc1_temp": (140, CelsiusInt16), + "mc1_target": (141, CelsiusInt16), + "mc1_min": (142, CelsiusInt16), + "mc1_max": (143, CelsiusInt16), + "mc2_temp": (150, CelsiusInt16), + "mc2_target": (151, CelsiusInt16), + "mc2_min": (152, CelsiusInt16), + "mc2_max": (153, CelsiusInt16), + "mc3_temp": (160, CelsiusInt16), + "mc3_target": (161, CelsiusInt16), + "mc3_min": (162, CelsiusInt16), + "mc3_max": (163, CelsiusInt16), + "error_number": (201, Errorcode), + "buffer_type": (202, BufferType), + "min_off_time": (203, Minutes), + "min_run_time": (204, Minutes), + "cooling_configured": (205, OnOffMode), + "pool_heating_configured": (206, OnOffMode), + "cooling_release": (207, OnOffMode), + "heating_power_actual": (300, PowerKW), + "electric_power_actual": (301, PowerKW), + "electric_power_min_predicted": (302, PowerKW), + "electric_energy_total": (310, Energy), + "electric_energy_heating": (312, Energy), + "electric_energy_dhw": (314, Energy), + "electric_energy_cooling": (316, Energy), + "electric_energy_pool": (318, Energy), + "thermal_energy_total": (320, Energy), + "thermal_energy_heating": (322, Energy), + "thermal_energy_dhw": (324, Energy), + "thermal_energy_cooling": (326, Energy), + "thermal_energy_pool": (328, Energy), + "unknown_input_350": (350, Unknown), + "unknown_input_351": (351, Unknown), + "unknown_input_352": (352, Unknown), + "unknown_input_353": (353, Unknown), + "unknown_input_354": (354, Unknown), + "unknown_input_355": (355, Unknown), + "unknown_input_356": (356, Unknown), + "unknown_input_360": (360, Unknown), + "unknown_input_361": (361, Unknown), + "version": (400, FullVersion), + "unknown_input_404": (404, Unknown), + "unknown_input_405": (405, Unknown), + "unknown_input_406": (406, Unknown), + "unknown_input_407": (407, Unknown), + "unknown_input_408": (408, Unknown), + "unknown_input_409": (409, Unknown), + "unknown_input_410": (410, Unknown), + "unknown_input_411": (411, Unknown), + "unknown_input_412": (412, Unknown), + "unknown_input_413": (413, Unknown), + "unknown_input_416": (416, Unknown), + "unknown_input_417": (417, Unknown), + "unknown_input_500": (500, Unknown), + "unknown_input_501": (501, Unknown), + "unknown_input_502": (502, Unknown), + } + + holdings = { + # New in 'main' branch: + "heating_mode": (0, ControlMode), + "heating_setpoint": (1, CelsiusUInt16), + "heating_offset": (2, KelvinInt16), + "heating_level": (3, LevelMode), + "hot_water_mode": (5, ControlMode), + "dhw_mode": (5, ControlMode), + "hot_water_setpoint": (6, CelsiusUInt16), + "dhw_setpoint": (6, CelsiusUInt16), + "hot_water_offset": (7, KelvinInt16), + "dhw_offset": (7, KelvinInt16), + "hot_water_level": (8, LevelMode), + "dhw_level": (8, LevelMode), + "mc1_heat_mode": (10, ControlMode), + "mc1_heat_setpoint": (11, CelsiusUInt16), + "mc1_heat_offset": (12, KelvinInt16), + "mc1_heat_level": (13, LevelMode), + "mc1_cool_mode": (15, ControlMode), + "mc1_cool_setpoint": (16, CelsiusUInt16), + "mc1_cool_offset": (17, KelvinInt16), + "mc2_heat_mode": (20, ControlMode), + "mc2_heat_setpoint": (21, CelsiusUInt16), + "mc2_heat_offset": (22, KelvinInt16), + "mc2_heat_level": (23, LevelMode), + "mc2_cool_mode": (25, ControlMode), + "mc2_cool_setpoint": (26, CelsiusUInt16), + "mc2_cool_offset": (27, KelvinInt16), + "mc3_heat_mode": (30, ControlMode), + "mc3_heat_setpoint": (31, CelsiusUInt16), + "mc3_heat_offset": (32, KelvinInt16), + "mc3_heat_level": (33, LevelMode), + "mc3_cool_mode": (35, ControlMode), + "mc3_cool_setpoint": (36, CelsiusUInt16), + "mc3_cool_offset": (37, KelvinInt16), + "lpc_mode": (40, LpcMode), + "pc_limit": (41, PowerKW), + "lock_heating": (50, LockMode), + "lock_hot_water": (51, LockMode), + "lock_cooling": (52, LockMode), + "lock_swimming_pool": (53, LockMode), + "unknown_holding_60": (60, Unknown), + "heat_overall_mode": (65, ControlMode), + "heat_overall_offset": (66, KelvinInt16), + "heat_overall_mode": (65, ControlMode), + "heat_overall_offset": (66, KelvinInt16), + "heat_overall_level": (67, LevelMode), + "circulation": (70, OnOffMode), + "hot_water_extra": (71, OnOffMode), + } + + values = [ + [paras, Parameters(), "paras"], + [calcs, Calculations(), "calcs"], + [visis, Visibilities(), "visis"], + [inputs, Inputs(), "inputs"], + [holdings, Holdings(), "holdings"], + ] # First, we check if we can find all entries of the above dicts. - ok = True - for mapping, obj, caption in values: - print_caption = True - for old_name, old_idx in mapping.items(): - def_by_name = obj.definitions.get(old_name) - field_by_name = obj.get(old_name) - if (def_by_name is None) \ - or (field_by_name is None) \ - or (def_by_name.index != old_idx) \ - or (def_by_name.name != field_by_name.name) \ - or (old_name not in def_by_name.names): - # We do not use assert here, in order to catch all incompatibilities at once. - if print_caption: - print(f"### Incompatibilities - {caption}:") - print_caption = False - print(f'"{old_name}" is not registered for {old_idx}: "{def_by_name.name}",') - ok = False + all_ok = True + for mapping, data_vector, caption in values: + obsolete_found = [] + old_not_found = [] + old_idx_wrong = [] + old_type_changed = [] + + for old_name, (old_idx, old_type) in mapping.items(): + + # Try to get the definition of the "old name" + try: + def_by_name = data_vector.definitions.get(old_name) + except Exception as e: + def_by_name = None + old_found = def_by_name is not None + old_is_obsolete = old_name in data_vector._obsolete + + # Check names + # We do not use assert here, in order to catch all incompatibilities at once. + if old_found and old_is_obsolete: + obsolete_found.append(f"{old_name} marked as obsolete, but a definition was found!") + continue + + if not old_found and not old_is_obsolete: + old_not_found.append(f"No definition found for {old_name} with index {old_idx} and type {old_type.__name__}") + continue + + if old_found: + if old_idx != def_by_name.index: + old_idx_wrong.append(f"Index of {old_name} changed from {old_idx} to {def_by_name.index}") + continue + + #if old_name != def_by_name.name: + # new name available -> no error + + if old_type != def_by_name.field_type: + old_type_changed.append(f"Type of {old_name} changed from {old_type.__name__} to {def_by_name.field_type.__name__}") + + # Currently we allow type changes + ok = not obsolete_found and not old_not_found \ + and not old_idx_wrong # and not old_type_changed + do_print = not ok or len(old_type_changed) > 0 + + if do_print: + print(f"############################## Incompatibilities - {caption}:") + if obsolete_found: + print(f"############################## obsolete") + for err in obsolete_found: + print(err) + if old_not_found: + print(f"############################## not found") + for err in old_not_found: + print(err) + if old_idx_wrong: + print(f"############################## idx wrong") + for err in old_idx_wrong: + print(err) + if old_type_changed: + print(f"############################## type changed") + for err in old_type_changed: + print(err) + + all_ok &= ok assert ok, "Found incompatibilities. Please consider to add them to compatibilities.py" # Second, we check if all names are present in the above dicts. - ok = True - for mapping, obj, caption in values: - print_caption = True - for definition, field in obj.items(): - if field.name not in mapping: + all_ok = True + for mapping, data_vector, caption in values: + missing = [] + + for definition, field in data_vector.items(): + for name in definition.names: + + # Check existing entries # We do not use assert here, in order to catch all incompatibilities at once. # The output can be copied to the dicts above - if print_caption: - print(f"### Missing - {caption}:") - print_caption = False - print(f'"{field.name}": {definition.index},') - ok = False - assert ok, f"Found missing {obj.name}. Please consider to add them to the test suite." \ No newline at end of file + if name not in mapping: + missing.append(f'"{name}": ({definition.index}, {definition.field_type.__name__}),') + + ok = not missing + do_print = not ok + + if do_print: + print(f"############################## Missing - {caption}:") + if missing: + for err in missing: + print(err) + + all_ok &= ok + assert all_ok, f"Found missing entries. Please consider to add them to the test suite." \ No newline at end of file From 53e9752b84e2fcc6e229a4984ecb9710c8d63258 Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Sat, 24 Jan 2026 21:04:17 +0100 Subject: [PATCH 35/68] wip --- luxtronik/datatypes.py | 26 -------------------------- tests/test_compatibility.py | 3 +++ 2 files changed, 3 insertions(+), 26 deletions(-) diff --git a/luxtronik/datatypes.py b/luxtronik/datatypes.py index a2862298..62150e6c 100755 --- a/luxtronik/datatypes.py +++ b/luxtronik/datatypes.py @@ -1,7 +1,6 @@ """datatype conversions.""" import datetime -import ipaddress import socket import struct @@ -328,31 +327,6 @@ class Seconds(Base): datatype_unit = "s" -class Pulses(Base): - """Pulses datatype, converts from and to Pulses.""" - - datatype_class = "pulses" - - -class IPAddress(Base): - """IP Address datatype, converts from and to an IP Address.""" - - datatype_class = "ipaddress" - - def from_heatpump(self, value): - if value < 0: - return str(ipaddress.IPv4Address(value + 2**32)) - if value > 2**32: - return str(ipaddress.IPv4Address(value - 2**32)) - return str(ipaddress.IPv4Address(value)) - - def to_heatpump(self, value): - result = int(ipaddress.IPv4Address(value)) - if result > 2**32: - return result - 2**32 - return result - - class IPv4Address(Base): """IPv4 address datatype, converts from and to an IPv4 address.""" diff --git a/tests/test_compatibility.py b/tests/test_compatibility.py index c4b42e4f..b23e9436 100644 --- a/tests/test_compatibility.py +++ b/tests/test_compatibility.py @@ -18,6 +18,9 @@ class Pulses(Base): pass +class IPAddress(Base): + pass + class TestCompatibility: """Test suite for compatibilities""" From 7b51d0c123dbcdfc7ad778974cf1eebd4a89f180 Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Sat, 24 Jan 2026 21:13:05 +0100 Subject: [PATCH 36/68] wip --- luxtronik/cfi/calculations.py | 2 ++ luxtronik/cfi/parameters.py | 2 ++ luxtronik/cfi/visibilities.py | 2 ++ luxtronik/definitions/calculations.py | 2 ++ luxtronik/definitions/holdings.py | 2 ++ luxtronik/definitions/inputs.py | 2 ++ luxtronik/definitions/parameters.py | 2 ++ luxtronik/definitions/visibilities.py | 2 ++ luxtronik/shi/holdings.py | 6 ++++-- luxtronik/shi/inputs.py | 4 +++- 10 files changed, 23 insertions(+), 3 deletions(-) diff --git a/luxtronik/cfi/calculations.py b/luxtronik/cfi/calculations.py index 5c2868af..986e7e8c 100644 --- a/luxtronik/cfi/calculations.py +++ b/luxtronik/cfi/calculations.py @@ -8,6 +8,7 @@ CALCULATIONS_DEFINITIONS_LIST, CALCULATIONS_OFFSET, CALCULATIONS_DEFAULT_DATA_TYPE, + CALCULATIONS_OUTDATED, ) from luxtronik.cfi.constants import CALCULATIONS_FIELD_NAME @@ -29,6 +30,7 @@ class Calculations(DataVectorConfig): name = CALCULATIONS_FIELD_NAME definitions = CALCULATIONS_DEFINITIONS + _outdated = CALCULATIONS_OUTDATED def get_firmware_version(self): """Get the firmware version as string.""" diff --git a/luxtronik/cfi/parameters.py b/luxtronik/cfi/parameters.py index 034c3fa8..f578b81c 100644 --- a/luxtronik/cfi/parameters.py +++ b/luxtronik/cfi/parameters.py @@ -8,6 +8,7 @@ PARAMETERS_DEFINITIONS_LIST, PARAMETERS_OFFSET, PARAMETERS_DEFAULT_DATA_TYPE, + PARAMETERS_OUTDATED, ) from luxtronik.cfi.constants import PARAMETERS_FIELD_NAME @@ -28,3 +29,4 @@ class Parameters(DataVectorConfig): name = PARAMETERS_FIELD_NAME definitions = PARAMETERS_DEFINITIONS + _outdated = PARAMETERS_OUTDATED diff --git a/luxtronik/cfi/visibilities.py b/luxtronik/cfi/visibilities.py index 0979001f..224f8f32 100644 --- a/luxtronik/cfi/visibilities.py +++ b/luxtronik/cfi/visibilities.py @@ -8,6 +8,7 @@ VISIBILITIES_DEFINITIONS_LIST, VISIBILITIES_OFFSET, VISIBILITIES_DEFAULT_DATA_TYPE, + VISIBILITIES_OUTDATED, ) from luxtronik.cfi.constants import VISIBILITIES_FIELD_NAME @@ -28,3 +29,4 @@ class Visibilities(DataVectorConfig): name = VISIBILITIES_FIELD_NAME definitions = VISIBILITIES_DEFINITIONS + _outdated = VISIBILITIES_OUTDATED diff --git a/luxtronik/definitions/calculations.py b/luxtronik/definitions/calculations.py index fcc7bd24..12e653ad 100644 --- a/luxtronik/definitions/calculations.py +++ b/luxtronik/definitions/calculations.py @@ -49,6 +49,8 @@ # to obtain the correct address of the data fields CALCULATIONS_OFFSET: Final = 0 CALCULATIONS_DEFAULT_DATA_TYPE: Final = 'INT32' +CALCULATIONS_OUTDATED = { +} CALCULATIONS_DEFINITIONS_LIST: Final = [ { diff --git a/luxtronik/definitions/holdings.py b/luxtronik/definitions/holdings.py index 2c56d9d2..c14fbabf 100644 --- a/luxtronik/definitions/holdings.py +++ b/luxtronik/definitions/holdings.py @@ -30,6 +30,8 @@ # to obtain the correct address of the data fields HOLDINGS_OFFSET: Final = 10000 HOLDINGS_DEFAULT_DATA_TYPE: Final = 'INT16' +HOLDINGS_OUTDATED = { +} HOLDINGS_DEFINITIONS_LIST: Final = [ { diff --git a/luxtronik/definitions/inputs.py b/luxtronik/definitions/inputs.py index 954c8e55..a1a9715a 100644 --- a/luxtronik/definitions/inputs.py +++ b/luxtronik/definitions/inputs.py @@ -35,6 +35,8 @@ # to obtain the correct address of the data fields INPUTS_OFFSET: Final = 10000 INPUTS_DEFAULT_DATA_TYPE: Final = 'INT16' +INPUTS_OUTDATED = { +} INPUTS_DEFINITIONS_LIST: Final = [ { diff --git a/luxtronik/definitions/parameters.py b/luxtronik/definitions/parameters.py index 49a3f2fd..8271f05f 100644 --- a/luxtronik/definitions/parameters.py +++ b/luxtronik/definitions/parameters.py @@ -42,6 +42,8 @@ # to obtain the correct address of the data fields PARAMETERS_OFFSET: Final = 0 PARAMETERS_DEFAULT_DATA_TYPE: Final = 'INT32' +PARAMETERS_OUTDATED = { +} PARAMETERS_DEFINITIONS_LIST: Final = [ { diff --git a/luxtronik/definitions/visibilities.py b/luxtronik/definitions/visibilities.py index 83596572..a4a86451 100644 --- a/luxtronik/definitions/visibilities.py +++ b/luxtronik/definitions/visibilities.py @@ -19,6 +19,8 @@ # to obtain the correct address of the data fields VISIBILITIES_OFFSET: Final = 0 VISIBILITIES_DEFAULT_DATA_TYPE: Final = 'INT32' +VISIBILITIES_OUTDATED = { +} VISIBILITIES_DEFINITIONS_LIST: Final = [ { diff --git a/luxtronik/shi/holdings.py b/luxtronik/shi/holdings.py index cdc39054..1bd065eb 100644 --- a/luxtronik/shi/holdings.py +++ b/luxtronik/shi/holdings.py @@ -7,7 +7,8 @@ from luxtronik.definitions.holdings import ( HOLDINGS_DEFINITIONS_LIST, HOLDINGS_OFFSET, - HOLDINGS_DEFAULT_DATA_TYPE + HOLDINGS_DEFAULT_DATA_TYPE, + HOLDINGS_OUTDATED, ) from luxtronik.shi.constants import HOLDINGS_FIELD_NAME @@ -27,4 +28,5 @@ class Holdings(DataVectorSmartHome): """Class that holds holding fields.""" name = HOLDINGS_FIELD_NAME - definitions = HOLDINGS_DEFINITIONS \ No newline at end of file + definitions = HOLDINGS_DEFINITIONS + _outdated = HOLDINGS_OUTDATED \ No newline at end of file diff --git a/luxtronik/shi/inputs.py b/luxtronik/shi/inputs.py index d609e9c4..cf36a8ef 100644 --- a/luxtronik/shi/inputs.py +++ b/luxtronik/shi/inputs.py @@ -8,6 +8,7 @@ INPUTS_DEFINITIONS_LIST, INPUTS_OFFSET, INPUTS_DEFAULT_DATA_TYPE, + INPUTS_OUTDATED, ) from luxtronik.shi.constants import INPUTS_FIELD_NAME @@ -27,4 +28,5 @@ class Inputs(DataVectorSmartHome): """Class that holds input fields.""" name = INPUTS_FIELD_NAME - definitions = INPUTS_DEFINITIONS \ No newline at end of file + definitions = INPUTS_DEFINITIONS + _outdated = INPUTS_OUTDATED \ No newline at end of file From 8c51f1da1d092051612c980230a683d3f83036f5 Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Sat, 24 Jan 2026 22:20:38 +0100 Subject: [PATCH 37/68] wip, multiple fields per register --- luxtronik/collections.py | 8 + luxtronik/definitions/__init__.py | 15 +- luxtronik/definitions/holdings.py | 300 ++++++++++++++++++------------ luxtronik/definitions/inputs.py | 148 +++++++++------ 4 files changed, 294 insertions(+), 177 deletions(-) diff --git a/luxtronik/collections.py b/luxtronik/collections.py index 814411ad..8ead2a59 100644 --- a/luxtronik/collections.py +++ b/luxtronik/collections.py @@ -88,6 +88,10 @@ def get_data_arr(definition, field, num_bits): data = field.raw if data is None: return None + # Currently, no read-modify-write function is implemented. + # For this reason, we cannot write (and retrieve the data to write) + # from a field with a bit_offset. + # -> no additional code here like in `integrate_data` should_unpack = field.concatenate_multiple_data_chunks \ and definition.count > 1 if should_unpack and not isinstance(data, list): @@ -111,6 +115,7 @@ def integrate_data(definition, field, raw_data, num_bits, data_offset=-1): # Use data_offset if provided, otherwise the index data_offset = data_offset if data_offset >= 0 else definition.index # Use the information of the definition to extract the raw-value + use_bit_offset = definition.bit_offset and definition.num_bits if (data_offset + definition.count - 1) >= len(raw_data): raw = None elif definition.count == 1: @@ -124,6 +129,9 @@ def integrate_data(definition, field, raw_data, num_bits, data_offset=-1): raw = pack_values(raw, num_bits) raw = raw if definition.check_raw_not_none(raw) else None + # Perform bit shift operations + if use_bit_offset and isinstance(raw, int): + raw = (raw >> definition.bit_offset) & ((1 << definition.num_bits) - 1) field.raw = raw ############################################################################### diff --git a/luxtronik/definitions/__init__.py b/luxtronik/definitions/__init__.py index ed3b14c5..dddafa6a 100644 --- a/luxtronik/definitions/__init__.py +++ b/luxtronik/definitions/__init__.py @@ -39,6 +39,8 @@ class LuxtronikDefinition: "since": "", "until": "", "datatype": "", + "bit_offset": None, + "bit_count": None, "description": "", } @@ -91,8 +93,13 @@ def __init__(self, data_dict, type_name, offset): data_type_valid = self._data_type in self.VALID_DATA_TYPES self._valid &= data_type_valid data_type_valid &= self._data_type != "" - self._num_bits = int(self._data_type.replace('U', '').replace('INT', '')) \ - if data_type_valid else 0 + self._bit_offset = data_dict["bit_offset"] + bit_count = data_dict["bit_count"] + if bit_count: + self._num_bits = bit_count + else: + self._num_bits = int(self._data_type.replace('U', '').replace('INT', '')) \ + if data_type_valid else 0 except Exception as e: self._valid = False self._index = 0 @@ -160,6 +167,10 @@ def field_type(self): def writeable(self): return self._writeable + @property + def bit_offset(self): + return self._bit_offset + @property def num_bits(self): return self._num_bits diff --git a/luxtronik/definitions/holdings.py b/luxtronik/definitions/holdings.py index c14fbabf..2f5b5110 100644 --- a/luxtronik/definitions/holdings.py +++ b/luxtronik/definitions/holdings.py @@ -45,11 +45,13 @@ "default": 0, "range": {"min": 0, "max": 3}, "since": "3.90.1", - "description": "Configuration for heating operation \ -0: no influence \ -1: Heating setpoint \ -2: Heating offset \ -3: Heating level" + "description": ( + "Configuration for heating operation\n" + "0: no influence\n" + "1: Heating setpoint\n" + "2: Heating offset\n" + "3: Heating level" + ) }, { "index": 1, @@ -62,9 +64,11 @@ "default": 350, "range": {"min": 150, "max": 750}, "since": "3.90.1", - "description": "Overrides the current return temperature setpoint (tRL) for heating. \ -Value may be limited by heat pump controller settings. \ -Requires heating_mode = setpoint to apply." + "description": ( + "Overrides the current return temperature setpoint (tRL) for heating. " + "Value may be limited by heat pump controller settings. " + "Requires heating_mode = setpoint to apply." + ) }, { "index": 2, @@ -77,8 +81,10 @@ "default": 0, "range": {"min": -200, "max": 200}, "since": "3.90.1", - "description": "Offset applied to the current return temperature setpoint (tRL) for heating. \ -Requires heating_mode = offset to apply." + "description": ( + "Offset applied to the current return temperature setpoint (tRL) for heating. " + "Requires heating_mode = offset to apply." + ) }, { "index": 3, @@ -87,8 +93,10 @@ "type": LevelMode, "writeable": True, "since": "3.92.0", - "description": "Increase or decrease the heating temperature " \ - "using the SHI offset settings.", + "description": ( + "Increase or decrease the heating temperature " + "using the SHI offset settings." + ) }, { "index": 5, @@ -101,11 +109,13 @@ "default": 0, "range": {"min": 0, "max": 3}, "since": "3.90.1", - "description": "Configuration for domestic hot water operation \ -0: no influence \ -1: DHW setpoint \ -2: DHW offset \ -3: DHW level" + "description": ( + "Configuration for domestic hot water operation\n" + "0: no influence\n" + "1: DHW setpoint\n" + "2: DHW offset\n" + "3: DHW level" + ) }, { "index": 6, @@ -118,9 +128,11 @@ "default": 400, "range": {"min": 300, "max": 750}, "since": "3.90.1", - "description": "Overrides the current DHW setpoint. \ -Value may be limited by heat pump controller settings. \ -Requires dhw_mode = setpoint to apply." + "description": ( + "Overrides the current DHW setpoint. " + "Value may be limited by heat pump controller settings. " + "Requires dhw_mode = setpoint to apply." + ) }, { "index": 7, @@ -133,8 +145,10 @@ "default": 0, "range": {"min": -200, "max": 200}, "since": "3.90.1", - "description": "Offset applied to the current DHW setpoint. \ -Requires dhw_mode = offset to apply." + "description": ( + "Offset applied to the current DHW setpoint. " + "Requires dhw_mode = offset to apply." + ) }, { "index": 8, @@ -143,8 +157,10 @@ "type": LevelMode, "writeable": True, "since": "3.92.0", - "description": "Increase or decrease the hot water temperature " \ - "using the SHI offset settings.", + "description": ( + "Increase or decrease the hot water temperature " + "using the SHI offset settings." + ) }, { "index": 10, @@ -157,11 +173,13 @@ "default": 0, "range": {"min": 0, "max": 3}, "since": "3.90.1", - "description": "Configuration for mixing circuit 1 heating operation \ -0: no influence \ -1: Heating setpoint \ -2: Heating offset \ -3: Heating level" + "description": ( + "Configuration for mixing circuit 1 heating operation\n" + "0: no influence\n" + "1: Heating setpoint\n" + "2: Heating offset\n" + "3: Heating level" + ) }, { "index": 11, @@ -174,9 +192,11 @@ "default": 350, "range": {"min": 200, "max": 650}, "since": "3.90.1", - "description": "Overrides the current flow temperature for mixing circuit 1 heating. \ -Value may be limited by heat pump controller settings. \ -Requires mc1_heat_mode = setpoint to apply." + "description": ( + "Overrides the current flow temperature for mixing circuit 1 heating. " + "Value may be limited by heat pump controller settings. " + "Requires mc1_heat_mode = setpoint to apply." + ) }, { "index": 12, @@ -189,8 +209,10 @@ "default": 0, "range": {"min": -50, "max": 50}, "since": "3.90.1", - "description": "Offset applied to the current flow temperature for mixing circuit 1 heating. \ -Requires mc1_heat_mode = offset to apply." + "description": ( + "Offset applied to the current flow temperature for mixing circuit 1 heating. " + "Requires mc1_heat_mode = offset to apply." + ) }, { "index": 13, @@ -199,8 +221,10 @@ "type": LevelMode, "writeable": True, "since": "3.92.0", - "description": "Increase or decrease the mixing circuit 1 temperature " \ - "using the SHI offset settings.", + "description": ( + "Increase or decrease the mixing circuit 1 temperature " + "using the SHI offset settings." + ) }, { "index": 15, @@ -213,11 +237,13 @@ "default": 0, "range": {"min": 0, "max": 3}, "since": "3.90.1", - "description": "Configuration for mixing circuit 1 cooling operation \ -0: no influence \ -1: Cooling setpoint \ -2: Cooling offset \ -3: Cooling level" + "description": ( + "Configuration for mixing circuit 1 cooling operation\n" + "0: no influence\n" + "1: Cooling setpoint\n" + "2: Cooling offset\n" + "3: Cooling level" + ) }, { "index": 16, @@ -230,9 +256,11 @@ "default": 200, "range": {"min": 50, "max": 250}, "since": "3.90.1", - "description": "Overrides the current flow temperature for mixing circuit 1 cooling. \ -Value may be limited by heat pump controller settings. \ -Requires mc1_cool_mode = setpoint to apply." + "description": ( + "Overrides the current flow temperature for mixing circuit 1 cooling. " + "Value may be limited by heat pump controller settings. " + "Requires mc1_cool_mode = setpoint to apply." + ) }, { "index": 17, @@ -245,8 +273,10 @@ "default": 0, "range": {"min": -50, "max": 50}, "since": "3.90.1", - "description": "Offset applied to the current flow temperature for mixing circuit 1 cooling. \ -Requires mc1_cool_mode = offset to apply." + "description": ( + "Offset applied to the current flow temperature for mixing circuit 1 cooling. " + "Requires mc1_cool_mode = offset to apply." + ) }, { "index": 20, @@ -259,11 +289,13 @@ "default": 0, "range": {"min": 0, "max": 3}, "since": "3.90.1", - "description": "Configuration for mixing circuit 2 heating operation \ -0: no influence \ -1: Heating setpoint \ -2: Heating offset \ -3: Heating level" + "description": ( + "Configuration for mixing circuit 2 heating operation\n" + "0: no influence\n" + "1: Heating setpoint\n" + "2: Heating offset\n" + "3: Heating level" + ) }, { "index": 21, @@ -276,9 +308,11 @@ "default": 350, "range": {"min": 200, "max": 650}, "since": "3.90.1", - "description": "Overrides the current flow temperature for mixing circuit 2 heating. \ -Value may be limited by heat pump controller settings. \ -Requires mc2_heat_mode = setpoint to apply." + "description": ( + "Overrides the current flow temperature for mixing circuit 2 heating. " + "Value may be limited by heat pump controller settings. " + "Requires mc2_heat_mode = setpoint to apply." + ) }, { "index": 22, @@ -291,8 +325,10 @@ "default": 0, "range": {"min": -50, "max": 50}, "since": "3.90.1", - "description": "Offset applied to the current flow temperature for mixing circuit 2 heating. \ -Requires mc2_heat_mode = offset to apply." + "description": ( + "Offset applied to the current flow temperature for mixing circuit 2 heating. " + "Requires mc2_heat_mode = offset to apply." + ) }, { "index": 23, @@ -301,8 +337,10 @@ "type": LevelMode, "writeable": True, "since": "3.92.0", - "description": "Increase or decrease the mixing circuit 2 temperature " \ - "using the SHI offset settings.", + "description": ( + "Increase or decrease the mixing circuit 2 temperature " + "using the SHI offset settings." + ) }, { "index": 25, @@ -315,11 +353,13 @@ "default": 0, "range": {"min": 0, "max": 3}, "since": "3.90.1", - "description": "Configuration for mixing circuit 2 cooling operation \ -0: no influence \ -1: Cooling setpoint \ -2: Cooling offset \ -3: Cooling level" + "description": ( + "Configuration for mixing circuit 2 cooling operation\n" + "0: no influence\n" + "1: Cooling setpoint\n" + "2: Cooling offset\n" + "3: Cooling level" + ) }, { "index": 26, @@ -332,9 +372,11 @@ "default": 200, "range": {"min": 50, "max": 250}, "since": "3.90.1", - "description": "Overrides the current flow temperature for mixing circuit 2 cooling. \ -Value may be limited by heat pump controller settings. \ -Requires mc2_cool_mode = setpoint to apply." + "description": ( + "Overrides the current flow temperature for mixing circuit 2 cooling. " + "Value may be limited by heat pump controller settings. " + "Requires mc2_cool_mode = setpoint to apply." + ) }, { "index": 27, @@ -347,8 +389,10 @@ "default": 0, "range": {"min": -50, "max": 50}, "since": "3.90.1", - "description": "Offset applied to the current flow temperature for mixing circuit 2 cooling. \ -Requires mc2_cool_mode = offset to apply." + "description": ( + "Offset applied to the current flow temperature for mixing circuit 2 cooling. " + "Requires mc2_cool_mode = offset to apply." + ) }, { "index": 30, @@ -361,11 +405,13 @@ "default": 0, "range": {"min": 0, "max": 3}, "since": "3.90.1", - "description": "Configuration for mixing circuit 3 heating operation \ -0: no influence \ -1: Heating setpoint \ -2: Heating offset \ -3: Heating level" + "description": ( + "Configuration for mixing circuit 3 heating operation\n" + "0: no influence\n" + "1: Heating setpoint\n" + "2: Heating offset\n" + "3: Heating level" + ) }, { "index": 31, @@ -378,9 +424,11 @@ "default": 350, "range": {"min": 200, "max": 650}, "since": "3.90.1", - "description": "Overrides the current flow temperature for mixing circuit 3 heating. \ -Value may be limited by heat pump controller settings. \ -Requires mc3_heat_mode = setpoint to apply." + "description": ( + "Overrides the current flow temperature for mixing circuit 3 heating. " + "Value may be limited by heat pump controller settings. " + "Requires mc3_heat_mode = setpoint to apply." + ) }, { "index": 32, @@ -393,8 +441,10 @@ "default": 0, "range": {"min": -50, "max": 50}, "since": "3.90.1", - "description": "Offset applied to the current flow temperature for mixing circuit 3 heating. \ -Requires mc3_heat_mode = offset to apply." + "description": ( + "Offset applied to the current flow temperature for mixing circuit 3 heating. " + "Requires mc3_heat_mode = offset to apply." + ) }, { "index": 33, @@ -403,8 +453,10 @@ "type": LevelMode, "writeable": True, "since": "3.92.0", - "description": "Increase or decrease the mixing circuit 3 temperature " \ - "using the SHI offset settings.", + "description": ( + "Increase or decrease the mixing circuit 3 temperature " + "using the SHI offset settings." + ) }, { "index": 35, @@ -417,11 +469,13 @@ "default": 0, "range": {"min": 0, "max": 3}, "since": "3.90.1", - "description": "Configuration for mixing circuit 3 cooling operation \ -0: no influence \ -1: Cooling setpoint \ -2: Cooling offset \ -3: Cooling level" + "description": ( + "Configuration for mixing circuit 3 cooling operation\n" + "0: no influence\n" + "1: Cooling setpoint\n" + "2: Cooling offset\n" + "3: Cooling level" + ) }, { "index": 36, @@ -434,9 +488,11 @@ "default": 200, "range": {"min": 50, "max": 250}, "since": "3.90.1", - "description": "Overrides the current flow temperature for mixing circuit 3 cooling. \ -Value may be limited by heat pump controller settings. \ -Requires mc3_cool_mode = setpoint to apply." + "description": ( + "Overrides the current flow temperature for mixing circuit 3 cooling. " + "Value may be limited by heat pump controller settings. " + "Requires mc3_cool_mode = setpoint to apply." + ) }, { "index": 37, @@ -449,8 +505,10 @@ "default": 0, "range": {"min": -50, "max": 50}, "since": "3.90.1", - "description": "Offset applied to the current flow temperature for mixing circuit 3 cooling. \ -Requires mc3_cool_mode = offset to apply." + "description": ( + "Offset applied to the current flow temperature for mixing circuit 3 cooling. " + "Requires mc3_cool_mode = offset to apply." + ) }, { "index": 40, @@ -463,17 +521,19 @@ "default": 0, "range": {"min": 0, "max": 2}, "since": "3.90.1", - "description": "Configuration for limitation of power consumption: \ -0: no power limitation (normal operation) \ -Setpoint values are achieved with heat pump performance curve \ -1: Soft limitation (recommended for PV surplus) \ -Power recommendation for heat pump, i.e., heat pump attempts to \ -limit power demand according to data point pc_limit \ -If the actual value deviates too much from the setpoint (hysteresis), \ -the heat pump ignores the PC Limit power specification. \ -2: Hard limitation (recommended only for §14a EnWG). \ -The heat pump limits the power consumption according to pc_limit regardless of hysteresis. \ -Hard limitation may reduce comfort." + "description": ( + "Configuration for limitation of power consumption:\n" + "0: no power limitation (normal operation)\n" + "Setpoint values are achieved with heat pump performance curve\n" + "1: Soft limitation (recommended for PV surplus)\n" + "Power recommendation for heat pump, i.e., heat pump attempts to " + "limit power demand according to data point pc_limit " + "If the actual value deviates too much from the setpoint (hysteresis), " + "the heat pump ignores the PC Limit power specification.\n" + "2: Hard limitation (recommended only for §14a EnWG).\n" + "The heat pump limits the power consumption according to pc_limit regardless of hysteresis. " + "Hard limitation may reduce comfort." + ) }, { "index": 41, @@ -486,8 +546,10 @@ "default": 300, "range": {"min": 0, "max": 300}, "since": "3.90.1", - "description": "Maximum allowed power consumption of the heat pump. \ -Requires lpc_mode to be set accordingly." + "description": ( + "Maximum allowed power consumption of the heat pump. " + "Requires lpc_mode to be set accordingly." + ) }, { "index": 50, @@ -518,10 +580,12 @@ "default": 0, "range": {"min": 0, "max": 1}, "since": "3.90.1", - "description": "Cooling operation lock. \ -0: normal operation \ -1: lock passive and active cooling. \ -Frequent switching may cause wear on heat pump and hydraulic components." + "description": ( + "Cooling operation lock.\n" + "0: normal operation\n" + "1: lock passive and active cooling.\n" + "Frequent switching may cause wear on heat pump and hydraulic components." + ) }, { "index": 53, @@ -534,10 +598,12 @@ "default": 0, "range": {"min": 0, "max": 1}, "since": "3.90.1", - "description": "Swimming pool heating lock. \ -0: normal operation \ -1: lock pool heating. \ -Frequent switching may cause wear on heat pump and hydraulic components." + "description": ( + "Swimming pool heating lock.\n" + "0: normal operation\n" + "1: lock pool heating.\n" + "Frequent switching may cause wear on heat pump and hydraulic components." + ) }, { "index": 60, @@ -566,8 +632,10 @@ "datatype": "INT16", "range": {"min": -200, "max": 200}, "since": "3.92.0", - "description": "Temperature correction in Kelvin " \ - "for all heating functions", + "description": ( + "Temperature correction in Kelvin " + "for all heating functions" + ) }, { "index": 67, @@ -576,8 +644,10 @@ "type": LevelMode, "writeable": True, "since": "3.92.0", - "description": "Increase or decrease all heating temperatures " \ - "using the SHI offset settings.", + "description": ( + "Increase or decrease all heating temperatures " + "using the SHI offset settings." + ) }, { "index": 70, diff --git a/luxtronik/definitions/inputs.py b/luxtronik/definitions/inputs.py index a1a9715a..13ce5244 100644 --- a/luxtronik/definitions/inputs.py +++ b/luxtronik/definitions/inputs.py @@ -113,14 +113,16 @@ "datatype": "UINT16", "unit": "bitmask", "since": "3.90.1", - "description": "Heat pump status bitmask: \ -1: VD1 \ -2: VD2 \ -4: ZWE1 \ -8: ZWE2 \ -16: ZWE3 \ -0: Heat pump inactive \ ->0: Heat pump or auxiliary heater active" + "description": ( + "Heat pump status bitmask:\n" + "1: VD1\n" + "2: VD2\n" + "4: ZWE1\n" + "8: ZWE2\n" + "16: ZWE3\n" + "0: Heat pump inactive\n" + ">0: Heat pump or auxiliary heater active" + ) }, { "index": 2, @@ -133,15 +135,17 @@ "default": 5, "range": {"min": 0, "max": 7}, "since": "3.90.1", - "description": "Operating mode status: \ -0: Heating \ -1: DHW heating \ -2: Pool heating / Solar\ -3: Utility lockout \ -4: Defrost \ -5: No demand \ -6: Not used \ -7: Cooling" + "description": ( + "Operating mode status:\n" + "0: Heating\n" + "1: DHW heating\n" + "2: Pool heating / Solar\n" + "3: Utility lockout\n" + "4: Defrost\n" + "5: No demand\n" + "6: Not used\n" + "7: Cooling" + ) }, { "index": 3, @@ -153,11 +157,13 @@ "unit": "enum", "range": {"min": 0, "max": 3}, "since": "3.90.1", - "description": "Heating status: \ -0: Off \ -1: No demand \ -2: Demand \ -3: Active" + "description": ( + "Heating status:\n" + "0: Off\n" + "1: No demand\n" + "2: Demand\n" + "3: Active" + ) }, { "index": 4, @@ -169,11 +175,13 @@ "unit": "enum", "range": {"min": 0, "max": 3}, "since": "3.90.1", - "description": "DHW status: \ -0: Off \ -1: No demand \ -2: Demand \ -3: Active" + "description": ( + "DHW status:\n" + "0: Off\n" + "1: No demand\n" + "2: Demand\n" + "3: Active" + ) }, { "index": 6, @@ -185,11 +193,13 @@ "unit": "enum", "range": {"min": 0, "max": 3}, "since": "3.90.1", - "description": "Cooling status: \ -0: Off \ -1: No demand \ -2: Demand \ -3: Active" + "description": ( + "Cooling status:\n" + "0: Off\n" + "1: No demand\n" + "2: Demand\n" + "3: Active" + ) }, { "index": 7, @@ -201,11 +211,13 @@ "unit": "enum", "range": {"min": 0, "max": 3}, "since": "3.90.1", - "description": "Pool heating / Solar status: \ -0: Off \ -1: No demand \ -2: Demand \ -3: Active" + "description": ( + "Pool heating / Solar status:\n" + "0: Off\n" + "1: No demand\n" + "2: Demand\n" + "3: Active" + ) }, { "index": 100, @@ -282,8 +294,10 @@ "datatype": "INT16", "unit": "°C/10", "since": "3.90.1", - "description": "Current room temperature. \ -Requires accessory RBE+ room control unit." + "description": ( + "Current room temperature. " + "Requires accessory RBE+ room control unit." + ) }, { "index": 107, @@ -294,8 +308,10 @@ "datatype": "INT16", "unit": "°C/10", "since": "3.90.1", - "description": "Heating limit temperature. \ -If undershot (heating curve setpoint - hysteresis), soft-limit power control is ignored." + "description": ( + "Heating limit temperature. " + "If undershot (heating curve setpoint - hysteresis), soft-limit power control is ignored." + ) }, { "index": 108, @@ -412,8 +428,10 @@ "datatype": "INT16", "unit": "°C/10", "since": "3.90.1", - "description": "DHW limit temperature. \ -If undershot (desired regulation value), soft-limit power control is ignored." + "description": ( + "DHW limit temperature. " + "If undershot (desired regulation value), soft-limit power control is ignored." + ) }, { "index": 140, @@ -555,9 +573,11 @@ "writeable": False, "datatype": "UINT16", "since": "3.90.1", - "description": "Current error number: \ -0: no error \ -X: error code." + "description": ( + "Current error number:\n" + "0: no error\n" + "X: error code." + ) }, { "index": 202, @@ -568,10 +588,12 @@ "datatype": "UINT16", "range": {"min": 0, "max": 2}, "since": "3.90.1", - "description": "Buffer tank configuration: \ -0: series buffer \ -1: separation buffer \ -2: multifunction buffer." + "description": ( + "Buffer tank configuration:\n" + "0: series buffer\n" + "1: separation buffer\n" + "2: multifunction buffer." + ) }, { "index": 203, @@ -605,9 +627,11 @@ "unit": "bool", "range": {"min": 0, "max": 1}, "since": "3.90.1", - "description": "Indicates whether cooling mode is configured: \ -0: no \ -1: yes." + "description": ( + "Indicates whether cooling mode is configured:\n" + "0: no\n" + "1: yes." + ) }, { "index": 206, @@ -619,9 +643,11 @@ "unit": "bool", "range": {"min": 0, "max": 1}, "since": "3.90.1", - "description": "Indicates whether pool heating is configured: \ -0: no \ -1: yes." + "description": ( + "Indicates whether pool heating is configured:\n" + "0: no\n" + "1: yes." + ) }, { "index": 207, @@ -633,10 +659,12 @@ "unit": "bool", "range": {"min": 0, "max": 1}, "since": "3.90.1", - "description": "Cooling release condition fulfilled: \ -0: no \ -1: yes. \ -Cooling release only valid if cooling is enabled (see cooling_configured)." + "description": ( + "Cooling release condition fulfilled:\n" + "0: no\n" + "1: yes.\n" + "Cooling release only valid if cooling is enabled (see cooling_configured)." + ) }, { "index": 300, From d927770b20c1ed5e98174e18d367a10ace1ee118 Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Sat, 24 Jan 2026 22:33:14 +0100 Subject: [PATCH 38/68] wip --- tests/cfi/test_cfi_parameters.py | 1 - tests/test_compatibility.py | 68 +++++++++++++++++++++++++++++++- 2 files changed, 67 insertions(+), 2 deletions(-) diff --git a/tests/cfi/test_cfi_parameters.py b/tests/cfi/test_cfi_parameters.py index 3764af8c..6438ae15 100644 --- a/tests/cfi/test_cfi_parameters.py +++ b/tests/cfi/test_cfi_parameters.py @@ -5,7 +5,6 @@ from luxtronik import Parameters from luxtronik.datatypes import Base from luxtronik.definitions import LuxtronikDefinition -from luxtronik.cfi.constants import LUXTRONIK_CFI_REGISTER_BIT_SIZE class TestParameters: diff --git a/tests/test_compatibility.py b/tests/test_compatibility.py index b23e9436..fab20b21 100644 --- a/tests/test_compatibility.py +++ b/tests/test_compatibility.py @@ -12,7 +12,68 @@ Inputs, Holdings, ) -from luxtronik.datatypes import * + +from luxtronik.datatypes import ( + AccessLevel, + Base, + BivalenceLevel, + Bool, + BufferType, + Celsius, + CelsiusInt16, + CelsiusUInt16, + Character, + ControlMode, + CoolingMode, + Count, + Energy, + Errorcode, + Flow, + Frequency, + FullVersion, + HeatPumpStatus, + HeatingMode, + HeatpumpCode, + HotWaterMode, + Hours, + Hours2, + IPv4Address, + Icon, + Kelvin, + KelvinInt16, + Level, + LevelMode, + LockMode, + LpcMode, + MainMenuStatusLine1, + MainMenuStatusLine2, + MainMenuStatusLine3, + MajorMinorVersion, + Minutes, + MixedCircuitMode, + ModeStatus, + OnOffMode, + OperationMode, + Percent2, + PoolMode, + Power, + PowerKW, + Pressure, + SecOperationMode, + Seconds, + SolarMode, + Speed, + SwitchoffFile, + TimeOfDay, + TimeOfDay2, + TimerProgram, + Timestamp, + Unknown, + VentilationMode, + Version, + Voltage, +) + class Pulses(Base): @@ -1915,6 +1976,11 @@ def test_compatibilities(self): } inputs = { + "heatpump_vd1_status": (0, Bool), + "heatpump_vd2_status": (0, Bool), + "heatpump_zwe1_status": (0, Bool), + "heatpump_zwe2_status": (0, Bool), + "heatpump_zwe3_status": (0, Bool), "heatpump_status": (0, HeatPumpStatus), "operation_mode": (2, OperationMode), "heating_status": (3, ModeStatus), From 78173c1e9c001333ee3ef0799fe2d6d0ace5f6d8 Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Sat, 24 Jan 2026 22:41:11 +0100 Subject: [PATCH 39/68] wip --- tests/test_compatibility.py | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/tests/test_compatibility.py b/tests/test_compatibility.py index fab20b21..357dc23b 100644 --- a/tests/test_compatibility.py +++ b/tests/test_compatibility.py @@ -3,7 +3,6 @@ # pylint: disable=too-few-public-methods,invalid-name,too-many-lines import logging -logging.disable(logging.CRITICAL) from luxtronik import ( Calculations, @@ -14,7 +13,6 @@ ) from luxtronik.datatypes import ( - AccessLevel, Base, BivalenceLevel, Bool, @@ -36,8 +34,6 @@ HeatpumpCode, HotWaterMode, Hours, - Hours2, - IPv4Address, Icon, Kelvin, KelvinInt16, @@ -64,7 +60,6 @@ SolarMode, Speed, SwitchoffFile, - TimeOfDay, TimeOfDay2, TimerProgram, Timestamp, @@ -74,6 +69,7 @@ Voltage, ) +logging.disable(logging.CRITICAL) class Pulses(Base): @@ -2115,8 +2111,6 @@ def test_compatibilities(self): "unknown_holding_60": (60, Unknown), "heat_overall_mode": (65, ControlMode), "heat_overall_offset": (66, KelvinInt16), - "heat_overall_mode": (65, ControlMode), - "heat_overall_offset": (66, KelvinInt16), "heat_overall_level": (67, LevelMode), "circulation": (70, OnOffMode), "hot_water_extra": (71, OnOffMode), @@ -2143,7 +2137,7 @@ def test_compatibilities(self): # Try to get the definition of the "old name" try: def_by_name = data_vector.definitions.get(old_name) - except Exception as e: + except Exception: def_by_name = None old_found = def_by_name is not None old_is_obsolete = old_name in data_vector._obsolete @@ -2177,24 +2171,24 @@ def test_compatibilities(self): if do_print: print(f"############################## Incompatibilities - {caption}:") if obsolete_found: - print(f"############################## obsolete") + print("############################## obsolete") for err in obsolete_found: print(err) if old_not_found: - print(f"############################## not found") + print("############################## not found") for err in old_not_found: print(err) if old_idx_wrong: - print(f"############################## idx wrong") + print("############################## idx wrong") for err in old_idx_wrong: print(err) if old_type_changed: - print(f"############################## type changed") + print("############################## type changed") for err in old_type_changed: print(err) all_ok &= ok - assert ok, "Found incompatibilities. Please consider to add them to compatibilities.py" + assert all_ok, "Found incompatibilities. Please consider to add them to compatibilities.py" # Second, we check if all names are present in the above dicts. all_ok = True @@ -2220,4 +2214,4 @@ def test_compatibilities(self): print(err) all_ok &= ok - assert all_ok, f"Found missing entries. Please consider to add them to the test suite." \ No newline at end of file + assert all_ok, "Found missing entries. Please consider to add them to the test suite." \ No newline at end of file From 5aace32d3fc353e94fa8794445dd409fb81f07aa Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Sat, 24 Jan 2026 22:52:21 +0100 Subject: [PATCH 40/68] wip --- luxtronik/datatypes.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/luxtronik/datatypes.py b/luxtronik/datatypes.py index 62150e6c..2a7889ee 100755 --- a/luxtronik/datatypes.py +++ b/luxtronik/datatypes.py @@ -598,6 +598,8 @@ class Version(Base): concatenate_multiple_data_chunks = False def from_heatpump(self, value): + if not isinstance(value, list): + return None return "".join([chr(c) for c in value]).strip("\x00") From 36b4a9ce1260b973b558612dbd7523f9bebfa944 Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Sat, 24 Jan 2026 22:58:21 +0100 Subject: [PATCH 41/68] wip --- tests/shi/test_shi_vector.py | 27 --------------------------- 1 file changed, 27 deletions(-) diff --git a/tests/shi/test_shi_vector.py b/tests/shi/test_shi_vector.py index 795870df..309e5ad8 100644 --- a/tests/shi/test_shi_vector.py +++ b/tests/shi/test_shi_vector.py @@ -319,33 +319,6 @@ def test_set(self): assert field_9.value == 6 assert field_9.write_pending - def test_parse(self): - data_vector = DataVectorTest(parse_version("1.1.2")) - field_5 = data_vector[5] - field_9 = data_vector[9] - field_9a = data_vector['field_9a'] - - # not enough data - data = [1] - data_vector.parse(data, LUXTRONIK_SHI_REGISTER_BIT_SIZE) - assert field_5.value is None - assert field_9.value is None - assert field_9a.value is None - - # data only for field 5 - data = [1, 2, 3, 4, 5, 6, 7] - data_vector.parse(data, LUXTRONIK_SHI_REGISTER_BIT_SIZE) - assert field_5.value == 6 - assert field_9.value is None - assert field_9a.value is None - - # data for all fields - data = [9, 8, 7, 6, 5, 4, 3, 2, 1, 0, -1, -2] - data_vector.parse(data, LUXTRONIK_SHI_REGISTER_BIT_SIZE) - assert field_5.value == 4 - assert field_9.value == [0, -1] - assert field_9a.value == 0 - def test_alias(self): TEST_DEFINITIONS.register_alias('field_9a', 10) data_vector = DataVectorTest(parse_version("1.1.2")) From f8f982c05e5582c54289c7d92aed9757c483f30e Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Sat, 24 Jan 2026 23:15:44 +0100 Subject: [PATCH 42/68] wip --- luxtronik/definitions/calculations.py | 10 ++++++++++ luxtronik/definitions/parameters.py | 24 ++++++++++++++++++++++++ tests/test_LuxtronikData.py | 6 +++--- tests/test_socket_interaction.py | 7 ++++++- 4 files changed, 43 insertions(+), 4 deletions(-) diff --git a/luxtronik/definitions/calculations.py b/luxtronik/definitions/calculations.py index 12e653ad..8d1267ff 100644 --- a/luxtronik/definitions/calculations.py +++ b/luxtronik/definitions/calculations.py @@ -2386,6 +2386,7 @@ { "index": 232, "names": ['Unknown_Calculation_232'], + "type": Unknown, }, { "index": 232, @@ -2400,6 +2401,7 @@ { "index": 233, "names": ['Unknown_Calculation_233'], + "type": Unknown, }, { "index": 233, @@ -2434,6 +2436,7 @@ { "index": 236, "names": ['Unknown_Calculation_236'], + "type": Unknown, }, { "index": 236, @@ -2448,6 +2451,7 @@ { "index": 237, "names": ['Unknown_Calculation_237'], + "type": Unknown, }, { "index": 237, @@ -2462,6 +2466,7 @@ { "index": 238, "names": ['Unknown_Calculation_238'], + "type": Unknown, }, { "index": 238, @@ -2476,6 +2481,7 @@ { "index": 239, "names": ['Unknown_Calculation_239'], + "type": Unknown, }, { "index": 239, @@ -2490,6 +2496,7 @@ { "index": 240, "names": ['Unknown_Calculation_240'], + "type": Unknown, }, { "index": 240, @@ -2514,6 +2521,7 @@ { "index": 242, "names": ['Unknown_Calculation_242'], + "type": Unknown, }, { "index": 242, @@ -2528,6 +2536,7 @@ { "index": 243, "names": ['Unknown_Calculation_243'], + "type": Unknown, }, { "index": 243, @@ -2682,6 +2691,7 @@ { "index": 258, "names": ['Unknown_Calculation_258'], + "type": Unknown, }, { "index": 258, diff --git a/luxtronik/definitions/parameters.py b/luxtronik/definitions/parameters.py index 8271f05f..ba1aa7d4 100644 --- a/luxtronik/definitions/parameters.py +++ b/luxtronik/definitions/parameters.py @@ -10919,6 +10919,7 @@ { "index": 1087, "names": ['Unknown_Parameter_1087'], + "type": Unknown, }, { "index": 1087, @@ -10973,6 +10974,7 @@ { "index": 1092, "names": ['Unknown_Parameter_1092'], + "type": Unknown, }, { "index": 1092, @@ -10987,6 +10989,7 @@ { "index": 1093, "names": ['Unknown_Parameter_1093'], + "type": Unknown, }, { "index": 1093, @@ -11001,6 +11004,7 @@ { "index": 1094, "names": ['Unknown_Parameter_1094'], + "type": Unknown, }, { "index": 1094, @@ -11015,6 +11019,7 @@ { "index": 1095, "names": ['Unknown_Parameter_1095'], + "type": Unknown, }, { "index": 1095, @@ -11029,6 +11034,7 @@ { "index": 1096, "names": ['Unknown_Parameter_1096'], + "type": Unknown, }, { "index": 1096, @@ -11043,6 +11049,7 @@ { "index": 1097, "names": ['Unknown_Parameter_1097'], + "type": Unknown, }, { "index": 1097, @@ -11057,6 +11064,7 @@ { "index": 1098, "names": ['Unknown_Parameter_1098'], + "type": Unknown, }, { "index": 1098, @@ -11071,6 +11079,7 @@ { "index": 1099, "names": ['Unknown_Parameter_1099'], + "type": Unknown, }, { "index": 1099, @@ -11085,6 +11094,7 @@ { "index": 1100, "names": ['Unknown_Parameter_1100'], + "type": Unknown, }, { "index": 1100, @@ -11099,6 +11109,7 @@ { "index": 1101, "names": ['Unknown_Parameter_1101'], + "type": Unknown, }, { "index": 1101, @@ -11113,6 +11124,7 @@ { "index": 1102, "names": ['Unknown_Parameter_1102'], + "type": Unknown, }, { "index": 1102, @@ -11127,6 +11139,7 @@ { "index": 1103, "names": ['Unknown_Parameter_1103'], + "type": Unknown, }, { "index": 1103, @@ -11141,6 +11154,7 @@ { "index": 1104, "names": ['Unknown_Parameter_1104'], + "type": Unknown, }, { "index": 1104, @@ -11155,6 +11169,7 @@ { "index": 1105, "names": ['Unknown_Parameter_1105'], + "type": Unknown, }, { "index": 1105, @@ -11169,6 +11184,7 @@ { "index": 1106, "names": ['Unknown_Parameter_1106'], + "type": Unknown, }, { "index": 1106, @@ -11183,6 +11199,7 @@ { "index": 1107, "names": ['Unknown_Parameter_1107'], + "type": Unknown, }, { "index": 1107, @@ -11197,6 +11214,7 @@ { "index": 1108, "names": ['Unknown_Parameter_1108'], + "type": Unknown, }, { "index": 1108, @@ -11211,6 +11229,7 @@ { "index": 1109, "names": ['Unknown_Parameter_1109'], + "type": Unknown, }, { "index": 1109, @@ -11225,6 +11244,7 @@ { "index": 1110, "names": ['Unknown_Parameter_1110'], + "type": Unknown, }, { "index": 1110, @@ -11239,6 +11259,7 @@ { "index": 1111, "names": ['Unknown_Parameter_1111'], + "type": Unknown, }, { "index": 1111, @@ -11253,6 +11274,7 @@ { "index": 1112, "names": ['Unknown_Parameter_1112'], + "type": Unknown, }, { "index": 1112, @@ -11267,6 +11289,7 @@ { "index": 1113, "names": ['Unknown_Parameter_1113'], + "type": Unknown, }, { "index": 1113, @@ -11331,6 +11354,7 @@ { "index": 1119, "names": ['Unknown_Parameter_1119'], + "type": Unknown, }, { "index": 1119, diff --git a/tests/test_LuxtronikData.py b/tests/test_LuxtronikData.py index 39ca2e52..f1e2bb62 100644 --- a/tests/test_LuxtronikData.py +++ b/tests/test_LuxtronikData.py @@ -65,9 +65,9 @@ def test_get_firmware_version(self): @pytest.mark.parametrize("vector, index, names", [ - ("para", 1106, ["ID_Einst_SilenceTimer_13", "Unknown_Parameter_1106"]), - ("para", 1109, ["ID_Einst_SilenceTimer_16", "Unknown_Parameter_1109"]), - ("calc", 232, ["Vapourisation_Temperature", "Unknown_Calculation_232"]), + ("para", 1106, ["ID_Einst_SilenceTimer_13"]), + ("para", 1109, ["ID_Einst_SilenceTimer_16"]), + ("calc", 232, ["Vapourisation_Temperature"]), ("calc", 241, ["HUP_PWM", "Circulation_Pump"]), ("visi", 182, ["ID_Visi_Heizung_Zeitschaltprogramm", "ID_Visi_Heizung_Zeitschlaltprogramm"]), ("visi", 326, ["Unknown_Visibility_326"]), diff --git a/tests/test_socket_interaction.py b/tests/test_socket_interaction.py index 96948d5f..196b7c36 100644 --- a/tests/test_socket_interaction.py +++ b/tests/test_socket_interaction.py @@ -3,6 +3,7 @@ import unittest.mock as mock from luxtronik import Luxtronik, LuxtronikSocketInterface, Parameters, Calculations, Visibilities +from luxtronik.collections import integrate_data from tests.fake import ( fake_create_connection, fake_parameter_value, @@ -34,7 +35,11 @@ def check_data_vector(self, data_vector): elif type(data_vector) is Visibilities: fct = fake_visibility_value for d, f in data_vector.items(): - if f.raw != fct(d.index): + # get raw data + raw = [fct(idx) for idx in range(d.index, d.index + d.count)] + temp_field = d.create_field() + integrate_data(d, temp_field, raw, 32, 0) + if f.raw != temp_field.raw: return False return True From 9d5c1829c35efcfe42757795bbb893d7b1380788 Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Sat, 24 Jan 2026 23:17:31 +0100 Subject: [PATCH 43/68] wip --- tests/shi/test_shi_vector.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/shi/test_shi_vector.py b/tests/shi/test_shi_vector.py index 309e5ad8..a18f9e03 100644 --- a/tests/shi/test_shi_vector.py +++ b/tests/shi/test_shi_vector.py @@ -1,7 +1,6 @@ from luxtronik.common import parse_version from luxtronik.datatypes import Base, Unknown from luxtronik.definitions import LuxtronikDefinitionsList -from luxtronik.shi.constants import LUXTRONIK_SHI_REGISTER_BIT_SIZE from luxtronik.shi.vector import DataVectorSmartHome from luxtronik.shi.holdings import Holdings from luxtronik.shi.inputs import Inputs From 81964861296af03ca95a2b3e0c801fc2b550f2e4 Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Sun, 25 Jan 2026 15:59:42 +0100 Subject: [PATCH 44/68] wip --- luxtronik/cfi/vector.py | 31 ++++++++- tests/cfi/test_cfi_vector.py | 112 +++++++++++++++++++++++++++++++ tests/shi/test_shi_contiguous.py | 10 +++ 3 files changed, 151 insertions(+), 2 deletions(-) create mode 100644 tests/cfi/test_cfi_vector.py diff --git a/luxtronik/cfi/vector.py b/luxtronik/cfi/vector.py index 4f8b5206..840a2de3 100644 --- a/luxtronik/cfi/vector.py +++ b/luxtronik/cfi/vector.py @@ -3,6 +3,7 @@ from luxtronik.data_vector import DataVector + LOGGER = logging.getLogger(__name__) ############################################################################### @@ -12,17 +13,43 @@ class DataVectorConfig(DataVector): """Specialized DataVector for Luxtronik configuration fields.""" - def __init__(self, safe=True): - """Initialize config interface data-vector class.""" + def _init_instance(self, version, safe): + """Re-usable method to initialize all instance variables.""" super()._init_instance(safe) + def __init__(self, safe=True): + """ + Initialize the data-vector instance. + Creates field objects for definitions and stores them in the data vector. + + Args: + safe (bool): If true, prevent fields marked as + not secure from being written to. + """ + self._init_instance(version, safe) + # Add all available fields for d in self.definitions: self._data.add(d, d.create_field()) + @classmethod + def empty(cls, safe=True): + """ + Initialize the data-vector instance without any fields. + + Args: + safe (bool): If true, prevent fields marked as + not secure from being written to. + """ + obj = cls.__new__(cls) # this don't call __init__() + obj._init_instance(version, safe) + return obj + def add(self, def_field_name_or_idx, alias=None): """ Adds an additional field to this data vector. + Mainly used for data vectors created via `empty()` + to read/write individual fields. Existing fields will not be overwritten. Args: def_field_name_or_idx (LuxtronikDefinition | Base | str | int): diff --git a/tests/cfi/test_cfi_vector.py b/tests/cfi/test_cfi_vector.py new file mode 100644 index 00000000..2931fa0a --- /dev/null +++ b/tests/cfi/test_cfi_vector.py @@ -0,0 +1,112 @@ +from luxtronik.datatypes import Base, Unknown +from luxtronik.definitions import LuxtronikDefinition, LuxtronikDefinitionsList +from luxtronik.cfi.vector import DataVectorConfig +from luxtronik.cfi.parameters import Parameters +from luxtronik.cfi.calculations import Calculations +from luxtronik.cfi.visibilities import Visibilities + +############################################################################### +# Tests +############################################################################### + +def_list = [ + { + "index": 5, + "count": 1, + "names": ["field_5_bit1"], + "bit_offset": 0, + "bit_count": 1, + "type": Base, + "writeable": False, + }, + { + "index": 5, + "count": 1, + "names": ["field_5_bit2"], + "bit_offset": 1, + "bit_count": 3, + "type": Base, + "writeable": False, + }, + { + "index": 5, + "count": 1, + "names": ["field_5_all"], + "type": Base, + "writeable": False, + }, + { + "index": 7, + "count": 2, + "names": ["field_7"], + "type": Base, + "writeable": True, + }, + { + "index": 9, + "count": 2, + "names": ["field_9"], + "type": Base, + "writeable": True, + } +] +TEST_DEFINITIONS = LuxtronikDefinitionsList(def_list, 'foo', 100, 'INT32') + +FIELD_11_DICT = { + "index": 11, + "count": 1, + "names": ["field_11"], + "type": Base, + "writeable": True, +} +FIELD_12_DICT = { + "index": 12, + "count": 1, + "names": ["field_12"], + "type": Base, + "writeable": True, +} + +class DataVectorTest(DataVectorConfig): + name = 'foo' + definitions = TEST_DEFINITIONS + +class TestDataVector: + + def test_add(self): + data_vector = DataVectorTest() + assert len(data_vector) == 5 + + # In case the definitions are added after the creation + data_vector.definitions.add(FIELD_11_DICT) + data_vector.definitions.add(FIELD_12_DICT) + + # Add available index + field = data_vector.add(11) + assert len(data_vector) == 6 + assert 11 in data_vector + assert field.name == 'field_11' + + # Add not available index (not existing) + field = data_vector.add(13) + assert 'field_6' not in data_vector + assert field is None + assert len(data_vector) == 6 + + # Re-add available index + field = data_vector.add(5) + assert len(data_vector) == 6 + assert field.name == 'field_5_all' + + # Add available field + field_12 = Base('field_12', False) + field = data_vector.add(field_12) + assert 12 in data_vector + assert len(data_vector) == 7 + assert field == field_12 + + # Re-add available field + field = data_vector.add(field_12) + assert field_12 in data_vector + assert len(data_vector) == 7 + assert field == field_12 diff --git a/tests/shi/test_shi_contiguous.py b/tests/shi/test_shi_contiguous.py index 62a27d50..9dc7a72d 100644 --- a/tests/shi/test_shi_contiguous.py +++ b/tests/shi/test_shi_contiguous.py @@ -278,6 +278,16 @@ def test_get_data(self): data_arr = block.get_data_arr() assert data_arr is None + # Missing data (via gaps) + block = ContiguousDataBlock() + field_a.raw = [56, 57] + field_c.raw = [21, 22, 23] + block.add(def_a, field_a) + block.add(def_c, field_c) + + data_arr = block.get_data_arr() + assert data_arr is None + def test_repr(self): block = ContiguousDataBlock() text_empty = repr(block) From a53fda2e7be3e847ffae7c39a2d88949b8b7b06c Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Sun, 25 Jan 2026 16:16:38 +0100 Subject: [PATCH 45/68] wip --- tests/test_datatypes.py | 54 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/tests/test_datatypes.py b/tests/test_datatypes.py index 29a6bf02..0117c337 100644 --- a/tests/test_datatypes.py +++ b/tests/test_datatypes.py @@ -77,6 +77,7 @@ def test_init(self): a = Base("base") assert a.name == "base" assert a.writeable is False + assert a.unit is None b = Base("base", writeable=True) assert b.name == "base" @@ -198,6 +199,7 @@ def test_init(self): assert a.name == "selection_base" assert not a.codes assert len(a.codes) == 0 + assert a.unit is None def test_options(self): """Test cases for options property""" @@ -217,6 +219,7 @@ def test_to_heatpump(self): """Test cases for to_heatpump function""" a = SelectionBase("") + assert a.to_heatpump("") is None assert a.to_heatpump("a") is None assert a.to_heatpump("Unknown_214") == 214 assert a.to_heatpump("unknown_215") == 215 @@ -246,6 +249,7 @@ def test_init(self): assert a.name == "selection_base_child" assert a.codes assert len(a.codes) == 3 + assert a.unit is None def test_options(self): """Test cases for options property""" @@ -287,6 +291,7 @@ def test_init(self): assert a.name == "bitmask_base" assert not a.bit_values assert len(a.bit_values) == 0 + assert a.unit is None def test_bits(self): """Test cases for bits property""" @@ -309,6 +314,7 @@ def test_to_heatpump(self): """Test cases for to_heatpump function""" a = BitMaskBase("") + assert a.to_heatpump("") is None assert a.to_heatpump("a") is None assert a.to_heatpump(1) is None assert a.to_heatpump(None) is None @@ -404,6 +410,7 @@ def test_to_heatpump(self): a = ScalingBaseTest("") assert a.to_heatpump(1) == 1 assert a.to_heatpump(42) == 42 + assert a.to_heatpump(12.0) == 12 class ScalingBaseChild(ScalingBase): @@ -430,6 +437,7 @@ def test_from_heatpump(self): assert a.from_heatpump(1) == 13 assert a.from_heatpump(2) == 26 assert a.from_heatpump(-4) == -52 + assert a.from_heatpump(None) is None def test_to_heatpump(self): """Test cases for to_heatpump function""" @@ -483,6 +491,7 @@ def test_init(self): assert a.name == "celsius" assert a.datatype_class == "temperature" assert a.datatype_unit == "°C" + assert a.unit == "°C" def test_from_heatpump(self): """Test cases for from_heatpump function""" @@ -504,6 +513,8 @@ def test_to_heatpump(self): assert Celsius.to_heatpump(-1) == -10 assert Celsius.to_heatpump(-1.1) == -11 + assert Celsius.to_heatpump(None) is None + class TestBool: """Test suite for Bool datatype""" @@ -515,18 +526,22 @@ def test_init(self): assert a.name == "bool" assert a.datatype_class == "boolean" assert a.datatype_unit is None + assert a.unit is None def test_from_heatpump(self): """Test cases for from_heatpump function""" assert Bool.from_heatpump(0) is False assert Bool.from_heatpump(1) is True + assert Bool.from_heatpump(None) is None def test_to_heatpump(self): """Test cases for to_heatpump function""" assert Bool.to_heatpump(False) == 0 assert Bool.to_heatpump(True) == 1 + assert Bool.to_heatpump(None) is None + assert Bool.to_heatpump("1") == 1 class TestFrequency: @@ -539,6 +554,7 @@ def test_init(self): assert a.name == "frequency" assert a.datatype_class == "frequency" assert a.datatype_unit == "Hz" + assert a.unit == "Hz" class TestSeconds: @@ -551,6 +567,7 @@ def test_init(self): assert a.name == "seconds" assert a.datatype_class == "timespan" assert a.datatype_unit == "s" + assert a.unit == "s" class TestIPv4Address: @@ -563,6 +580,7 @@ def test_init(self): assert a.name == "ipv4_address" assert a.datatype_class == "ipv4_address" assert a.datatype_unit is None + assert a.unit is None def test_from_heatpump(self): """Test cases for from_heatpump function""" @@ -572,6 +590,7 @@ def test_from_heatpump(self): assert IPv4Address.from_heatpump(-1062731775) == "192.168.0.1" assert IPv4Address.from_heatpump(-256) == "255.255.255.0" assert IPv4Address.from_heatpump(-1) == "255.255.255.255" + assert IPv4Address.from_heatpump(None) is None def test_to_heatpump(self): """Test cases for to_heatpump function""" @@ -581,6 +600,8 @@ def test_to_heatpump(self): assert IPv4Address.to_heatpump("192.168.0.1") == -1062731775 assert IPv4Address.to_heatpump("255.255.255.0") == -256 assert IPv4Address.to_heatpump("255.255.255.255") == -1 + assert IPv4Address.to_heatpump(1) is None + assert IPv4Address.to_heatpump(None) is None class TestTimestamp: @@ -593,6 +614,7 @@ def test_init(self): assert a.name == "timestamp" assert a.datatype_class == "timestamp" assert a.datatype_unit is None + assert a.unit is None def test_from_heatpump(self): """Test cases for from_heatpump function""" @@ -612,6 +634,8 @@ def test_to_heatpump(self): """Test cases for to_heatpump function""" a = Timestamp("") + assert a.to_heatpump(None) is None + assert a.to_heatpump("a") is None assert a.to_heatpump(datetime.datetime.fromtimestamp(0)) == 0 assert a.to_heatpump(datetime.datetime.fromtimestamp(1)) == 1 # pylint: disable=fixme @@ -656,6 +680,8 @@ def test_to_heatpump(self): assert Kelvin.to_heatpump(1) == 10 assert Kelvin.to_heatpump(1.1) == 11 + assert Kelvin.to_heatpump(None) is None + assert Kelvin.to_heatpump("b") is None class TestPressure: @@ -682,6 +708,8 @@ def test_to_heatpump(self): assert Pressure.to_heatpump(1) == 100 assert Pressure.to_heatpump(1.01) == 101 + assert Pressure.to_heatpump(None) is None + assert Pressure.to_heatpump("1") is None class TestPercent: @@ -709,6 +737,9 @@ def test_percent_to_heatpump(self): assert Percent.to_heatpump(1) == 10 assert Percent.to_heatpump(1.1) == 11 + assert Percent.to_heatpump(None) is None + assert Percent.to_heatpump("2") is None + class TestPercent2: """Test suite for Percent2 datatype""" @@ -733,6 +764,9 @@ def test_to_heatpump(self): assert Percent2.to_heatpump(10) == 10 assert Percent2.to_heatpump(11) == 11 + assert Percent2.to_heatpump(None) is None + assert Percent2.to_heatpump("3") is None + class TestSpeed: """Test suite for Speed datatype""" @@ -783,6 +817,9 @@ def test_to_heatpump(self): assert a.to_heatpump(1.5) == 15 assert a.to_heatpump(5.6) == 56 + assert a.to_heatpump(None) is None + assert a.to_heatpump("4") is None + class TestEnergy: """Test suite for Energy datatype""" @@ -809,6 +846,9 @@ def test_energy_to_heatpump(self): assert Energy.to_heatpump(1) == 10 assert Energy.to_heatpump(1.1) == 11 + assert Energy.to_heatpump(None) is None + assert Energy.to_heatpump("5") is None + class TestVoltage: """Test suite for Voltage datatype""" @@ -835,6 +875,9 @@ def test_voltage_to_heatpump(self): assert Voltage.to_heatpump(1) == 10 assert Voltage.to_heatpump(1.1) == 11 + assert Voltage.to_heatpump(None) is None + assert Voltage.to_heatpump("6") is None + class TestHours: """Test suite for Hours datatype""" @@ -861,6 +904,9 @@ def test_hours_to_heatpump(self): assert Hours.to_heatpump(1) == 10 assert Hours.to_heatpump(1.1) == 11 + assert Hours.to_heatpump(None) is None + assert Hours.to_heatpump("7") is None + class TestHours2: """Test suite for Hours2 datatype""" @@ -887,6 +933,9 @@ def test_hours2_to_heatpump(self): assert Hours2.to_heatpump(2) == 2 assert Hours2.to_heatpump(5) == 8 + assert Hours2.to_heatpump(None) is None + assert Hours2.to_heatpump("8") is None + class TestMinutes: """Test suite for Minutes datatype""" @@ -956,6 +1005,8 @@ def test_from_heatpump(self): assert Character.from_heatpump(56) == "8" assert Character.from_heatpump(48) == "0" + assert Character.from_heatpump(None) is None + class TestMajorMinorVersion: """Test suite for MajorMinorVersion datatype""" @@ -981,6 +1032,8 @@ def test_from_heatpump(self): assert MajorMinorVersion.from_heatpump(12) == "0.12" assert MajorMinorVersion.from_heatpump(-1) == "0" + assert MajorMinorVersion.from_heatpump(None) is None + class TestFullVersion: """Test suite for FullVersion datatype""" @@ -995,6 +1048,7 @@ def test_init(self): def test_from_heatpump(self): """Test cases for from_heatpump function""" + assert FullVersion.from_heatpump(None) is None assert FullVersion.from_heatpump(112) is None assert FullVersion.from_heatpump(0) is None assert FullVersion.from_heatpump([0, 12]) is None From b7375a75525161905119be282410a3dfbcbff5de Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Sun, 25 Jan 2026 16:19:33 +0100 Subject: [PATCH 46/68] wip --- luxtronik/cfi/vector.py | 4 ++-- tests/cfi/test_cfi_vector.py | 6 ++---- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/luxtronik/cfi/vector.py b/luxtronik/cfi/vector.py index 840a2de3..a2d0154a 100644 --- a/luxtronik/cfi/vector.py +++ b/luxtronik/cfi/vector.py @@ -26,7 +26,7 @@ def __init__(self, safe=True): safe (bool): If true, prevent fields marked as not secure from being written to. """ - self._init_instance(version, safe) + self._init_instance(safe) # Add all available fields for d in self.definitions: @@ -42,7 +42,7 @@ def empty(cls, safe=True): not secure from being written to. """ obj = cls.__new__(cls) # this don't call __init__() - obj._init_instance(version, safe) + obj._init_instance(safe) return obj def add(self, def_field_name_or_idx, alias=None): diff --git a/tests/cfi/test_cfi_vector.py b/tests/cfi/test_cfi_vector.py index 2931fa0a..87e2dbe1 100644 --- a/tests/cfi/test_cfi_vector.py +++ b/tests/cfi/test_cfi_vector.py @@ -1,9 +1,7 @@ from luxtronik.datatypes import Base, Unknown -from luxtronik.definitions import LuxtronikDefinition, LuxtronikDefinitionsList +from luxtronik.definitions import LuxtronikDefinitionsList from luxtronik.cfi.vector import DataVectorConfig -from luxtronik.cfi.parameters import Parameters -from luxtronik.cfi.calculations import Calculations -from luxtronik.cfi.visibilities import Visibilities + ############################################################################### # Tests From 6deef70fe91d1332ee87ffc1125f02030699fb3a Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Sun, 25 Jan 2026 16:22:00 +0100 Subject: [PATCH 47/68] wip --- luxtronik/cfi/vector.py | 2 +- tests/cfi/test_cfi_vector.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/luxtronik/cfi/vector.py b/luxtronik/cfi/vector.py index a2d0154a..8b6c9892 100644 --- a/luxtronik/cfi/vector.py +++ b/luxtronik/cfi/vector.py @@ -13,7 +13,7 @@ class DataVectorConfig(DataVector): """Specialized DataVector for Luxtronik configuration fields.""" - def _init_instance(self, version, safe): + def _init_instance(self, safe): """Re-usable method to initialize all instance variables.""" super()._init_instance(safe) diff --git a/tests/cfi/test_cfi_vector.py b/tests/cfi/test_cfi_vector.py index 87e2dbe1..49e9dd37 100644 --- a/tests/cfi/test_cfi_vector.py +++ b/tests/cfi/test_cfi_vector.py @@ -1,4 +1,4 @@ -from luxtronik.datatypes import Base, Unknown +from luxtronik.datatypes import Base from luxtronik.definitions import LuxtronikDefinitionsList from luxtronik.cfi.vector import DataVectorConfig From f1c05928b4c0265a2b8e230d5d9002f6096729b6 Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Sun, 25 Jan 2026 18:43:36 +0100 Subject: [PATCH 48/68] wip --- luxtronik/datatypes.py | 2 ++ tests/test_datatypes.py | 23 ++++++++++++++++------- 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/luxtronik/datatypes.py b/luxtronik/datatypes.py index 2a7889ee..24730482 100755 --- a/luxtronik/datatypes.py +++ b/luxtronik/datatypes.py @@ -39,6 +39,8 @@ def __init__(self, names, writeable=False): @classmethod def to_heatpump(cls, value): """Converts value into heatpump units.""" + if not isinstance(value, int): + return None return value @classmethod diff --git a/tests/test_datatypes.py b/tests/test_datatypes.py index 0117c337..83f1b953 100644 --- a/tests/test_datatypes.py +++ b/tests/test_datatypes.py @@ -540,7 +540,7 @@ def test_to_heatpump(self): assert Bool.to_heatpump(False) == 0 assert Bool.to_heatpump(True) == 1 - assert Bool.to_heatpump(None) is None + assert Bool.to_heatpump(None) == 0 assert Bool.to_heatpump("1") == 1 @@ -681,6 +681,7 @@ def test_to_heatpump(self): assert Kelvin.to_heatpump(1) == 10 assert Kelvin.to_heatpump(1.1) == 11 assert Kelvin.to_heatpump(None) is None + assert Kelvin.to_heatpump("0") == 0 assert Kelvin.to_heatpump("b") is None @@ -709,7 +710,8 @@ def test_to_heatpump(self): assert Pressure.to_heatpump(1) == 100 assert Pressure.to_heatpump(1.01) == 101 assert Pressure.to_heatpump(None) is None - assert Pressure.to_heatpump("1") is None + assert Pressure.to_heatpump("1") == 100 + assert Pressure.to_heatpump("c") is None class TestPercent: @@ -738,7 +740,8 @@ def test_percent_to_heatpump(self): assert Percent.to_heatpump(1.1) == 11 assert Percent.to_heatpump(None) is None - assert Percent.to_heatpump("2") is None + assert Percent.to_heatpump("2") == 20 + assert Percent.to_heatpump("d") is None class TestPercent2: @@ -766,6 +769,7 @@ def test_to_heatpump(self): assert Percent2.to_heatpump(None) is None assert Percent2.to_heatpump("3") is None + assert Percent2.to_heatpump("e") is None class TestSpeed: @@ -818,7 +822,8 @@ def test_to_heatpump(self): assert a.to_heatpump(5.6) == 56 assert a.to_heatpump(None) is None - assert a.to_heatpump("4") is None + assert a.to_heatpump("4") == 40 + assert a.to_heatpump("f") is None class TestEnergy: @@ -847,7 +852,8 @@ def test_energy_to_heatpump(self): assert Energy.to_heatpump(1.1) == 11 assert Energy.to_heatpump(None) is None - assert Energy.to_heatpump("5") is None + assert Energy.to_heatpump("5") == 50 + assert Energy.to_heatpump("g") is None class TestVoltage: @@ -876,7 +882,8 @@ def test_voltage_to_heatpump(self): assert Voltage.to_heatpump(1.1) == 11 assert Voltage.to_heatpump(None) is None - assert Voltage.to_heatpump("6") is None + assert Voltage.to_heatpump("6") == 60 + assert Voltage.to_heatpump("h") is None class TestHours: @@ -905,7 +912,8 @@ def test_hours_to_heatpump(self): assert Hours.to_heatpump(1.1) == 11 assert Hours.to_heatpump(None) is None - assert Hours.to_heatpump("7") is None + assert Hours.to_heatpump("7") == 70 + assert Hours.to_heatpump("i") is None class TestHours2: @@ -935,6 +943,7 @@ def test_hours2_to_heatpump(self): assert Hours2.to_heatpump(None) is None assert Hours2.to_heatpump("8") is None + assert Hours2.to_heatpump("i") is None class TestMinutes: From 9dc71264c895fd3c4ba52eba092fa6ad2fdad10e Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Sun, 25 Jan 2026 19:02:05 +0100 Subject: [PATCH 49/68] wip --- tests/shi/test_shi_vector.py | 50 ++++++++++++++++++++++-------------- 1 file changed, 31 insertions(+), 19 deletions(-) diff --git a/tests/shi/test_shi_vector.py b/tests/shi/test_shi_vector.py index a18f9e03..4cf149ea 100644 --- a/tests/shi/test_shi_vector.py +++ b/tests/shi/test_shi_vector.py @@ -5,23 +5,35 @@ from luxtronik.shi.holdings import Holdings from luxtronik.shi.inputs import Inputs -""" -The test was originally written for "False". -Since "True" is already checked in "test_definitions.py", -we continue to use "False" consistently here. -""" -Base.concatenate_multiple_data_chunks = False ############################################################################### # Tests ############################################################################### + +class TestType(Base): + """ + The test was originally written for "False". + Since "True" is already checked in "test_definitions.py", + we continue to use "False" consistently here. + """ + Base.concatenate_multiple_data_chunks = False + + @classmethod + def to_heatpump(cls, value): + return value + + @classmethod + def from_heatpump(cls, value): + return value + + def_list = [ { "index": 5, "count": 1, "names": ["field_5"], - "type": Base, + "type": TestType, "writeable": False, "since": "1.1", "until": "1.2", @@ -30,7 +42,7 @@ "index": 7, "count": 2, "names": ["field_7"], - "type": Base, + "type": TestType, "writeable": True, "since": "3.1", }, @@ -38,7 +50,7 @@ "index": 9, "count": 1, "names": ["field_9a"], - "type": Base, + "type": TestType, "writeable": True, "until": "1.3", }, @@ -46,7 +58,7 @@ "index": 9, "count": 2, "names": ["field_9"], - "type": Base, + "type": TestType, "writeable": True, "until": "3.3", }, @@ -54,7 +66,7 @@ "index": -1, "count": 1, "names": ["field_invalid"], - "type": Base, + "type": TestType, "writeable": True, "until": "3.3", }, @@ -82,7 +94,7 @@ def test_create(self): field = DataVectorTest.create_any_field(7) assert field.name == 'field_7' assert field.writeable - assert type(field) is Base + assert type(field) is TestType # create not available field field = DataVectorTest.create_any_field('BAR') @@ -92,7 +104,7 @@ def test_create(self): field = DataVectorTest.create_any_field(TEST_DEFINITIONS._definitions[2]) assert field.name == 'field_9a' assert field.writeable - assert type(field) is Base + assert type(field) is TestType # create versioned data vector data_vector = DataVectorTest(parse_version("1.2")) @@ -106,7 +118,7 @@ def test_create(self): field = data_vector.create_field(5) assert field.name == 'field_5' assert not field.writeable - assert type(field) is Base + assert type(field) is TestType # create not available field (not available) field = data_vector.create_field(6) @@ -120,13 +132,13 @@ def test_create(self): field = data_vector.create_field(9) assert field.name == 'field_9' assert field.writeable - assert type(field) is Base + assert type(field) is TestType # create index-overloaded version-dependent field field = data_vector.create_field('field_9a') assert field.name == 'field_9a' assert field.writeable - assert type(field) is Base + assert type(field) is TestType # create versioned data vector data_vector = DataVectorTest(parse_version("3.0")) @@ -151,7 +163,7 @@ def test_create(self): field = data_vector.create_field(9) assert field.name == 'field_9' assert field.writeable - assert type(field) is Base + assert type(field) is TestType # create invalid field (not available) field = data_vector.create_field('field_invalid') @@ -198,7 +210,7 @@ def test_add(self): assert field.name == 'field_5' # Add available field - field_9 = Base('field_9', False) + field_9 = TestType('field_9', False) field = data_vector.add(field_9) assert 9 in data_vector assert len(data_vector) == 2 @@ -211,7 +223,7 @@ def test_add(self): assert field == field_9 # Add available field with same name - field_9_2 = Base('field_9', False) + field_9_2 = TestType('field_9', False) field = data_vector.add(field_9_2) assert field_9_2 not in data_vector assert len(data_vector) == 2 From f8188c5e0a86e3308989aa6ebdf79b02e38b65fb Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Sun, 25 Jan 2026 19:13:16 +0100 Subject: [PATCH 50/68] wip --- tests/cfi/test_cfi_vector.py | 14 +++++++------- tests/test_datatypes.py | 24 ++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 7 deletions(-) diff --git a/tests/cfi/test_cfi_vector.py b/tests/cfi/test_cfi_vector.py index 49e9dd37..80480131 100644 --- a/tests/cfi/test_cfi_vector.py +++ b/tests/cfi/test_cfi_vector.py @@ -72,8 +72,8 @@ class DataVectorTest(DataVectorConfig): class TestDataVector: def test_add(self): - data_vector = DataVectorTest() - assert len(data_vector) == 5 + data_vector = DataVectorTest.empty() + assert len(data_vector) == 0 # In case the definitions are added after the creation data_vector.definitions.add(FIELD_11_DICT) @@ -81,7 +81,7 @@ def test_add(self): # Add available index field = data_vector.add(11) - assert len(data_vector) == 6 + assert len(data_vector) == 1 assert 11 in data_vector assert field.name == 'field_11' @@ -89,22 +89,22 @@ def test_add(self): field = data_vector.add(13) assert 'field_6' not in data_vector assert field is None - assert len(data_vector) == 6 + assert len(data_vector) == 1 # Re-add available index field = data_vector.add(5) - assert len(data_vector) == 6 + assert len(data_vector) == 1 assert field.name == 'field_5_all' # Add available field field_12 = Base('field_12', False) field = data_vector.add(field_12) assert 12 in data_vector - assert len(data_vector) == 7 + assert len(data_vector) == 2 assert field == field_12 # Re-add available field field = data_vector.add(field_12) assert field_12 in data_vector - assert len(data_vector) == 7 + assert len(data_vector) == 2 assert field == field_12 diff --git a/tests/test_datatypes.py b/tests/test_datatypes.py index 83f1b953..d19407ee 100644 --- a/tests/test_datatypes.py +++ b/tests/test_datatypes.py @@ -54,6 +54,7 @@ TimerProgram, TimeOfDay, TimeOfDay2, + Version, ) @@ -175,6 +176,8 @@ def test_eq(self): d = Bool("bool") assert c != d + assert a != "b" + def test_lt(self): """Test cases for __lt__ function""" @@ -542,6 +545,7 @@ def test_to_heatpump(self): assert Bool.to_heatpump(True) == 1 assert Bool.to_heatpump(None) == 0 assert Bool.to_heatpump("1") == 1 + assert Bool.to_heatpump("abc") is None class TestFrequency: @@ -994,6 +998,24 @@ def test_init(self): assert a.datatype_unit is None +class TestVersion: + """Test suite for Version datatype""" + + def test_init(self): + """Test cases for initialization""" + + a = Version("ver") + assert a.name == "ver" + assert a.datatype_class == "ver" + assert a.datatype_unit is None + + def test_from_heatpump(self): + + assert Version.from_heatpump([3, 1, 4]) == "3.1.4" + assert Version.from_heatpump(None) is None + assert Version.from_heatpump("a") is None + + class TestCharacter: """Test suite for Character datatype""" @@ -1421,6 +1443,7 @@ def test_timeofday_conversion(self): """Test cases for from_heatpump function""" assert TimeOfDay.from_heatpump(None) is None + assert TimeOfDay.from_heatpump(1) is None check_pair(TimeOfDay, 7 * 3600 + 30 * 60, "7:30") check_pair(TimeOfDay, 7 * 3600 + 30 * 60 + 50, "7:30:50") @@ -1445,6 +1468,7 @@ def test_timeofday_conversion(self): """Test cases for from_heatpump function""" assert TimeOfDay2.from_heatpump(None) is None + assert TimeOfDay2.from_heatpump(1) is None check_pair(TimeOfDay2, ((19 * 60) << 16) + 7 * 60 + 30, "7:30-19:00") check_pair(TimeOfDay2, ((19 * 60 + 30) << 16) + 5 * 60 + 23, "5:23-19:30") From 66d9e0254750a01f1a4c50546e4ef658a8345f7a Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Sun, 25 Jan 2026 19:25:48 +0100 Subject: [PATCH 51/68] wip --- luxtronik/datatypes.py | 1 + tests/cfi/test_cfi_vector.py | 2 +- tests/test_datatypes.py | 17 ++++++++++++----- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/luxtronik/datatypes.py b/luxtronik/datatypes.py index 24730482..ccf79224 100755 --- a/luxtronik/datatypes.py +++ b/luxtronik/datatypes.py @@ -599,6 +599,7 @@ class Version(Base): concatenate_multiple_data_chunks = False + @classmethod def from_heatpump(self, value): if not isinstance(value, list): return None diff --git a/tests/cfi/test_cfi_vector.py b/tests/cfi/test_cfi_vector.py index 80480131..2ca6d552 100644 --- a/tests/cfi/test_cfi_vector.py +++ b/tests/cfi/test_cfi_vector.py @@ -92,7 +92,7 @@ def test_add(self): assert len(data_vector) == 1 # Re-add available index - field = data_vector.add(5) + field = data_vector.add(11) assert len(data_vector) == 1 assert field.name == 'field_5_all' diff --git a/tests/test_datatypes.py b/tests/test_datatypes.py index d19407ee..8139d201 100644 --- a/tests/test_datatypes.py +++ b/tests/test_datatypes.py @@ -541,11 +541,16 @@ def test_from_heatpump(self): def test_to_heatpump(self): """Test cases for to_heatpump function""" + class BoolExcept: + def __bool__(self): + return "x" + assert Bool.to_heatpump(False) == 0 assert Bool.to_heatpump(True) == 1 assert Bool.to_heatpump(None) == 0 assert Bool.to_heatpump("1") == 1 - assert Bool.to_heatpump("abc") is None + assert Bool.to_heatpump("abc") == 1 + assert Bool.to_heatpump(BoolExcept()) is None class TestFrequency: @@ -1006,12 +1011,12 @@ def test_init(self): a = Version("ver") assert a.name == "ver" - assert a.datatype_class == "ver" + assert a.datatype_class == "version" assert a.datatype_unit is None def test_from_heatpump(self): - assert Version.from_heatpump([3, 1, 4]) == "3.1.4" + assert Version.from_heatpump([3, 1, 4]) == '\x03\x01\x04' assert Version.from_heatpump(None) is None assert Version.from_heatpump("a") is None @@ -1443,7 +1448,8 @@ def test_timeofday_conversion(self): """Test cases for from_heatpump function""" assert TimeOfDay.from_heatpump(None) is None - assert TimeOfDay.from_heatpump(1) is None + assert TimeOfDay.to_heatpump(None) is None + assert TimeOfDay.to_heatpump(1) is None check_pair(TimeOfDay, 7 * 3600 + 30 * 60, "7:30") check_pair(TimeOfDay, 7 * 3600 + 30 * 60 + 50, "7:30:50") @@ -1468,7 +1474,8 @@ def test_timeofday_conversion(self): """Test cases for from_heatpump function""" assert TimeOfDay2.from_heatpump(None) is None - assert TimeOfDay2.from_heatpump(1) is None + assert TimeOfDay2.to_heatpump(None) is None + assert TimeOfDay2.to_heatpump(1) is None check_pair(TimeOfDay2, ((19 * 60) << 16) + 7 * 60 + 30, "7:30-19:00") check_pair(TimeOfDay2, ((19 * 60 + 30) << 16) + 5 * 60 + 23, "5:23-19:30") From af77880eee675fb57b068afc9e7655d4c668183d Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Sun, 25 Jan 2026 19:27:32 +0100 Subject: [PATCH 52/68] wip --- tests/cfi/test_cfi_vector.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/cfi/test_cfi_vector.py b/tests/cfi/test_cfi_vector.py index 2ca6d552..a97fa18b 100644 --- a/tests/cfi/test_cfi_vector.py +++ b/tests/cfi/test_cfi_vector.py @@ -94,7 +94,7 @@ def test_add(self): # Re-add available index field = data_vector.add(11) assert len(data_vector) == 1 - assert field.name == 'field_5_all' + assert field.name == 'field_11' # Add available field field_12 = Base('field_12', False) From 90d7d8870ad050818993bc619260d19abbd21f73 Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Tue, 27 Jan 2026 21:54:55 +0100 Subject: [PATCH 53/68] wip --- luxtronik/constants.py | 2 +- luxtronik/definitions/__init__.py | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/luxtronik/constants.py b/luxtronik/constants.py index bb88c487..65185d75 100644 --- a/luxtronik/constants.py +++ b/luxtronik/constants.py @@ -14,6 +14,6 @@ # Content of response that is contained in responses to discovery broadcast LUXTRONIK_DISCOVERY_RESPONSE_PREFIX: Final = "2500;111;" -# Since version 3.92.0, all unavailable 16 bit data fields +# Since version 3.92.0, all unavailable 16 bit signed data fields # have been returning this value (0x7FFF) LUXTRONIK_VALUE_FUNCTION_NOT_AVAILABLE: Final = 32767 diff --git a/luxtronik/definitions/__init__.py b/luxtronik/definitions/__init__.py index dddafa6a..6f5d908a 100644 --- a/luxtronik/definitions/__init__.py +++ b/luxtronik/definitions/__init__.py @@ -167,6 +167,10 @@ def field_type(self): def writeable(self): return self._writeable + @property + def data_type(self): + return self._data_type + @property def bit_offset(self): return self._bit_offset From 3198750d646d80b3dc44db135eec7fd4e076b849 Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Thu, 29 Jan 2026 22:17:03 +0100 Subject: [PATCH 54/68] wip --- luxtronik/cfi/interface.py | 4 +++- tests/cfi/test_cfi_interface.py | 21 +++++++++++++++++++-- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/luxtronik/cfi/interface.py b/luxtronik/cfi/interface.py index 87ad8c99..0e643d13 100644 --- a/luxtronik/cfi/interface.py +++ b/luxtronik/cfi/interface.py @@ -266,9 +266,10 @@ def _parse(self, data_vector, raw_data): Parse raw data into the corresponding fields. Args: + data_vector (DataVector): Data vector in which + the raw data is to be integrated. raw_data (list[int]): List of raw register values. The raw data must start at register index 0. - num_bits (int): Number of bits per register. """ raw_len = len(raw_data) # Prepare a list of undefined indices @@ -281,6 +282,7 @@ def _parse(self, data_vector, raw_data): next_idx = definition.index + definition.count if next_idx > raw_len: # not enough registers + field.raw = None continue # remove all used indices from the list of undefined indices for index in range(definition.index, next_idx): diff --git a/tests/cfi/test_cfi_interface.py b/tests/cfi/test_cfi_interface.py index a46a2ad4..755b9e59 100644 --- a/tests/cfi/test_cfi_interface.py +++ b/tests/cfi/test_cfi_interface.py @@ -9,7 +9,6 @@ class TestLuxtronikSocketInterface: - def test_parse(self): lux = LuxtronikSocketInterface('host') parameters = Parameters() @@ -32,4 +31,22 @@ def test_parse(self): lux._parse(visibilities, t) v = visibilities.get(n) assert v.name == f"unknown_visibility_{n}" - assert v.raw == n \ No newline at end of file + assert v.raw == n + + n = 10 + t = list(range(0, n + 1)) + + lux._parse(parameters, t) + for definition, field in parameters.data.pairs(): + if definition.index > n: + assert field.raw is None + + lux._parse(calculations, t) + for definition, field in calculations.data.pairs(): + if definition.index > n: + assert field.raw is None + + lux._parse(visibilities, t) + for definition, field in visibilities.data.pairs(): + if definition.index > n: + assert field.raw is None \ No newline at end of file From d9e4e1731843f77955226e07586a317c17c575fc Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Tue, 3 Feb 2026 19:37:49 +0100 Subject: [PATCH 55/68] wip --- luxtronik/cfi/interface.py | 5 +++-- luxtronik/shi/interface.py | 2 ++ tests/cfi/test_cfi_parameters.py | 4 ++-- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/luxtronik/cfi/interface.py b/luxtronik/cfi/interface.py index 0e643d13..a14df1ba 100644 --- a/luxtronik/cfi/interface.py +++ b/luxtronik/cfi/interface.py @@ -164,6 +164,7 @@ def _write_and_read(self, parameters, data): def _write(self, parameters): for definition, field in parameters.items(): if field.write_pending: + field.write_pending = False value = field.raw if not isinstance(definition.index, int) or not isinstance(value, int): LOGGER.warning( @@ -172,7 +173,6 @@ def _write(self, parameters): definition.index, value, ) - field.write_pending = False continue LOGGER.info("%s: Parameter '%d' set to '%s'", self._host, definition.index, value) self._send_ints(LUXTRONIK_PARAMETERS_WRITE, definition.index, value) @@ -180,7 +180,6 @@ def _write(self, parameters): LOGGER.debug("%s: Command %s", self._host, cmd) val = self._read_int() LOGGER.debug("%s: Value %s", self._host, val) - field.write_pending = False # Give the heatpump a short time to handle the value changes/calculations: time.sleep(WAIT_TIME_AFTER_PARAMETER_WRITE) @@ -287,6 +286,8 @@ def _parse(self, data_vector, raw_data): # remove all used indices from the list of undefined indices for index in range(definition.index, next_idx): undefined.discard(index) + # integrate_data() also resets the write_pending flag, + # intentionally only for read fields pair.integrate_data(raw_data, LUXTRONIK_CFI_REGISTER_BIT_SIZE) # create an unknown field for additional data diff --git a/luxtronik/shi/interface.py b/luxtronik/shi/interface.py index 2ff751e8..ab82c848 100644 --- a/luxtronik/shi/interface.py +++ b/luxtronik/shi/interface.py @@ -321,6 +321,8 @@ def _integrate_data(self, telegrams_data): success = True for block, telegram, read_not_write in telegrams_data: if (read_not_write == READ): + # integrate_data() also resets the write_pending flag, + # intentionally only for read fields valid = block.integrate_data(telegram.data) if not valid: LOGGER.debug(f"Failed to integrate read data into {block}") diff --git a/tests/cfi/test_cfi_parameters.py b/tests/cfi/test_cfi_parameters.py index 6438ae15..8acb6f8b 100644 --- a/tests/cfi/test_cfi_parameters.py +++ b/tests/cfi/test_cfi_parameters.py @@ -80,7 +80,7 @@ def test_set(self): parameters.set("BarFoo", 0) assert parameters["BarFoo"] is None - # Set something which was previously not allowed to be set + # Set something which was previously (v0.3.14) not allowed to be set parameters.set("ID_Transfert_LuxNet", 1) assert parameters["ID_Transfert_LuxNet"].raw == 1 assert parameters["ID_Transfert_LuxNet"].write_pending @@ -92,7 +92,7 @@ def test_set(self): parameters = Parameters(safe=False) - # Set something which was previously not allowed to be set, but we are brave. + # Set something which was previously (v0.3.14) not allowed to be set, but we are brave. parameters.set("ID_Transfert_LuxNet", 4) assert parameters["ID_Transfert_LuxNet"].raw == 4 assert parameters["ID_Transfert_LuxNet"].write_pending From da3115328cae1acacd6a5047e360469f9a72f5d2 Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Tue, 3 Feb 2026 22:12:06 +0100 Subject: [PATCH 56/68] wip --- tests/shi/test_shi_interface.py | 152 +++++++++++++++++++++----------- 1 file changed, 100 insertions(+), 52 deletions(-) diff --git a/tests/shi/test_shi_interface.py b/tests/shi/test_shi_interface.py index 76fc209d..6f58b4ae 100644 --- a/tests/shi/test_shi_interface.py +++ b/tests/shi/test_shi_interface.py @@ -28,6 +28,10 @@ ) from tests.fake import FakeModbus +IDX_BLK = 0 +IDX_TLG = 1 +IDX_RNW = 2 + class TestLuxtronikSmartHomeData: @@ -244,8 +248,8 @@ def test_create_telegram(self): telegram = self.interface._create_telegram(block, "input", False) assert telegram is None - def test_create_telegrams(self): - blocks_list = [] + def create_contiguous_block_list(self): + block_list = [] blocks = ContiguousDataBlockList("holding", True) # block 1 @@ -260,86 +264,130 @@ def test_create_telegrams(self): # block 3 blocks.append_single(HOLDINGS_DEFINITIONS[10], HOLDINGS_DEFINITIONS[10].create_field()) - blocks_list.append(blocks) + block_list.append(blocks) blocks = ContiguousDataBlockList("holding", False) - # invalid block + # invalid block because of invalid data blocks.append_single(HOLDINGS_DEFINITIONS[12], HOLDINGS_DEFINITIONS[12].create_field()) + # block 4 field3 = HOLDINGS_DEFINITIONS[17].create_field() blocks.append_single(HOLDINGS_DEFINITIONS[17], field3) - blocks_list.append(blocks) + block_list.append(blocks) field3.raw = 17 - telegram_data = self.interface._create_telegrams(blocks_list) + assert len(block_list) == 2 + assert len(block_list[0]) == 3 + assert len(block_list[0][0]) == 2 + assert len(block_list[0][1]) == 1 + assert len(block_list[0][2]) == 1 + assert len(block_list[1]) == 2 + assert len(block_list[1][0]) == 1 + assert len(block_list[1][1]) == 1 + + return block_list + + def test_create_telegrams(self): + block_list = self.create_contiguous_block_list() + + telegram_data = self.interface._create_telegrams(block_list) assert len(telegram_data) == 4 + + # Note: telegram_data[block index][tuple index] + # Note: telegram_data[block index][IDX_BLK][part index] + # blocks - assert len(telegram_data[0][0]) == 2 - assert telegram_data[0][0].first_index == 10 - assert telegram_data[0][0].overall_count == 2 - assert len(telegram_data[1][0]) == 1 - assert telegram_data[1][0].first_index == 17 - assert telegram_data[1][0].overall_count == 1 - assert len(telegram_data[2][0]) == 1 - assert telegram_data[2][0].first_index == 10 - assert telegram_data[2][0].overall_count == 1 - assert len(telegram_data[3][0]) == 1 - assert telegram_data[3][0].first_index == 17 - assert telegram_data[3][0].overall_count == 1 + assert len(telegram_data[0][IDX_BLK]) == 2 + assert telegram_data[0][IDX_BLK].first_index == 10 + assert telegram_data[0][IDX_BLK].overall_count == 2 + assert len(telegram_data[1][IDX_BLK]) == 1 + assert telegram_data[1][IDX_BLK].first_index == 17 + assert telegram_data[1][IDX_BLK].overall_count == 1 + assert len(telegram_data[2][IDX_BLK]) == 1 + assert telegram_data[2][IDX_BLK].first_index == 10 + assert telegram_data[2][IDX_BLK].overall_count == 1 + assert len(telegram_data[3][IDX_BLK]) == 1 + assert telegram_data[3][IDX_BLK].first_index == 17 + assert telegram_data[3][IDX_BLK].overall_count == 1 # telegrams - assert telegram_data[0][1].count == 2 - assert telegram_data[1][1].count == 1 - assert telegram_data[2][1].count == 1 - assert telegram_data[3][1].count == 1 + assert telegram_data[0][IDX_TLG].count == 2 + assert telegram_data[1][IDX_TLG].count == 1 + assert telegram_data[2][IDX_TLG].count == 1 + assert telegram_data[3][IDX_TLG].count == 1 # read not write - assert telegram_data[0][2] - assert telegram_data[1][2] - assert telegram_data[2][2] - assert not telegram_data[3][2] + assert telegram_data[0][IDX_RNW] + assert telegram_data[1][IDX_RNW] + assert telegram_data[2][IDX_RNW] + assert not telegram_data[3][IDX_RNW] + + def test_integrate_data(self): + block_list = self.create_contiguous_block_list() + field3 = block_list[1][1][0].field + + telegram_data = self.interface._create_telegrams(block_list) # integrate - telegram_data[0][1].data = [18, 4] - telegram_data[1][1].data = [9] - telegram_data[2][1].data = [27] - telegram_data[3][0][0].field.write_pending = True + telegram_data[0][IDX_TLG].data = [18, 4] + telegram_data[0][IDX_BLK][0].field.write_pending = True + telegram_data[0][IDX_BLK][1].field.write_pending = False + telegram_data[1][IDX_TLG].data = [9] + telegram_data[2][IDX_TLG].data = [27] + telegram_data[3][IDX_BLK][0].field.write_pending = True valid = self.interface._integrate_data(telegram_data) assert valid # [index data, index for blocks, index for part] - assert telegram_data[0][0][0].field.raw == 18 - assert telegram_data[0][0][1].field.raw == 4 - assert telegram_data[1][0][0].field.raw == 9 - assert telegram_data[2][0][0].field.raw == 27 - assert not telegram_data[3][0][0].field.write_pending - assert telegram_data[3][0][0].field.raw == 17 # no update + assert telegram_data[0][IDX_BLK][0].field.raw == 18 + assert not telegram_data[0][IDX_BLK][0].field.write_pending + assert telegram_data[0][IDX_BLK][1].field.raw == 4 + assert not telegram_data[0][IDX_BLK][1].field.write_pending + assert telegram_data[1][IDX_BLK][0].field.raw == 9 + assert telegram_data[2][IDX_BLK][0].field.raw == 27 + assert telegram_data[3][IDX_BLK][0].field.raw == 17 # no update + assert not telegram_data[3][IDX_BLK][0].field.write_pending # integrate not available / None -> no error - telegram_data[0][1].data = [18, 4] - telegram_data[1][1].data = [LUXTRONIK_VALUE_FUNCTION_NOT_AVAILABLE] - telegram_data[2][1].data = [None] + telegram_data[0][IDX_TLG].data = [19, 5] + telegram_data[0][IDX_BLK][0].field.write_pending = True + telegram_data[1][IDX_TLG].data = [LUXTRONIK_VALUE_FUNCTION_NOT_AVAILABLE] + telegram_data[1][IDX_BLK][0].field.write_pending = True + telegram_data[2][IDX_TLG].data = [None] + telegram_data[2][IDX_BLK][0].field.write_pending = True + telegram_data[3][IDX_BLK][0].field.write_pending = True valid = self.interface._integrate_data(telegram_data) assert valid # [index data, index for blocks, index for part] - assert telegram_data[0][0][0].field.raw == 18 - assert telegram_data[0][0][1].field.raw == 4 - assert telegram_data[1][0][0].field.raw is None - assert telegram_data[2][0][0].field.raw is None - assert telegram_data[3][0][0].field.raw == 17 # no update + assert telegram_data[0][IDX_BLK][0].field.raw == 19 + assert not telegram_data[0][IDX_BLK][0].field.write_pending + assert telegram_data[0][IDX_BLK][1].field.raw == 5 + assert not telegram_data[0][IDX_BLK][1].field.write_pending + assert telegram_data[1][IDX_BLK][0].field.raw is None + assert not telegram_data[1][IDX_BLK][0].field.write_pending # update with none -> reset flag + assert telegram_data[2][IDX_BLK][0].field.raw is None + assert not telegram_data[2][IDX_BLK][0].field.write_pending # update with none -> reset flag + assert telegram_data[3][IDX_BLK][0].field.raw == 17 # no update + assert not telegram_data[3][IDX_BLK][0].field.write_pending # integrate too less -> error - telegram_data[0][1].data = [18] - telegram_data[1][1].data = [1] - telegram_data[2][1].data = [None] + telegram_data[0][IDX_TLG].data = [18] + telegram_data[0][IDX_BLK][0].field.write_pending = True + telegram_data[0][IDX_BLK][1].field.write_pending = True + telegram_data[1][IDX_TLG].data = [2] + telegram_data[1][IDX_BLK][0].field.write_pending = True + telegram_data[2][IDX_TLG].data = [None] valid = self.interface._integrate_data(telegram_data) assert not valid # [index data, index for blocks, index for part] - assert telegram_data[0][0][0].field.raw == 18 - assert telegram_data[0][0][1].field.raw == 4 # no update - assert telegram_data[1][0][0].field.raw == 1 - assert telegram_data[2][0][0].field.raw is None - assert telegram_data[3][0][0].field.raw == 17 # no update + assert telegram_data[0][IDX_BLK][0].field.raw == 19 # no update + assert telegram_data[0][IDX_BLK][0].field.write_pending # no update + assert telegram_data[0][IDX_BLK][1].field.raw == 5 # no update + assert telegram_data[0][IDX_BLK][1].field.write_pending # no update + assert telegram_data[1][IDX_BLK][0].field.raw == 2 + assert not telegram_data[1][IDX_BLK][0].field.write_pending + assert telegram_data[2][IDX_BLK][0].field.raw is None + assert telegram_data[3][IDX_BLK][0].field.raw == 17 # no update def test_prepare(self): definition = HOLDINGS_DEFINITIONS[2] From 2a326ca554d6b8af05a67e3a1f2068402c1eb82c Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Tue, 3 Feb 2026 22:22:35 +0100 Subject: [PATCH 57/68] wip --- tests/cfi/test_cfi_interface.py | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/tests/cfi/test_cfi_interface.py b/tests/cfi/test_cfi_interface.py index 755b9e59..e842d0f2 100644 --- a/tests/cfi/test_cfi_interface.py +++ b/tests/cfi/test_cfi_interface.py @@ -18,35 +18,53 @@ def test_parse(self): n = 2000 t = list(range(0, n + 1)) + parameters[0].write_pending = True lux._parse(parameters, t) p = parameters.get(n) assert p.name == f"unknown_parameter_{n}" assert p.raw == n + assert not p.write_pending + calculations[0].write_pending = True lux._parse(calculations, t) c = calculations.get(n) assert c.name == f"unknown_calculation_{n}" assert c.raw == n + assert not c.write_pending + visibilities[0].write_pending = True lux._parse(visibilities, t) v = visibilities.get(n) assert v.name == f"unknown_visibility_{n}" assert v.raw == n + assert not v.write_pending n = 10 t = list(range(0, n + 1)) + parameters[0].write_pending = True + parameters[20].write_pending = True + parameters[40].write_pending = True lux._parse(parameters, t) - for definition, field in parameters.data.pairs(): + for definition, field in parameters.data.items(): if definition.index > n: assert field.raw is None + assert not field.write_pending + calculations[0].write_pending = True + calculations[20].write_pending = True + calculations[40].write_pending = True lux._parse(calculations, t) - for definition, field in calculations.data.pairs(): + for definition, field in calculations.data.items(): if definition.index > n: assert field.raw is None + assert not field.write_pending + visibilities[0].write_pending = True + visibilities[20].write_pending = True + visibilities[40].write_pending = True lux._parse(visibilities, t) - for definition, field in visibilities.data.pairs(): + for definition, field in visibilities.data.items(): if definition.index > n: - assert field.raw is None \ No newline at end of file + assert field.raw is None + assert not field.write_pending \ No newline at end of file From b522e79351593348e3800f2a2f4e7a4d706eb777 Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Tue, 3 Feb 2026 23:31:35 +0100 Subject: [PATCH 58/68] preserve --- luxtronik/__init__.py | 2 +- luxtronik/cfi/interface.py | 5 ++-- luxtronik/common.py | 10 +++++++ luxtronik/shi/contiguous.py | 8 ++++++ tests/cfi/test_cfi_interface.py | 49 ++++++++++++++++++++------------- tests/shi/test_shi_interface.py | 35 ++++++++++++++++++++--- 6 files changed, 83 insertions(+), 26 deletions(-) diff --git a/luxtronik/__init__.py b/luxtronik/__init__.py index 9f5fa168..52165676 100755 --- a/luxtronik/__init__.py +++ b/luxtronik/__init__.py @@ -6,7 +6,7 @@ import logging -from luxtronik.common import get_host_lock +from luxtronik.common import LuxtronikSettings, get_host_lock from luxtronik.discover import discover # noqa: F401 from luxtronik.cfi import ( diff --git a/luxtronik/cfi/interface.py b/luxtronik/cfi/interface.py index a14df1ba..62a86162 100644 --- a/luxtronik/cfi/interface.py +++ b/luxtronik/cfi/interface.py @@ -5,7 +5,7 @@ import struct import time -from luxtronik.common import get_host_lock +from luxtronik.common import LuxtronikSettings, get_host_lock from luxtronik.cfi.constants import ( LUXTRONIK_DEFAULT_PORT, LUXTRONIK_PARAMETERS_WRITE, @@ -281,7 +281,8 @@ def _parse(self, data_vector, raw_data): next_idx = definition.index + definition.count if next_idx > raw_len: # not enough registers - field.raw = None + if not LuxtronikSettings.preserve_last_read_value_on_fail: + field.raw = None continue # remove all used indices from the list of undefined indices for index in range(definition.index, next_idx): diff --git a/luxtronik/common.py b/luxtronik/common.py index dbef88a7..013a84a7 100644 --- a/luxtronik/common.py +++ b/luxtronik/common.py @@ -1,6 +1,16 @@ from threading import RLock +############################################################################### +# User adjust-able settings class +############################################################################### + +class LuxtronikSettings: + + # If False, overwrite existing values with None in case of a transmission error. + # Otherwise, leave the previous value unchanged. + preserve_last_read_value_on_fail = True + ############################################################################### # Multi-threading lock mechanism ############################################################################### diff --git a/luxtronik/shi/contiguous.py b/luxtronik/shi/contiguous.py index fcb6c500..80653487 100644 --- a/luxtronik/shi/contiguous.py +++ b/luxtronik/shi/contiguous.py @@ -6,6 +6,7 @@ import logging +from luxtronik.common import LuxtronikSettings from luxtronik.collections import LuxtronikDefFieldPair from luxtronik.shi.constants import LUXTRONIK_SHI_REGISTER_BIT_SIZE @@ -161,11 +162,18 @@ def integrate_data(self, data_arr): data_len = len(data_arr) if valid else 0 valid &= data_len == self.overall_count + print('test1') + if not valid: + print('test2') LOGGER.debug( f"Data to integrate not valid! Expected length {self.overall_count} " \ + f"but got {data_len}: data = {data_arr}, block = {self}" ) + if not LuxtronikSettings.preserve_last_read_value_on_fail: + print('test3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!1') + for definition, field in self._parts: + field.raw = None return False first = self.first_index diff --git a/tests/cfi/test_cfi_interface.py b/tests/cfi/test_cfi_interface.py index e842d0f2..aced441a 100644 --- a/tests/cfi/test_cfi_interface.py +++ b/tests/cfi/test_cfi_interface.py @@ -1,9 +1,10 @@ from luxtronik import ( - Parameters, - Calculations, - Visibilities, - LuxtronikSocketInterface, + LuxtronikSettings, + Parameters, + Calculations, + Visibilities, + LuxtronikSocketInterface, ) @@ -42,29 +43,39 @@ def test_parse(self): n = 10 t = list(range(0, n + 1)) - parameters[0].write_pending = True - parameters[20].write_pending = True - parameters[40].write_pending = True + orig_preserve = LuxtronikSettings.preserve_last_read_value_on_fail + + LuxtronikSettings.preserve_last_read_value_on_fail = True + preserve = LuxtronikSettings.preserve_last_read_value_on_fail + for definition, field in parameters.data.items(): + field.write_pending = True lux._parse(parameters, t) for definition, field in parameters.data.items(): - if definition.index > n: + value_available = definition.index > n + if value_available and not preserve: assert field.raw is None - assert not field.write_pending + assert field.write_pending == (value_available and preserve) - calculations[0].write_pending = True - calculations[20].write_pending = True - calculations[40].write_pending = True + LuxtronikSettings.preserve_last_read_value_on_fail = False + preserve = LuxtronikSettings.preserve_last_read_value_on_fail + for definition, field in calculations.data.items(): + field.write_pending = True lux._parse(calculations, t) for definition, field in calculations.data.items(): - if definition.index > n: + value_available = definition.index > n + if value_available and not preserve: assert field.raw is None - assert not field.write_pending + assert field.write_pending == (value_available and preserve) - visibilities[0].write_pending = True - visibilities[20].write_pending = True - visibilities[40].write_pending = True + LuxtronikSettings.preserve_last_read_value_on_fail = False + preserve = LuxtronikSettings.preserve_last_read_value_on_fail + for definition, field in visibilities.data.items(): + field.write_pending = True lux._parse(visibilities, t) for definition, field in visibilities.data.items(): - if definition.index > n: + value_available = definition.index > n + if value_available and not preserve: assert field.raw is None - assert not field.write_pending \ No newline at end of file + assert field.write_pending == (value_available and preserve) + + LuxtronikSettings.preserve_last_read_value_on_fail = orig_preserve \ No newline at end of file diff --git a/tests/shi/test_shi_interface.py b/tests/shi/test_shi_interface.py index 6f58b4ae..ed7c5d18 100644 --- a/tests/shi/test_shi_interface.py +++ b/tests/shi/test_shi_interface.py @@ -1,6 +1,7 @@ import pytest from unittest.mock import patch +from luxtronik.common import LuxtronikSettings from luxtronik.constants import LUXTRONIK_VALUE_FUNCTION_NOT_AVAILABLE from luxtronik.datatypes import Base, Unknown from luxtronik.definitions import LuxtronikDefinition @@ -370,6 +371,30 @@ def test_integrate_data(self): assert telegram_data[3][IDX_BLK][0].field.raw == 17 # no update assert not telegram_data[3][IDX_BLK][0].field.write_pending + orig_preserve = LuxtronikSettings.preserve_last_read_value_on_fail + LuxtronikSettings.preserve_last_read_value_on_fail = True + + # integrate too less -> error + telegram_data[0][IDX_TLG].data = [18] + telegram_data[0][IDX_BLK][0].field.write_pending = True + telegram_data[0][IDX_BLK][1].field.write_pending = True + telegram_data[1][IDX_TLG].data = [2] + telegram_data[1][IDX_BLK][0].field.write_pending = True + telegram_data[2][IDX_TLG].data = [None] + valid = self.interface._integrate_data(telegram_data) + assert not valid + # [index data, index for blocks, index for part] + assert telegram_data[0][IDX_BLK][0].field.raw == 19 # preserve -> no update + assert telegram_data[0][IDX_BLK][0].field.write_pending # preserve -> no update + assert telegram_data[0][IDX_BLK][1].field.raw == 5 # preserve -> no update + assert telegram_data[0][IDX_BLK][1].field.write_pending # preserve -> no update + assert telegram_data[1][IDX_BLK][0].field.raw == 2 + assert not telegram_data[1][IDX_BLK][0].field.write_pending + assert telegram_data[2][IDX_BLK][0].field.raw is None + assert telegram_data[3][IDX_BLK][0].field.raw == 17 # no update + + LuxtronikSettings.preserve_last_read_value_on_fail = False + # integrate too less -> error telegram_data[0][IDX_TLG].data = [18] telegram_data[0][IDX_BLK][0].field.write_pending = True @@ -380,15 +405,17 @@ def test_integrate_data(self): valid = self.interface._integrate_data(telegram_data) assert not valid # [index data, index for blocks, index for part] - assert telegram_data[0][IDX_BLK][0].field.raw == 19 # no update - assert telegram_data[0][IDX_BLK][0].field.write_pending # no update - assert telegram_data[0][IDX_BLK][1].field.raw == 5 # no update - assert telegram_data[0][IDX_BLK][1].field.write_pending # no update + assert telegram_data[0][IDX_BLK][0].field.raw is None # no preserve -> update + assert not telegram_data[0][IDX_BLK][0].field.write_pending # no preserve -> update + assert telegram_data[0][IDX_BLK][1].field.raw is None # no preserve -> update + assert not telegram_data[0][IDX_BLK][1].field.write_pending # no preserve -> update assert telegram_data[1][IDX_BLK][0].field.raw == 2 assert not telegram_data[1][IDX_BLK][0].field.write_pending assert telegram_data[2][IDX_BLK][0].field.raw is None assert telegram_data[3][IDX_BLK][0].field.raw == 17 # no update + LuxtronikSettings.preserve_last_read_value_on_fail = orig_preserve + def test_prepare(self): definition = HOLDINGS_DEFINITIONS[2] field = definition.create_field() From 5615fde3a13911be39df2eedb190b6531b139db6 Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Tue, 3 Feb 2026 23:32:40 +0100 Subject: [PATCH 59/68] wip --- luxtronik/shi/contiguous.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/luxtronik/shi/contiguous.py b/luxtronik/shi/contiguous.py index 80653487..d28d8fbd 100644 --- a/luxtronik/shi/contiguous.py +++ b/luxtronik/shi/contiguous.py @@ -162,16 +162,12 @@ def integrate_data(self, data_arr): data_len = len(data_arr) if valid else 0 valid &= data_len == self.overall_count - print('test1') - if not valid: - print('test2') LOGGER.debug( f"Data to integrate not valid! Expected length {self.overall_count} " \ + f"but got {data_len}: data = {data_arr}, block = {self}" ) if not LuxtronikSettings.preserve_last_read_value_on_fail: - print('test3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!1') for definition, field in self._parts: field.raw = None return False From 6d8d2fd9659c7269700a649b5328629807901a15 Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Tue, 3 Feb 2026 23:36:51 +0100 Subject: [PATCH 60/68] wip --- luxtronik/__init__.py | 2 +- tests/shi/test_shi_interface.py | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/luxtronik/__init__.py b/luxtronik/__init__.py index 52165676..278a5516 100755 --- a/luxtronik/__init__.py +++ b/luxtronik/__init__.py @@ -6,7 +6,7 @@ import logging -from luxtronik.common import LuxtronikSettings, get_host_lock +from luxtronik.common import LuxtronikSettings, get_host_lock # noqa: F401 from luxtronik.discover import discover # noqa: F401 from luxtronik.cfi import ( diff --git a/tests/shi/test_shi_interface.py b/tests/shi/test_shi_interface.py index ed7c5d18..c2c96cc9 100644 --- a/tests/shi/test_shi_interface.py +++ b/tests/shi/test_shi_interface.py @@ -326,7 +326,6 @@ def test_create_telegrams(self): def test_integrate_data(self): block_list = self.create_contiguous_block_list() - field3 = block_list[1][1][0].field telegram_data = self.interface._create_telegrams(block_list) From 8140ed0cb7b0d0450c9df3874c6677f4f2e3d7ff Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Thu, 5 Feb 2026 18:52:12 +0100 Subject: [PATCH 61/68] wip --- luxtronik/definitions/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/luxtronik/definitions/__init__.py b/luxtronik/definitions/__init__.py index 6f5d908a..9afa9318 100644 --- a/luxtronik/definitions/__init__.py +++ b/luxtronik/definitions/__init__.py @@ -249,7 +249,7 @@ def __getitem__(self, name_or_idx): def __contains__(self, def_name_or_idx): if isinstance(def_name_or_idx, LuxtronikDefinition): - return any(def_name_or_idx is d for d in self._index_dict.values()) + return any(def_name_or_idx is d for d in self._name_dict.values()) return self._get(def_name_or_idx) is not None def _add_alias(self, definition, alias): From 1e1d451f65a8aa48c5c1af446f729e75d63b92a0 Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Thu, 5 Feb 2026 21:52:24 +0100 Subject: [PATCH 62/68] wip --- luxtronik/cfi/interface.py | 3 ++- luxtronik/data_vector.py | 26 +++++++++++++++++++++++++- luxtronik/datatypes.py | 14 ++++++++++---- luxtronik/definitions/parameters.py | 14 +++++++------- luxtronik/definitions/visibilities.py | 2 +- luxtronik/shi/interface.py | 11 +++++------ tests/test_LuxtronikData.py | 6 +++--- 7 files changed, 53 insertions(+), 23 deletions(-) diff --git a/luxtronik/cfi/interface.py b/luxtronik/cfi/interface.py index 62a86162..01344b45 100644 --- a/luxtronik/cfi/interface.py +++ b/luxtronik/cfi/interface.py @@ -6,6 +6,7 @@ import time from luxtronik.common import LuxtronikSettings, get_host_lock +from luxtronik.data_vector import check_write_data from luxtronik.cfi.constants import ( LUXTRONIK_DEFAULT_PORT, LUXTRONIK_PARAMETERS_WRITE, @@ -166,7 +167,7 @@ def _write(self, parameters): if field.write_pending: field.write_pending = False value = field.raw - if not isinstance(definition.index, int) or not isinstance(value, int): + if not isinstance(definition.index, int) or not check_write_data(parameters, field): LOGGER.warning( "%s: Parameter id '%s' or value '%s' invalid!", self._host, diff --git a/luxtronik/data_vector.py b/luxtronik/data_vector.py index c440559e..dae53bca 100644 --- a/luxtronik/data_vector.py +++ b/luxtronik/data_vector.py @@ -9,6 +9,30 @@ LOGGER = logging.getLogger(__name__) +############################################################################### +# Common functions +############################################################################### + + def check_write_data(data_vector, field): + """ + Returns true if the field is writable and the field data is valid. + + Args: + data_vector (DataVector): Data vector to which the field belongs + field (Base): The field object with the data to be written + + Returns: + bool: True if the data is writable, otherwise False. + """ + if field.writeable or not data_vector.safe: + if isinstance(field.raw, int): + return True + else: + LOGGER.error(f"Value of {data_vector.name} '{field.name}' invalid!") + else: + LOGGER.warning(f"{data_vector.name} '{field.name}' not safe for writing!") + return False + ############################################################################### # Base class for all luxtronik data vectors @@ -256,7 +280,7 @@ def get(self, def_field_name_or_idx, default=None): def set(self, def_field_name_or_idx, value): """ - Set field to new value. + Set the data of a field to the given value. The value is set, even if the field marked as non-writeable. No data validation is performed either. diff --git a/luxtronik/datatypes.py b/luxtronik/datatypes.py index ccf79224..56719a18 100755 --- a/luxtronik/datatypes.py +++ b/luxtronik/datatypes.py @@ -1,6 +1,7 @@ """datatype conversions.""" import datetime +import logging import socket import struct @@ -9,6 +10,9 @@ from functools import total_ordering +LOGGER = logging.getLogger(__name__) + + @total_ordering class Base: """Base datatype, no conversions.""" @@ -67,6 +71,8 @@ def value(self): def value(self, value): """Converts the value into heatpump units and store it.""" self._raw = self.to_heatpump(value) + if self._raw is None: + LOGGER.warning(f"Value '{value}' not valid for field '{self.name}'") self.write_pending = True @property @@ -76,7 +82,7 @@ def raw(self): @raw.setter def raw(self, raw): - """Store the raw data.""" + """Store the raw data. For internal use only""" self._raw = raw self.write_pending = False @@ -89,7 +95,7 @@ def __repr__(self): f"name: {self.name}, " f"writeable: {self.writeable}, " f"value: {self.value}, " - f"raw: {self._raw}, " + f"raw: {self.raw}, " f"write_pending: {self.write_pending}, " f"class: {self.datatype_class}, " f"unit: {self.datatype_unit}" @@ -111,7 +117,7 @@ def __eq__(self, other): return False return ( - self.value == other.value + self._raw == other._raw and self.datatype_class == other.datatype_class and self.datatype_unit == other.datatype_unit ) @@ -120,7 +126,7 @@ def __lt__(self, other): """Compares two datatype objects and returns which one contains the lower value""" return ( - self.value < other.value + self._raw < other._raw and self.datatype_class == other.datatype_class and self.datatype_unit == other.datatype_unit ) diff --git a/luxtronik/definitions/parameters.py b/luxtronik/definitions/parameters.py index ba1aa7d4..c8b7f62f 100644 --- a/luxtronik/definitions/parameters.py +++ b/luxtronik/definitions/parameters.py @@ -11529,7 +11529,7 @@ { "index": 1136, "count": 1, - "names": ['HEAT_ENERGY_INPUT'], + "names": ['HEAT_ENERGY_INPUT', 'Unknown_Parameter_1136'], "type": Energy, "writeable": False, "datatype": 'UINT32', @@ -11539,7 +11539,7 @@ { "index": 1137, "count": 1, - "names": ['DHW_ENERGY_INPUT'], + "names": ['DHW_ENERGY_INPUT', 'Unknown_Parameter_1137'], "type": Energy, "writeable": False, "datatype": 'UINT32', @@ -11559,7 +11559,7 @@ { "index": 1139, "count": 1, - "names": ['COOLING_ENERGY_INPUT'], + "names": ['COOLING_ENERGY_INPUT', 'Unknown_Parameter_1139'], "type": Energy, "writeable": False, "datatype": 'UINT32', @@ -11569,7 +11569,7 @@ { "index": 1140, "count": 1, - "names": ['SECOND_HEAT_GENERATOR_AMOUNT_COUNTER'], + "names": ['SECOND_HEAT_GENERATOR_AMOUNT_COUNTER', 'Unknown_Parameter_1140'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -11649,7 +11649,7 @@ { "index": 1148, "count": 1, - "names": ['HEATING_TARGET_TEMP_ROOM_THERMOSTAT'], + "names": ['HEATING_TARGET_TEMP_ROOM_THERMOSTAT', 'Unknown_Parameter_1148'], "type": Celsius, "writeable": True, "datatype": 'INT32', @@ -11749,7 +11749,7 @@ { "index": 1158, "count": 1, - "names": ['POWER_LIMIT_SWITCH'], + "names": ['POWER_LIMIT_SWITCH', 'Unknown_Parameter_1158'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -11759,7 +11759,7 @@ { "index": 1159, "count": 1, - "names": ['POWER_LIMIT_VALUE'], + "names": ['POWER_LIMIT_VALUE', 'Unknown_Parameter_1159'], "type": Unknown, "writeable": False, "datatype": 'UINT32', diff --git a/luxtronik/definitions/visibilities.py b/luxtronik/definitions/visibilities.py index a4a86451..502d05b6 100644 --- a/luxtronik/definitions/visibilities.py +++ b/luxtronik/definitions/visibilities.py @@ -3596,7 +3596,7 @@ { "index": 357, "count": 1, - "names": ['ELECTRICAL_POWER_LIMITATION_SWITCH', 'Unknown_Parameter_357'], + "names": ['ELECTRICAL_POWER_LIMITATION_SWITCH', 'Unknown_Visibility_357', 'Unknown_Parameter_357'], "type": Unknown, "writeable": False, "datatype": 'UINT32', diff --git a/luxtronik/shi/interface.py b/luxtronik/shi/interface.py index ab82c848..4187386d 100644 --- a/luxtronik/shi/interface.py +++ b/luxtronik/shi/interface.py @@ -5,6 +5,7 @@ from luxtronik.common import classproperty, version_in_range from luxtronik.collections import get_data_arr from luxtronik.datatypes import Base +from luxtronik.data_vector import check_write_data from luxtronik.definitions import ( LuxtronikDefinition, LuxtronikDefinitionsList, @@ -381,16 +382,14 @@ def _prepare_write_field(self, definition, field, safe, data): if not field.write_pending and data is None: return False - # Abort if field is not writeable - if safe and not (definition.writeable and field.writeable): - LOGGER.warning("Field marked as non-writeable: " \ - + f"name={definition.name}, data={field.raw}") - return False - # Override the field's data with the provided data if data is not None: field.value = data + # Abort if field is not writeable or the value is invalid + if check_write_data(field): + return False + # Abort if insufficient data is provided if not get_data_arr(definition, field, LUXTRONIK_SHI_REGISTER_BIT_SIZE): LOGGER.warning("Data error / insufficient data provided: " \ diff --git a/tests/test_LuxtronikData.py b/tests/test_LuxtronikData.py index f1e2bb62..39ca2e52 100644 --- a/tests/test_LuxtronikData.py +++ b/tests/test_LuxtronikData.py @@ -65,9 +65,9 @@ def test_get_firmware_version(self): @pytest.mark.parametrize("vector, index, names", [ - ("para", 1106, ["ID_Einst_SilenceTimer_13"]), - ("para", 1109, ["ID_Einst_SilenceTimer_16"]), - ("calc", 232, ["Vapourisation_Temperature"]), + ("para", 1106, ["ID_Einst_SilenceTimer_13", "Unknown_Parameter_1106"]), + ("para", 1109, ["ID_Einst_SilenceTimer_16", "Unknown_Parameter_1109"]), + ("calc", 232, ["Vapourisation_Temperature", "Unknown_Calculation_232"]), ("calc", 241, ["HUP_PWM", "Circulation_Pump"]), ("visi", 182, ["ID_Visi_Heizung_Zeitschaltprogramm", "ID_Visi_Heizung_Zeitschlaltprogramm"]), ("visi", 326, ["Unknown_Visibility_326"]), From 205d9b9bbc0e67b6414ca0659f74055264e765d8 Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Thu, 5 Feb 2026 21:55:09 +0100 Subject: [PATCH 63/68] wip --- luxtronik/data_vector.py | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/luxtronik/data_vector.py b/luxtronik/data_vector.py index dae53bca..23a2bf56 100644 --- a/luxtronik/data_vector.py +++ b/luxtronik/data_vector.py @@ -13,25 +13,25 @@ # Common functions ############################################################################### - def check_write_data(data_vector, field): - """ - Returns true if the field is writable and the field data is valid. +def check_write_data(data_vector, field): + """ + Returns true if the field is writable and the field data is valid. - Args: - data_vector (DataVector): Data vector to which the field belongs - field (Base): The field object with the data to be written + Args: + data_vector (DataVector): Data vector to which the field belongs + field (Base): The field object with the data to be written - Returns: - bool: True if the data is writable, otherwise False. - """ - if field.writeable or not data_vector.safe: - if isinstance(field.raw, int): - return True - else: - LOGGER.error(f"Value of {data_vector.name} '{field.name}' invalid!") + Returns: + bool: True if the data is writable, otherwise False. + """ + if field.writeable or not data_vector.safe: + if isinstance(field.raw, int): + return True else: - LOGGER.warning(f"{data_vector.name} '{field.name}' not safe for writing!") - return False + LOGGER.error(f"Value of {data_vector.name} '{field.name}' invalid!") + else: + LOGGER.warning(f"{data_vector.name} '{field.name}' not safe for writing!") + return False ############################################################################### From 0402f8d8ffcd6280e4172e7065270b8a2a88e8f3 Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Thu, 5 Feb 2026 22:07:32 +0100 Subject: [PATCH 64/68] wip --- luxtronik/cfi/interface.py | 3 +-- luxtronik/data_vector.py | 24 ------------------------ luxtronik/datatypes.py | 20 ++++++++++++++++++++ luxtronik/shi/interface.py | 3 +-- 4 files changed, 22 insertions(+), 28 deletions(-) diff --git a/luxtronik/cfi/interface.py b/luxtronik/cfi/interface.py index 01344b45..2907d810 100644 --- a/luxtronik/cfi/interface.py +++ b/luxtronik/cfi/interface.py @@ -6,7 +6,6 @@ import time from luxtronik.common import LuxtronikSettings, get_host_lock -from luxtronik.data_vector import check_write_data from luxtronik.cfi.constants import ( LUXTRONIK_DEFAULT_PORT, LUXTRONIK_PARAMETERS_WRITE, @@ -167,7 +166,7 @@ def _write(self, parameters): if field.write_pending: field.write_pending = False value = field.raw - if not isinstance(definition.index, int) or not check_write_data(parameters, field): + if not isinstance(definition.index, int) or not field.check_for_write(parameters.safe): LOGGER.warning( "%s: Parameter id '%s' or value '%s' invalid!", self._host, diff --git a/luxtronik/data_vector.py b/luxtronik/data_vector.py index 23a2bf56..efa2c41d 100644 --- a/luxtronik/data_vector.py +++ b/luxtronik/data_vector.py @@ -9,30 +9,6 @@ LOGGER = logging.getLogger(__name__) -############################################################################### -# Common functions -############################################################################### - -def check_write_data(data_vector, field): - """ - Returns true if the field is writable and the field data is valid. - - Args: - data_vector (DataVector): Data vector to which the field belongs - field (Base): The field object with the data to be written - - Returns: - bool: True if the data is writable, otherwise False. - """ - if field.writeable or not data_vector.safe: - if isinstance(field.raw, int): - return True - else: - LOGGER.error(f"Value of {data_vector.name} '{field.name}' invalid!") - else: - LOGGER.warning(f"{data_vector.name} '{field.name}' not safe for writing!") - return False - ############################################################################### # Base class for all luxtronik data vectors diff --git a/luxtronik/datatypes.py b/luxtronik/datatypes.py index 56719a18..732bd159 100755 --- a/luxtronik/datatypes.py +++ b/luxtronik/datatypes.py @@ -131,6 +131,26 @@ def __lt__(self, other): and self.datatype_unit == other.datatype_unit ) + def check_for_write(self, safe=True): + """ + Returns true if the field is writable and the field data is valid. + + Args: + safe (bool, Default: True): Flag for blocking write operations + if the field is not marked as writable + + Returns: + bool: True if the data is writable, otherwise False. + """ + if self.writeable or not safe: + if isinstance(self._raw, int): + return True + else: + LOGGER.error(f"Value of '{self.name}' invalid!") + else: + LOGGER.warning(f"'{self.name}' not safe for writing!") + return False + class SelectionBase(Base): """Selection base datatype, converts from and to list of codes.""" diff --git a/luxtronik/shi/interface.py b/luxtronik/shi/interface.py index 4187386d..39bc1cfa 100644 --- a/luxtronik/shi/interface.py +++ b/luxtronik/shi/interface.py @@ -5,7 +5,6 @@ from luxtronik.common import classproperty, version_in_range from luxtronik.collections import get_data_arr from luxtronik.datatypes import Base -from luxtronik.data_vector import check_write_data from luxtronik.definitions import ( LuxtronikDefinition, LuxtronikDefinitionsList, @@ -387,7 +386,7 @@ def _prepare_write_field(self, definition, field, safe, data): field.value = data # Abort if field is not writeable or the value is invalid - if check_write_data(field): + if field.check_for_write(safe): return False # Abort if insufficient data is provided From e8c0df236d33f57bdfab2b1e0c9d5aaab254bc88 Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Thu, 5 Feb 2026 22:11:53 +0100 Subject: [PATCH 65/68] wip --- luxtronik/shi/interface.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/luxtronik/shi/interface.py b/luxtronik/shi/interface.py index 39bc1cfa..202d6461 100644 --- a/luxtronik/shi/interface.py +++ b/luxtronik/shi/interface.py @@ -386,7 +386,7 @@ def _prepare_write_field(self, definition, field, safe, data): field.value = data # Abort if field is not writeable or the value is invalid - if field.check_for_write(safe): + if not field.check_for_write(safe): return False # Abort if insufficient data is provided From 2b954a3771d7cc21f099c9db665c60aa3a0d25c2 Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Thu, 5 Feb 2026 22:16:36 +0100 Subject: [PATCH 66/68] wip --- tests/test_LuxtronikData.py | 6 +++--- tests/test_compatibility.py | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/tests/test_LuxtronikData.py b/tests/test_LuxtronikData.py index 39ca2e52..f1e2bb62 100644 --- a/tests/test_LuxtronikData.py +++ b/tests/test_LuxtronikData.py @@ -65,9 +65,9 @@ def test_get_firmware_version(self): @pytest.mark.parametrize("vector, index, names", [ - ("para", 1106, ["ID_Einst_SilenceTimer_13", "Unknown_Parameter_1106"]), - ("para", 1109, ["ID_Einst_SilenceTimer_16", "Unknown_Parameter_1109"]), - ("calc", 232, ["Vapourisation_Temperature", "Unknown_Calculation_232"]), + ("para", 1106, ["ID_Einst_SilenceTimer_13"]), + ("para", 1109, ["ID_Einst_SilenceTimer_16"]), + ("calc", 232, ["Vapourisation_Temperature"]), ("calc", 241, ["HUP_PWM", "Circulation_Pump"]), ("visi", 182, ["ID_Visi_Heizung_Zeitschaltprogramm", "ID_Visi_Heizung_Zeitschlaltprogramm"]), ("visi", 326, ["Unknown_Visibility_326"]), diff --git a/tests/test_compatibility.py b/tests/test_compatibility.py index 357dc23b..97ae8679 100644 --- a/tests/test_compatibility.py +++ b/tests/test_compatibility.py @@ -1946,6 +1946,7 @@ def test_compatibilities(self): "ID_Visi_Heizung_Zeitschaltprogramm": (182, Unknown), "Unknown_Visibility_355": (355, Unknown), "Unknown_Visibility_356": (356, Unknown), + "Unknown_Visibility_357": (357, Unknown), "ELECTRICAL_POWER_LIMITATION_SWITCH": (357, Unknown), "Unknown_Visibility_358": (358, Unknown), "Unknown_Visibility_359": (359, Unknown), From 9f3215ff6ceee6d7904afa6b8a5424e9252e83ca Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Thu, 5 Feb 2026 22:59:26 +0100 Subject: [PATCH 67/68] wip --- luxtronik/definitions/parameters.py | 28 ++++++++++++--- tests/test_compatibility.py | 56 +++++++++++++++++++++-------- 2 files changed, 65 insertions(+), 19 deletions(-) diff --git a/luxtronik/definitions/parameters.py b/luxtronik/definitions/parameters.py index c8b7f62f..dbdf8d56 100644 --- a/luxtronik/definitions/parameters.py +++ b/luxtronik/definitions/parameters.py @@ -11526,20 +11526,30 @@ "unit": '', "description": '', }, + { + "index": 1136, + "names": ['Unknown_Parameter_1136'], + "type": Unknown, + }, { "index": 1136, "count": 1, - "names": ['HEAT_ENERGY_INPUT', 'Unknown_Parameter_1136'], + "names": ['HEAT_ENERGY_INPUT'], "type": Energy, "writeable": False, "datatype": 'UINT32', "unit": 'kWh/10', "description": '', }, + { + "index": 1137, + "names": ['Unknown_Parameter_1137'], + "type": Unknown, + }, { "index": 1137, "count": 1, - "names": ['DHW_ENERGY_INPUT', 'Unknown_Parameter_1137'], + "names": ['DHW_ENERGY_INPUT'], "type": Energy, "writeable": False, "datatype": 'UINT32', @@ -11556,10 +11566,15 @@ "unit": '', "description": '', }, + { + "index": 1139, + "names": ['Unknown_Parameter_1139'], + "type": Unknown, + }, { "index": 1139, "count": 1, - "names": ['COOLING_ENERGY_INPUT', 'Unknown_Parameter_1139'], + "names": ['COOLING_ENERGY_INPUT'], "type": Energy, "writeable": False, "datatype": 'UINT32', @@ -11646,10 +11661,15 @@ "unit": '', "description": '', }, + { + "index": 1148, + "names": ['Unknown_Parameter_1148'], + "type": Unknown, + }, { "index": 1148, "count": 1, - "names": ['HEATING_TARGET_TEMP_ROOM_THERMOSTAT', 'Unknown_Parameter_1148'], + "names": ['HEATING_TARGET_TEMP_ROOM_THERMOSTAT'], "type": Celsius, "writeable": True, "datatype": 'INT32', diff --git a/tests/test_compatibility.py b/tests/test_compatibility.py index 97ae8679..30a922b8 100644 --- a/tests/test_compatibility.py +++ b/tests/test_compatibility.py @@ -84,6 +84,14 @@ class TestCompatibility: def test_compatibilities(self): """Test cases for compatibilities""" + # Structure of entries: + # old_name: (old_index, old_type[, type_intentionally_changed]) + # + # old_name: Previously used but still supported name + # old_index: Index assigned to this name + # type_intentionally_changed: We also check type changes. + # If this optional flag is set to True, you can skip the type check + paras = { # Status of 0.3.14: "ID_Transfert_LuxNet": (0, Unknown), @@ -1247,10 +1255,14 @@ def test_compatibilities(self): "Unknown_Parameter_1133": (1133, Unknown), "Unknown_Parameter_1134": (1134, Unknown), "Unknown_Parameter_1135": (1135, Unknown), + "Unknown_Parameter_1136": (1136, Unknown), "HEAT_ENERGY_INPUT": (1136, Energy), + "Unknown_Parameter_1137": (1137, Unknown), "DHW_ENERGY_INPUT": (1137, Energy), "Unknown_Parameter_1138": (1138, Unknown), + "Unknown_Parameter_1139": (1139, Unknown), "COOLING_ENERGY_INPUT": (1139, Energy), + "Unknown_Parameter_1140": (1140, Unknown), "SECOND_HEAT_GENERATOR_AMOUNT_COUNTER": (1140, Unknown), "Unknown_Parameter_1141": (1141, Unknown), "Unknown_Parameter_1142": (1142, Unknown), @@ -1259,6 +1271,7 @@ def test_compatibilities(self): "Unknown_Parameter_1145": (1145, Unknown), "Unknown_Parameter_1146": (1146, Unknown), "Unknown_Parameter_1147": (1147, Unknown), + "Unknown_Parameter_1148": (1148, Unknown), "HEATING_TARGET_TEMP_ROOM_THERMOSTAT": (1148, Celsius), "Unknown_Parameter_1149": (1149, Unknown), "Unknown_Parameter_1150": (1150, Unknown), @@ -1269,7 +1282,9 @@ def test_compatibilities(self): "Unknown_Parameter_1155": (1155, Unknown), "Unknown_Parameter_1156": (1156, Unknown), "Unknown_Parameter_1157": (1157, Unknown), + "Unknown_Parameter_1158": (1158, Unknown), "POWER_LIMIT_SWITCH": (1158, Unknown), + "Unknown_Parameter_1159": (1159, Unknown), "POWER_LIMIT_VALUE": (1159, Unknown), } @@ -1332,9 +1347,9 @@ def test_compatibilities(self): "ID_WEB_MZ2out": (54, Bool), "ID_WEB_MA2out": (55, Bool), "ID_WEB_Zaehler_BetrZeitVD1": (56, Seconds), - "ID_WEB_Zaehler_BetrZeitImpVD1": (57, Pulses), + "ID_WEB_Zaehler_BetrZeitImpVD1": (57, Pulses, True), # obsolete type -> type change allowed "ID_WEB_Zaehler_BetrZeitVD2": (58, Seconds), - "ID_WEB_Zaehler_BetrZeitImpVD2": (59, Pulses), + "ID_WEB_Zaehler_BetrZeitImpVD2": (59, Pulses, True), # obsolete type -> type change allowed "ID_WEB_Zaehler_BetrZeitZWE1": (60, Seconds), "ID_WEB_Zaehler_BetrZeitZWE2": (61, Seconds), "ID_WEB_Zaehler_BetrZeitZWE3": (62, Seconds), @@ -1357,10 +1372,10 @@ def test_compatibilities(self): "ID_WEB_BIV_Stufe_akt": (79, BivalenceLevel), "ID_WEB_WP_BZ_akt": (80, OperationMode), "ID_WEB_SoftStand": (81, Version), - "ID_WEB_AdresseIP_akt": (91, IPAddress), - "ID_WEB_SubNetMask_akt": (92, IPAddress), - "ID_WEB_Add_Broadcast": (93, IPAddress), - "ID_WEB_Add_StdGateway": (94, IPAddress), + "ID_WEB_AdresseIP_akt": (91, IPAddress, True), # obsolete type -> type change allowed + "ID_WEB_SubNetMask_akt": (92, IPAddress, True), # obsolete type -> type change allowed + "ID_WEB_Add_Broadcast": (93, IPAddress, True), # obsolete type -> type change allowed + "ID_WEB_Add_StdGateway": (94, IPAddress, True), # obsolete type -> type change allowed "ID_WEB_ERROR_Time0": (95, Timestamp), "ID_WEB_ERROR_Time1": (96, Timestamp), "ID_WEB_ERROR_Time2": (97, Timestamp), @@ -2131,9 +2146,12 @@ def test_compatibilities(self): obsolete_found = [] old_not_found = [] old_idx_wrong = [] - old_type_changed = [] + old_type_changed_info = [] + old_type_changed_err = [] - for old_name, (old_idx, old_type) in mapping.items(): + for old_name, (old_idx, old_type, *old_type_changed) in mapping.items(): + # using * old_type_changed is a list with all residual elements + old_type_changed = True if len(old_type_changed) > 0 and old_type_changed[0] else False # Try to get the definition of the "old name" try: @@ -2161,13 +2179,17 @@ def test_compatibilities(self): #if old_name != def_by_name.name: # new name available -> no error + # we allow type changes if we already use a name, but the type is still unknown + type_change_allowed = old_type_changed or (not old_name.lower().startswith("unknown_") and old_type == Unknown) if old_type != def_by_name.field_type: - old_type_changed.append(f"Type of {old_name} changed from {old_type.__name__} to {def_by_name.field_type.__name__}") + if type_change_allowed: + old_type_changed_info.append(f"Type of {old_name} changed from {old_type.__name__} to {def_by_name.field_type.__name__}") + else: + old_type_changed_err.append(f"Type of {old_name} changed from {old_type.__name__} to {def_by_name.field_type.__name__}") - # Currently we allow type changes ok = not obsolete_found and not old_not_found \ - and not old_idx_wrong # and not old_type_changed - do_print = not ok or len(old_type_changed) > 0 + and not old_idx_wrong and not old_type_changed_err + do_print = not ok or len(old_type_changed_info) > 0 if do_print: print(f"############################## Incompatibilities - {caption}:") @@ -2183,9 +2205,13 @@ def test_compatibilities(self): print("############################## idx wrong") for err in old_idx_wrong: print(err) - if old_type_changed: - print("############################## type changed") - for err in old_type_changed: + if old_type_changed_err: + print("############################## type change error") + for err in old_type_changed_err: + print(err) + if old_type_changed_info: + print("############################## type change info") + for err in old_type_changed_info: print(err) all_ok &= ok From de3bfc149d38dcf3a042d30fc2716334c779d278 Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Thu, 5 Feb 2026 23:03:57 +0100 Subject: [PATCH 68/68] wip --- tests/test_socket_interaction.py | 48 ++++++++++++++++---------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/tests/test_socket_interaction.py b/tests/test_socket_interaction.py index 196b7c36..34e8ebdf 100644 --- a/tests/test_socket_interaction.py +++ b/tests/test_socket_interaction.py @@ -96,29 +96,29 @@ def test_luxtronik_socket_interface(self): # Finally, writing p = Parameters() - p[0].raw = 100 - p[0].write_pending = True - p[1].raw = 200 + p[1].raw = 100 p[1].write_pending = True + p[2].raw = 200 + p[2].write_pending = True lux.write(p) s = FakeSocket.last_instance - assert s.written_values[0] == 100 - assert s.written_values[1] == 200 - assert not p[0].write_pending + assert s.written_values[1] == 100 + assert s.written_values[2] == 200 assert not p[1].write_pending + assert not p[2].write_pending p = Parameters() - p[2].raw = 300 - p[2].write_pending = True - p[3].raw = "test" + p[3].raw = 300 p[3].write_pending = True + p[4].raw = "test" + p[4].write_pending = True d = lux.write_and_read(p) s = FakeSocket.last_instance - assert s.written_values[2] == 300 + assert s.written_values[3] == 300 # Make sure that the non-int value is not written: - assert 3 not in s.written_values - assert not p[2].write_pending + assert 4 not in s.written_values assert not p[3].write_pending + assert not p[4].write_pending assert self.check_luxtronik_data(d) def test_luxtronik(self): @@ -149,18 +149,18 @@ def test_luxtronik(self): ########################## # Test the write routine # ########################## - lux.parameters[0].raw = 500 - lux.parameters[0].write_pending = True + lux.parameters[1].raw = 500 + lux.parameters[1].write_pending = True lux.write() s = FakeSocket.last_instance - assert s.written_values[0] == 500 + assert s.written_values[1] == 500 p = Parameters() - p[1].raw = 501 - p[1].write_pending = True + p[2].raw = 501 + p[2].write_pending = True lux.write(p) s = FakeSocket.last_instance - assert s.written_values[1] == 501 + assert s.written_values[2] == 501 # lux.write() and lux.write(p) should not read: assert self.check_luxtronik_data(lux, False) @@ -168,24 +168,24 @@ def test_luxtronik(self): ################################### # Test the write_and_read routine # ################################### - lux.parameters[2].raw = 502 - lux.parameters[2].write_pending = True + lux.parameters[3].raw = 502 + lux.parameters[3].write_pending = True lux.write_and_read() # Currently write_and_read triggers two separate connections/operations s = FakeSocket.prev_instance - assert s.written_values[2] == 502 + assert s.written_values[3] == 502 # Now, the values should be read assert self.check_luxtronik_data(lux) self.clear_luxtronik_data(lux) - p[3].raw = 503 - p[3].write_pending = True + p[4].raw = 503 + p[4].write_pending = True lux.write_and_read(p) # Currently write_and_read triggers two separate connections/operations s = FakeSocket.prev_instance - assert s.written_values[3] == 503 + assert s.written_values[4] == 503 # Now, the values should be read assert self.check_luxtronik_data(lux)