"""constants for Wolf ISM8 API"""

import datetime

ISM_HEADER = b"\x06\x20\xf0\x80"
ISM_CONN_HEADER = b"\x04\x00\x00\x00"
ISM_SERVICE_RECEIVE = b"\xF0\x06"
ISM_SERVICE_ACK = b"\xF0\x86"
ISM_SERVICE_TRANSMIT = b"\xF0\xC1"
ISM_SERVICE_READ_ALL = b"\xF0\xD0"
ISM_ACK_DP_OBJ = b"\x00\x00" + b"\x00\x00" + b"\x00"
ISM_ACK_DP_MSG = (
    ISM_HEADER + b"\x00\x11" + ISM_CONN_HEADER + ISM_SERVICE_ACK + ISM_ACK_DP_OBJ
)
ISM_REQ_DP_MSG = ISM_HEADER + b"\x00\x16" + ISM_CONN_HEADER + ISM_SERVICE_READ_ALL
# constant byte arrays for creating ISM8 network messages
# Msg: ISM_HEADER || bytearray(LENGTH_MSG) || ISM_CONN_HEADER || ISM_SERVICE_XX ||

IX_DEVICENAME = 0
# index of Wolf ISM main device name
IX_NAME = 1
# index of datapoint name
IX_TYPE = 2
# index of datapoint type (as described in Wolf API)
IX_RW_FLAG = 3
# index of R/W-flag (writing not implemented so far)

