From 4e75b6db86289911b9d30e31789c242ed792a177 Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Thu, 15 Jan 2026 21:30:30 +0100 Subject: [PATCH 01/40] Unify and improve the scripts dump-cfi / watch-cfi commands are now available in CLI --- luxtronik/__main__.py | 20 ++-- luxtronik/scripts/__init__.py | 31 ++++++- luxtronik/scripts/dump_changes.py | 127 +++++++++++--------------- luxtronik/scripts/dump_luxtronik.py | 55 ++++------- luxtronik/scripts/dump_shi.py | 30 +++--- luxtronik/scripts/update_screen.py | 136 ++++++++++++++++++++++++++++ luxtronik/scripts/watch_shi.py | 99 ++++++++------------ 7 files changed, 291 insertions(+), 207 deletions(-) create mode 100644 luxtronik/scripts/update_screen.py diff --git a/luxtronik/__main__.py b/luxtronik/__main__.py index fb0b4b12..b66a1d1b 100755 --- a/luxtronik/__main__.py +++ b/luxtronik/__main__.py @@ -4,13 +4,13 @@ import sys from luxtronik.discover import discover as _discover from luxtronik.scripts.dump_luxtronik import ( - dump_luxtronik, + dump_cfi, ) # pylint: disable=unused-import # noqa: F401 from luxtronik.scripts.dump_shi import ( dump_shi, ) # pylint: disable=unused-import # noqa: F401 from luxtronik.scripts.dump_changes import ( - dump_changes, + watch_cfi, ) # pylint: disable=unused-import # noqa: F401 from luxtronik.scripts.watch_shi import ( watch_shi, @@ -31,10 +31,12 @@ def main() -> int: description="CLI for Luxtronik controllers", usage="""luxtronik [] The supported commands are: - dump Dump all available data from the Luxtronik controller - dump-shi Dump all available data from the Luxtronik smart home interface - changes Dump all value changes from Luxtronik controller - watch-shi Watch all value changes from Luxtronik smart home interface + dump Dump all config interface values of the Luxtronik controller + dump-cfi Dump all config interface values of the Luxtronik controller + dump-shi Dump all smart home interface values of the Luxtronik controller + changes Watch all config interface value changes of the Luxtronik controller + watch-cfi Watch all config interface value changes of the Luxtronik controller + watch-shi Watch all smart home interface value changes of the Luxtronik controller discover Discover Luxtronik controllers on the network (via magic packet) and output results """, ) @@ -43,9 +45,11 @@ def main() -> int: # exclude the rest of the args too, or validation will fail args = parser.parse_args(sys.argv[1:2]) commands = { - "dump": dump_luxtronik, + "dump": dump_cfi, + "dump-cfi": dump_cfi, "dump-shi": dump_shi, - "changes": dump_changes, + "changes": watch_cfi, + "watch-cfi": watch_cfi, "watch-shi": watch_shi, "discover": discover, } diff --git a/luxtronik/scripts/__init__.py b/luxtronik/scripts/__init__.py index d5ff75b5..c9072d23 100644 --- a/luxtronik/scripts/__init__.py +++ b/luxtronik/scripts/__init__.py @@ -2,6 +2,7 @@ import argparse + def create_default_args_parser(func_desc, default_port): parser = argparse.ArgumentParser(description=func_desc) parser.add_argument("ip", help="IP address of Luxtronik controller to connect to") @@ -22,7 +23,29 @@ def print_dump_header(caption): def print_dump_row(number, field): print(f"Number: {number:<5} Name: {field.name:<60} " + f"Type: {field.__class__.__name__:<20} Value: {field}") -def print_watch_header(caption): - print("=" * 130) - print(caption) - print("=" * 130) +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) + +def print_watch_header(screen, caption): + cols, _ = screen.get_visible_size() + screen.write("=" * cols) + screen.write(caption) + screen.write("=" * cols) + +def get_watch_row(short_name, number, prev_field, this_field): + text = f"{short_name}: Number: {number:<5} Name: {prev_field.name:<60} " + f"Value: {prev_field}" + if this_field: + text += f" -> {this_field}" + return text + +def update_changes(changes, prev_data_vector, this_data_vector): + for index, 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) + if this_field.raw != prev_field.raw: + changes[key] = get_watch_row(short_name, index, prev_field, this_field) + elif key in changes: + changes[key] = get_watch_row(short_name, index, prev_field, None) diff --git a/luxtronik/scripts/dump_changes.py b/luxtronik/scripts/dump_changes.py index 435503aa..77d80722 100755 --- a/luxtronik/scripts/dump_changes.py +++ b/luxtronik/scripts/dump_changes.py @@ -1,85 +1,60 @@ #! /usr/bin/env python3 -# pylint: disable=invalid-name, disable=too-many-locals - -"""Script to dump all value changes from Luxtronik controller""" - -import os -import time -import argparse - -from luxtronik import LuxtronikSocketInterface -from luxtronik.cfi.constants import LUXTRONIK_DEFAULT_PORT - - -def dump_changes(): - """Dump all value changes from Luxtronik controller""" - # pylint: disable=duplicate-code - parser = argparse.ArgumentParser(description="Dumps all value changes from Luxtronik controller") - parser.add_argument("ip", help="IP address of Luxtronik controller to connect to") - parser.add_argument( - "port", - nargs="?", - type=int, - default=LUXTRONIK_DEFAULT_PORT, - help="Port to use to connect to Luxtronik controller", - ) - args = parser.parse_args() - - client = LuxtronikSocketInterface(args.ip, args.port) +# pylint: disable=invalid-name +""" +Script to watch all config interface value changes of the Luxtronik controller +""" + +from collections import OrderedDict + +from luxtronik import LuxtronikSocketInterface, LuxtronikData, LUXTRONIK_DEFAULT_PORT +from luxtronik.scripts.update_screen import UpdateScreen +from luxtronik.scripts import ( + create_default_args_parser, + print_watch_header, + update_changes +) + + +def dump_all(screen, client, changes, prev_data, this_data): + # Get new data + client.read(this_data) + + # Compare this values with the initial values + # and add changes to dictionary + update_changes(changes, prev_data.parameters, this_data.parameters) + update_changes(changes, prev_data.calculations, this_data.calculations) + update_changes(changes, prev_data.visibilities, this_data.visibilities) + + # Print changes + print_watch_header(screen, f"Watch CFI of {client._host}:{client._port}") + sorted_changes = OrderedDict(sorted(changes.items())) + for key, values in sorted_changes.items(): + screen.write(values) + +def dump_repeated(client): prev_data = client.read() - # pylint: enable=duplicate-code + this_data = LuxtronikData() changes = {} + screen = UpdateScreen(500) + screen.clear() while True: - # Get new data - this_data = client.read() - - # Compare this values with the initial values - # and add changes to dictionary - for number, param in this_data.parameters: - key = f"para_{number}" - prev_param = prev_data.parameters.get(number) - if param.raw != prev_param.raw: - changes[key] = ( - f"para: Number: {number:<5} Name: {prev_param.name:<60} " + f"Value: {prev_param} -> {param}" - ) - elif key in changes: - changes[key] = ( - f"para: Number: {number:<5} Name: {prev_param.name:<60} " + f"Value: {prev_param} -> reverted" - ) - - for number, calc in this_data.calculations: - key = f"calc_{number}" - prev_calc = prev_data.calculations.get(number) - if calc.raw != prev_calc.raw: - changes[key] = ( - f"calc: Number: {number:<5} Name: {prev_calc.name:<60} " + f"Value: {prev_calc} -> {calc}" - ) - elif key in changes: - changes[key] = ( - f"calc: Number: {number:<5} Name: {prev_calc.name:<60} " + f"Value: {prev_calc} -> reverted" - ) - - for number, visi in this_data.visibilities: - key = f"visi_{number}" - prev_visi = prev_data.visibilities.get(number) - if visi.raw != prev_visi.raw: - changes[key] = ( - f"visi: Number: {number:<5} Name: {prev_visi.name:<60} " + f"Value: {prev_visi} -> {visi}" - ) - elif key in changes: - changes[key] = ( - f"visi: Number: {number:<5} Name: {prev_visi.name:<60} " + f"Value: {prev_visi} -> reverted" - ) - - # Print changes - os.system("clear") - print("=" * 80) - for key, values in changes.items(): - print(values) - time.sleep(1) + dump_all(screen, client, changes, prev_data, this_data) + screen.update() + if screen.process_keys(100): + break + screen.reset() + +def watch_cfi(): + parser = create_default_args_parser( + "Watch all config interface value changes of the Luxtronik controller", + LUXTRONIK_DEFAULT_PORT + ) + args = parser.parse_args() + client = LuxtronikSocketInterface(args.ip, args.port) + dump_repeated(client) if __name__ == "__main__": - dump_changes() + watch_cfi() diff --git a/luxtronik/scripts/dump_luxtronik.py b/luxtronik/scripts/dump_luxtronik.py index 526c15f3..504012b3 100755 --- a/luxtronik/scripts/dump_luxtronik.py +++ b/luxtronik/scripts/dump_luxtronik.py @@ -1,52 +1,29 @@ #! /usr/bin/env python3 # pylint: disable=invalid-name +""" +Script to dump all available config interface values of the Luxtronik controller +""" -"""Script to dump all available values from Luxtronik controller""" -import argparse +from luxtronik import Luxtronik, LUXTRONIK_DEFAULT_PORT +from luxtronik.scripts import create_default_args_parser, dump_fields -from luxtronik import Luxtronik -from luxtronik.cfi.constants import LUXTRONIK_DEFAULT_PORT +def dump_all(client): + dump_fields(client.parameters) + dump_fields(client.calculations) + dump_fields(client.visibilities) -def dump_luxtronik(): - # pylint: disable=duplicate-code - """Dump all available data from the Luxtronik controller.""" - parser = argparse.ArgumentParser(description="Dumps all values from Luxtronik controller") - parser.add_argument("ip", help="IP address of Luxtronik controller to connect to") - parser.add_argument( - "port", - nargs="?", - type=int, - default=LUXTRONIK_DEFAULT_PORT, - help="Port to use to connect to Luxtronik controller", +def dump_cfi(): + parser = create_default_args_parser( + "Dumps all config interface values of the Luxtronik controller", + LUXTRONIK_DEFAULT_PORT ) args = parser.parse_args() - + print(f"Dump CFI of {args.ip}:{args.port}") client = Luxtronik(args.ip, args.port) - # pylint: enable=duplicate-code - - print("=" * 80) - print(f"{' Parameter ': ^80}") - print("=" * 80) - - for number, param in client.parameters: - print(f"Number: {number:<5} Name: {param.name:<60} " + f"Type: {param.__class__.__name__:<20} Value: {param}") - - print("=" * 80) - print(f"{' Calculations ': ^80}") - print("=" * 80) - - for number, calc in client.calculations: - print(f"Number: {number:<5} Name: {calc.name:<60} " + f"Type: {calc.__class__.__name__:<20} Value: {calc}") - - print("=" * 80) - print(f"{' Visibilities ': ^80}") - print("=" * 80) - - for number, visi in client.visibilities: - print(f"Number: {number:<5} Name: {visi.name:<60} " + f"Type: {visi.__class__.__name__:<20} Value: {visi}") + dump_all(client) if __name__ == "__main__": - dump_luxtronik() + dump_cfi() diff --git a/luxtronik/scripts/dump_shi.py b/luxtronik/scripts/dump_shi.py index 38290f41..de33a140 100644 --- a/luxtronik/scripts/dump_shi.py +++ b/luxtronik/scripts/dump_shi.py @@ -1,39 +1,31 @@ #! /usr/bin/env python3 + # pylint: disable=invalid-name """ -Script to dump all available smart home interface values from Luxtronik controller. +Script to dump all available smart home interface values of the Luxtronik controller """ import logging -from luxtronik.scripts import ( - create_default_args_parser, - print_dump_header, - print_dump_row -) -from luxtronik.shi import create_modbus_tcp -from luxtronik.shi.constants import LUXTRONIK_DEFAULT_MODBUS_PORT +from luxtronik.shi import create_modbus_tcp, LUXTRONIK_DEFAULT_MODBUS_PORT +from luxtronik.scripts import create_default_args_parser, dump_fields logging.disable(logging.CRITICAL) -def dump_fields(read_cb): - data_vector = read_cb() - print_dump_header(f"{data_vector.name}s") - for definition, field in data_vector.items(): - print_dump_row(definition.index, field) + +def dump_all(client): + dump_fields(client.read_inputs()) + dump_fields(client.read_holdings()) def dump_shi(): parser = create_default_args_parser( - "Dumps all smart home interface values from Luxtronik controller.", + "Dumps all smart home interface values of the Luxtronik controller", LUXTRONIK_DEFAULT_MODBUS_PORT ) args = parser.parse_args() print(f"Dump SHI of {args.ip}:{args.port}") - - shi = create_modbus_tcp(args.ip, args.port) - - dump_fields(shi.read_inputs) - dump_fields(shi.read_holdings) + client = create_modbus_tcp(args.ip, args.port) + dump_all(client) if __name__ == "__main__": diff --git a/luxtronik/scripts/update_screen.py b/luxtronik/scripts/update_screen.py new file mode 100644 index 00000000..d5b2f876 --- /dev/null +++ b/luxtronik/scripts/update_screen.py @@ -0,0 +1,136 @@ +import os +import shutil +import sys + +if sys.platform == "win32": + import msvcrt +else: + import select + import termios + import tty + + + + + +class UpdateScreen: + + if sys.platform == "win32": + + def init_key(self): + pass + + def get_key(self): + try: + if msvcrt.kbhit(): + key = msvcrt.getch() + if key == b'\xe0': # special key + key2 = msvcrt.getch() + if key2 == b'H': + key = "up" + elif key2 == b'P': + key = "down" + else: + key = key.decode() + return key + except Exception: + pass + return None + + def finalize_key(self): + pass + + else: + + def init_key(self): + self._fd = sys.stdin.fileno() + self._old_settings = termios.tcgetattr(self._fd) + tty.setcbreak(self._fd) + + def get_key(self): + try: + if select.select([sys.stdin], [], [], 0)[0]: + key = sys.stdin.read(1) + if key == "\x1b[A": + key = "up" + elif key == "\x1b[B": + key = "down" + return key + except Exception: + pass + return None + + def finalize_key(self): + termios.tcsetattr(self._fd, termios.TCSADRAIN, self._old_settings) + + + NUM_STATUS_LINES = 1 + + def __init__(self, buffer_size): + self._buffer_size = buffer_size + self._buffer = [""] * self._buffer_size + self._offset = 0 + self._index = 0 + self._counter = 0 + self.init_key() + + def __del__(self): + self.finalize_key() + + def _safe_up(self, n): + _, rows = shutil.get_terminal_size() + rows -= 1 # one for half lines + n = min(n, rows) + sys.stdout.write(f"\033[{n}A") + sys.stdout.flush() + + def clear(self): + self._buffer = [""] * self._buffer_size + self._offset = 0 + self._index = 0 + self._counter = 0 + os.system("cls" if os.name == "nt" else "clear") + + def write(self, text): + if self._index < self._buffer_size: + self._buffer[self._index] = text + self._index += 1 + + def get_visible_size(self): + cols, rows = shutil.get_terminal_size() + rows -= 1 # one for half lines + visible_rows = rows - self.NUM_STATUS_LINES + return cols, visible_rows + + def update(self): + cols, rows = self.get_visible_size() + visible = self._buffer[self._offset : self._offset + rows] + for line in visible: + print(line[:cols] + "\033[0K") # clear residual line + print(f"[Update: {self._counter}, Offset: {self._offset}] up/down to scroll, q to quit" + "\033[0K") + self._counter += 1 + + def reset(self): + # "clear" screen + self._index = 0 + self._safe_up(self._buffer_size) + + def on_key_press(self, key): + _, rows = self.get_visible_size() + if key == "q": + return True + elif key == "down": + self._offset = min(self._offset + self.NUM_STATUS_LINES, self._buffer_size - rows) + elif key == "up": + self._offset = max(self._offset - self.NUM_STATUS_LINES, 0) + return False + + def process_keys(self, count): + do_exit = False + # Repeat query user-input for smaller latency + for i in range(count): + key = self.get_key() + if self.on_key_press(key): + do_exit = True + break + return do_exit \ No newline at end of file diff --git a/luxtronik/scripts/watch_shi.py b/luxtronik/scripts/watch_shi.py index b3d443f1..a86c2212 100644 --- a/luxtronik/scripts/watch_shi.py +++ b/luxtronik/scripts/watch_shi.py @@ -1,84 +1,61 @@ #! /usr/bin/env python3 -# pylint: disable=invalid-name, disable=too-many-locals + +# pylint: disable=invalid-name """ -Script to watch all value changes from the smart home interface of the Luxtronik controller +Script to watch all smart home interface value changes of the Luxtronik controller """ from collections import OrderedDict import logging -#import select -#import sys -import time +from luxtronik.shi import create_modbus_tcp, LUXTRONIK_DEFAULT_MODBUS_PORT +from luxtronik.scripts.update_screen import UpdateScreen from luxtronik.scripts import ( create_default_args_parser, - print_watch_header + print_watch_header, + update_changes ) -from luxtronik.shi import create_modbus_tcp -from luxtronik.shi.constants import LUXTRONIK_DEFAULT_MODBUS_PORT logging.disable(logging.CRITICAL) -def update_changes(changes, this_data_vector, prev_data_vector): - for definition, this_field in this_data_vector.items(): - short_name = this_data_vector.name[:4] - number = definition.index - key = f"{short_name}_{str(number).zfill(5)}" - prev_field = prev_data_vector.get(number) - if this_field.raw != prev_field.raw: - changes[key] = ( - f"{short_name}: Number: {number:<5} Name: {prev_field.name:<60} " + f"Value: {prev_field} -> {this_field}" - ) - elif key in changes: - changes[key] = ( - f"{short_name}: Number: {number:<5} Name: {prev_field.name:<60} " + f"Value: {prev_field}" - ) -def watch_shi(): - parser = create_default_args_parser( - "Watch all value changes from the smart home interface of the Luxtronik controller.", - LUXTRONIK_DEFAULT_MODBUS_PORT - ) - args = parser.parse_args() +def dump_all(screen, client, changes, prev_data, this_data): + # Get new data + client.read(this_data) - shi = create_modbus_tcp(args.ip, args.port) + # Compare this values with the initial values + # and add changes to dictionary + update_changes(changes, prev_data.inputs, this_data.inputs) + update_changes(changes, prev_data.holdings, this_data.holdings) - prev_data = shi.read() - this_data = shi.create_data() - changes = {} + # Print changes + print_watch_header(screen, f"Watch SHI of {client._interface._client._host}:{client._interface._client._port}") + sorted_changes = OrderedDict(sorted(changes.items())) + for key, values in sorted_changes.items(): + screen.write(values) - print("\033[2J") # clear screen +def dump_repeated(client): + prev_data = client.read() + this_data = client.create_data() + changes = {} + screen = UpdateScreen(500) + screen.clear() while True: - # Get new data - shi.read(this_data) + dump_all(screen, client, changes, prev_data, this_data) + screen.update() + if screen.process_keys(100): + break + screen.reset() - # Compare this values with the initial values - # and add changes to dictionary - update_changes(changes, this_data.inputs, prev_data.inputs) - update_changes(changes, this_data.holdings, prev_data.holdings) - - # Print changes - print("\033[H") # Go-to home, line 0 - #print_watch_header(f"Watch SHI of {args.ip}:{args.port}: Press a key and enter to: q = quit; r = reset") - print_watch_header(f"Watch SHI of {args.ip}:{args.port}") - sorted_changes = OrderedDict(sorted(changes.items())) - for key, values in sorted_changes.items(): - print(values + "\033[0K") # clear residual line - print("\n") - - # Read stdin - # input, _, _ = select.select([sys.stdin], [], [], 0.1) - # if input: - # key = sys.stdin.read(1) - # if key == 'q': - # break - # elif key == 'r': - # prev_data = client.read() - # changes = {} - # print("\033[2J") # clear screen - - time.sleep(1) +def watch_shi(): + parser = create_default_args_parser( + "Watch all smart home interface value changes of the Luxtronik controller", + LUXTRONIK_DEFAULT_MODBUS_PORT + ) + args = parser.parse_args() + client = create_modbus_tcp(args.ip, args.port) + dump_repeated(client) if __name__ == "__main__": From 8c227c8aaed925e9c2aba5e5954722cd74a0ae87 Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Wed, 14 Jan 2026 22:22:53 +0100 Subject: [PATCH 02/40] Move fake classes into separate files This allows the fake classes to be used in multiple unit tests. No productive code change! --- tests/fake/__init__.py | 14 +++ tests/fake/fake_common.py | 4 + tests/fake/fake_luxtronik.py | 13 ++ tests/fake/fake_modbus.py | 26 ++++ tests/fake/fake_modbus_client.py | 79 ++++++++++++ tests/fake/fake_shi_interface.py | 57 +++++++++ tests/fake/fake_socket.py | 151 ++++++++++++++++++++++ tests/fake/fake_socket_interface.py | 32 +++++ tests/fake/fake_update_screen.py | 9 ++ tests/shi/test_shi_interface.py | 187 ++++++++++++---------------- tests/shi/test_shi_modbus.py | 86 +------------ tests/test_Luxtronik.py | 76 +---------- tests/test_socket_interaction.py | 177 ++------------------------ 13 files changed, 477 insertions(+), 434 deletions(-) create mode 100644 tests/fake/__init__.py create mode 100644 tests/fake/fake_common.py create mode 100644 tests/fake/fake_luxtronik.py create mode 100644 tests/fake/fake_modbus.py create mode 100644 tests/fake/fake_modbus_client.py create mode 100644 tests/fake/fake_shi_interface.py create mode 100644 tests/fake/fake_socket.py create mode 100644 tests/fake/fake_socket_interface.py create mode 100644 tests/fake/fake_update_screen.py diff --git a/tests/fake/__init__.py b/tests/fake/__init__.py new file mode 100644 index 00000000..0570139f --- /dev/null +++ b/tests/fake/__init__.py @@ -0,0 +1,14 @@ +from tests.fake.fake_common import fake_resolve_version # noqa: F401 +from tests.fake.fake_luxtronik import FakeLuxtronik # noqa: F401 +from tests.fake.fake_modbus_client import FakeModbusClient # noqa: F401 +from tests.fake.fake_modbus import FakeModbus # noqa: F401 +from tests.fake.fake_shi_interface import FakeShiInterface # noqa: F401 +from tests.fake.fake_socket_interface import FakeSocketInterface # noqa: F401 +from tests.fake.fake_socket import ( + fake_parameter_value, # noqa: F401 + fake_calculation_value, # noqa: F401 + fake_visibility_value, # noqa: F401 + FakeSocket, # noqa: F401 + fake_create_connection # noqa: F401 +) +from tests.fake.fake_update_screen import FakeScreen # noqa: F401 diff --git a/tests/fake/fake_common.py b/tests/fake/fake_common.py new file mode 100644 index 00000000..e1770a44 --- /dev/null +++ b/tests/fake/fake_common.py @@ -0,0 +1,4 @@ + + +def fake_resolve_version(modbus_interface): + return (3, 99, 11, 0) \ No newline at end of file diff --git a/tests/fake/fake_luxtronik.py b/tests/fake/fake_luxtronik.py new file mode 100644 index 00000000..8aaf38bc --- /dev/null +++ b/tests/fake/fake_luxtronik.py @@ -0,0 +1,13 @@ +from luxtronik import LuxtronikAllData, Luxtronik + + +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 diff --git a/tests/fake/fake_modbus.py b/tests/fake/fake_modbus.py new file mode 100644 index 00000000..9734a29d --- /dev/null +++ b/tests/fake/fake_modbus.py @@ -0,0 +1,26 @@ +from luxtronik.shi.common import LuxtronikSmartHomeReadTelegram + + +class FakeModbus: + telegram_list = [] + result = True + + def __init__(self, host="", port="", timeout=0): + self._connected = False + self._blocking = False + + def _get_data(self, addr, count): + return [addr - 10000 + i for i in range(count)] + + def read_inputs(self, addr, count): + return self._get_data(addr, count) if self.result else None + + def send(self, telegrams): + if not isinstance(telegrams, list): + telegrams = [telegrams] + FakeModbus.telegram_list = telegrams + + for t in telegrams: + if isinstance(t, LuxtronikSmartHomeReadTelegram): + t.data = self._get_data(t.addr, t.count) + return self.result \ No newline at end of file diff --git a/tests/fake/fake_modbus_client.py b/tests/fake/fake_modbus_client.py new file mode 100644 index 00000000..ba5971f1 --- /dev/null +++ b/tests/fake/fake_modbus_client.py @@ -0,0 +1,79 @@ + +from pyModbusTCP.client import ModbusClient + + +class FakeModbusClient(ModbusClient): + can_connect = True + can_disconnect = True + + def __init__(self, host, port=0, timeout=0, *args, **kwargs): + self._host = host + self._port = port + self._timeout = timeout + self._connected = False + self._error = 'None' + + def open(self): + if self.can_connect: + self._connected = True + self._error = 'None' if self.can_connect else 'Connection error!' + return self.can_connect + + def close(self): + if self.can_disconnect: + self._connected = False + self._error = 'None' if self.can_disconnect else 'Disconnection error!' + return self.can_disconnect + + @property + def is_open(self): + return self._connected + + @property + def last_error_as_txt(self): + return self._error + + def _read(self, addr, count): + if addr == 1000: + # Return None + self._error = 'Read returned "None"!' + return None + elif addr == 1001: + # Return empty data + self._error = 'Read returned to less data!' + return [] + elif addr == 1002: + # Return too much data + self._error = 'Read returned to few data!' + return [0] * 16 + elif addr == 1003: + # Exception + self._error = 'Exception!' + raise + else: + # Return the addr as value(s) + self._error = 'None' + values = [] + for i in range(count): + values += [addr + i] + return values + + def read_holding_registers(self, addr, count): + return self._read(addr, count) + + def read_input_registers(self, addr, count): + return self._read(addr, count) + + def write_multiple_registers(self, addr, data): + if addr == 1000: + # Return false + self._error = 'Write error!' + return False + elif addr == 1001: + # Exception + self._error = 'Exception!' + raise + else: + # Return true + self._error = 'None' + return True \ No newline at end of file diff --git a/tests/fake/fake_shi_interface.py b/tests/fake/fake_shi_interface.py new file mode 100644 index 00000000..d63e7ce6 --- /dev/null +++ b/tests/fake/fake_shi_interface.py @@ -0,0 +1,57 @@ +from luxtronik.shi import ( + LuxtronikSmartHomeInterface, + LuxtronikSmartHomeData, + Inputs, + Holdings, +) + + +class FakeShiInterface(LuxtronikSmartHomeInterface): + + write_counter = 0 + read_counter = 0 + + class dummy: + pass + + @classmethod + def for_script_test(cls): + obj = cls.__new__(cls) + obj._interface = cls.dummy() + obj._interface._client = cls.dummy() + obj._interface._client._host = "host" + obj._interface._client._port = "port" + return obj + + @classmethod + def reset(cls): + FakeShiInterface.write_counter = 0 + FakeShiInterface.read_counter = 0 + + def read(self, data): + if not data: + data = LuxtronikSmartHomeData() + FakeShiInterface.read_inputs(self, data.inputs) + FakeShiInterface.read_holdings(self, data.holdings) + return data + + def read_inputs(self, inputs=None): + if inputs is None: + inputs = Inputs() + inputs[0].raw = 3 + FakeShiInterface.read_counter += 1 + return inputs + + def read_holdings(self, holdings=None): + if not holdings: + holdings = Holdings() + holdings[1].raw = 5 + FakeShiInterface.read_counter += 1 + return holdings + + def write(self, data): + return FakeShiInterface.write_holdings(self, data.holdings) + + def write_holdings(self, holdings): + FakeShiInterface.write_counter += 1 + return True \ No newline at end of file diff --git a/tests/fake/fake_socket.py b/tests/fake/fake_socket.py new file mode 100644 index 00000000..56d926cc --- /dev/null +++ b/tests/fake/fake_socket.py @@ -0,0 +1,151 @@ +import socket +import struct + +from luxtronik import Parameters, Calculations, Visibilities + + +def fake_parameter_value(i): + return (5 * i**2 + 4 * i - 2) % 1001 + + +def fake_calculation_value(i): + return (23 * i**2 + 42 * i - 47) % 1001 + + +def fake_visibility_value(i): + return (90 * i**2 + 19 * i - 1) % 2 + + +class FakeSocket: + last_instance = None + prev_instance = None + + # These code are hard coded here in order to prevent + # accidential changes in constants.py + code_write_parameter = 3002 + code_read_parameters = 3003 + code_read_calculations = 3004 + code_read_visibilities = 3005 + + def __init__(self): + FakeSocket.prev_instance = FakeSocket.last_instance + FakeSocket.last_instance = self + + self._connected = False + self._buffer = b"" + self._blocking = False + + # Offer some more entries + self._num_paras = len(Parameters()._data) + 10 + self._num_calcs = len(Calculations()._data) + 10 + self._num_visis = len(Visibilities()._data) + 10 + + self.written_values = {} + + def setblocking(self, blocking): + self._blocking = blocking + + def connect(self): + assert not self._connected + self._connected = True + + def close(self): + self._connected = False + + def sendall(self, data): + assert self._connected + + cnt = len(data) // 4 + content = struct.unpack(">" + "i" * cnt, data) + + # Next, we compute our response, which is saved in self._buffer. + # The client can read the response with self.recv() + + if content[0] == FakeSocket.code_write_parameter: + # Client wants to write a parameters + assert cnt == 3 + idx = content[1] + value = content[2] + + # Remember the written values, so we can test them later on + self.written_values[idx] = value + + # Respond with code and idx of parameter + self._buffer += struct.pack(">i", FakeSocket.code_write_parameter) + self._buffer += struct.pack(">i", idx) + + elif content[0] == FakeSocket.code_read_parameters: + # Client wants to read parameters + assert cnt == 2 + + # Respond with code... + self._buffer += struct.pack(">i", FakeSocket.code_read_parameters) + + # ... length of the response... + response_cnt = self._num_paras + self._buffer += struct.pack(">i", response_cnt) + + # ... and the payload + for i in range(response_cnt): + self._buffer += struct.pack(">i", fake_parameter_value(i)) + + elif content[0] == FakeSocket.code_read_calculations: + # Client wants to read calculations + assert cnt == 2 + + # Respond with code... + self._buffer += struct.pack(">i", FakeSocket.code_read_calculations) + + # ...for calculations, we need a 'status' response... + self._buffer += struct.pack(">i", 0) + + # ... length of the response... + response_cnt = self._num_calcs + self._buffer += struct.pack(">i", response_cnt) + + # ... and the payload + for i in range(response_cnt): + self._buffer += struct.pack(">i", fake_calculation_value(i)) + + elif content[0] == FakeSocket.code_read_visibilities: + # Client wants to read visibilities + assert cnt == 2 + + # Respond with code... + self._buffer += struct.pack(">i", FakeSocket.code_read_visibilities) + + # ... length of the response... + response_cnt = self._num_visis + self._buffer += struct.pack(">i", response_cnt) + + # ... and the payload + for i in range(response_cnt): + self._buffer += struct.pack(">b", fake_visibility_value(i)) + + def recv(self, cnt, flag=0): + assert self._connected + + if (not self._blocking) and len(self._buffer) < cnt: + raise BlockingIOError("Not enough bytes in buffer.") + + assert len(self._buffer) >= cnt + + data = self._buffer[0:cnt] + + if not (flag & socket.MSG_PEEK): + # Remove data from buffer + self._buffer = self._buffer[cnt:] + + return data + +# --- Context manager support --- + def __enter__(self): + self.connect() + return self + + def __exit__(self, exc_type, exc, tb): + self.close() + return False + +def fake_create_connection(info): + return FakeSocket() \ No newline at end of file diff --git a/tests/fake/fake_socket_interface.py b/tests/fake/fake_socket_interface.py new file mode 100644 index 00000000..38e36932 --- /dev/null +++ b/tests/fake/fake_socket_interface.py @@ -0,0 +1,32 @@ +from luxtronik import LuxtronikSocketInterface + + +class FakeSocketInterface(LuxtronikSocketInterface): + + write_counter = 0 + read_counter = 0 + + @classmethod + def reset(cls): + FakeSocketInterface.write_counter = 0 + FakeSocketInterface.read_counter = 0 + + def read(self, data): + FakeSocketInterface.read_parameters(self, data.parameters) + FakeSocketInterface.read_visibilities(self, data.visibilities) + FakeSocketInterface.read_calculations(self, data.calculations) + + def read_parameters(self, parameters): + parameters.get(0).raw = 2 + FakeSocketInterface.read_counter += 1 + + def read_visibilities(self, visibilities): + visibilities.get(0).raw = 4 + FakeSocketInterface.read_counter += 1 + + def read_calculations(self, calculations): + calculations.get(0).raw = 6 + FakeSocketInterface.read_counter += 1 + + def write(self, data): + FakeSocketInterface.write_counter += 1 \ No newline at end of file diff --git a/tests/fake/fake_update_screen.py b/tests/fake/fake_update_screen.py new file mode 100644 index 00000000..1012c8da --- /dev/null +++ b/tests/fake/fake_update_screen.py @@ -0,0 +1,9 @@ + + +class FakeScreen: + + def write(self, text): + print(text) + + def get_visible_size(self): + return 120, 40 \ No newline at end of file diff --git a/tests/shi/test_shi_interface.py b/tests/shi/test_shi_interface.py index f474bb41..11c47ace 100644 --- a/tests/shi/test_shi_interface.py +++ b/tests/shi/test_shi_interface.py @@ -10,7 +10,6 @@ LUXTRONIK_VALUE_FUNCTION_NOT_AVAILABLE, ) from luxtronik.shi.common import ( - LuxtronikSmartHomeReadTelegram, LuxtronikSmartHomeReadHoldingsTelegram, LuxtronikSmartHomeReadInputsTelegram, LuxtronikSmartHomeWriteHoldingsTelegram, @@ -27,38 +26,8 @@ LuxtronikSmartHomeInterface, create_modbus_tcp, ) +from tests.fake import FakeModbus -############################################################################### -# Fake modbus client -############################################################################### - -class FakeInterface: - telegram_list = [] - result = True - - def __init__(self, host="", port="", timeout=0): - pass - - def _get_data(self, addr, count): - return [addr - 10000 + i for i in range(count)] - - def read_inputs(self, addr, count): - return self._get_data(addr, count) if self.result else None - - def send(self, telegrams): - if not isinstance(telegrams, list): - telegrams = [telegrams] - FakeInterface.telegram_list = telegrams - - for t in telegrams: - if isinstance(t, LuxtronikSmartHomeReadTelegram): - t.data = self._get_data(t.addr, t.count) - return self.result - - -############################################################################### -# Tests -############################################################################### class TestLuxtronikSmartHomeData: @@ -85,15 +54,15 @@ def test_empty(self): assert data.inputs.version == (1, 2, 0, 0) -@patch("luxtronik.shi.LuxtronikModbusTcpInterface", FakeInterface) +@patch("luxtronik.shi.LuxtronikModbusTcpInterface", FakeModbus) class TestLuxtronikSmartHomeInterface: @classmethod def setup_class(cls): - cls.interface = LuxtronikSmartHomeInterface(FakeInterface(), LUXTRONIK_FIRST_VERSION_WITH_SHI) + cls.interface = LuxtronikSmartHomeInterface(FakeModbus(), LUXTRONIK_FIRST_VERSION_WITH_SHI) def test_init(self): - assert isinstance(self.interface._interface, FakeInterface) + assert isinstance(self.interface._interface, FakeModbus) assert self.interface._blocks_list == [] assert self.interface.version == LUXTRONIK_FIRST_VERSION_WITH_SHI assert len(self.interface._filtered_holdings) > 0 @@ -499,13 +468,13 @@ def test_collect_field(self): valid = self.interface._send_and_integrate(blocks_list) assert valid - assert len(FakeInterface.telegram_list) == 2 - assert type(FakeInterface.telegram_list[0]) is LuxtronikSmartHomeReadHoldingsTelegram - assert FakeInterface.telegram_list[0].addr == 10000 + 2 - assert FakeInterface.telegram_list[0].count == 1 - assert type(FakeInterface.telegram_list[1]) is LuxtronikSmartHomeWriteHoldingsTelegram - assert FakeInterface.telegram_list[1].addr == 10000 + 1 - assert FakeInterface.telegram_list[1].count == 1 + assert len(FakeModbus.telegram_list) == 2 + assert type(FakeModbus.telegram_list[0]) is LuxtronikSmartHomeReadHoldingsTelegram + assert FakeModbus.telegram_list[0].addr == 10000 + 2 + assert FakeModbus.telegram_list[0].count == 1 + assert type(FakeModbus.telegram_list[1]) is LuxtronikSmartHomeWriteHoldingsTelegram + assert FakeModbus.telegram_list[1].addr == 10000 + 1 + assert FakeModbus.telegram_list[1].count == 1 def test_collect_fields(self): blocks_list = [] @@ -567,22 +536,22 @@ def test_collect_fields(self): assert blocks_list[1][1][1].field.value == 40 self.interface._send_and_integrate(blocks_list) - assert len(FakeInterface.telegram_list) == 5 - assert type(FakeInterface.telegram_list[0]) is LuxtronikSmartHomeReadHoldingsTelegram - assert FakeInterface.telegram_list[0].addr == 10000 + 0 - assert FakeInterface.telegram_list[0].count == 1 - assert type(FakeInterface.telegram_list[1]) is LuxtronikSmartHomeReadHoldingsTelegram - assert FakeInterface.telegram_list[1].addr == 10000 + 2 - assert FakeInterface.telegram_list[1].count == 1 - assert type(FakeInterface.telegram_list[2]) is LuxtronikSmartHomeReadHoldingsTelegram - assert FakeInterface.telegram_list[2].addr == 10000 + 5 - assert FakeInterface.telegram_list[2].count == 3 - assert type(FakeInterface.telegram_list[3]) is LuxtronikSmartHomeWriteHoldingsTelegram - assert FakeInterface.telegram_list[3].addr == 10000 + 0 - assert FakeInterface.telegram_list[3].count == 1 - assert type(FakeInterface.telegram_list[4]) is LuxtronikSmartHomeWriteHoldingsTelegram - assert FakeInterface.telegram_list[4].addr == 10000 + 5 - assert FakeInterface.telegram_list[4].count == 2 + assert len(FakeModbus.telegram_list) == 5 + assert type(FakeModbus.telegram_list[0]) is LuxtronikSmartHomeReadHoldingsTelegram + assert FakeModbus.telegram_list[0].addr == 10000 + 0 + assert FakeModbus.telegram_list[0].count == 1 + assert type(FakeModbus.telegram_list[1]) is LuxtronikSmartHomeReadHoldingsTelegram + assert FakeModbus.telegram_list[1].addr == 10000 + 2 + assert FakeModbus.telegram_list[1].count == 1 + assert type(FakeModbus.telegram_list[2]) is LuxtronikSmartHomeReadHoldingsTelegram + assert FakeModbus.telegram_list[2].addr == 10000 + 5 + assert FakeModbus.telegram_list[2].count == 3 + assert type(FakeModbus.telegram_list[3]) is LuxtronikSmartHomeWriteHoldingsTelegram + assert FakeModbus.telegram_list[3].addr == 10000 + 0 + assert FakeModbus.telegram_list[3].count == 1 + assert type(FakeModbus.telegram_list[4]) is LuxtronikSmartHomeWriteHoldingsTelegram + assert FakeModbus.telegram_list[4].addr == 10000 + 5 + assert FakeModbus.telegram_list[4].count == 2 def test_collect_field2(self): @@ -800,7 +769,7 @@ def test_create_holding(self): assert field is None def test_read_holding(self): - FakeInterface.result = False + FakeModbus.result = False # read field with error field = self.interface.read_holding(2) @@ -818,7 +787,7 @@ def test_read_holding(self): assert not vector.safe assert vector[2] is None - FakeInterface.result = True + FakeModbus.result = True # read field field = self.interface.read_holding(2) @@ -843,7 +812,7 @@ def test_write_holding(self): field_2 = vector.add(2) assert len(vector) == 1 - FakeInterface.result = False + FakeModbus.result = False # write field with error field = self.interface.write_holding(2, 19) @@ -867,7 +836,7 @@ def test_write_holding(self): success = self.interface.write_and_read_holdings(4) assert not success - FakeInterface.result = True + FakeModbus.result = True # write field field = self.interface.write_holding(2, 19) @@ -938,7 +907,7 @@ def test_create_input(self): assert field is None def test_read_input(self): - FakeInterface.result = False + FakeModbus.result = False # read field with error field = self.interface.read_input(105) @@ -956,7 +925,7 @@ def test_read_input(self): assert vector.safe assert vector[105] is None - FakeInterface.result = True + FakeModbus.result = True # read field field = self.interface.read_input(105) @@ -1000,7 +969,7 @@ def test_create_data(self): assert field is None def test_read_data(self): - FakeInterface.result = False + FakeModbus.result = False # read data with error data = self.interface.read_data() @@ -1019,7 +988,7 @@ def test_read_data(self): assert not data.holdings.safe assert data.holdings[2] is None - FakeInterface.result = True + FakeModbus.result = True # read data data = self.interface.read_data() @@ -1043,7 +1012,7 @@ def test_write_data(self): field_2 = data.holdings.add(2) assert len(data.holdings) == 1 - FakeInterface.result = False + FakeModbus.result = False # write data with error field_2.value = 20 @@ -1071,7 +1040,7 @@ def test_write_data(self): success = self.interface.write_and_read(None) assert not success - FakeInterface.result = True + FakeModbus.result = True # write vector field_2.value = 20 @@ -1106,7 +1075,7 @@ def test_write_data(self): assert not success def test_raw(self): - FakeInterface.result = False + FakeModbus.result = False data = self.interface.read_holding_raw(1, 3) assert data is None @@ -1117,7 +1086,7 @@ def test_raw(self): data = self.interface.read_input_raw(2, 5) assert data is None - FakeInterface.result = True + FakeModbus.result = True data = self.interface.read_holding_raw(1, 3) assert data == [1, 2, 3] @@ -1139,10 +1108,10 @@ def test_read_then_write(self): assert field.value == 32 self.interface.read_input(0) - assert len(FakeInterface.telegram_list) == 3 - assert FakeInterface.telegram_list[0].data == [2] - assert FakeInterface.telegram_list[1].data == [32 * 10] - assert FakeInterface.telegram_list[2].data == [0] + assert len(FakeModbus.telegram_list) == 3 + assert FakeModbus.telegram_list[0].data == [2] + assert FakeModbus.telegram_list[1].data == [32 * 10] + assert FakeModbus.telegram_list[2].data == [0] assert field.raw == 2 @@ -1158,17 +1127,17 @@ def test_write_then_read(self): field.value = 42 self.interface.read_input(0) - assert len(FakeInterface.telegram_list) == 3 - assert FakeInterface.telegram_list[0].data == [42 * 10] - assert FakeInterface.telegram_list[1].data == [2] - assert FakeInterface.telegram_list[2].data == [0] + assert len(FakeModbus.telegram_list) == 3 + assert FakeModbus.telegram_list[0].data == [42 * 10] + assert FakeModbus.telegram_list[1].data == [2] + assert FakeModbus.telegram_list[2].data == [0] assert field.raw == 2 def test_trial_and_error_mode(self): # prepare - interface = LuxtronikSmartHomeInterface(FakeInterface(), None) + interface = LuxtronikSmartHomeInterface(FakeModbus(), None) holdings = Holdings.empty(None) h0 = holdings.add(0) # 3.90.1 @@ -1237,34 +1206,34 @@ def test_trial_and_error_mode(self): interface.send() offset = interface.holdings.offset - assert len(FakeInterface.telegram_list) == 8 - assert type(FakeInterface.telegram_list[0]) is LuxtronikSmartHomeReadHoldingsTelegram - assert FakeInterface.telegram_list[0].addr == offset + 0 - assert FakeInterface.telegram_list[0].count == 1 - assert type(FakeInterface.telegram_list[1]) is LuxtronikSmartHomeReadHoldingsTelegram - assert FakeInterface.telegram_list[1].addr == offset + 1 - assert FakeInterface.telegram_list[1].count == 1 - assert type(FakeInterface.telegram_list[2]) is LuxtronikSmartHomeReadHoldingsTelegram - assert FakeInterface.telegram_list[2].addr == offset + 2 - assert FakeInterface.telegram_list[2].count == 1 - assert type(FakeInterface.telegram_list[3]) is LuxtronikSmartHomeReadHoldingsTelegram - assert FakeInterface.telegram_list[3].addr == offset + 3 - assert FakeInterface.telegram_list[3].count == 1 - assert type(FakeInterface.telegram_list[4]) is LuxtronikSmartHomeWriteHoldingsTelegram - assert FakeInterface.telegram_list[4].addr == offset + 1 - assert FakeInterface.telegram_list[4].count == 1 - assert FakeInterface.telegram_list[4].data == [10] - assert type(FakeInterface.telegram_list[5]) is LuxtronikSmartHomeWriteHoldingsTelegram - assert FakeInterface.telegram_list[5].addr == offset + 3 - assert FakeInterface.telegram_list[5].count == 1 - assert FakeInterface.telegram_list[5].data == [1] - assert type(FakeInterface.telegram_list[6]) is LuxtronikSmartHomeReadHoldingsTelegram - assert FakeInterface.telegram_list[6].addr == offset + 4 - assert FakeInterface.telegram_list[6].count == 1 - assert type(FakeInterface.telegram_list[7]) is LuxtronikSmartHomeWriteHoldingsTelegram - assert FakeInterface.telegram_list[7].addr == offset + 4 - assert FakeInterface.telegram_list[7].count == 1 - assert FakeInterface.telegram_list[7].data == [16] + assert len(FakeModbus.telegram_list) == 8 + assert type(FakeModbus.telegram_list[0]) is LuxtronikSmartHomeReadHoldingsTelegram + assert FakeModbus.telegram_list[0].addr == offset + 0 + assert FakeModbus.telegram_list[0].count == 1 + assert type(FakeModbus.telegram_list[1]) is LuxtronikSmartHomeReadHoldingsTelegram + assert FakeModbus.telegram_list[1].addr == offset + 1 + assert FakeModbus.telegram_list[1].count == 1 + assert type(FakeModbus.telegram_list[2]) is LuxtronikSmartHomeReadHoldingsTelegram + assert FakeModbus.telegram_list[2].addr == offset + 2 + assert FakeModbus.telegram_list[2].count == 1 + assert type(FakeModbus.telegram_list[3]) is LuxtronikSmartHomeReadHoldingsTelegram + assert FakeModbus.telegram_list[3].addr == offset + 3 + assert FakeModbus.telegram_list[3].count == 1 + assert type(FakeModbus.telegram_list[4]) is LuxtronikSmartHomeWriteHoldingsTelegram + assert FakeModbus.telegram_list[4].addr == offset + 1 + assert FakeModbus.telegram_list[4].count == 1 + assert FakeModbus.telegram_list[4].data == [10] + assert type(FakeModbus.telegram_list[5]) is LuxtronikSmartHomeWriteHoldingsTelegram + assert FakeModbus.telegram_list[5].addr == offset + 3 + assert FakeModbus.telegram_list[5].count == 1 + assert FakeModbus.telegram_list[5].data == [1] + assert type(FakeModbus.telegram_list[6]) is LuxtronikSmartHomeReadHoldingsTelegram + assert FakeModbus.telegram_list[6].addr == offset + 4 + assert FakeModbus.telegram_list[6].count == 1 + assert type(FakeModbus.telegram_list[7]) is LuxtronikSmartHomeWriteHoldingsTelegram + assert FakeModbus.telegram_list[7].addr == offset + 4 + assert FakeModbus.telegram_list[7].count == 1 + assert FakeModbus.telegram_list[7].data == [16] def check_definitions(self, interface): @@ -1315,10 +1284,10 @@ def test_create_modbus(self): assert interface.version == (400, 401, 402, 0) self.check_definitions(interface) - FakeInterface.result = False + FakeModbus.result = False interface = create_modbus_tcp('host') assert interface.version is None self.check_definitions(interface) - FakeInterface.result = True + FakeModbus.result = True diff --git a/tests/shi/test_shi_modbus.py b/tests/shi/test_shi_modbus.py index 445e22af..ba432418 100644 --- a/tests/shi/test_shi_modbus.py +++ b/tests/shi/test_shi_modbus.py @@ -1,8 +1,6 @@ import pytest from unittest.mock import patch -from pyModbusTCP.client import ModbusClient - from luxtronik.shi.common import ( LuxtronikSmartHomeReadTelegram, LuxtronikSmartHomeReadHoldingsTelegram, @@ -12,90 +10,8 @@ LuxtronikSmartHomeTelegrams, ) from luxtronik.shi.modbus import LuxtronikModbusTcpInterface +from tests.fake import FakeModbusClient -############################################################################### -# Fake modbus client -############################################################################### - -class FakeModbusClient(ModbusClient): - can_connect = True - can_disconnect = True - - def __init__(self, host, port=0, timeout=0, *args, **kwargs): - self._host = host - self._port = port - self._timeout = timeout - self._connected = False - self._error = 'None' - - def open(self): - if self.can_connect: - self._connected = True - self._error = 'None' if self.can_connect else 'Connection error!' - return self.can_connect - - def close(self): - if self.can_disconnect: - self._connected = False - self._error = 'None' if self.can_disconnect else 'Disconnection error!' - return self.can_disconnect - - @property - def is_open(self): - return self._connected - - @property - def last_error_as_txt(self): - return self._error - - def _read(self, addr, count): - if addr == 1000: - # Return None - self._error = 'Read returned "None"!' - return None - elif addr == 1001: - # Return empty data - self._error = 'Read returned to less data!' - return [] - elif addr == 1002: - # Return too much data - self._error = 'Read returned to few data!' - return [0] * 16 - elif addr == 1003: - # Exception - self._error = 'Exception!' - raise - else: - # Return the addr as value(s) - self._error = 'None' - values = [] - for i in range(count): - values += [addr + i] - return values - - def read_holding_registers(self, addr, count): - return self._read(addr, count) - - def read_input_registers(self, addr, count): - return self._read(addr, count) - - def write_multiple_registers(self, addr, data): - if addr == 1000: - # Return false - self._error = 'Write error!' - return False - elif addr == 1001: - # Exception - self._error = 'Exception!' - raise - else: - # Return true - self._error = 'None' - return True - -############################################################################### -# Tests -############################################################################### class DummyTelegram(LuxtronikSmartHomeReadTelegram): pass diff --git a/tests/test_Luxtronik.py b/tests/test_Luxtronik.py index 2792a0d5..1a808209 100644 --- a/tests/test_Luxtronik.py +++ b/tests/test_Luxtronik.py @@ -1,86 +1,20 @@ from unittest.mock import patch -from luxtronik.shi import LuxtronikSmartHomeInterface from luxtronik.shi.interface import LuxtronikSmartHomeData from luxtronik import ( LuxtronikData, Parameters, Holdings, - LuxtronikSocketInterface, LuxtronikAllData, LuxtronikInterface, Luxtronik ) +from tests.fake import ( + FakeSocketInterface, + FakeShiInterface, + fake_resolve_version +) -############################################################################### -# Fake interfaces -############################################################################### - -class FakeSocketInterface(LuxtronikSocketInterface): - - write_counter = 0 - read_counter = 0 - - @classmethod - def reset(cls): - FakeSocketInterface.write_counter = 0 - FakeSocketInterface.read_counter = 0 - - def read(self, data): - FakeSocketInterface.read_parameters(self, data.parameters) - FakeSocketInterface.read_visibilities(self, data.visibilities) - FakeSocketInterface.read_calculations(self, data.calculations) - - def read_parameters(self, parameters): - parameters.get(0).raw = 2 - FakeSocketInterface.read_counter += 1 - - def read_visibilities(self, visibilities): - visibilities.get(0).raw = 4 - FakeSocketInterface.read_counter += 1 - - def read_calculations(self, calculations): - calculations.get(0).raw = 6 - FakeSocketInterface.read_counter += 1 - - def write(self, data): - FakeSocketInterface.write_counter += 1 - -class FakeShiInterface(LuxtronikSmartHomeInterface): - - write_counter = 0 - read_counter = 0 - - @classmethod - def reset(cls): - FakeShiInterface.write_counter = 0 - FakeShiInterface.read_counter = 0 - - def read(self, data): - FakeShiInterface.read_inputs(self, data.inputs) - FakeShiInterface.read_holdings(self, data.holdings) - - def read_inputs(self, inputs): - inputs[0].raw = 3 - FakeShiInterface.read_counter += 1 - - def read_holdings(self, holdings): - holdings[1].raw = 5 - FakeShiInterface.read_counter += 1 - - def write(self, data): - return FakeShiInterface.write_holdings(self, data.holdings) - - def write_holdings(self, holdings): - FakeShiInterface.write_counter += 1 - return True - -def fake_resolve_version(modbus_interface): - return (3, 99, 11, 0) - -############################################################################### -# Tests -############################################################################### @patch("luxtronik.LuxtronikSocketInterface", FakeSocketInterface) @patch("luxtronik.LuxtronikSocketInterface.read_parameters", FakeSocketInterface.read_parameters) diff --git a/tests/test_socket_interaction.py b/tests/test_socket_interaction.py index 94485642..125cc5ce 100644 --- a/tests/test_socket_interaction.py +++ b/tests/test_socket_interaction.py @@ -2,176 +2,15 @@ import unittest.mock as mock -import socket -import struct - from luxtronik import Luxtronik, LuxtronikSocketInterface, Parameters, Calculations, Visibilities - - -def fake_parameter_value(i): - return (5 * i**2 + 4 * i - 2) % 1001 - - -def fake_calculation_value(i): - return (23 * i**2 + 42 * i - 47) % 1001 - - -def fake_visibility_value(i): - return (90 * i**2 + 19 * i - 1) % 2 - - -class FakeSocket: - last_instance = None - prev_instance = None - - # These code are hard coded here in order to prevent - # accidential changes in constants.py - code_write_parameter = 3002 - code_read_parameters = 3003 - code_read_calculations = 3004 - code_read_visibilities = 3005 - - def __init__(self): - FakeSocket.prev_instance = FakeSocket.last_instance - FakeSocket.last_instance = self - - self._connected = False - self._buffer = b"" - self._blocking = False - - # Offer some more entries - self._num_paras = len(Parameters()._data) + 10 - self._num_calcs = len(Calculations()._data) + 10 - self._num_visis = len(Visibilities()._data) + 10 - - self.written_values = {} - - def setblocking(self, blocking): - self._blocking = blocking - - def connect(self): - assert not self._connected - self._connected = True - - def close(self): - self._connected = False - - def sendall(self, data): - assert self._connected - - cnt = len(data) // 4 - content = struct.unpack(">" + "i" * cnt, data) - - # Next, we compute our response, which is saved in self._buffer. - # The client can read the response with self.recv() - - if content[0] == FakeSocket.code_write_parameter: - # Client wants to write a parameters - assert cnt == 3 - idx = content[1] - value = content[2] - - # Remember the written values, so we can test them later on - self.written_values[idx] = value - - # Respond with code and idx of parameter - self._buffer += struct.pack(">i", FakeSocket.code_write_parameter) - self._buffer += struct.pack(">i", idx) - - elif content[0] == FakeSocket.code_read_parameters: - # Client wants to read parameters - assert cnt == 2 - - # Respond with code... - self._buffer += struct.pack(">i", FakeSocket.code_read_parameters) - - # ... length of the response... - response_cnt = self._num_paras - self._buffer += struct.pack(">i", response_cnt) - - # ... and the payload - for i in range(response_cnt): - self._buffer += struct.pack(">i", fake_parameter_value(i)) - - elif content[0] == FakeSocket.code_read_calculations: - # Client wants to read calculations - assert cnt == 2 - - # Respond with code... - self._buffer += struct.pack(">i", FakeSocket.code_read_calculations) - - # ...for calculations, we need a 'status' response... - self._buffer += struct.pack(">i", 0) - - # ... length of the response... - response_cnt = self._num_calcs - self._buffer += struct.pack(">i", response_cnt) - - # ... and the payload - for i in range(response_cnt): - self._buffer += struct.pack(">i", fake_calculation_value(i)) - - elif content[0] == FakeSocket.code_read_visibilities: - # Client wants to read visibilities - assert cnt == 2 - - # Respond with code... - self._buffer += struct.pack(">i", FakeSocket.code_read_visibilities) - - # ... length of the response... - response_cnt = self._num_visis - self._buffer += struct.pack(">i", response_cnt) - - # ... and the payload - for i in range(response_cnt): - self._buffer += struct.pack(">b", fake_visibility_value(i)) - - def recv(self, cnt, flag=0): - assert self._connected - - if (not self._blocking) and len(self._buffer) < cnt: - raise BlockingIOError("Not enough bytes in buffer.") - - assert len(self._buffer) >= cnt - - data = self._buffer[0:cnt] - - if not (flag & socket.MSG_PEEK): - # Remove data from buffer - self._buffer = self._buffer[cnt:] - - return data - -# --- Context manager support --- - def __enter__(self): - self.connect() - return self - - def __exit__(self, exc_type, exc, tb): - self.close() - return False - -def fake_create_connection(info): - return FakeSocket() - - -class FakeModbus: - - def __init__( - self, - host, - port=0, - timeout=0 - ): - self._connected = False - self._blocking = False - - def read_inputs(self, addr, count): - return [addr + i for i in range(count)] - - def send(self, data): - return True - +from tests.fake import ( + fake_create_connection, + fake_parameter_value, + fake_calculation_value, + fake_visibility_value, + FakeSocket, + FakeModbus, +) @mock.patch("socket.create_connection", fake_create_connection) From 3f11e67e2adef4dc61bdbbd53c288896b9b08fdb Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Thu, 15 Jan 2026 21:31:36 +0100 Subject: [PATCH 03/40] Add unit tests for the scripts --- tests/scripts/test_dump_changes.py | 16 ++++++++++++++++ tests/scripts/test_dump_luxtronik.py | 11 +++++++++++ tests/scripts/test_dump_shi.py | 11 +++++++++++ tests/scripts/test_watch_shi.py | 16 ++++++++++++++++ 4 files changed, 54 insertions(+) create mode 100644 tests/scripts/test_dump_changes.py create mode 100644 tests/scripts/test_dump_luxtronik.py create mode 100644 tests/scripts/test_dump_shi.py create mode 100644 tests/scripts/test_watch_shi.py diff --git a/tests/scripts/test_dump_changes.py b/tests/scripts/test_dump_changes.py new file mode 100644 index 00000000..be9fe34c --- /dev/null +++ b/tests/scripts/test_dump_changes.py @@ -0,0 +1,16 @@ +from luxtronik.scripts.dump_changes import dump_all +from luxtronik import LuxtronikData +from tests.fake import FakeSocketInterface, FakeScreen + + +class TestDumpChanges: + + def test_dump_all(self): + client = FakeSocketInterface("host", 0) + changes = {} + prev_data = LuxtronikData() + this_data = LuxtronikData() + screen = FakeScreen() + + # It is sufficient if no exception occurs. + dump_all(screen, client, changes, prev_data, this_data) diff --git a/tests/scripts/test_dump_luxtronik.py b/tests/scripts/test_dump_luxtronik.py new file mode 100644 index 00000000..d6cf98b3 --- /dev/null +++ b/tests/scripts/test_dump_luxtronik.py @@ -0,0 +1,11 @@ +from luxtronik.scripts.dump_luxtronik import dump_all +from tests.fake import FakeLuxtronik + + +class TestDumpLuxtronik: + + def test_dump_all(self): + client = FakeLuxtronik() + + # It is sufficient if no exception occurs. + dump_all(client) diff --git a/tests/scripts/test_dump_shi.py b/tests/scripts/test_dump_shi.py new file mode 100644 index 00000000..ad3824e4 --- /dev/null +++ b/tests/scripts/test_dump_shi.py @@ -0,0 +1,11 @@ +from luxtronik.scripts.dump_shi import dump_all +from tests.fake import FakeShiInterface + + +class TestDumpShi: + + def test_dump_all(self): + client = FakeShiInterface.for_script_test() + + # It is sufficient if no exception occurs. + dump_all(client) diff --git a/tests/scripts/test_watch_shi.py b/tests/scripts/test_watch_shi.py new file mode 100644 index 00000000..0b3e9b01 --- /dev/null +++ b/tests/scripts/test_watch_shi.py @@ -0,0 +1,16 @@ +from luxtronik.scripts.watch_shi import dump_all +from luxtronik.shi import LuxtronikSmartHomeData +from tests.fake import FakeShiInterface, FakeScreen + + +class TestWatchShi: + + def test_dump_all(self): + client = FakeShiInterface.for_script_test() + changes = {} + prev_data = LuxtronikSmartHomeData() + this_data = LuxtronikSmartHomeData() + screen = FakeScreen() + + # It is sufficient if no exception occurs. + dump_all(screen, client, changes, prev_data, this_data) From 07705c637149d8df60b5e6b574b569dd441bd46f Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Sun, 18 Jan 2026 20:00:29 +0100 Subject: [PATCH 04/40] Rename cfi scripts to dump_cfi / watch_cfi --- README.md | 4 ++-- luxtronik/__main__.py | 4 ++-- luxtronik/scripts/{dump_luxtronik.py => dump_cfi.py} | 0 luxtronik/scripts/{dump_changes.py => watch_cfi.py} | 0 tests/scripts/{test_dump_luxtronik.py => test_dump_cfi.py} | 4 ++-- tests/scripts/{test_dump_changes.py => test_watch_cfi.py} | 4 ++-- 6 files changed, 8 insertions(+), 8 deletions(-) rename luxtronik/scripts/{dump_luxtronik.py => dump_cfi.py} (100%) rename luxtronik/scripts/{dump_changes.py => watch_cfi.py} (100%) rename tests/scripts/{test_dump_luxtronik.py => test_dump_cfi.py} (69%) rename tests/scripts/{test_dump_changes.py => test_watch_cfi.py} (84%) diff --git a/README.md b/README.md index 2f64b539..f40a9c36 100755 --- a/README.md +++ b/README.md @@ -146,7 +146,7 @@ luxtronik dump-shi 192.168.178.123 502 or call the script that comes with the python package: ```python -PYTHONPATH=. ./luxtronik/scripts/dump_luxtronik.py 192.168.178.123 8889 +PYTHONPATH=. ./luxtronik/scripts/dump_cfi.py 192.168.178.123 8889 # or from the base folder of luxtronik python -m luxtronik dump-shi 192.168.178.123 502 @@ -205,7 +205,7 @@ luxtronik watch-shi 192.168.178.123 Alternatively, it can be invoked directly: ```python -PYTHONPATH=. ./luxtronik/scripts/dump_changes.py 192.168.178.123 8889 +PYTHONPATH=. ./luxtronik/scripts/watch_cfi.py 192.168.178.123 8889 # or PYTHONPATH=. ./luxtronik/scripts/watch_shi.py 192.168.178.123 diff --git a/luxtronik/__main__.py b/luxtronik/__main__.py index b66a1d1b..51746286 100755 --- a/luxtronik/__main__.py +++ b/luxtronik/__main__.py @@ -3,13 +3,13 @@ import argparse import sys from luxtronik.discover import discover as _discover -from luxtronik.scripts.dump_luxtronik import ( +from luxtronik.scripts.dump_cfi import ( dump_cfi, ) # pylint: disable=unused-import # noqa: F401 from luxtronik.scripts.dump_shi import ( dump_shi, ) # pylint: disable=unused-import # noqa: F401 -from luxtronik.scripts.dump_changes import ( +from luxtronik.scripts.watch_cfi import ( watch_cfi, ) # pylint: disable=unused-import # noqa: F401 from luxtronik.scripts.watch_shi import ( diff --git a/luxtronik/scripts/dump_luxtronik.py b/luxtronik/scripts/dump_cfi.py similarity index 100% rename from luxtronik/scripts/dump_luxtronik.py rename to luxtronik/scripts/dump_cfi.py diff --git a/luxtronik/scripts/dump_changes.py b/luxtronik/scripts/watch_cfi.py similarity index 100% rename from luxtronik/scripts/dump_changes.py rename to luxtronik/scripts/watch_cfi.py diff --git a/tests/scripts/test_dump_luxtronik.py b/tests/scripts/test_dump_cfi.py similarity index 69% rename from tests/scripts/test_dump_luxtronik.py rename to tests/scripts/test_dump_cfi.py index d6cf98b3..fa92d9be 100644 --- a/tests/scripts/test_dump_luxtronik.py +++ b/tests/scripts/test_dump_cfi.py @@ -1,8 +1,8 @@ -from luxtronik.scripts.dump_luxtronik import dump_all +from luxtronik.scripts.dump_cfi import dump_all from tests.fake import FakeLuxtronik -class TestDumpLuxtronik: +class TestDumpCfi: def test_dump_all(self): client = FakeLuxtronik() diff --git a/tests/scripts/test_dump_changes.py b/tests/scripts/test_watch_cfi.py similarity index 84% rename from tests/scripts/test_dump_changes.py rename to tests/scripts/test_watch_cfi.py index be9fe34c..1798fa52 100644 --- a/tests/scripts/test_dump_changes.py +++ b/tests/scripts/test_watch_cfi.py @@ -1,9 +1,9 @@ -from luxtronik.scripts.dump_changes import dump_all +from luxtronik.scripts.watch_cfi import dump_all from luxtronik import LuxtronikData from tests.fake import FakeSocketInterface, FakeScreen -class TestDumpChanges: +class TestWatchCfi: def test_dump_all(self): client = FakeSocketInterface("host", 0) From ae7c4755c7daefa83a67ec4688c6d1e6432d6d52 Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Tue, 20 Jan 2026 20:22:23 +0100 Subject: [PATCH 05/40] wip --- README.md | 4 +- luxtronik/cfi/calculations.py | 9 +- luxtronik/cfi/constants.py | 5 +- luxtronik/cfi/interface.py | 36 +-- luxtronik/cfi/parameters.py | 27 +- luxtronik/cfi/visibilities.py | 4 +- luxtronik/constants.py | 4 + luxtronik/data_vector.py | 473 +++++++++++++++++++++++++----- luxtronik/definitions/__init__.py | 35 ++- luxtronik/shi/__init__.py | 4 +- luxtronik/shi/constants.py | 4 - luxtronik/shi/contiguous.py | 46 +-- luxtronik/shi/definitions.py | 142 --------- luxtronik/shi/interface.py | 10 +- luxtronik/shi/vector.py | 230 +-------------- tests/cfi/test_cfi_parameters.py | 23 +- tests/shi/test_shi_contiguous.py | 2 +- tests/shi/test_shi_definitions.py | 5 +- tests/shi/test_shi_interface.py | 8 +- tests/test_compatibility.py | 6 +- tests/test_definition_list.py | 12 +- tests/test_definitions.py | 6 +- tests/test_socket_interaction.py | 32 +- 23 files changed, 530 insertions(+), 597 deletions(-) delete mode 100644 luxtronik/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 e552aa2b..5ed51331 100644 --- a/luxtronik/cfi/calculations.py +++ b/luxtronik/cfi/calculations.py @@ -7,7 +7,7 @@ from luxtronik.definitions.calculations import CALCULATIONS_DEFINITIONS_LIST, CALCULATIONS_OFFSET 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 @@ -19,7 +19,7 @@ CALCULATIONS_OFFSET ) -class Calculations(DataVector): +class Calculations(DataVectorConfig): """Class that holds all calculations.""" logger = LOGGER @@ -30,11 +30,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/constants.py b/luxtronik/cfi/constants.py index 5e0301b6..ade20989 100644 --- a/luxtronik/cfi/constants.py +++ b/luxtronik/cfi/constants.py @@ -26,4 +26,7 @@ # Wait time (in seconds) after writing parameters to give controller # some time to re-calculate values, etc. -WAIT_TIME_AFTER_PARAMETER_WRITE = 1 \ No newline at end of file +WAIT_TIME_AFTER_PARAMETER_WRITE = 1 + +# The data from the config interface are transmitted in 32-bit chunks. +LUXTRONIK_CFI_REGISTER_BIT_SIZE: Final = 32 \ No newline at end of file diff --git a/luxtronik/cfi/interface.py b/luxtronik/cfi/interface.py index 1c7fd9be..aecf6ad4 100644 --- a/luxtronik/cfi/interface.py +++ b/luxtronik/cfi/interface.py @@ -161,23 +161,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 1ffa9be3..7cc6b82a 100644 --- a/luxtronik/cfi/parameters.py +++ b/luxtronik/cfi/parameters.py @@ -7,7 +7,7 @@ from luxtronik.definitions.parameters import PARAMETERS_DEFINITIONS_LIST, PARAMETERS_OFFSET from luxtronik.cfi.constants import PARAMETERS_FIELD_NAME -from luxtronik.data_vector import DataVector +from luxtronik.cfi.vector import DataVectorConfig LOGGER = logging.getLogger(__name__) @@ -18,36 +18,13 @@ PARAMETERS_OFFSET ) -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: - self.logger.error("Value '%s' for Parameter '%s' not valid!", value, parameter.name) - else: - self.logger.warning("Parameter '%s' not safe for writing!", parameter.name) - else: - self.logger.warning("Parameter '%s' not found", target) diff --git a/luxtronik/cfi/visibilities.py b/luxtronik/cfi/visibilities.py index a582250c..d6e5ec36 100644 --- a/luxtronik/cfi/visibilities.py +++ b/luxtronik/cfi/visibilities.py @@ -7,7 +7,7 @@ from luxtronik.definitions.visibilities import VISIBILITIES_DEFINITIONS_LIST, VISIBILITIES_OFFSET from luxtronik.cfi.constants import VISIBILITIES_FIELD_NAME -from luxtronik.data_vector import DataVector +from luxtronik.cfi.vector import DataVectorConfig LOGGER = logging.getLogger(__name__) @@ -18,7 +18,7 @@ VISIBILITIES_OFFSET ) -class Visibilities(DataVector): +class Visibilities(DataVectorConfig): """Class that holds all visibilities.""" logger = LOGGER diff --git a/luxtronik/constants.py b/luxtronik/constants.py index 7434ea7d..c2ac4283 100644 --- a/luxtronik/constants.py +++ b/luxtronik/constants.py @@ -17,3 +17,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 269f5b05..902a3167 100644 --- a/luxtronik/data_vector.py +++ b/luxtronik/data_vector.py @@ -5,6 +5,7 @@ from luxtronik.constants import ( LUXTRONIK_NAME_CHECK_PREFERRED, LUXTRONIK_NAME_CHECK_OBSOLETE, + LUXTRONIK_VALUE_FUNCTION_NOT_AVAILABLE, ) from luxtronik.datatypes import Base @@ -14,6 +15,173 @@ 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 ############################################################################### @@ -33,7 +201,7 @@ def __init__(self): 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._items = [] # list of tuples, 0: definition, 1: field + self._pairs = [] # list of LuxtronikDefFieldPair def __getitem__(self, def_field_name_or_idx): return self.get(def_field_name_or_idx) @@ -49,9 +217,8 @@ 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. """ - # _items is a list of tuples, 0: definition, 1: field all_related_defs = self._def_lookup._index_dict.values() - return iter([d.index for d in self._items if d in all_related_defs]) + return iter([d.index for d in self._pairs if d in all_related_defs]) def __contains__(self, def_field_name_or_idx): """ @@ -78,9 +245,8 @@ 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. """ - # _items is a list of tuples, 0: definition, 1: field all_related_defs = self._def_lookup._index_dict.values() - return iter([f for d, f in self._items if d in all_related_defs]) + return iter([f for d, f in self._pairs if d in all_related_defs]) def items(self): """ @@ -88,17 +254,14 @@ def items(self): 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. """ - # _items is a list of tuples, 0: definition, 1: field all_related_defs = self._def_lookup._index_dict.values() - return iter([(d.index, f) for d, f in self._items if d in all_related_defs]) + return iter([(d.index, f) for d, f in self._pairs if d in all_related_defs]) - @property - def def_items(self): + def pairs(self): """ - Iterator for all definition-field-pairs (list of tuples with - 0: definition, 1: field) contained herein. + Return all definition-field-pairs contained herein. """ - return self._items + return self._pairs @property def def_dict(self): @@ -117,14 +280,13 @@ def add(self, definition, field, alias=None): if definition.valid: self._def_lookup.add(definition, alias) self._field_lookup[definition] = field - self._items.append((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 _items by definition.index - # _items is a list of tuples, 0: definition, 1: field - self._items.sort(key=lambda item: item[0].index) + # sort _pairs by definition.index + self._pairs.sort(key=lambda pair: pair.definition.index) def register_alias(self, def_field_name_or_idx, alias): """ @@ -182,92 +344,241 @@ def get(self, def_field_name_or_idx, default=None): ############################################################################### 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 self._data + 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) + + def __iter__(self): + 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. + + 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 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): + """ + 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) + + +# Parse methods ############################################################### + def parse(self, raw_data): - """Parse raw data.""" - for index, data in enumerate(raw_data): - entry = self._data.get(index, None) - if entry is not None: - entry.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. + """ + 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: - # self.logger.warning(f"Entry '%d' not in list of {self.name}", index) - definition = LuxtronikDefinition.unknown(index, self.name, 0) - field = definition.create_field() - field.raw = data - self._data.add_sorted(definition, field) + # def_dict contains only valid and addable definitions + definition = self._data.def_dict.get(definition) + return definition, field - def _name_lookup(self, name): + def get(self, def_name_or_idx, default=None): """ - Try to find the index using the given field name. + Retrieve a field by definition, name or register index. Args: - name (string): Field name. + def_name_or_idx (LuxtronikDefinition | str | int): + Definition, name, or register index to be used to search for the field. Returns: - tuple[int | None, str | None]: - 0: Index found or None - 1: New preferred name, if available, otherwise None + 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(name, None) + 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: - self.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 + 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 1541e53e..c5b1924f 100644 --- a/luxtronik/definitions/__init__.py +++ b/luxtronik/definitions/__init__.py @@ -9,6 +9,7 @@ import logging +from luxtronik.constants import LUXTRONIK_VALUE_FUNCTION_NOT_AVAILABLE from luxtronik.common import ( parse_version, version_in_range @@ -37,6 +38,7 @@ class LuxtronikDefinition: "names": [], "since": "", "until": "", + "datatype": "UINT32", "description": "", } @@ -61,7 +63,7 @@ def __init__(self, data_dict, type_name, offset): self._valid = index >= 0 self._index = index if self._valid else 0 self._count = int(data_dict["count"]) - self._data_type = data_dict["type"] + self._field_type = data_dict["type"] self._writeable = bool(data_dict["writeable"]) names = data_dict["names"] if not isinstance(names, list): @@ -80,6 +82,8 @@ def __init__(self, data_dict, type_name, offset): self._valid &= len(self._type_name) > 0 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', '')) except Exception as e: self._valid = False self._index = 0 @@ -108,7 +112,7 @@ def __bool__(self): return self._valid def __repr__(self): - return f"(name={self.name}, data_type={self.data_type}," \ + return f"(name={self.name}, field_type={self.field_type}," \ + f" index={self.index}, count={self.count})" @property @@ -138,13 +142,22 @@ def count(self): return self._count @property - def data_type(self): - return self._data_type + def field_type(self): + return self._field_type @property def writeable(self): return self._writeable + @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 @@ -173,7 +186,19 @@ def create_field(self): Returns: Base | None: Field instance or None if invalid. """ - return self.data_type(self.names, self.writeable) if self.valid else None + return self.field_type(self.names, self.writeable) if self.valid else None + + def check_raw_not_none(self, raw): + """ + Check if the related raw value to this definition represents not 'not available'. + + Args: + raw (int): Raw-value to check. + """ + # TODO: Check if there are other magic values + if isinstance(raw, int) and self._data_type in ['INT16']: + return raw != LUXTRONIK_VALUE_FUNCTION_NOT_AVAILABLE + return True ############################################################################### diff --git a/luxtronik/shi/__init__.py b/luxtronik/shi/__init__.py index 506fa510..774693b5 100644 --- a/luxtronik/shi/__init__.py +++ b/luxtronik/shi/__init__.py @@ -36,12 +36,12 @@ def get_version_definitions(definitions): definitions (LuxtronikDefinitionsList): List of definitions Returns: - list[LuxtronikDefinition]: List of definitions whose data_type + list[LuxtronikDefinition]: List of definitions whose field_type is either FullVersion or MajorMinorVersion. """ version_definitions = [] for d in definitions: - if d.data_type in (FullVersion, MajorMinorVersion): + if d.field_type in (FullVersion, MajorMinorVersion): version_definitions.append(d) return version_definitions diff --git a/luxtronik/shi/constants.py b/luxtronik/shi/constants.py index 93248a51..5258b7fb 100644 --- a/luxtronik/shi/constants.py +++ b/luxtronik/shi/constants.py @@ -21,10 +21,6 @@ # The data from the smart home interface are transmitted in 16-bit chunks. LUXTRONIK_SHI_REGISTER_BIT_SIZE: Final = 16 -# Since version 3.92.0, all unavailable data fields -# have been returning this value (0x7FFF) -LUXTRONIK_VALUE_FUNCTION_NOT_AVAILABLE: Final = 32767 - # First Luxtronik firmware version that supports the smart home interface (SHI) LUXTRONIK_FIRST_VERSION_WITH_SHI: Final = (3, 90, 1, 0) diff --git a/luxtronik/shi/contiguous.py b/luxtronik/shi/contiguous.py index 4f1a12db..7c598a82 100644 --- a/luxtronik/shi/contiguous.py +++ b/luxtronik/shi/contiguous.py @@ -6,7 +6,7 @@ import logging -from luxtronik.shi.definitions import get_data_arr, integrate_data +from luxtronik.data_vector import LuxtronikDefFieldPair LOGGER = logging.getLogger(__name__) @@ -15,57 +15,15 @@ # ContiguousDataPart ############################################################################### -class ContiguousDataPart: +class ContiguousDataPart(LuxtronikDefFieldPair): """ Represents a single element of a contiguous data block. Each part references a `field` and its associated `definition`. """ - def __init__(self, definition, field): - """ - Initialize a contiguous data part. - - Args: - field (Base): The field object to read or write. - definition (LuxtronikDefinition): The definition for this field. - """ - self.field = field - self.definition = definition - def __repr__(self): return f"({self.index}, {self.count})" - @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) - ############################################################################### # ContiguousDataBlock diff --git a/luxtronik/shi/definitions.py b/luxtronik/shi/definitions.py deleted file mode 100644 index 1e054fef..00000000 --- a/luxtronik/shi/definitions.py +++ /dev/null @@ -1,142 +0,0 @@ -""" -The metadata (`index`, `count`, ...) for a field (`Base`, `SelectionBase`) -is stored as a definition object. For ease of use, all definitions -of one type (`input`, `holding`, ...) are provided as a sorted list of objects. -This usually contains only predefined definitions (generated out of -`HOLDINGS_DEFINITIONS_LIST` or `INPUTS_DEFINITIONS_LIST`), -but can be expanded by the user. -""" - -import logging - -from luxtronik.shi.constants import ( - LUXTRONIK_SHI_REGISTER_BIT_SIZE, - LUXTRONIK_VALUE_FUNCTION_NOT_AVAILABLE -) - - -LOGGER = logging.getLogger(__name__) - -############################################################################### -# Definition-Field-Pair methods -############################################################################### - -VALUE_MASK = (1 << LUXTRONIK_SHI_REGISTER_BIT_SIZE) - 1 - -def pack_values(values, reverse=True): - """ - Packs a list of data chunks into one integer. - - Args: - values (list[int]): raw data; distributed across multiple registers. - 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) - - 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 & VALUE_MASK) << (LUXTRONIK_SHI_REGISTER_BIT_SIZE * bit_index) - - return result - -def unpack_values(packed, count, reverse=True): - """ - Unpacks 'count' values from a packed integer. - - Args: - packed (int): Packed raw data as a single integer value. - count (int): Number of chunks to unpack. - 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 = [] - - 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 >> (LUXTRONIK_SHI_REGISTER_BIT_SIZE * bit_index)) & VALUE_MASK - values.append(chunk) - - 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 - 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) - if not isinstance(data, list): - data = [data] - return data if len(data) == definition.count else None - -def check_data(definition, field): - """ - Validate that the field contains sufficient raw data. - - Args: - definition (LuxtronikDefinition): Meta-data of the field. - field (Base): Field object that contains the data to check. - - Returns: - bool: True if valid, False otherwise. - """ - return get_data_arr(definition, field) is not None - -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`. - """ - 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] - raw = raw if raw != LUXTRONIK_VALUE_FUNCTION_NOT_AVAILABLE else None - else: - raw = raw_data[data_offset : data_offset + definition.count] - raw = raw if len(raw) == definition.count and \ - not any(data == LUXTRONIK_VALUE_FUNCTION_NOT_AVAILABLE for data in raw) else None - if field.concatenate_multiple_data_chunks and raw is not None: - # Usually big-endian (reverse=True) is used - raw = pack_values(raw) - field.raw = raw \ No newline at end of file diff --git a/luxtronik/shi/interface.py b/luxtronik/shi/interface.py index d73118e4..b924a84c 100644 --- a/luxtronik/shi/interface.py +++ b/luxtronik/shi/interface.py @@ -4,6 +4,7 @@ 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, @@ -14,7 +15,6 @@ LuxtronikSmartHomeReadInputsTelegram, LuxtronikSmartHomeWriteHoldingsTelegram, ) -from luxtronik.shi.definitions import check_data from luxtronik.shi.vector import DataVectorSmartHome from luxtronik.shi.holdings import Holdings, HOLDINGS_DEFINITIONS from luxtronik.shi.inputs import Inputs, INPUTS_DEFINITIONS @@ -387,7 +387,7 @@ def _prepare_write_field(self, definition, field, safe, data): field.value = data # Abort if insufficient data is provided - if not check_data(definition, field): + if not get_data_arr(definition, field): LOGGER.warning("Data error / insufficient data provided: " \ + f"name={definition.name}, data={field.raw}") return False @@ -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.def_items: + for definition, field in data_vector.data.pairs(): # _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.def_items: + for definition, field in data_vector.data.pairs(): 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.def_items: + for definition, field in data_vector.data.pairs(): 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 cc9493a1..33882480 100644 --- a/luxtronik/shi/vector.py +++ b/luxtronik/shi/vector.py @@ -7,7 +7,6 @@ from luxtronik.definitions import LuxtronikDefinition from luxtronik.shi.constants import LUXTRONIK_LATEST_SHI_VERSION -from luxtronik.shi.definitions import integrate_data from luxtronik.shi.contiguous import ContiguousDataBlockList @@ -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,77 +76,22 @@ 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.def_items) - - def __iter__(self): - return iter([definition for definition, _ in self._data.def_items]) - - 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 ############################################### - @property def version(self): return self._version - def values(self): - return iter([field for _, field in self._data.def_items]) - - def items(self): - return iter(self._data.def_items) - - -# 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): """ @@ -254,90 +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.def_items: - self._read_blocks.collect(definition, field) - self._read_blocks_up_to_date = True - - -# Data and access methods ##################################################### - - def parse(self, 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. - """ - raw_len = len(raw_data) - for definition, field in self._data.def_items: - if definition.index + definition.count >= raw_len: - continue - integrate_data(definition, field, raw_data) - - 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 6cc2f58d..3df3492a 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""" @@ -97,18 +95,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 cc655da4..888ff675 100644 --- a/tests/shi/test_shi_contiguous.py +++ b/tests/shi/test_shi_contiguous.py @@ -1,7 +1,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_VALUE_FUNCTION_NOT_AVAILABLE from luxtronik.shi.contiguous import ( ContiguousDataPart, ContiguousDataBlock, diff --git a/tests/shi/test_shi_definitions.py b/tests/shi/test_shi_definitions.py index acb29813..d4297420 100644 --- a/tests/shi/test_shi_definitions.py +++ b/tests/shi/test_shi_definitions.py @@ -1,8 +1,7 @@ +from luxtronik.constants import LUXTRONIK_VALUE_FUNCTION_NOT_AVAILABLE from luxtronik.definitions import LuxtronikDefinition -from luxtronik.shi.constants import LUXTRONIK_VALUE_FUNCTION_NOT_AVAILABLE -from luxtronik.shi.definitions import ( +from luxtronik.data_vector import ( get_data_arr, - check_data, integrate_data, ) diff --git a/tests/shi/test_shi_interface.py b/tests/shi/test_shi_interface.py index 11c47ace..39789caf 100644 --- a/tests/shi/test_shi_interface.py +++ b/tests/shi/test_shi_interface.py @@ -1,13 +1,13 @@ import pytest from unittest.mock import patch +from luxtronik.constants import LUXTRONIK_VALUE_FUNCTION_NOT_AVAILABLE from luxtronik.datatypes import Base, Unknown from luxtronik.definitions import LuxtronikDefinition from luxtronik.shi.constants import ( LUXTRONIK_LATEST_SHI_VERSION, LUXTRONIK_FIRST_VERSION_WITH_SHI, - LUXTRONIK_VALUE_FUNCTION_NOT_AVAILABLE, ) from luxtronik.shi.common import ( LuxtronikSmartHomeReadHoldingsTelegram, @@ -155,7 +155,7 @@ def test_try_create(self): assert definition.index == 4 assert definition.count == 1 assert not definition.writeable - assert definition.data_type is Unknown + assert definition.field_type is Unknown # fail by name definition = self.interface._try_create_definition("unKnOWn_foo4", HOLDINGS_DEFINITIONS) @@ -171,7 +171,7 @@ def test_try_create(self): assert definition.index == 9 assert definition.count == 1 assert not definition.writeable - assert definition.data_type is Unknown + assert definition.field_type is Unknown # fail by else definition = self.interface._try_create_definition(Base, HOLDINGS_DEFINITIONS) @@ -184,7 +184,7 @@ def test_try_create(self): assert definition.index == 14 assert definition.count == 1 assert not definition.writeable - assert definition.data_type is Unknown + assert definition.field_type is Unknown def test_create_telegram(self): block = ContiguousDataBlock() diff --git a/tests/test_compatibility.py b/tests/test_compatibility.py index 963c1799..a6eeb019 100644 --- a/tests/test_compatibility.py +++ b/tests/test_compatibility.py @@ -1914,9 +1914,9 @@ def test_compatibilities(self): for mapping, obj, 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 - 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}:") diff --git a/tests/test_definition_list.py b/tests/test_definition_list.py index e749d89a..67fff156 100644 --- a/tests/test_definition_list.py +++ b/tests/test_definition_list.py @@ -24,7 +24,7 @@ KEY_UNTIL = "until" KEY_DESC = "description" -VALID_DATA_TYPES = ("", "UINT16", "UINT32", "INT16", "INT32") +VALID_DATA_TYPES = ("UINT16", "UINT32", "INT16", "INT32") class RunTestDefinitionList: @@ -65,7 +65,7 @@ def test_structure(self): assert isinstance(name, str), f"Entry of {KEY_NAMES} " \ f"must be of type 'int': {definition}" - # data_type + # field_type if KEY_TYPE in definition: assert issubclass(definition[KEY_TYPE], Base), \ f"{KEY_TYPE} must be inherit from 'Base': {definition}" @@ -176,13 +176,13 @@ def test_name_unique(self): f"this = {i_def}" \ f"other = {j_def}" - def test_data_type(self): + def test_field_type(self): for definition in self.definitions: - data_type = definition.get(KEY_TYPE, None) - assert issubclass(data_type, Base), \ + field_type = definition.get(KEY_TYPE, None) + assert issubclass(field_type, Base), \ f"Type must be set: {definition}" - def test_data_types(self): + def test_data_type(self): for definition in self.definitions: if KEY_DATATYPE in definition: data_type = definition[KEY_DATATYPE] diff --git a/tests/test_definitions.py b/tests/test_definitions.py index 2babfa1a..6d6416a1 100644 --- a/tests/test_definitions.py +++ b/tests/test_definitions.py @@ -31,7 +31,7 @@ def test_init(self): names = self.TEST_DATA['names'] assert definition.index == self.TEST_DATA['index'] assert definition.count == self.TEST_DATA['count'] - assert definition.data_type == self.TEST_DATA['type'] + assert definition.field_type == self.TEST_DATA['type'] assert definition.writeable == self.TEST_DATA['writeable'] assert definition.names == names assert definition.name == names[0] @@ -59,7 +59,7 @@ def test_init_unknown(self): names = ['unknown_foo_2'] assert definition.index == 2 assert definition.count == self.DEFAULT_DATA['count'] - assert definition.data_type == self.DEFAULT_DATA['type'] + assert definition.field_type == self.DEFAULT_DATA['type'] assert definition.writeable == self.DEFAULT_DATA['writeable'] assert definition.names == names assert definition.name == names[0] @@ -394,7 +394,7 @@ def test_create(self): definition = definitions.create_unknown_definition(4) assert definition.index == 4 assert definition.count == 1 - assert definition.data_type is Unknown + assert definition.field_type is Unknown assert not definition.writeable assert definition.names == ['unknown_foo_4'] assert definition.valid diff --git a/tests/test_socket_interaction.py b/tests/test_socket_interaction.py index 125cc5ce..c6e50dbb 100644 --- a/tests/test_socket_interaction.py +++ b/tests/test_socket_interaction.py @@ -32,7 +32,7 @@ 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: + for idx, entry in data_vector.items(): if entry.raw != fct(idx): return False return True @@ -43,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): @@ -90,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): @@ -135,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 @@ -152,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 @@ -163,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 3bf950f8087c29e87da66cc810a4bfc7f5589c8c Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Tue, 20 Jan 2026 21:09:01 +0100 Subject: [PATCH 06/40] 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 | 30 ++++++------ 5 files changed, 99 insertions(+), 27 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 6c2a5beb..e88e0bd8 100644 --- a/tests/test_data_vector.py +++ b/tests/test_data_vector.py @@ -20,37 +20,37 @@ def test_init(self): assert type(d._def_lookup) is LuxtronikDefinitionsDictionary assert type(d._field_lookup) is dict assert len(d._field_lookup.values()) == 0 - assert type(d._items) is list - assert len(d._items) == 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._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._items) == 1 - assert d._items[0][0] is u - assert d._items[0][1] 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._items) == 2 - assert d._items[1][0] is u - assert d._items[1][1] 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._items) == 3 - assert d._items[0][0] is u - assert d._items[0][1] is f + 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() @@ -77,7 +77,7 @@ def test_len(self): d, _, _ = self.create_instance() # 3 different indices assert len(d) == 3 - assert len(d._items) == 4 + assert len(d._pairs) == 4 def test_get_contains(self): d, u, f = self.create_instance() @@ -124,7 +124,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: @@ -185,7 +185,7 @@ class TestDataVector: @pytest.mark.parametrize("name, exception_expected", [ ("foo", False), - ("bar", True), + ("bar", False), ("baz", True), ("qux", False), ]) From ef091dc897da891515ac00c4ef8fcb657964ec4c Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Sun, 11 Jan 2026 20:12:48 +0100 Subject: [PATCH 07/40] wip --- tests/shi/test_shi_vector.py | 35 ++++++++++++++--------------------- 1 file changed, 14 insertions(+), 21 deletions(-) diff --git a/tests/shi/test_shi_vector.py b/tests/shi/test_shi_vector.py index 50b038e4..31134a84 100644 --- a/tests/shi/test_shi_vector.py +++ b/tests/shi/test_shi_vector.py @@ -91,7 +91,7 @@ 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) == 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,7 +215,7 @@ 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) == 2 assert len(data_vector.data._items) == 3 assert field.name == 'field_9a' @@ -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")) @@ -432,7 +425,7 @@ 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) == 3 assert len(data_vector._data._items) == 4 From 95d8c267b064e2a91c2cd38b5508e26e11ee7b49 Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Tue, 20 Jan 2026 22:20:09 +0100 Subject: [PATCH 08/40] wip --- luxtronik/cfi/calculations.py | 9 ++++-- luxtronik/cfi/parameters.py | 9 ++++-- luxtronik/cfi/visibilities.py | 9 ++++-- luxtronik/data_vector.py | 14 +++++---- luxtronik/datatypes.py | 41 ++++++++++++++++++++++----- luxtronik/definitions/__init__.py | 30 ++++++++++++++------ luxtronik/definitions/calculations.py | 1 + luxtronik/definitions/holdings.py | 1 + luxtronik/definitions/inputs.py | 1 + luxtronik/definitions/parameters.py | 1 + luxtronik/definitions/visibilities.py | 1 + luxtronik/shi/holdings.py | 9 ++++-- luxtronik/shi/inputs.py | 9 ++++-- tests/cfi/test_cfi_parameters.py | 34 +++++++++------------- tests/shi/test_shi_interface.py | 10 +++---- tests/shi/test_shi_vector.py | 6 ++-- tests/test_definition_list.py | 2 -- 17 files changed, 124 insertions(+), 63 deletions(-) diff --git a/luxtronik/cfi/calculations.py b/luxtronik/cfi/calculations.py index 5ed51331..b4f1c460 100644 --- a/luxtronik/cfi/calculations.py +++ b/luxtronik/cfi/calculations.py @@ -4,7 +4,11 @@ from typing import Final from luxtronik.definitions import LuxtronikDefinitionsList -from luxtronik.definitions.calculations import CALCULATIONS_DEFINITIONS_LIST, CALCULATIONS_OFFSET +from luxtronik.definitions.calculations import ( + CALCULATIONS_DEFINITIONS_LIST, + CALCULATIONS_OFFSET, + CALCULATIONS_DEFAULT_DATA_TYPE, +) from luxtronik.cfi.constants import CALCULATIONS_FIELD_NAME from luxtronik.cfi.vector import DataVectorConfig @@ -16,7 +20,8 @@ CALCULATIONS_DEFINITIONS: Final = LuxtronikDefinitionsList( CALCULATIONS_DEFINITIONS_LIST, CALCULATIONS_FIELD_NAME, - CALCULATIONS_OFFSET + CALCULATIONS_OFFSET, + CALCULATIONS_DEFAULT_DATA_TYPE ) class Calculations(DataVectorConfig): diff --git a/luxtronik/cfi/parameters.py b/luxtronik/cfi/parameters.py index 7cc6b82a..f0976028 100644 --- a/luxtronik/cfi/parameters.py +++ b/luxtronik/cfi/parameters.py @@ -4,7 +4,11 @@ from typing import Final from luxtronik.definitions import LuxtronikDefinitionsList -from luxtronik.definitions.parameters import PARAMETERS_DEFINITIONS_LIST, PARAMETERS_OFFSET +from luxtronik.definitions.parameters import ( + PARAMETERS_DEFINITIONS_LIST, + PARAMETERS_OFFSET, + PARAMETERS_DEFAULT_DATA_TYPE, +) from luxtronik.cfi.constants import PARAMETERS_FIELD_NAME from luxtronik.cfi.vector import DataVectorConfig @@ -15,7 +19,8 @@ PARAMETERS_DEFINITIONS: Final = LuxtronikDefinitionsList( PARAMETERS_DEFINITIONS_LIST, PARAMETERS_FIELD_NAME, - PARAMETERS_OFFSET + PARAMETERS_OFFSET, + PARAMETERS_DEFAULT_DATA_TYPE ) class Parameters(DataVectorConfig): diff --git a/luxtronik/cfi/visibilities.py b/luxtronik/cfi/visibilities.py index d6e5ec36..f7a55b5f 100644 --- a/luxtronik/cfi/visibilities.py +++ b/luxtronik/cfi/visibilities.py @@ -4,7 +4,11 @@ from typing import Final from luxtronik.definitions import LuxtronikDefinitionsList -from luxtronik.definitions.visibilities import VISIBILITIES_DEFINITIONS_LIST, VISIBILITIES_OFFSET +from luxtronik.definitions.visibilities import ( + VISIBILITIES_DEFINITIONS_LIST, + VISIBILITIES_OFFSET, + VISIBILITIES_DEFAULT_DATA_TYPE, +) from luxtronik.cfi.constants import VISIBILITIES_FIELD_NAME from luxtronik.cfi.vector import DataVectorConfig @@ -15,7 +19,8 @@ VISIBILITIES_DEFINITIONS: Final = LuxtronikDefinitionsList( VISIBILITIES_DEFINITIONS_LIST, VISIBILITIES_FIELD_NAME, - VISIBILITIES_OFFSET + VISIBILITIES_OFFSET, + VISIBILITIES_DEFAULT_DATA_TYPE, ) class Visibilities(DataVectorConfig): 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/definitions/calculations.py b/luxtronik/definitions/calculations.py index eda78344..4ca70ae1 100644 --- a/luxtronik/definitions/calculations.py +++ b/luxtronik/definitions/calculations.py @@ -47,6 +47,7 @@ # Offset which must be added to the calculation indices # to obtain the correct address of the data fields CALCULATIONS_OFFSET: Final = 0 +CALCULATIONS_DEFAULT_DATA_TYPE: Final = 'INT32' CALCULATIONS_DEFINITIONS_LIST: Final = [ { diff --git a/luxtronik/definitions/holdings.py b/luxtronik/definitions/holdings.py index 119b0960..2c56d9d2 100644 --- a/luxtronik/definitions/holdings.py +++ b/luxtronik/definitions/holdings.py @@ -29,6 +29,7 @@ # Offset which must be added to the holding indices # to obtain the correct address of the data fields HOLDINGS_OFFSET: Final = 10000 +HOLDINGS_DEFAULT_DATA_TYPE: Final = 'INT16' HOLDINGS_DEFINITIONS_LIST: Final = [ { diff --git a/luxtronik/definitions/inputs.py b/luxtronik/definitions/inputs.py index 6a4322a9..c266f528 100644 --- a/luxtronik/definitions/inputs.py +++ b/luxtronik/definitions/inputs.py @@ -33,6 +33,7 @@ # Offset which must be added to the input indices # to obtain the correct address of the data fields INPUTS_OFFSET: Final = 10000 +INPUTS_DEFAULT_DATA_TYPE: Final = 'INT16' INPUTS_DEFINITIONS_LIST: Final = [ { diff --git a/luxtronik/definitions/parameters.py b/luxtronik/definitions/parameters.py index 497292a0..122b9694 100644 --- a/luxtronik/definitions/parameters.py +++ b/luxtronik/definitions/parameters.py @@ -41,6 +41,7 @@ # Offset which must be added to the parameter indices # to obtain the correct address of the data fields PARAMETERS_OFFSET: Final = 0 +PARAMETERS_DEFAULT_DATA_TYPE: Final = 'INT32' PARAMETERS_DEFINITIONS_LIST: Final = [ { diff --git a/luxtronik/definitions/visibilities.py b/luxtronik/definitions/visibilities.py index d386d24c..8f5d0b6d 100644 --- a/luxtronik/definitions/visibilities.py +++ b/luxtronik/definitions/visibilities.py @@ -18,6 +18,7 @@ # Offset which must be added to the visibility indices # to obtain the correct address of the data fields VISIBILITIES_OFFSET: Final = 0 +VISIBILITIES_DEFAULT_DATA_TYPE: Final = 'INT32' VISIBILITIES_DEFINITIONS_LIST: Final = [ { diff --git a/luxtronik/shi/holdings.py b/luxtronik/shi/holdings.py index 33ffcacb..6331c960 100644 --- a/luxtronik/shi/holdings.py +++ b/luxtronik/shi/holdings.py @@ -4,7 +4,11 @@ from typing import Final from luxtronik.definitions import LuxtronikDefinitionsList -from luxtronik.definitions.holdings import HOLDINGS_DEFINITIONS_LIST, HOLDINGS_OFFSET +from luxtronik.definitions.holdings import ( + HOLDINGS_DEFINITIONS_LIST, + HOLDINGS_OFFSET, + HOLDINGS_DEFAULT_DATA_TYPE +) from luxtronik.shi.constants import HOLDINGS_FIELD_NAME from luxtronik.shi.vector import DataVectorSmartHome @@ -15,7 +19,8 @@ HOLDINGS_DEFINITIONS: Final = LuxtronikDefinitionsList( HOLDINGS_DEFINITIONS_LIST, HOLDINGS_FIELD_NAME, - HOLDINGS_OFFSET + HOLDINGS_OFFSET, + HOLDINGS_DEFAULT_DATA_TYPE, ) class Holdings(DataVectorSmartHome): diff --git a/luxtronik/shi/inputs.py b/luxtronik/shi/inputs.py index e5db66e3..7bac711d 100644 --- a/luxtronik/shi/inputs.py +++ b/luxtronik/shi/inputs.py @@ -4,7 +4,11 @@ from typing import Final from luxtronik.definitions import LuxtronikDefinitionsList -from luxtronik.definitions.inputs import INPUTS_DEFINITIONS_LIST, INPUTS_OFFSET +from luxtronik.definitions.inputs import ( + INPUTS_DEFINITIONS_LIST, + INPUTS_OFFSET, + INPUTS_DEFAULT_DATA_TYPE, +) from luxtronik.shi.constants import INPUTS_FIELD_NAME from luxtronik.shi.vector import DataVectorSmartHome @@ -15,7 +19,8 @@ INPUTS_DEFINITIONS: Final = LuxtronikDefinitionsList( INPUTS_DEFINITIONS_LIST, INPUTS_FIELD_NAME, - INPUTS_OFFSET + INPUTS_OFFSET, + INPUTS_DEFAULT_DATA_TYPE, ) class Inputs(DataVectorSmartHome): diff --git a/tests/cfi/test_cfi_parameters.py b/tests/cfi/test_cfi_parameters.py index 3df3492a..3f5f8c6a 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_parse(self): """Test cases for _parse""" @@ -95,21 +87,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_interface.py b/tests/shi/test_shi_interface.py index 39789caf..dd1596a6 100644 --- a/tests/shi/test_shi_interface.py +++ b/tests/shi/test_shi_interface.py @@ -255,7 +255,7 @@ def test_create_telegrams(self): blocks.append(block) # block 2 - blocks.append_single(HOLDINGS_DEFINITIONS[13], HOLDINGS_DEFINITIONS[13].create_field()) + blocks.append_single(HOLDINGS_DEFINITIONS[17], HOLDINGS_DEFINITIONS[17].create_field()) # block 3 blocks.append_single(HOLDINGS_DEFINITIONS[10], HOLDINGS_DEFINITIONS[10].create_field()) @@ -267,8 +267,8 @@ def test_create_telegrams(self): # invalid block blocks.append_single(HOLDINGS_DEFINITIONS[12], HOLDINGS_DEFINITIONS[12].create_field()) # block 4 - field3 = HOLDINGS_DEFINITIONS[13].create_field() - blocks.append_single(HOLDINGS_DEFINITIONS[13], field3) + field3 = HOLDINGS_DEFINITIONS[17].create_field() + blocks.append_single(HOLDINGS_DEFINITIONS[17], field3) blocks_list.append(blocks) @@ -281,13 +281,13 @@ def test_create_telegrams(self): 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 == 13 + 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 == 13 + assert telegram_data[3][0].first_index == 17 assert telegram_data[3][0].overall_count == 1 # telegrams assert telegram_data[0][1].count == 2 diff --git a/tests/shi/test_shi_vector.py b/tests/shi/test_shi_vector.py index 31134a84..a836acf0 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) @@ -426,7 +426,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 036cda3369971b006de930104de6a704e2340b94 Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Wed, 21 Jan 2026 20:26:17 +0100 Subject: [PATCH 09/40] wip --- luxtronik/cfi/calculations.py | 3 +- luxtronik/cfi/parameters.py | 1 - luxtronik/cfi/vector.py | 56 ++++++ luxtronik/cfi/visibilities.py | 6 - luxtronik/data_vector.py | 350 ++-------------------------------- luxtronik/datatypes.py | 4 - luxtronik/shi/contiguous.py | 2 +- luxtronik/shi/holdings.py | 1 - luxtronik/shi/inputs.py | 1 - luxtronik/shi/interface.py | 2 +- luxtronik/shi/vector.py | 9 +- tests/shi/test_shi_vector.py | 2 +- 12 files changed, 78 insertions(+), 359 deletions(-) create mode 100644 luxtronik/cfi/vector.py diff --git a/luxtronik/cfi/calculations.py b/luxtronik/cfi/calculations.py index b4f1c460..51d98785 100644 --- a/luxtronik/cfi/calculations.py +++ b/luxtronik/cfi/calculations.py @@ -27,7 +27,6 @@ class Calculations(DataVectorConfig): """Class that holds all calculations.""" - logger = LOGGER name = CALCULATIONS_FIELD_NAME definitions = CALCULATIONS_DEFINITIONS @@ -50,7 +49,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 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 f7a55b5f..99ceb3e2 100644 --- a/luxtronik/cfi/visibilities.py +++ b/luxtronik/cfi/visibilities.py @@ -26,15 +26,9 @@ class Visibilities(DataVectorConfig): """Class that holds all visibilities.""" - logger = LOGGER 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/holdings.py b/luxtronik/shi/holdings.py index 6331c960..53f6e0d4 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 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 diff --git a/tests/shi/test_shi_vector.py b/tests/shi/test_shi_vector.py index a836acf0..733657f5 100644 --- a/tests/shi/test_shi_vector.py +++ b/tests/shi/test_shi_vector.py @@ -59,7 +59,7 @@ "until": "3.3", }, ] -TEST_DEFINITIONS = LuxtronikDefinitionsList(def_list, 'foo', 100) +TEST_DEFINITIONS = LuxtronikDefinitionsList(def_list, 'foo', 100, 'INT16') class DataVectorTest(DataVectorSmartHome): name = 'foo' From 1cd2728649bd5c4dc44e0a989b19d13c650ec049 Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Wed, 21 Jan 2026 20:29:07 +0100 Subject: [PATCH 10/40] wip --- luxtronik/collections.py | 344 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 344 insertions(+) create mode 100644 luxtronik/collections.py diff --git a/luxtronik/collections.py b/luxtronik/collections.py new file mode 100644 index 00000000..67389dcf --- /dev/null +++ b/luxtronik/collections.py @@ -0,0 +1,344 @@ +"""Common used collection objects.""" + +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.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 + 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 \ No newline at end of file From c78d028b082a84bd0e4acfd8dd945a3e2e6032d7 Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Wed, 21 Jan 2026 20:41:13 +0100 Subject: [PATCH 11/40] 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 c54d887033e2a7537172037a5409b39bb7b196c6 Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Wed, 21 Jan 2026 21:31:10 +0100 Subject: [PATCH 12/40] wip --- luxtronik/datatypes.py | 6 ++---- tests/test_datatypes.py | 8 ++++---- tests/test_definition_list.py | 3 ++- tests/test_definitions.py | 14 +++++++------- 4 files changed, 15 insertions(+), 16 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): diff --git a/tests/test_definitions.py b/tests/test_definitions.py index 6d6416a1..b5cbe285 100644 --- a/tests/test_definitions.py +++ b/tests/test_definitions.py @@ -336,7 +336,7 @@ class TestDefinitionsList: ] def test_init(self): - definitions = LuxtronikDefinitionsList(self.def_list, 'foo', 100) + definitions = LuxtronikDefinitionsList(self.def_list, 'foo', 100, '') # only valid assert len(definitions) == 4 @@ -354,7 +354,7 @@ def test_init(self): assert definitions.get(9).name == "field_9" def test_filtered(self): - definitions = LuxtronikDefinitionsList(self.def_list, 'foo', 100) + definitions = LuxtronikDefinitionsList(self.def_list, 'foo', 100, '') filtered1 = LuxtronikDefinitionsList.filtered(definitions, (1, 1, 0, 0)) assert filtered1.name == 'foo' @@ -375,7 +375,7 @@ def test_filtered(self): assert 'field_invalid' not in filtered1 # invalid def test_iter(self): - definitions = LuxtronikDefinitionsList(self.def_list, 'foo', 100) + definitions = LuxtronikDefinitionsList(self.def_list, 'foo', 100, '') for index, d in enumerate(definitions): if index == 0: @@ -388,7 +388,7 @@ def test_iter(self): assert d.index == 9 def test_create(self): - definitions = LuxtronikDefinitionsList(self.def_list, 'foo', 100) + definitions = LuxtronikDefinitionsList(self.def_list, 'foo', 100, '') # create unknown definition definition = definitions.create_unknown_definition(4) @@ -406,7 +406,7 @@ def test_create(self): assert definition.until is None def test_alias(self): - definitions = LuxtronikDefinitionsList(self.def_list, 'foo', 100) + definitions = LuxtronikDefinitionsList(self.def_list, 'foo', 100, '') # add alias d = definitions.register_alias(5, 'bar') @@ -421,7 +421,7 @@ def test_alias(self): assert d is None def test_add(self): - definitions = LuxtronikDefinitionsList(self.def_list, 'foo', 100) + definitions = LuxtronikDefinitionsList(self.def_list, 'foo', 100, '') assert len(definitions) == 4 # add custom definition @@ -461,6 +461,6 @@ def test_add(self): assert added_4 is None def test_repr(self): - definitions = LuxtronikDefinitionsList(self.def_list, 'foo', 100) + definitions = LuxtronikDefinitionsList(self.def_list, 'foo', 100, '') text = repr(definitions) assert text \ No newline at end of file From e6857a221da0cb9fe7eee1d68cd0a361d5caf616 Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Wed, 21 Jan 2026 21:34:54 +0100 Subject: [PATCH 13/40] 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 21d10b6d9f6fa8367b2e65b0ec9523c6ade49230 Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Wed, 21 Jan 2026 21:43:21 +0100 Subject: [PATCH 14/40] 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 98858ee8b3a3c8afbe4f1be18c2df298cfeacdc9 Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Wed, 21 Jan 2026 22:06:02 +0100 Subject: [PATCH 15/40] 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 ab5880c62f51eff847207637a2aeaf49db60f391 Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Wed, 21 Jan 2026 22:06:15 +0100 Subject: [PATCH 16/40] wip --- tests/test_collections.py | 162 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 162 insertions(+) create mode 100644 tests/test_collections.py diff --git a/tests/test_collections.py b/tests/test_collections.py new file mode 100644 index 00000000..a9966743 --- /dev/null +++ b/tests/test_collections.py @@ -0,0 +1,162 @@ + +import pytest + +from luxtronik.collections import LuxtronikFieldsDictionary +from luxtronik.definitions import LuxtronikDefinition, LuxtronikDefinitionsDictionary +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] \ No newline at end of file From a6bc23ee8fece730b096b2ed2cf586a049dfba34 Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Wed, 21 Jan 2026 22:28:22 +0100 Subject: [PATCH 17/40] 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 971b346b0c8b636a04bfe8745c91b9aab0f887c9 Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Wed, 21 Jan 2026 23:24:31 +0100 Subject: [PATCH 18/40] 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 e28f7fc6acc5831f6f757c12146f1afbeefe3423 Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Wed, 21 Jan 2026 23:29:35 +0100 Subject: [PATCH 19/40] 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 68b431880b60d227d11c48206ade0382feac623d Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Thu, 22 Jan 2026 20:25:40 +0100 Subject: [PATCH 20/40] 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 3f5f8c6a..e85ee962 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 733657f5..a59c9bc3 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 @@ -436,7 +436,6 @@ def test_init(self): """Test cases for initialization""" holdings = Holdings() assert holdings.name == "holding" - assert holdings.holdings == holdings._data class TestInputs: @@ -446,4 +445,3 @@ def test_init(self): """Test cases for initialization""" inputs = Inputs() assert inputs.name == "input" - assert inputs.inputs == inputs._data From 4745384b0866b49df5588df7bc742cfa48bddb6f Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Thu, 22 Jan 2026 20:40:28 +0100 Subject: [PATCH 21/40] 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 d4766326e020c5373086389f4b6933567b512fa6 Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Thu, 22 Jan 2026 21:34:31 +0100 Subject: [PATCH 22/40] 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 a59c9bc3..caff040a 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 11357bab079115ac8569b20bcf5b39cda9e21416 Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Thu, 22 Jan 2026 21:59:38 +0100 Subject: [PATCH 23/40] 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 c9ebe07878f39031c12874daf665e8b38d0fd6a3 Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Thu, 22 Jan 2026 23:07:05 +0100 Subject: [PATCH 24/40] wip --- luxtronik/cfi/interface.py | 17 +++++++-------- 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 | 22 ++++++++++++-------- 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 | 33 ++++++++++++++++++++---------- tests/test_compatibility.py | 6 +++--- tests/test_socket_interaction.py | 9 ++++---- 13 files changed, 96 insertions(+), 74 deletions(-) diff --git a/luxtronik/cfi/interface.py b/luxtronik/cfi/interface.py index aecf6ad4..7750d099 100644 --- a/luxtronik/cfi/interface.py +++ b/luxtronik/cfi/interface.py @@ -15,6 +15,7 @@ LUXTRONIK_SOCKET_READ_SIZE_INTEGER, LUXTRONIK_SOCKET_READ_SIZE_CHAR, WAIT_TIME_AFTER_PARAMETER_WRITE, + LUXTRONIK_CFI_REGISTER_BIT_SIZE, ) from luxtronik.cfi.calculations import Calculations from luxtronik.cfi.parameters import Parameters @@ -161,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() @@ -193,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) + parameters.parse(data, LUXTRONIK_CFI_REGISTER_BIT_SIZE) return parameters def _read_calculations(self, calculations): @@ -208,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) + calculations.parse(data, LUXTRONIK_CFI_REGISTER_BIT_SIZE) return calculations def _read_visibilities(self, visibilities): @@ -221,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) + visibilities.parse(data, LUXTRONIK_CFI_REGISTER_BIT_SIZE) return visibilities def _send_ints(self, *ints): 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 e85ee962..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): @@ -61,7 +63,7 @@ def test_parse(self): n = 2000 t = list(range(0, n + 1)) - parameters.parse(t) + parameters.parse(t, LUXTRONIK_CFI_REGISTER_BIT_SIZE) p = parameters.get(n) @@ -72,11 +74,15 @@ 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 caff040a..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): @@ -310,21 +321,21 @@ def test_parse(self): # not enough data data = [1] - data_vector.parse(data) + 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) + 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) + 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 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 be445f793001fdef1d4b4c109f2362aa1c2aaece Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Thu, 22 Jan 2026 23:16:39 +0100 Subject: [PATCH 25/40] 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 baf147826da5727c9d524f54cffb72e6d3ed2a7a Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Fri, 23 Jan 2026 20:24:41 +0100 Subject: [PATCH 26/40] 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 8fbdbafed6e28332b078c007599e33114de5069e Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Fri, 23 Jan 2026 20:30:13 +0100 Subject: [PATCH 27/40] wip --- tests/shi/test_shi_vector.py | 2 +- tests/test_definitions.py | 2 ++ 2 files changed, 3 insertions(+), 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 diff --git a/tests/test_definitions.py b/tests/test_definitions.py index b5cbe285..bcf3d79e 100644 --- a/tests/test_definitions.py +++ b/tests/test_definitions.py @@ -17,6 +17,7 @@ class TestDefinition: 'type': Base, 'writeable': True, 'names': ['test1', 'test2'], + 'datatype': 'INT16', 'since': '1.1', 'until': '3.16.7', 'description': 'foo', @@ -40,6 +41,7 @@ def test_init(self): assert definition.type_name == 'bar' assert definition.offset == 20 assert definition.addr == 20 + self.TEST_DATA['index'] + assert definition.num_bits == 16 assert definition.aliases == [] assert definition.since == (1, 1, 0, 0) assert definition.until == (3, 16, 7, 0) From f7f51423382d8cd6d4b2469eba6d4f7a8e8a192f Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Fri, 23 Jan 2026 21:39:19 +0100 Subject: [PATCH 28/40] wip last unify --- luxtronik/cfi/interface.py | 42 +++++++++++++++++++++++++++++--- luxtronik/collections.py | 36 +++++++++++++++------------ luxtronik/constants.py | 4 --- 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(+), 105 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 c2ac4283..bb88c487 100644 --- a/luxtronik/constants.py +++ b/luxtronik/constants.py @@ -14,10 +14,6 @@ # Content of response that is contained in responses to discovery broadcast LUXTRONIK_DISCOVERY_RESPONSE_PREFIX: Final = "2500;111;" -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 2fd75f2fae6287c0fc21343d9d5696b480c00a7c Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Fri, 23 Jan 2026 22:09:20 +0100 Subject: [PATCH 29/40] 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 1a32de85735e91c417fce741bf6aa27ab3089a94 Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Sat, 24 Jan 2026 21:02:46 +0100 Subject: [PATCH 30/40] wip --- luxtronik/cfi/calculations.py | 6 +- luxtronik/datatypes.py | 2 + luxtronik/definitions/calculations.py | 525 +++--- luxtronik/definitions/parameters.py | 2330 +++++++++++++------------ luxtronik/definitions/visibilities.py | 652 +++---- tests/cfi/test_cfi_interface.py | 35 + tests/test_compatibility.py | 560 ++++-- 7 files changed, 2249 insertions(+), 1861 deletions(-) create mode 100644 tests/cfi/test_cfi_interface.py 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 4ca70ae1..fcc7bd24 100644 --- a/luxtronik/definitions/calculations.py +++ b/luxtronik/definitions/calculations.py @@ -41,6 +41,7 @@ Timestamp, Unknown, MajorMinorVersion, + Version, Voltage, ) @@ -153,7 +154,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 +164,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 +174,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 +184,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 +194,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 +204,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 +214,7 @@ { "index": 16, "count": 1, - "names": ['ID_WEB_Mitteltemperatur', 'Unknown_Calculation_16'], + "names": ['ID_WEB_Mitteltemperatur'], "type": Celsius, "writeable": False, "datatype": 'INT32', @@ -223,7 +224,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 +234,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 +244,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 +254,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 +264,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 +274,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 +284,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 +294,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 +304,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 +314,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 +324,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 +334,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 +344,7 @@ { "index": 29, "count": 1, - "names": ['ID_WEB_ASDin', 'Unknown_Calculation_29'], + "names": ['ID_WEB_ASDin'], "type": Bool, "writeable": False, "datatype": 'UINT32', @@ -353,7 +354,7 @@ { "index": 30, "count": 1, - "names": ['ID_WEB_BWTin', 'Unknown_Calculation_30'], + "names": ['ID_WEB_BWTin'], "type": Bool, "writeable": False, "datatype": 'UINT32', @@ -363,7 +364,7 @@ { "index": 31, "count": 1, - "names": ['ID_WEB_EVUin', 'Unknown_Calculation_31'], + "names": ['ID_WEB_EVUin'], "type": Bool, "writeable": False, "datatype": 'UINT32', @@ -373,7 +374,7 @@ { "index": 32, "count": 1, - "names": ['ID_WEB_HDin', 'Unknown_Calculation_32'], + "names": ['ID_WEB_HDin'], "type": Bool, "writeable": False, "datatype": 'UINT32', @@ -383,7 +384,7 @@ { "index": 33, "count": 1, - "names": ['ID_WEB_MOTin', 'Unknown_Calculation_33'], + "names": ['ID_WEB_MOTin'], "type": Bool, "writeable": False, "datatype": 'UINT32', @@ -393,7 +394,7 @@ { "index": 34, "count": 1, - "names": ['ID_WEB_NDin', 'Unknown_Calculation_34'], + "names": ['ID_WEB_NDin'], "type": Bool, "writeable": False, "datatype": 'UINT32', @@ -403,7 +404,7 @@ { "index": 35, "count": 1, - "names": ['ID_WEB_PEXin', 'Unknown_Calculation_35'], + "names": ['ID_WEB_PEXin'], "type": Bool, "writeable": False, "datatype": 'UINT32', @@ -413,7 +414,7 @@ { "index": 36, "count": 1, - "names": ['ID_WEB_SWTin', 'Unknown_Calculation_36'], + "names": ['ID_WEB_SWTin'], "type": Bool, "writeable": False, "datatype": 'UINT32', @@ -423,7 +424,7 @@ { "index": 37, "count": 1, - "names": ['ID_WEB_AVout', 'Unknown_Calculation_37'], + "names": ['ID_WEB_AVout'], "type": Bool, "writeable": False, "datatype": 'UINT32', @@ -433,7 +434,7 @@ { "index": 38, "count": 1, - "names": ['ID_WEB_BUPout', 'Unknown_Calculation_38'], + "names": ['ID_WEB_BUPout'], "type": Bool, "writeable": False, "datatype": 'UINT32', @@ -443,7 +444,7 @@ { "index": 39, "count": 1, - "names": ['ID_WEB_HUPout', 'Unknown_Calculation_39'], + "names": ['ID_WEB_HUPout'], "type": Bool, "writeable": False, "datatype": 'UINT32', @@ -453,7 +454,7 @@ { "index": 40, "count": 1, - "names": ['ID_WEB_MA1out', 'Unknown_Calculation_40'], + "names": ['ID_WEB_MA1out'], "type": Bool, "writeable": False, "datatype": 'UINT32', @@ -463,7 +464,7 @@ { "index": 41, "count": 1, - "names": ['ID_WEB_MZ1out', 'Unknown_Calculation_41'], + "names": ['ID_WEB_MZ1out'], "type": Bool, "writeable": False, "datatype": 'UINT32', @@ -473,7 +474,7 @@ { "index": 42, "count": 1, - "names": ['ID_WEB_VENout', 'Unknown_Calculation_42'], + "names": ['ID_WEB_VENout'], "type": Bool, "writeable": False, "datatype": 'UINT32', @@ -483,7 +484,7 @@ { "index": 43, "count": 1, - "names": ['ID_WEB_VBOout', 'Unknown_Calculation_43'], + "names": ['ID_WEB_VBOout'], "type": Bool, "writeable": False, "datatype": 'UINT32', @@ -493,7 +494,7 @@ { "index": 44, "count": 1, - "names": ['ID_WEB_VD1out', 'Unknown_Calculation_44'], + "names": ['ID_WEB_VD1out'], "type": Bool, "writeable": False, "datatype": 'UINT32', @@ -503,7 +504,7 @@ { "index": 45, "count": 1, - "names": ['ID_WEB_VD2out', 'Unknown_Calculation_45'], + "names": ['ID_WEB_VD2out'], "type": Bool, "writeable": False, "datatype": 'UINT32', @@ -513,7 +514,7 @@ { "index": 46, "count": 1, - "names": ['ID_WEB_ZIPout', 'Unknown_Calculation_46'], + "names": ['ID_WEB_ZIPout'], "type": Bool, "writeable": False, "datatype": 'UINT32', @@ -523,7 +524,7 @@ { "index": 47, "count": 1, - "names": ['ID_WEB_ZUPout', 'Unknown_Calculation_47'], + "names": ['ID_WEB_ZUPout'], "type": Bool, "writeable": False, "datatype": 'UINT32', @@ -533,7 +534,7 @@ { "index": 48, "count": 1, - "names": ['ID_WEB_ZW1out', 'Unknown_Calculation_48'], + "names": ['ID_WEB_ZW1out'], "type": Bool, "writeable": False, "datatype": 'UINT32', @@ -543,7 +544,7 @@ { "index": 49, "count": 1, - "names": ['ID_WEB_ZW2SSTout', 'Unknown_Calculation_49'], + "names": ['ID_WEB_ZW2SSTout'], "type": Bool, "writeable": False, "datatype": 'UINT32', @@ -553,7 +554,7 @@ { "index": 50, "count": 1, - "names": ['ID_WEB_ZW3SSTout', 'Unknown_Calculation_50'], + "names": ['ID_WEB_ZW3SSTout'], "type": Bool, "writeable": False, "datatype": 'UINT32', @@ -563,7 +564,7 @@ { "index": 51, "count": 1, - "names": ['ID_WEB_FP2out', 'Unknown_Calculation_51'], + "names": ['ID_WEB_FP2out'], "type": Bool, "writeable": False, "datatype": 'UINT32', @@ -573,7 +574,7 @@ { "index": 52, "count": 1, - "names": ['ID_WEB_SLPout', 'Unknown_Calculation_52'], + "names": ['ID_WEB_SLPout'], "type": Bool, "writeable": False, "datatype": 'UINT32', @@ -583,7 +584,7 @@ { "index": 53, "count": 1, - "names": ['ID_WEB_SUPout', 'Unknown_Calculation_53'], + "names": ['ID_WEB_SUPout'], "type": Bool, "writeable": False, "datatype": 'UINT32', @@ -593,7 +594,7 @@ { "index": 54, "count": 1, - "names": ['ID_WEB_MZ2out', 'Unknown_Calculation_54'], + "names": ['ID_WEB_MZ2out'], "type": Bool, "writeable": False, "datatype": 'UINT32', @@ -603,7 +604,7 @@ { "index": 55, "count": 1, - "names": ['ID_WEB_MA2out', 'Unknown_Calculation_55'], + "names": ['ID_WEB_MA2out'], "type": Bool, "writeable": False, "datatype": 'UINT32', @@ -613,7 +614,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 +624,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 +634,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 +644,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 +654,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 +664,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 +674,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 +684,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 +694,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 +704,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 +714,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 +724,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 +734,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 +744,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 +754,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 +764,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 +774,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 +784,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 +794,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 +804,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 +814,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 +824,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 +834,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 +844,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,17 +854,27 @@ { "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', "unit": 'enum', "description": '', }, + { + "index": 81, + "count": 10, + "names": ['ID_WEB_SoftStand'], + "type": Version, + "writeable": False, + "datatype": 'UINT32', + "unit": '', + "description": '', + }, { "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 +884,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 +894,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 +904,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 +914,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 +924,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 +934,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 +944,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 +954,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 +964,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 +974,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 +984,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 +994,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 +1004,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 +1014,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 +1024,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 +1034,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 +1044,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 +1054,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 +1064,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 +1074,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 +1084,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 +1094,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 +1104,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 +1114,7 @@ { "index": 105, "count": 1, - "names": ['ID_WEB_AnzahlFehlerInSpeicher', 'Unknown_Calculation_105'], + "names": ['ID_WEB_AnzahlFehlerInSpeicher'], "type": Count, "writeable": False, "datatype": 'UINT32', @@ -1113,7 +1124,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 +1134,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 +1144,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 +1154,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 +1164,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 +1174,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 +1184,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 +1194,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 +1204,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 +1214,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 +1224,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 +1234,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 +1244,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 +1254,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 +1264,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 +1274,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 +1284,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 +1294,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 +1304,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 +1314,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 +1324,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 +1334,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 +1344,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 +1354,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 +1364,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 +1374,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 +1384,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 +1394,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 +1404,7 @@ { "index": 134, "count": 1, - "names": ['ID_WEB_AktuelleTimeStamp', 'Unknown_Calculation_134'], + "names": ['ID_WEB_AktuelleTimeStamp'], "type": Timestamp, "writeable": False, "datatype": 'UINT32', @@ -1403,7 +1414,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 +1424,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 +1434,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 +1444,7 @@ { "index": 138, "count": 1, - "names": ['ID_WEB_MZ3out', 'Unknown_Calculation_138'], + "names": ['ID_WEB_MZ3out'], "type": Bool, "writeable": False, "datatype": 'UINT32', @@ -1443,7 +1454,7 @@ { "index": 139, "count": 1, - "names": ['ID_WEB_MA3out', 'Unknown_Calculation_139'], + "names": ['ID_WEB_MA3out'], "type": Bool, "writeable": False, "datatype": 'UINT32', @@ -1453,7 +1464,7 @@ { "index": 140, "count": 1, - "names": ['ID_WEB_FP3out', 'Unknown_Calculation_140'], + "names": ['ID_WEB_FP3out'], "type": Bool, "writeable": False, "datatype": 'UINT32', @@ -1463,7 +1474,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 +1484,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 +1494,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 +1504,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 +1514,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 +1524,7 @@ { "index": 146, "count": 1, - "names": ['ID_WEB_FreigabKuehl', 'Unknown_Calculation_146'], + "names": ['ID_WEB_FreigabKuehl'], "type": Bool, "writeable": False, "datatype": 'UINT32', @@ -1523,7 +1534,7 @@ { "index": 147, "count": 1, - "names": ['ID_WEB_AnalogIn', 'Unknown_Calculation_147'], + "names": ['ID_WEB_AnalogIn'], "type": Voltage, "writeable": False, "datatype": 'INT32', @@ -1533,7 +1544,7 @@ { "index": 148, "count": 1, - "names": ['ID_WEB_SonderZeichen', 'Unknown_Calculation_148'], + "names": ['ID_WEB_SonderZeichen'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -1543,7 +1554,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 +1564,7 @@ { "index": 150, "count": 1, - "names": ['ID_WEB_WebsrvProgrammWerteBeobarten', 'Unknown_Calculation_150'], + "names": ['ID_WEB_WebsrvProgrammWerteBeobarten'], "type": Icon, "writeable": False, "datatype": 'UINT32', @@ -1563,7 +1574,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 +1584,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 +1594,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 +1604,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 +1614,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 +1624,7 @@ { "index": 156, "count": 1, - "names": ['ID_WEB_AnalogOut1', 'Unknown_Calculation_156'], + "names": ['ID_WEB_AnalogOut1'], "type": Voltage, "writeable": False, "datatype": 'INT32', @@ -1623,7 +1634,7 @@ { "index": 157, "count": 1, - "names": ['ID_WEB_AnalogOut2', 'Unknown_Calculation_157'], + "names": ['ID_WEB_AnalogOut2'], "type": Voltage, "writeable": False, "datatype": 'INT32', @@ -1633,7 +1644,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 +1654,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 +1664,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 +1674,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 +1684,7 @@ { "index": 162, "count": 1, - "names": ['ID_WEB_AnalogOut3', 'Unknown_Calculation_162'], + "names": ['ID_WEB_AnalogOut3'], "type": Voltage, "writeable": False, "datatype": 'INT32', @@ -1683,7 +1694,7 @@ { "index": 163, "count": 1, - "names": ['ID_WEB_AnalogOut4', 'Unknown_Calculation_163'], + "names": ['ID_WEB_AnalogOut4'], "type": Voltage, "writeable": False, "datatype": 'INT32', @@ -1693,7 +1704,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 +1714,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 +1724,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 +1734,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 +1744,7 @@ { "index": 168, "count": 1, - "names": ['ID_WEB_AnalogIn2', 'Unknown_Calculation_168'], + "names": ['ID_WEB_AnalogIn2'], "type": Voltage, "writeable": False, "datatype": 'INT32', @@ -1743,7 +1754,7 @@ { "index": 169, "count": 1, - "names": ['ID_WEB_AnalogIn3', 'Unknown_Calculation_169'], + "names": ['ID_WEB_AnalogIn3'], "type": Voltage, "writeable": False, "datatype": 'INT32', @@ -1753,7 +1764,7 @@ { "index": 170, "count": 1, - "names": ['ID_WEB_SAXin', 'Unknown_Calculation_170'], + "names": ['ID_WEB_SAXin'], "type": Bool, "writeable": False, "datatype": 'UINT32', @@ -1763,7 +1774,7 @@ { "index": 171, "count": 1, - "names": ['ID_WEB_SPLin', 'Unknown_Calculation_171'], + "names": ['ID_WEB_SPLin'], "type": Bool, "writeable": False, "datatype": 'UINT32', @@ -1773,7 +1784,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 +1794,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 +1804,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 +1814,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 +1824,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 +1834,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 +1844,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 +1854,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 +1864,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 +1874,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 +1884,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 +1894,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 +1904,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 +1914,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 +1924,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 +1934,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 +1944,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 +1954,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 +1964,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 +1974,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 +1984,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 +1994,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 +2004,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 +2014,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 +2024,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 +2034,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 +2044,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 +2054,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 +2064,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 +2074,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 +2084,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 +2094,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 +2104,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 +2114,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 +2124,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 +2134,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 +2144,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 +2154,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 +2164,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 +2174,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 +2184,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 +2194,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 +2204,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 +2214,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 +2224,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 +2234,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 +2244,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 +2254,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 +2264,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 +2274,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 +2284,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 +2294,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 +2304,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 +2314,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 +2324,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 +2334,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 +2344,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 +2354,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 +2364,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,27 +2374,35 @@ { "index": 231, "count": 1, - "names": ['ID_WEB_Freq_VD', 'Unknown_Calculation_231'], + "names": ['ID_WEB_Freq_VD'], "type": Frequency, "writeable": False, "datatype": 'UINT32', "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', @@ -2463,27 +2502,35 @@ { "index": 241, "count": 1, - "names": ['HUP_PWM', 'Circulation_Pump', 'Unknown_Calculation_241'], + "names": ['HUP_PWM', 'Circulation_Pump'], "type": Percent2, "writeable": False, "datatype": 'UINT32', "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', @@ -2593,7 +2640,7 @@ { "index": 254, "count": 1, - "names": ['Flow_Rate_254', 'Unknown_Calculation_254'], + "names": ['Flow_Rate_254'], "type": Flow, "writeable": False, "datatype": 'UINT32', @@ -2623,17 +2670,21 @@ { "index": 257, "count": 1, - "names": ['Heat_Output', 'Unknown_Calculation_257'], + "names": ['Heat_Output'], "type": Power, "writeable": False, "datatype": 'UINT32', "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', @@ -2723,7 +2774,7 @@ { "index": 267, "count": 1, - "names": ['Desired_Room_Temperature', 'Unknown_Calculation_267'], + "names": ['Desired_Room_Temperature'], "type": Celsius, "writeable": False, "datatype": 'INT32', @@ -2733,7 +2784,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 122b9694..d708774d 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": Unknown, "writeable": False, "datatype": 'UINT32', @@ -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": Unknown, "writeable": False, "datatype": 'UINT32', @@ -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": Unknown, "writeable": False, "datatype": 'UINT32', @@ -967,7 +967,7 @@ { "index": 92, "count": 1, - "names": ['ID_Einst_TAmin_akt', 'Unknown_Parameter_92'], + "names": ['ID_Einst_TAmin_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -977,7 +977,7 @@ { "index": 93, "count": 1, - "names": ['ID_Einst_TWQmin_akt', 'Unknown_Parameter_93'], + "names": ['ID_Einst_TWQmin_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -987,7 +987,7 @@ { "index": 94, "count": 1, - "names": ['ID_Einst_THGmax_akt', 'Unknown_Parameter_94'], + "names": ['ID_Einst_THGmax_akt'], "type": Unknown, "writeable": False, "datatype": 'UINT32', @@ -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": Unknown, "writeable": False, "datatype": 'UINT32', @@ -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', @@ -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 8f5d0b6d..83596572 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', @@ -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 new file mode 100644 index 00000000..a46a2ad4 --- /dev/null +++ b/tests/cfi/test_cfi_interface.py @@ -0,0 +1,35 @@ + +from luxtronik import ( + Parameters, + Calculations, + Visibilities, + LuxtronikSocketInterface, +) + + +class TestLuxtronikSocketInterface: + + + def test_parse(self): + lux = LuxtronikSocketInterface('host') + parameters = Parameters() + calculations = Calculations() + visibilities = Visibilities() + + n = 2000 + t = list(range(0, n + 1)) + + lux._parse(parameters, t) + p = parameters.get(n) + assert p.name == f"unknown_parameter_{n}" + assert p.raw == n + + lux._parse(calculations, t) + c = calculations.get(n) + assert c.name == f"unknown_calculation_{n}" + assert c.raw == n + + 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 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 6519d561d5506dda8dd8af5e14120a1024e14227 Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Sat, 24 Jan 2026 21:04:17 +0100 Subject: [PATCH 31/40] 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 bac883ae8ce071abaeccd13bf367f58541491a66 Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Sat, 24 Jan 2026 21:13:05 +0100 Subject: [PATCH 32/40] 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 c266f528..85f0d7ac 100644 --- a/luxtronik/definitions/inputs.py +++ b/luxtronik/definitions/inputs.py @@ -34,6 +34,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 d708774d..0bf52259 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 3830d97e101dc052e7e07ddc93d2f11bc70bc4d7 Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Sat, 24 Jan 2026 22:20:38 +0100 Subject: [PATCH 33/40] wip, multiple fields per register --- luxtronik/collections.py | 8 + luxtronik/definitions/__init__.py | 15 +- luxtronik/definitions/holdings.py | 300 ++++++++++++++++++------------ luxtronik/definitions/inputs.py | 214 +++++++++++++++------ 4 files changed, 360 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 85f0d7ac..13ce5244 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, @@ -38,6 +39,71 @@ } 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, @@ -47,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, @@ -67,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, @@ -87,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, @@ -103,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, @@ -119,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, @@ -135,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, @@ -216,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, @@ -228,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, @@ -346,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, @@ -489,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, @@ -502,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, @@ -539,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, @@ -553,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, @@ -567,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 0e690220e406eae38ccdcccad183b8403b6885a1 Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Sat, 24 Jan 2026 22:33:14 +0100 Subject: [PATCH 34/40] 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 b85d9513842167dc51caaf3ebca2e5082d09672c Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Sat, 24 Jan 2026 22:41:11 +0100 Subject: [PATCH 35/40] 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 7756fd3e3a8159a8d31431cd61f89b10cf164a7a Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Sat, 24 Jan 2026 22:52:21 +0100 Subject: [PATCH 36/40] 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 fa245728d87dec3906133d366d1ac2ed4a555435 Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Sat, 24 Jan 2026 22:56:47 +0100 Subject: [PATCH 37/40] 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 dddafa6a..756d1643 100644 --- a/luxtronik/definitions/__init__.py +++ b/luxtronik/definitions/__init__.py @@ -245,7 +245,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 3461c8ce0c5b3b0c18cc14861295a5336261d36c Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Sat, 24 Jan 2026 22:58:21 +0100 Subject: [PATCH 38/40] 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 050c9c84677401bdcc58a3a57b6d74019d56c997 Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Sat, 24 Jan 2026 23:15:44 +0100 Subject: [PATCH 39/40] wip --- luxtronik/definitions/calculations.py | 10 ++++++++++ luxtronik/definitions/parameters.py | 24 ++++++++++++++++++++++++ tests/test_LuxtronikData.py | 10 +++++----- tests/test_socket_interaction.py | 7 ++++++- 4 files changed, 45 insertions(+), 6 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 0bf52259..4a0632b1 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 bb327e13..f1e2bb62 100644 --- a/tests/test_LuxtronikData.py +++ b/tests/test_LuxtronikData.py @@ -65,11 +65,11 @@ 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"]), - ("calc", 241, ["HUP_PWM", "Circulation_Pump", "Unknown_Calculation_241"]), - ("visi", 182, ["ID_Visi_Heizung_Zeitschaltprogramm", "ID_Visi_Heizung_Zeitschlaltprogramm", "Unknown_Visibility_182"]), + ("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"]), ]) def test_obsolete(self, vector, index, names): 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 ef7aeb573aa8900b0eb10f43f58f2735631012e0 Mon Sep 17 00:00:00 2001 From: Guzz-T Date: Sat, 24 Jan 2026 23:17:31 +0100 Subject: [PATCH 40/40] 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