DATAPOINTS = {
    1: ("Heizgeraet1", "Stoerung", "DPT_Switch", False),
    2: ("Heizgeraet1", "Betriebsart", "DPT_HVACContrMode", False),
    3: ("Heizgeraet1", "Brennerleistung", "DPT_Scaling", False),
    4: ("Heizgeraet1", "Kesseltemperatur", "DPT_Value_Temp", False),
    5: ("Heizgeraet1", "Sammlertemperatur", "DPT_Value_Temp", False),
    6: ("Heizgeraet1", "Ruecklauftemperatur", "DPT_Value_Temp", False),
    7: ("Heizgeraet1", "Warmwassertemperatur", "DPT_Value_Temp", False),
    8: ("Heizgeraet1", "Aussentemperatur", "DPT_Value_Temp", False),
    9: ("Heizgeraet1", "Status Brenner", "DPT_Switch", False),
    10: ("Heizgeraet1", "Status Heizkreispumpe", "DPT_Switch", False),
    11: ("Heizgeraet1", "Status Speicherladepumpe", "DPT_Switch", False),
    12: ("Heizgeraet1", "Status 3W-Umschaltventil", "DPT_OpenClose", False),
    13: ("Heizgeraet1", "Anlagendruck", "DPT_Value_Pres", False),
    14: ("Heizgeraet2", "Stoerung", "DPT_Switch", False),
    15: ("Heizgeraet2", "Betriebsart", "DPT_HVACContrMode", False),
    16: ("Heizgeraet2", "Brennerleistung", "DPT_Scaling", False),
    17: ("Heizgeraet2", "Kesseltemperatur", "DPT_Value_Temp", False),
    18: ("Heizgeraet2", "Sammlertemperatur", "DPT_Value_Temp", False),
    19: ("Heizgeraet2", "Ruecklauftemperatur", "DPT_Value_Temp", False),
    20: ("Heizgeraet2", "Warmwassertemperatur", "DPT_Value_Temp", False),
    21: ("Heizgeraet2", "Aussentemperatur", "DPT_Value_Temp", False),
    22: ("Heizgeraet2", "Status Brenner", "DPT_Switch", False),
    23: ("Heizgeraet2", "Status Heizkreispumpe", "DPT_Switch", False),
    24: ("Heizgeraet2", "Status Speicherladepumpe", "DPT_Switch", False),
    25: ("Heizgeraet2", "Status 3W-Umschaltventil", "DPT_OpenClose", False),
    26: ("Heizgeraet2", "Anlagendruck", "DPT_Value_Pres", False),
    27: ("Heizgeraet3", "Stoerung", "DPT_Switch", False),
    28: ("Heizgeraet3", "Betriebsart", "DPT_HVACContrMode", False),
    29: ("Heizgeraet3", "Brennerleistung", "DPT_Scaling", False),
    30: ("Heizgeraet3", "Kesseltemperatur", "DPT_Value_Temp", False),
    31: ("Heizgeraet3", "Sammlertemperatur", "DPT_Value_Temp", False),
    32: ("Heizgeraet3", "Ruecklauftemperatur", "DPT_Value_Temp", False),
    33: ("Heizgeraet3", "Warmwassertemperatur", "DPT_Value_Temp", False),
    34: ("Heizgeraet3", "Aussentemperatur", "DPT_Value_Temp", False),
    35: ("Heizgeraet3", "Status Brenner", "DPT_Switch", False),
    36: ("Heizgeraet3", "Status Heizkreispumpe", "DPT_Switch", False),
    37: ("Heizgeraet3", "Status Speicherladepumpe", "DPT_Switch", False),
    38: ("Heizgeraet3", "Status 3W-Umschaltventil", "DPT_OpenClose", False),
    39: ("Heizgeraet3", "Anlagendruck", "DPT_Value_Pres", False),
    40: ("Heizgeraet4", "Stoerung", "DPT_Switch", False),
    41: ("Heizgeraet4", "Betriebsart", "DPT_HVACContrMode", False),
    42: ("Heizgeraet4", "Brennerleistung", "DPT_Scaling", False),
    43: ("Heizgeraet4", "Kesseltemperatur", "DPT_Value_Temp", False),
    44: ("Heizgeraet4", "Sammlertemperatur", "DPT_Value_Temp", False),
    45: ("Heizgeraet4", "Ruecklauftemperatur", "DPT_Value_Temp", False),
    46: ("Heizgeraet4", "Warmwassertemperatur", "DPT_Value_Temp", False),
    47: ("Heizgeraet4", "Aussentemperatur", "DPT_Value_Temp", False),
    48: ("Heizgeraet4", "Status Brenner", "DPT_Switch", False),
    49: ("Heizgeraet4", "Status Heizkreispumpe", "DPT_Switch", False),
    50: ("Heizgeraet4", "Status Speicherladepumpe", "DPT_Switch", False),
    51: ("Heizgeraet4", "Status 3W-Umschaltventil", "DPT_OpenClose", False),
    52: ("Heizgeraet4", "Anlagendruck", "DPT_Value_Pres", False),
    53: ("Systembedienmodul", "Stoerung", "DPT_Switch", False),
    54: ("Systembedienmodul", "Aussentemperatur", "DPT_Value_Temp", False),
    55: ("Direkter_Heizkreis_WW", "Raumtemperatur", "DPT_Value_Temp", False),
    56: ("Direkter_Heizkreis_WW", "Warmwassersolltemperatur", "DPT_Value_Temp", True),
    57: ("Direkter_Heizkreis_WW", "Programmwahl Heizkreis", "DPT_HVACMode", True),
    58: ("Direkter_Heizkreis_WW", "Programmwahl Warmwasser", "DPT_DHWMode", True),
    59: ("Direkter_Heizkreis_WW", "Heizkreis Zeitprogramm 1", "DPT_Switch", True),
    60: ("Direkter_Heizkreis_WW", "Heizkreis Zeitprogramm 2", "DPT_Switch", True),
    61: ("Direkter_Heizkreis_WW", "Heizkreis Zeitprogramm 3", "DPT_Switch", True),
    62: ("Direkter_Heizkreis_WW", "Warmwasser Zeitprogramm 1", "DPT_Switch", True),
    63: ("Direkter_Heizkreis_WW", "Warmwasser Zeitprogramm 2", "DPT_Switch", True),
    64: ("Direkter_Heizkreis_WW", "Warmwasser Zeitprogramm 3", "DPT_Switch", True),
    65: ("Direkter_Heizkreis_WW", "Sollwertkorrektur", "DPT_Tempd", True),
    66: ("Direkter_Heizkreis_WW", "Sparfaktor", "DPT_Tempd", True),
    68: ("Mischerkreis1", "Raumtemperatur", "DPT_Value_Temp", False),
    69: ("Mischerkreis1", "Warmwassersolltemperatur", "DPT_Value_Temp", True),
    70: ("Mischerkreis1", "Programmwahl Mischer", "DPT_HVACMode", True),
    71: ("Mischerkreis1", "Programmwahl Warmwasser", "DPT_DHWMode", True),
    72: ("Mischerkreis1", "Mischer Zeitprogramm 1", "DPT_Switch", True),
    73: ("Mischerkreis1", "Mischer Zeitprogramm 2", "DPT_Switch", True),
    74: ("Mischerkreis1", "Mischer Zeitprogramm 3", "DPT_Switch", True),
    75: ("Mischerkreis1", "Warmwasser Zeitprogramm 1", "DPT_Switch", True),
    76: ("Mischerkreis1", "Warmwasser Zeitprogramm 2", "DPT_Switch", True),
    77: ("Mischerkreis1", "Warmwasser Zeitprogramm 3", "DPT_Switch", True),
    78: ("Mischerkreis1", "Sollwertkorrektur", "DPT_Tempd", True),
    79: ("Mischerkreis1", "Sparfaktor", "DPT_Tempd", True),
    82: ("Mischerkreis2", "Warmwassersolltemperatur", "DPT_Value_Temp", True),
    83: ("Mischerkreis2", "Programmwahl Mischer", "DPT_HVACMode", True),
    84: ("Mischerkreis2", "Programmwahl Warmwasser", "DPT_DHWMode", True),
    85: ("Mischerkreis2", "Mischer Zeitprogramm 1", "DPT_Switch", True),
    86: ("Mischerkreis2", "Mischer Zeitprogramm 2", "DPT_Switch", True),
    87: ("Mischerkreis2", "Mischer Zeitprogramm 3", "DPT_Switch", True),
    88: ("Mischerkreis2", "Warmwasser Zeitprogramm 1", "DPT_Switch", True),
    89: ("Mischerkreis2", "Warmwasser Zeitprogramm 2", "DPT_Switch", True),
    90: ("Mischerkreis2", "Warmwasser Zeitprogramm 3", "DPT_Switch", True),
    91: ("Mischerkreis2", "Sollwertkorrektur", "DPT_Tempd", True),
    92: ("Mischerkreis2", "Sparfaktor", "DPT_Tempd", True),
    94: ("Mischerkreis3", "Raumtemperatur", "DPT_Value_Temp", False),
    95: ("Mischerkreis3", "Warmwassersolltemperatur", "DPT_Value_Temp", True),
    96: ("Mischerkreis3", "Programmwahl Mischer", "DPT_HVACMode", True),
    97: ("Mischerkreis3", "Programmwahl Warmwasser", "DPT_DHWMode", True),
    98: ("Mischerkreis3", "Mischer Zeitprogramm 1", "DPT_Switch", True),
    99: ("Mischerkreis3", "Mischer Zeitprogramm 2", "DPT_Switch", True),
    100: ("Mischerkreis3", "Mischer Zeitprogramm 3", "DPT_Switch", True),
    101: ("Mischerkreis3", "Warmwasser Zeitprogramm 1", "DPT_Switch", True),
    102: ("Mischerkreis3", "Warmwasser Zeitprogramm 2", "DPT_Switch", True),
    103: ("Mischerkreis3", "Warmwasser Zeitprogramm 3", "DPT_Switch", True),
    104: ("Mischerkreis3", "Sollwertkorrektur", "DPT_Tempd", True),
    105: ("Mischerkreis3", "Sparfaktor", "DPT_Tempd", True),
    106: ("Kaskadenmodul", "Stoerung", "DPT_Switch", False),
    107: ("Kaskadenmodul", "Sammlertemperatur", "DPT_Value_Temp", False),
    108: ("Kaskadenmodul", "Gesamtmodulationsgrad", "DPT_Scaling", False),
    109: ("Kaskadenmodul", "Vorlauftemperatur Mischer", "DPT_Value_Temp", False),
    110: ("Kaskadenmodul", "Status Mischerkreispumpe", "DPT_Switch", False),
    111: ("Kaskadenmodul", "Status Ausgang A1", "DPT_Enable", False),
    112: ("Kaskadenmodul", "Eingang E1", "DPT_Value_Temp", False),
    113: ("Kaskadenmodul", "Eingang E2", "DPT_Value_Temp", False),
    114: ("Mischermodul1", "Stoerung", "DPT_Switch", False),
    115: ("Mischermodul1", "Warmwassertemperatur", "DPT_Value_Temp", False),
    116: ("Mischermodul1", "Vorlauftemperatur Mischer", "DPT_Value_Temp", False),
    117: ("Mischermodul1", "Status Mischerkreispumpe", "DPT_Switch", False),
    118: ("Mischermodul1", "Status Ausgang A1", "DPT_Enable", False),
    119: ("Mischermodul1", "Eingang E1", "DPT_Value_Temp", False),
    120: ("Mischermodul1", "Eingang E2", "DPT_Value_Temp", False),
    121: ("Mischermodul2", "Stoerung", "DPT_Switch", False),
    122: ("Mischermodul2", "Warmwassertemperatur", "DPT_Value_Temp", False),
    123: ("Mischermodul2", "Vorlauftemperatur Mischer", "DPT_Value_Temp", False),
    124: ("Mischermodul2", "Status Mischerkreispumpe", "DPT_Switch", False),
    125: ("Mischermodul2", "Status Ausgang A1", "DPT_Enable", False),
    126: ("Mischermodul2", "Eingang E1", "DPT_Value_Temp", False),
    127: ("Mischermodul2", "Eingang E2", "DPT_Value_Temp", False),
    128: ("Mischermodul3", "Stoerung", "DPT_Switch", False),
    129: ("Mischermodul3", "Warmwassertemperatur", "DPT_Value_Temp", False),
    130: ("Mischermodul3", "Vorlauftemperatur Mischer", "DPT_Value_Temp", False),
    131: ("Mischermodul3", "Status Mischerkreispumpe", "DPT_Switch", False),
    132: ("Mischermodul3", "Status Ausgang A1", "DPT_Enable", False),
    133: ("Mischermodul3", "Eingang E1", "DPT_Value_Temp", False),
    134: ("Mischermodul3", "Eingang E2", "DPT_Value_Temp", False),
    135: ("Solarmodul", "Stoerung", "DPT_Switch", False),
    136: ("Solarmodul", "Warmwassertemperatur Solar 1", "DPT_Value_Temp", False),
    137: ("Solarmodul", "Temperatur Kollektor 1", "DPT_Value_Temp", False),
    138: ("Solarmodul", "Eingang E1", "DPT_Value_Temp", False),
    139: ("Solarmodul", "Eingang E2 (Durchfluss)", "DPT_Value_Volume_Flow", False),
    140: ("Solarmodul", "Eingang E3", "DPT_Value_Temp", False),
    141: ("Solarmodul", "Status Solarkreispumpe SKP1", "DPT_Switch", False),
    142: ("Solarmodul", "Status Ausgang A1", "DPT_Enable", False),
    143: ("Solarmodul", "Status Ausgang A2", "DPT_Enable", False),
    144: ("Solarmodul", "Status Ausgang A3", "DPT_Enable", False),
    145: ("Solarmodul", "Status Ausgang A4", "DPT_Enable", False),
    146: ("Solarmodul", "Durchfluss", "DPT_Value_Volume_Flow", False),
    147: ("Solarmodul", "aktuelle Leistung", "DPT_Power", False),
    148: ("CWL_Wohnraumlueftung", "Stoerung", "DPT_Switch", False),
    149: ("CWL_Wohnraumlueftung", "Programm", "DPT_HVACMode_CWL", True),
    150: ("CWL_Wohnraumlueftung", "Zeitprogramm 1", "DPT_Switch", True),
    151: ("CWL_Wohnraumlueftung", "Zeitprogramm 2", "DPT_Switch", True),
    152: ("CWL_Wohnraumlueftung", "Zeitprogramm 3", "DPT_Switch", True),
    153: ("CWL_Wohnraumlueftung", "Intensivlueftung AN_AUS", "DPT_Switch", True),
    154: ("CWL_Wohnraumlueftung", "Intensivlueftung Startdatum", "DPT_Date", True),
    155: ("CWL_Wohnraumlueftung", "Intensivlueftung Enddatum", "DPT_Date", True),
    156: ("CWL_Wohnraumlueftung", "Intensivlueftung Startzeit", "DPT_TimeOfDay", True),
    157: ("CWL_Wohnraumlueftung", "Intensivlueftung Endzeit", "DPT_TimeOfDay", True),
    158: ("CWL_Wohnraumlueftung", "Feuchteschutz AN_AUS", "DPT_Switch", True),
    159: ("CWL_Wohnraumlueftung", "Feuchteschutz Startdatum", "DPT_Date", True),
    160: ("CWL_Wohnraumlueftung", "Feuchteschutz Enddatum", "DPT_Date", True),
    161: ("CWL_Wohnraumlueftung", "Feuchteschutz Startzeit", "DPT_TimeOfDay", True),
    162: ("CWL_Wohnraumlueftung", "Feuchteschutz Endzeit", "DPT_TimeOfDay", True),
    163: ("CWL_Wohnraumlueftung", "Lueftungsstufe", "DPT_Scaling", False),
    164: ("CWL_Wohnraumlueftung", "Ablufttemperatur", "DPT_Value_Temp", False),
    165: ("CWL_Wohnraumlueftung", "Frischlufttemperatur", "DPT_Value_Temp", False),
    166: ("CWL_Wohnraumlueftung", "Durchsatz Zuluft", "DPT_FlowRate_m3/h", False),
    167: ("CWL_Wohnraumlueftung", "Durchsatz Abluft", "DPT_FlowRate_m3/h", False),
    168: ("CWL_Wohnraumlueftung", "Bypass Initialisierung", "DPT_Bool", False),
    169: ("CWL_Wohnraumlueftung", "Bypass offen", "DPT_Bool", False),
    170: ("CWL_Wohnraumlueftung", "Bypass geschlossen", "DPT_Bool", False),
    171: ("CWL_Wohnraumlueftung", "Bypass Fehler", "DPT_Bool", False),
    172: ("CWL_Wohnraumlueftung", "Frost Status: Init_Warte", "DPT_Bool", False),
    173: ("CWL_Wohnraumlueftung", "Frost Status: Kein Frost", "DPT_Bool", False),
    174: ("CWL_Wohnraumlueftung", "Frost Status: Vorwaermer", "DPT_Bool", False),
    175: ("CWL_Wohnraumlueftung", "Frost Status: Fehler", "DPT_Bool", False),
    176: ("Waermepumpe", "Stoerung", "DPT_Switch", False),
    177: ("Waermepumpe", "Betriebsart", "DPT_HVACContrMode", False),
    178: ("Waermepumpe", "Heizleistung", "DPT_Power", False),
    179: ("Waermepumpe", "Kuehlleistung", "DPT_Power", False),
    180: ("Waermepumpe", "Kesseltemperatur", "DPT_Value_Temp", False),
    181: ("Waermepumpe", "Sammlertemperatur", "DPT_Value_Temp", False),
    182: ("Waermepumpe", "Ruecklauftemperatur", "DPT_Value_Temp", False),
    183: ("Waermepumpe", "Warmwassertemperatur", "DPT_Value_Temp", False),
    184: ("Waermepumpe", "Aussentemperatur", "DPT_Value_Temp", False),
    185: ("Waermepumpe", "Status Heizkreispumpe", "DPT_Switch", False),
    186: ("Waermepumpe", "Status Aux-Pumpe", "DPT_Switch", False),
    187: ("Waermepumpe", "3W-Umschaltventil HZ_WW", "DPT_OpenClose", False),
    188: ("Waermepumpe", "3W-Umschaltventil HZ_K", "DPT_OpenClose", False),
    189: ("Waermepumpe", "Status E-Heizung", "DPT_Switch", False),
    190: ("Waermepumpe", "Anlagendruck", "DPT_Value_Pres", False),
    191: ("Waermepumpe", "Leistungsaufnahme", "DPT_Power", False),
    192: ("CWL_Wohnraumlueftung", "Filterwarnung aktiv", "DPT_Switch", False),
    193: ("CWL_Wohnraumlueftung", "Filterwarnung zuruecksetzen", "DPT_Switch", True),
    194: ("Systembedienmodul", "1x Warmwasserladung (global)", "DPT_Switch", True),
    195: ("Solarmodul", "Tagesertrag", "DPT_ActiveEnergy", False),
    196: ("Solarmodul", "Gesamtertrag", "DPT_ActiveEnergy_kWh", False),
    197: ("Heizgeraet1", "Abgastemperatur", "DPT_Value_Temp", False),
    198: ("Heizgeraet1", "Leistungsvorgabe", "DPT_Scaling", True),
    199: ("Heizgeraet1", "Kesseltemperaturvorgabe", "DPT_Value_Temp", True),
    200: ("Heizgeraet2", "Abgastemperatur", "DPT_Value_Temp", False),
    201: ("Heizgeraet2", "Leistungsvorgabe", "DPT_Scaling", True),
    202: ("Heizgeraet2", "Kesseltemperaturvorgabe", "DPT_Value_Temp", True),
    203: ("Heizgeraet3", "Abgastemperatur", "DPT_Value_Temp", False),
    204: ("Heizgeraet3", "Leistungsvorgabe", "DPT_Scaling", True),
    205: ("Heizgeraet3", "Kesseltemperaturvorgabe", "DPT_Value_Temp", True),
    206: ("Heizgeraet4", "Abgastemperatur", "DPT_Value_Temp", False),
    207: ("Heizgeraet4", "Leistungsvorgabe", "DPT_Scaling", True),
    208: ("Heizgeraet4", "Kesseltemperaturvorgabe", "DPT_Value_Temp", True),
    209: ("Kaskadenmodul", "Gesamtmodulationsgradvorgabe", "DPT_Scaling", True),
    210: ("Kaskadenmodul", "Sammlertemperaturvorgabe", "DPT_Value_Temp", True),
    211: ("Kaskadenmodul", "Betriebsart Heizen/Kuehlen", "DPT_Switch", False),
    251: ("Bedienmodul_BM2", "Erkennung HK_MK", "DPT_Value_1_Ucount", False),
    336: ("undok_Daten", "undokumentiert_336", "DPT_unknown", False),
    337: ("undok_Daten", "undokumentiert_337", "DPT_unknown", False),
    338: ("undok_Daten", "undokumentiert_338", "DPT_unknown", False),
    339: ("undok_Daten", "undokumentiert_339", "DPT_unknown", False),
    340: ("undok_Daten", "undokumentiert_340", "DPT_unknown", False),
    341: ("undok_Daten", "undokumentiert_341", "DPT_unknown", False),
    342: ("undok_Daten", "undokumentiert_342", "DPT_unknown", False),
    343: ("undok_Daten", "undokumentiert_343", "DPT_unknown", False),
    344: ("undok_Daten", "undokumentiert_344", "DPT_unknown", False),
    345: ("undok_Daten", "undokumentiert_345", "DPT_unknown", False),
    346: ("undok_Daten", "undokumentiert_346", "DPT_unknown", False),
    347: ("undok_Daten", "undokumentiert_347", "DPT_unknown", False),
    348: ("undok_Daten", "undokumentiert_348", "DPT_unknown", False),
    349: ("undok_Daten", "undokumentiert_349", "DPT_unknown", False),
    350: ("undok_Daten", "undokumentiert_350", "DPT_unknown", False),
    351: ("undok_Daten", "undokumentiert_351", "DPT_unknown", False),
    352: ("undok_Daten", "undokumentiert_352", "DPT_unknown", False),
    353: ("undok_Daten", "undokumentiert_353", "DPT_unknown", False),
    354: ("undok_Daten", "undokumentiert_354", "DPT_unknown", False),
    362: ("undok_Daten", "undokumentiert_362", "DPT_unknown", False),
    363: ("undok_Daten", "undokumentiert_363", "DPT_unknown", False),
    355: ("Bedienmodul_BM2", "Erkennung_Geraete_1", "DPT_Value_2_Ucount", False),
    356: ("Bedienmodul_BM2", "Erkennung_Geraete_2", "DPT_Value_2_Ucount", False),
    357: ("Bedienmodul_BM2", "Unterscheidung_Typ_HG1", "DPT_Value_1_Ucount", False),
    358: ("Bedienmodul_BM2", "Erkennung_WW_Kreise", "DPT_Value_1_Ucount", False),
    359: ("Bedienmodul_BM2", "Unterscheidung_Typ_HG2", "DPT_Value_1_Ucount", False),
    360: ("Bedienmodul_BM2", "Unterscheidung_Typ_HG3", "DPT_Value_1_Ucount", False),
    361: ("Bedienmodul_BM2", "Unterscheidung_Typ_HG4", "DPT_Value_1_Ucount", False),
    364: ("Heizgeraet1", "Kesselsolltemperatur", "DPT_Value_Temp", False),
    365: ("Heizgeraet2", "Kesselsolltemperatur", "DPT_Value_Temp", False),
    366: ("Heizgeraet3", "Kesselsolltemperatur", "DPT_Value_Temp", False),
    367: ("Heizgeraet4", "Kesselsolltemperatur", "DPT_Value_Temp", False),
    368: ("Direkter_Heizkreis_WW", "Vorlaufsolltemperatur HK", "DPT_Value_Temp", False),
    369: ("Mischermodul1", "Mischersolltemperatur", "DPT_Value_Temp", False),
    370: ("Mischermodul2", "Mischersolltemperatur", "DPT_Value_Temp", False),
    371: ("Mischermodul3", "Mischersolltemperatur", "DPT_Value_Temp", False),
    372: ("Systembedienmodul", "Letzter Stoercode", "DPT_Value_1_Ucount", False),
    212: ("Waermepumpe2", "Stoerung", "DPT_Switch", False),
    213: ("Waermepumpe2", "Betriebsart", "DPT_HVACContrMode", False),
    214: ("Waermepumpe2", "Heizleistung", "DPT_Power", False),
    215: ("Waermepumpe2", "Kuehlleistung", "DPT_Power", False),
    216: ("Waermepumpe2", "Kesseltemperatur", "DPT_Value_Temp", False),
    217: ("Waermepumpe2", "Ruecklauftemperatur", "DPT_Value_Temp", False),
    218: ("Waermepumpe2", "Status Heizkreispumpe", "DPT_Switch", False),
    219: ("Waermepumpe2", "Status Aux-Pumpe", "DPT_Switch", False),
    220: ("Waermepumpe2", "3W-Umschaltventil HZ_WW", "DPT_OpenClose", False),
    221: ("Waermepumpe2", "3W-Umschaltventil HZ_K", "DPT_OpenClose", False),
    222: ("Waermepumpe2", "Status E-Heizung", "DPT_Switch", False),
    223: ("Waermepumpe2", "Anlagendruck", "DPT_Value_Pres", False),
    224: ("Waermepumpe2", "Leistungsaufnahme", "DPT_Power", False),
    225: ("Waermepumpe3", "Stoerung", "DPT_Switch", False),
    226: ("Waermepumpe3", "Betriebsart", "DPT_HVACContrMode", False),
    227: ("Waermepumpe3", "Heizleistung", "DPT_Power", False),
    228: ("Waermepumpe3", "Kuehlleistung", "DPT_Power", False),
    229: ("Waermepumpe3", "Kesseltemperatur", "DPT_Value_Temp", False),
    230: ("Waermepumpe3", "Ruecklauftemperatur", "DPT_Value_Temp", False),
    231: ("Waermepumpe3", "Status Heizkreispumpe", "DPT_Switch", False),
    232: ("Waermepumpe3", "Status Aux-Pumpe", "DPT_Switch", False),
    233: ("Waermepumpe3", "3W-Umschaltventil HZ_WW", "DPT_OpenClose", False),
    234: ("Waermepumpe3", "3W-Umschaltventil HZ_K", "DPT_OpenClose", False),
    235: ("Waermepumpe3", "Status E-Heizung", "DPT_Switch", False),
    236: ("Waermepumpe3", "Anlagendruck", "DPT_Value_Pres", False),
    237: ("Waermepumpe3", "Leistungsaufnahme", "DPT_Power", False),
    238: ("Waermepumpe4", "Stoerung", "DPT_Switch", False),
    239: ("Waermepumpe4", "Betriebsart", "DPT_HVACContrMode", False),
    240: ("Waermepumpe4", "Heizleistung", "DPT_Power", False),
    241: ("Waermepumpe4", "Kuehlleistung", "DPT_Power", False),
    242: ("Waermepumpe4", "Kesseltemperatur", "DPT_Value_Temp", False),
    243: ("Waermepumpe4", "Ruecklauftemperatur", "DPT_Value_Temp", False),
    244: ("Waermepumpe4", "Status Heizkreispumpe", "DPT_Switch", False),
    245: ("Waermepumpe4", "Status Aux-Pumpe", "DPT_Switch", False),
    246: ("Waermepumpe4", "3W-Umschaltventil HZ_WW", "DPT_OpenClose", False),
    247: ("Waermepumpe4", "3W-Umschaltventil HZ_K", "DPT_OpenClose", False),
    248: ("Waermepumpe4", "Status E-Heizung", "DPT_Switch", False),
    249: ("Waermepumpe4", "Anlagendruck", "DPT_Value_Pres", False),
    250: ("Waermepumpe4", "Leistungsaufnahme", "DPT_Power", False),
    767: ("undok_Daten", "undokumentiert_767", "DPT_unknown", False),
}

HVACModes = {
    0: "Automatikbetrieb",
    1: "Heizbetrieb",
    2: "Standby",
    3: "Sparbetrieb",
    4: "Gebäudeschutz",
    6: "Permanentbetrieb kühlen",
    7: "Automatikbetrieb heizen",
    8: "Automatikbetrieb kühlen",
}

HVACModes_CWL = {
    0: "Automatikbetrieb",
    1: "Nennlüftung",
    2: "Standby",
    3: "Red. Lüftung",
    4: "Feuchteschutz",
}

HVACContrModes = {
    0: "Auto",
    1: "Heizbetrieb",
    2: "Vorwärmung",
    3: "Aktive Kühlung",
    4: "Night Purge",
    5: "Precool",
    6: "Standby",
    7: "Test",
    8: "Emergency Heat",
    9: "Fan Only",
    10: "Free Cool",
    11: "Frostschutz",
    12: "Maximum Heating Mode",
    13: "Economic Heat/Cool Mode",
    14: "Dehumidification",
    15: "Kalibration",
    16: "Emergency Cool Mode",
    17: "Emergency Steam Mode",
    20: "NoDem",
}

DHWModes = {
    0: "Automatikbetrieb",
    1: "LegioProtect",
    2: "Dauerbetrieb",
    3: "Reduced",
    4: "Standby",
}

DP_VALUES_ALLOWED = {
    56: tuple(range(20, 81, 1)),
    57: tuple(HVACModes.values()),
    58: (DHWModes[0], DHWModes[2], DHWModes[4]),
    59: (0, 1),
    60: (0, 1),
    61: (0, 1),
    62: (0, 1),
    63: (0, 1),
    64: (0, 1),
    65: tuple([(i / 10) for i in range(-40, 45, 5)]),
    66: tuple([(i / 10) for i in range(0, 105, 5)]),
    69: tuple(range(20, 81, 1)),
    70: tuple(HVACModes.values()),
    71: (DHWModes[0], DHWModes[2], DHWModes[4]),
    72: (0, 1),
    73: (0, 1),
    74: (0, 1),
    75: (0, 1),
    76: (0, 1),
    77: (0, 1),
    78: tuple([(i / 10) for i in range(-40, 45, 5)]),
    79: tuple([(i / 10) for i in range(0, 105, 5)]),
    82: tuple(range(20, 81, 1)),
    83: tuple(HVACModes.values()),
    84: (DHWModes[0], DHWModes[2], DHWModes[4]),
    85: (0, 1),
    86: (0, 1),
    87: (0, 1),
    88: (0, 1),
    89: (0, 1),
    90: (0, 1),
    91: tuple([(i / 10) for i in range(-40, 45, 5)]),
    92: tuple([(i / 10) for i in range(0, 105, 5)]),
    95: tuple(range(20, 81, 1)),
    96: tuple(HVACModes.values()),
    97: (DHWModes[0], DHWModes[2], DHWModes[4]),
    98: (0, 1),
    99: (0, 1),
    100: (0, 1),
    101: (0, 1),
    102: (0, 1),
    103: (0, 1),
    104: tuple([(i / 10) for i in range(-40, 45, 5)]),
    105: tuple([(i / 10) for i in range(0, 105, 5)]),
    149: tuple(HVACModes_CWL.values()),
    150: (0, 1),
    151: (0, 1),
    152: (0, 1),
    153: (0, 1),
    154: (datetime.date(1900, 1, 1), datetime.date(2099, 12, 31)),
    155: (datetime.date(1900, 1, 1), datetime.date(2099, 12, 31)),
    156: (datetime.time(0, 0, 0), datetime.time(23, 59, 59)),
    157: (datetime.time(0, 0, 0), datetime.time(23, 59, 59)),
    158: (0, 1),
    159: (datetime.date(2000, 1, 1), datetime.date(2099, 12, 31)),
    160: (datetime.date(2000, 1, 1), datetime.date(2099, 12, 31)),
    161: (datetime.time(0, 0, 0), datetime.time(23, 59, 59)),
    162: (datetime.time(0, 0, 0), datetime.time(23, 59, 59)),
    193: (0, 1),
    194: (0, 1),
    198: tuple(range(0, 101, 1)),
    199: tuple(range(0, 90, 1)),
    201: tuple(range(0, 101, 1)),
    202: tuple(range(0, 90, 1)),
    204: tuple(range(0, 101, 1)),
    205: tuple(range(0, 90, 1)),
    207: tuple(range(0, 101, 1)),
    208: tuple(range(0, 90, 1)),
    209: tuple(range(0, 101, 1)),
    210: tuple(range(0, 90, 1)),
    211: (0, 1),
}

# index into DATATYPE DICTIONARY
DT_MIN = 0
# index of min value allowed by datatype according to ism8 doc
DT_MAX = 1
# index of max value allowed by datatype according to ism8 doc
DT_PYTHONTYPE = 2
# index of python datatype
DT_STEP = 3
# index of step value according to ism8 doc
DT_UNIT = 4
# index of datatype unit according to ism8 doc
DT_LENGTH = 5
# index of length in bytes according to ism8 doc

DATATYPES = {
    "DPT_Switch": (0, 1, int, 1, None, 1),
    "DPT_Bool": (0, 1, int, 1, None, 1),
    "DPT_Enable": (0, 1, int, 1, None, 1),
    "DPT_OpenClose": (0, 1, int, 1, None, 1),
    "DPT_Scaling": (0.00, 100.00, float, 100 / 255, "%", 1),
    "DPT_Value_1_Ucount": (0, 255, int, 1, None, 1),
    "DPT_Value_2_Ucount": (0, 65535, int, 1, None, 2),
    "DPT_Value_Temp": (-273.00, 670760.00, float, 1 / 100, "C", 2),
    "DPT_Value_Tempd": (-670760.00, 670760.00, float, 1 / 100, "K", 2),
    "DPT_Tempd": (-670760.00, 670760.00, float, 1 / 100, "K", 2),
    "DPT_Value_Pres": (0, 670760.00, float, 1 / 100, "Pa", 2),
    "DPT_Power": (-670760.00, 670760.00, float, 1 / 100, "kW", 2),
    "DPT_Value_Volume_Flow": (-670760.00, 670760.00, float, 1 / 100, "l/h", 2),
    "DPT_TimeOfDay": (None, None, datetime.time, None, None, 3),
    "DPT_Date": (None, None, datetime.date, None, None, 3),
    "DPT_FlowRate_m3/h": (-2147483647, 2147483647, int, 1 / 10000, "m3/h", 4),
    "DPT_ActiveEnergy": (-2147483647, 2147483647, int, 1 / 10000, "Wh", 4),
    "DPT_ActiveEnergy_kWh": (-2147483647, 2147483647, int, 1 / 10000, "kWh", 4),
    "DPT_HVACMode": (0, 4, str, 1, None, 1),
    "DPT_HVACMode_CWL": (0, 4, str, 1, None, 1),
    "DPT_DHWMode": (0, 4, str, 1, None, 1),
    "DPT_HVACContrMode": (0, 20, str, 1, None, 1),
}
