{
  "627": {
    "12": {
      "codec": "O3EUtf8",
      "len": 12,
      "id": "CentralHeatingOneCircuitName",
      "args": {
        "desc": "",
        "info": "",
        "acc": "ro"
      }
    }
  },
  "628": {
    "12": {
      "codec": "O3EUtf8",
      "len": 12,
      "id": "CentralHeatingTwoCircuitName",
      "args": {
        "desc": "",
        "info": "",
        "acc": "ro"
      }
    }
  },
  "629": {
    "12": {
      "codec": "O3EUtf8",
      "len": 12,
      "id": "CentralHeatingThreeCircuitName",
      "args": {
        "desc": "",
        "info": "",
        "acc": "ro"
      }
    }
  },
  "630": {
    "12": {
      "codec": "O3EUtf8",
      "len": 12,
      "id": "CentralHeatingFourCircuitName",
      "args": {
        "desc": "",
        "info": "",
        "acc": "ro"
      }
    }
  },
  "1006": {
    "3": {
      "codec": "O3EComplexType",
      "len": 3,
      "id": "TargetQuickMode",
      "args": {
        "subTypes": [
          {
            "codec": "O3EByteVal",
            "len": 1,
            "id": "SetModeOneTimesHotWater",
            "args": {
              "unit": "",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EByteVal",
            "len": 1,
            "id": "State",
            "args": {
              "unit": "",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          }
        ],
        "desc": "External request for one-time charging of domestic hot water (0: off, 2: one-time request)",
        "info": "[Link](https://github.com/open3e/open3e/discussions/318)",
        "acc": "rw"
      }
    }
  },
  "1007": {
    "3": {
      "codec": "O3EComplexType",
      "len": 3,
      "id": "CurrentQuickMode",
      "args": {
        "subTypes": [
          {
            "codec": "O3EByteVal",
            "len": 1,
            "id": "ModeOneTimesHotWater",
            "args": {
              "unit": "",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EByteVal",
            "len": 1,
            "id": "State",
            "args": {
              "unit": "",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          }
        ],
        "desc": "State of external request for one-time charging of domestic hot water (0: off, 2: on)",
        "info": "[Link](https://github.com/open3e/open3e/discussions/318)",
        "acc": "ro"
      }
    }
  },
  "1008": {
    "3": {
      "codec": "O3EComplexType",
      "len": 3,
      "id": "MixerOneCircuitTargetQuickMode",
      "args": {
        "subTypes": [
          {
            "codec": "O3EByteVal",
            "len": 1,
            "id": "SetModeParty",
            "args": {
              "unit": "",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EByteVal",
            "len": 1,
            "id": "State",
            "args": {
              "unit": "",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          }
        ],
        "desc": "",
        "info": "",
        "acc": "rw"
      }
    }
  },
  "1009": {
    "3": {
      "codec": "O3EComplexType",
      "len": 3,
      "id": "MixerTwoCircuitTargetQuickMode",
      "args": {
        "subTypes": [
          {
            "codec": "O3EByteVal",
            "len": 1,
            "id": "SetModeParty",
            "args": {
              "unit": "",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EByteVal",
            "len": 1,
            "id": "State",
            "args": {
              "unit": "",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          }
        ],
        "desc": "",
        "info": "",
        "acc": "rw"
      }
    }
  },
  "1010": {
    "3": {
      "codec": "O3EComplexType",
      "len": 3,
      "id": "MixerThreeCircuitTargetQuickMode",
      "args": {
        "subTypes": [
          {
            "codec": "O3EByteVal",
            "len": 1,
            "id": "SetModeParty",
            "args": {
              "unit": "",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EByteVal",
            "len": 1,
            "id": "State",
            "args": {
              "unit": "",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          }
        ],
        "desc": "",
        "info": "",
        "acc": "rw"
      }
    }
  },
  "1011": {
    "3": {
      "codec": "O3EComplexType",
      "len": 3,
      "id": "MixerFourCircuitTargetQuickMode",
      "args": {
        "subTypes": [
          {
            "codec": "O3EByteVal",
            "len": 1,
            "id": "SetModeParty",
            "args": {
              "unit": "",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EByteVal",
            "len": 1,
            "id": "State",
            "args": {
              "unit": "",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          }
        ],
        "desc": "",
        "info": "",
        "acc": "rw"
      }
    }
  },
  "1024": {
    "3": {
      "codec": "O3EComplexType",
      "len": 3,
      "id": "MixerOneCircuitCurrentQuickMode",
      "args": {
        "subTypes": [
          {
            "codec": "O3EByteVal",
            "len": 1,
            "id": "ModeParty",
            "args": {
              "unit": "",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EByteVal",
            "len": 1,
            "id": "State",
            "args": {
              "unit": "",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          }
        ],
        "desc": "",
        "info": "",
        "acc": "ro"
      }
    }
  },
  "1025": {
    "3": {
      "codec": "O3EComplexType",
      "len": 3,
      "id": "MixerTwoCircuitCurrentQuickMode",
      "args": {
        "subTypes": [
          {
            "codec": "O3EByteVal",
            "len": 1,
            "id": "ModeParty",
            "args": {
              "unit": "",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EByteVal",
            "len": 1,
            "id": "State",
            "args": {
              "unit": "",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          }
        ],
        "desc": "",
        "info": "",
        "acc": "ro"
      }
    }
  },
  "1026": {
    "3": {
      "codec": "O3EComplexType",
      "len": 3,
      "id": "MixerThreeCircuitCurrentQuickMode",
      "args": {
        "subTypes": [
          {
            "codec": "O3EByteVal",
            "len": 1,
            "id": "ModeParty",
            "args": {
              "unit": "",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EByteVal",
            "len": 1,
            "id": "State",
            "args": {
              "unit": "",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          }
        ],
        "desc": "",
        "info": "",
        "acc": "ro"
      }
    }
  },
  "1027": {
    "3": {
      "codec": "O3EComplexType",
      "len": 3,
      "id": "MixerFourCircuitCurrentQuickMode",
      "args": {
        "subTypes": [
          {
            "codec": "O3EByteVal",
            "len": 1,
            "id": "ModeParty",
            "args": {
              "unit": "",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EByteVal",
            "len": 1,
            "id": "State",
            "args": {
              "unit": "",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          }
        ],
        "desc": "",
        "info": "",
        "acc": "ro"
      }
    }
  },
  "1603": {
    "12": {
      "codec": "O3EComplexType",
      "len": 12,
      "id": "PointOfCommonCouplingPower",
      "args": {
        "subTypes": [
          {
            "codec": "O3EInt16",
            "len": 2,
            "id": "ActivePower",
            "args": {
              "scale": 1.0,
              "signed": true,
              "decimals": 0,
              "unit": "W",
              "desc": "Active Power",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt16",
            "len": 2,
            "id": "ReactivePower",
            "args": {
              "scale": 1.0,
              "signed": true,
              "decimals": 0,
              "unit": "VA",
              "desc": "Reactive Power",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt16",
            "len": 2,
            "id": "ActivePowerDup",
            "args": {
              "scale": 1.0,
              "signed": true,
              "decimals": 0,
              "unit": "W",
              "desc": "Active Power Duplicate",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt16",
            "len": 2,
            "id": "PadZeros",
            "args": {
              "scale": 1.0,
              "signed": true,
              "decimals": 0,
              "unit": "",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt16",
            "len": 2,
            "id": "ReactivePowerDup",
            "args": {
              "scale": 1.0,
              "signed": true,
              "decimals": 0,
              "unit": "VA",
              "desc": "Reactive Power Duplicate",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt16",
            "len": 2,
            "id": "PadOnes",
            "args": {
              "scale": 1.0,
              "signed": true,
              "decimals": 0,
              "unit": "",
              "desc": "",
              "info": "",
              "acc": ""
            }
          }
        ],
        "desc": "Actual Power at Point of Common Coupling",
        "info": "",
        "acc": "ro"
      }
    }
  },
  "1884": {
    "85": {
      "codec": "O3EComplexType",
      "len": 85,
      "id": "RoomOneProperty",
      "args": {
        "subTypes": [
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_00",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EUtf8",
            "len": 38,
            "id": "Roomname",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 4,
            "id": "Unknown_39_42",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EEnum",
            "len": 1,
            "id": "Roomtype",
            "args": {
              "listStr": "Roomtypes",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EEnum",
            "len": 1,
            "id": "ChildLockActive",
            "args": {
              "listStr": "DeviceChildLockStates",
              "desc": "Room-side mirror of the child lock of the assigned TRV (1 = active); off44, was an unknown byte; proven by one-factor test",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EEnum",
            "len": 1,
            "id": "TemperatureControl",
            "args": {
              "listStr": "TemperatureControlLevels",
              "desc": "Level 1 (Eco) .. 6 (Komfort), factory default 4",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_46",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 8,
            "id": "Unknown_47_54",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "ZigbeeDeviceLinkOne",
            "args": {
              "scale": 1.0,
              "signed": false,
              "decimals": 0,
              "unit": "",
              "desc": "Linked ZigBee device #1 (1-based index, 0 = none)",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "ZigbeeDeviceLinkTwo",
            "args": {
              "scale": 1.0,
              "signed": false,
              "decimals": 0,
              "unit": "",
              "desc": "Linked ZigBee device #2 (1-based index, 0 = none)",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 18,
            "id": "Unknown_57_74",
            "args": {
              "desc": "maybe more linked zigbee devices or other room properties",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EEnum",
            "len": 1,
            "id": "WindowDetection",
            "args": {
              "listStr": "WindowDetectionStates",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 9,
            "id": "Unknown_76_84",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          }
        ],
        "desc": "DeviceLinkOne/Two: 1-based index of linked ZigBee device (0 = not linked). DID of linked device: N<=20: Property=2084+(N-1)*3, N>=21: Property=2260+(N-21)*3; Setpoint=+1, CurrentValues=+2",
        "info": "",
        "acc": "ro"
      }
    }
  },
  "1887": {
    "85": {
      "codec": "O3EComplexType",
      "len": 85,
      "id": "RoomTwoProperty",
      "args": {
        "subTypes": [
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_00",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EUtf8",
            "len": 38,
            "id": "Roomname",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 4,
            "id": "Unknown_39_42",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EEnum",
            "len": 1,
            "id": "Roomtype",
            "args": {
              "listStr": "Roomtypes",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EEnum",
            "len": 1,
            "id": "ChildLockActive",
            "args": {
              "listStr": "DeviceChildLockStates",
              "desc": "Room-side mirror of the child lock of the assigned TRV (1 = active); off44, was an unknown byte; proven by one-factor test",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EEnum",
            "len": 1,
            "id": "TemperatureControl",
            "args": {
              "listStr": "TemperatureControlLevels",
              "desc": "Level 1 (Eco) .. 6 (Komfort), factory default 4",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_46",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 8,
            "id": "Unknown_47_54",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "ZigbeeDeviceLinkOne",
            "args": {
              "scale": 1.0,
              "signed": false,
              "decimals": 0,
              "unit": "",
              "desc": "Linked ZigBee device #1 (1-based index, 0 = none)",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "ZigbeeDeviceLinkTwo",
            "args": {
              "scale": 1.0,
              "signed": false,
              "decimals": 0,
              "unit": "",
              "desc": "Linked ZigBee device #2 (1-based index, 0 = none)",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 18,
            "id": "Unknown_57_74",
            "args": {
              "desc": "maybe more linked zigbee devices or other room properties",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EEnum",
            "len": 1,
            "id": "WindowDetection",
            "args": {
              "listStr": "WindowDetectionStates",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 9,
            "id": "Unknown_76_84",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          }
        ],
        "desc": "DeviceLinkOne/Two: 1-based index of linked ZigBee device (0 = not linked). DID of linked device: N<=20: Property=2084+(N-1)*3, N>=21: Property=2260+(N-21)*3; Setpoint=+1, CurrentValues=+2",
        "info": "",
        "acc": "ro"
      }
    }
  },
  "1890": {
    "85": {
      "codec": "O3EComplexType",
      "len": 85,
      "id": "RoomThreeProperty",
      "args": {
        "subTypes": [
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_00",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EUtf8",
            "len": 38,
            "id": "Roomname",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 4,
            "id": "Unknown_39_42",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EEnum",
            "len": 1,
            "id": "Roomtype",
            "args": {
              "listStr": "Roomtypes",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EEnum",
            "len": 1,
            "id": "ChildLockActive",
            "args": {
              "listStr": "DeviceChildLockStates",
              "desc": "Room-side mirror of the child lock of the assigned TRV (1 = active); off44, was an unknown byte; proven by one-factor test",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EEnum",
            "len": 1,
            "id": "TemperatureControl",
            "args": {
              "listStr": "TemperatureControlLevels",
              "desc": "Level 1 (Eco) .. 6 (Komfort), factory default 4",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_46",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 8,
            "id": "Unknown_47_54",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "ZigbeeDeviceLinkOne",
            "args": {
              "scale": 1.0,
              "signed": false,
              "decimals": 0,
              "unit": "",
              "desc": "Linked ZigBee device #1 (1-based index, 0 = none)",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "ZigbeeDeviceLinkTwo",
            "args": {
              "scale": 1.0,
              "signed": false,
              "decimals": 0,
              "unit": "",
              "desc": "Linked ZigBee device #2 (1-based index, 0 = none)",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 18,
            "id": "Unknown_57_74",
            "args": {
              "desc": "maybe more linked zigbee devices or other room properties",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EEnum",
            "len": 1,
            "id": "WindowDetection",
            "args": {
              "listStr": "WindowDetectionStates",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 9,
            "id": "Unknown_76_84",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          }
        ],
        "desc": "DeviceLinkOne/Two: 1-based index of linked ZigBee device (0 = not linked). DID of linked device: N<=20: Property=2084+(N-1)*3, N>=21: Property=2260+(N-21)*3; Setpoint=+1, CurrentValues=+2",
        "info": "",
        "acc": "ro"
      }
    }
  },
  "1893": {
    "85": {
      "codec": "O3EComplexType",
      "len": 85,
      "id": "RoomFourProperty",
      "args": {
        "subTypes": [
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_00",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EUtf8",
            "len": 38,
            "id": "Roomname",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 4,
            "id": "Unknown_39_42",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EEnum",
            "len": 1,
            "id": "Roomtype",
            "args": {
              "listStr": "Roomtypes",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EEnum",
            "len": 1,
            "id": "ChildLockActive",
            "args": {
              "listStr": "DeviceChildLockStates",
              "desc": "Room-side mirror of the child lock of the assigned TRV (1 = active); off44, was an unknown byte; proven by one-factor test",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EEnum",
            "len": 1,
            "id": "TemperatureControl",
            "args": {
              "listStr": "TemperatureControlLevels",
              "desc": "Level 1 (Eco) .. 6 (Komfort), factory default 4",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_46",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 8,
            "id": "Unknown_47_54",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "ZigbeeDeviceLinkOne",
            "args": {
              "scale": 1.0,
              "signed": false,
              "decimals": 0,
              "unit": "",
              "desc": "Linked ZigBee device #1 (1-based index, 0 = none)",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "ZigbeeDeviceLinkTwo",
            "args": {
              "scale": 1.0,
              "signed": false,
              "decimals": 0,
              "unit": "",
              "desc": "Linked ZigBee device #2 (1-based index, 0 = none)",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 18,
            "id": "Unknown_57_74",
            "args": {
              "desc": "maybe more linked zigbee devices or other room properties",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EEnum",
            "len": 1,
            "id": "WindowDetection",
            "args": {
              "listStr": "WindowDetectionStates",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 9,
            "id": "Unknown_76_84",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          }
        ],
        "desc": "DeviceLinkOne/Two: 1-based index of linked ZigBee device (0 = not linked). DID of linked device: N<=20: Property=2084+(N-1)*3, N>=21: Property=2260+(N-21)*3; Setpoint=+1, CurrentValues=+2",
        "info": "",
        "acc": "ro"
      }
    }
  },
  "1896": {
    "85": {
      "codec": "O3EComplexType",
      "len": 85,
      "id": "RoomFiveProperty",
      "args": {
        "subTypes": [
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_00",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EUtf8",
            "len": 38,
            "id": "Roomname",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 4,
            "id": "Unknown_39_42",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EEnum",
            "len": 1,
            "id": "Roomtype",
            "args": {
              "listStr": "Roomtypes",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EEnum",
            "len": 1,
            "id": "ChildLockActive",
            "args": {
              "listStr": "DeviceChildLockStates",
              "desc": "Room-side mirror of the child lock of the assigned TRV (1 = active); off44, was an unknown byte; proven by one-factor test",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EEnum",
            "len": 1,
            "id": "TemperatureControl",
            "args": {
              "listStr": "TemperatureControlLevels",
              "desc": "Level 1 (Eco) .. 6 (Komfort), factory default 4",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_46",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 8,
            "id": "Unknown_47_54",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "ZigbeeDeviceLinkOne",
            "args": {
              "scale": 1.0,
              "signed": false,
              "decimals": 0,
              "unit": "",
              "desc": "Linked ZigBee device #1 (1-based index, 0 = none)",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "ZigbeeDeviceLinkTwo",
            "args": {
              "scale": 1.0,
              "signed": false,
              "decimals": 0,
              "unit": "",
              "desc": "Linked ZigBee device #2 (1-based index, 0 = none)",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 18,
            "id": "Unknown_57_74",
            "args": {
              "desc": "maybe more linked zigbee devices or other room properties",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EEnum",
            "len": 1,
            "id": "WindowDetection",
            "args": {
              "listStr": "WindowDetectionStates",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 9,
            "id": "Unknown_76_84",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          }
        ],
        "desc": "DeviceLinkOne/Two: 1-based index of linked ZigBee device (0 = not linked). DID of linked device: N<=20: Property=2084+(N-1)*3, N>=21: Property=2260+(N-21)*3; Setpoint=+1, CurrentValues=+2",
        "info": "",
        "acc": "ro"
      }
    }
  },
  "1899": {
    "85": {
      "codec": "O3EComplexType",
      "len": 85,
      "id": "RoomSixProperty",
      "args": {
        "subTypes": [
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_00",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EUtf8",
            "len": 38,
            "id": "Roomname",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 4,
            "id": "Unknown_39_42",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EEnum",
            "len": 1,
            "id": "Roomtype",
            "args": {
              "listStr": "Roomtypes",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EEnum",
            "len": 1,
            "id": "ChildLockActive",
            "args": {
              "listStr": "DeviceChildLockStates",
              "desc": "Room-side mirror of the child lock of the assigned TRV (1 = active); off44, was an unknown byte; proven by one-factor test",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EEnum",
            "len": 1,
            "id": "TemperatureControl",
            "args": {
              "listStr": "TemperatureControlLevels",
              "desc": "Level 1 (Eco) .. 6 (Komfort), factory default 4",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_46",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 8,
            "id": "Unknown_47_54",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "ZigbeeDeviceLinkOne",
            "args": {
              "scale": 1.0,
              "signed": false,
              "decimals": 0,
              "unit": "",
              "desc": "Linked ZigBee device #1 (1-based index, 0 = none)",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "ZigbeeDeviceLinkTwo",
            "args": {
              "scale": 1.0,
              "signed": false,
              "decimals": 0,
              "unit": "",
              "desc": "Linked ZigBee device #2 (1-based index, 0 = none)",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 18,
            "id": "Unknown_57_74",
            "args": {
              "desc": "maybe more linked zigbee devices or other room properties",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EEnum",
            "len": 1,
            "id": "WindowDetection",
            "args": {
              "listStr": "WindowDetectionStates",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 9,
            "id": "Unknown_76_84",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          }
        ],
        "desc": "DeviceLinkOne/Two: 1-based index of linked ZigBee device (0 = not linked). DID of linked device: N<=20: Property=2084+(N-1)*3, N>=21: Property=2260+(N-21)*3; Setpoint=+1, CurrentValues=+2",
        "info": "",
        "acc": "ro"
      }
    }
  },
  "1902": {
    "85": {
      "codec": "O3EComplexType",
      "len": 85,
      "id": "RoomSevenProperty",
      "args": {
        "subTypes": [
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_00",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EUtf8",
            "len": 38,
            "id": "Roomname",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 4,
            "id": "Unknown_39_42",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EEnum",
            "len": 1,
            "id": "Roomtype",
            "args": {
              "listStr": "Roomtypes",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EEnum",
            "len": 1,
            "id": "ChildLockActive",
            "args": {
              "listStr": "DeviceChildLockStates",
              "desc": "Room-side mirror of the child lock of the assigned TRV (1 = active); off44, was an unknown byte; proven by one-factor test",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EEnum",
            "len": 1,
            "id": "TemperatureControl",
            "args": {
              "listStr": "TemperatureControlLevels",
              "desc": "Level 1 (Eco) .. 6 (Komfort), factory default 4",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_46",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 8,
            "id": "Unknown_47_54",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "ZigbeeDeviceLinkOne",
            "args": {
              "scale": 1.0,
              "signed": false,
              "decimals": 0,
              "unit": "",
              "desc": "Linked ZigBee device #1 (1-based index, 0 = none)",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "ZigbeeDeviceLinkTwo",
            "args": {
              "scale": 1.0,
              "signed": false,
              "decimals": 0,
              "unit": "",
              "desc": "Linked ZigBee device #2 (1-based index, 0 = none)",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 18,
            "id": "Unknown_57_74",
            "args": {
              "desc": "maybe more linked zigbee devices or other room properties",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EEnum",
            "len": 1,
            "id": "WindowDetection",
            "args": {
              "listStr": "WindowDetectionStates",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 9,
            "id": "Unknown_76_84",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          }
        ],
        "desc": "DeviceLinkOne/Two: 1-based index of linked ZigBee device (0 = not linked). DID of linked device: N<=20: Property=2084+(N-1)*3, N>=21: Property=2260+(N-21)*3; Setpoint=+1, CurrentValues=+2",
        "info": "",
        "acc": "ro"
      }
    }
  },
  "1905": {
    "85": {
      "codec": "O3EComplexType",
      "len": 85,
      "id": "RoomEightProperty",
      "args": {
        "subTypes": [
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_00",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EUtf8",
            "len": 38,
            "id": "Roomname",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 4,
            "id": "Unknown_39_42",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EEnum",
            "len": 1,
            "id": "Roomtype",
            "args": {
              "listStr": "Roomtypes",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EEnum",
            "len": 1,
            "id": "ChildLockActive",
            "args": {
              "listStr": "DeviceChildLockStates",
              "desc": "Room-side mirror of the child lock of the assigned TRV (1 = active); off44, was an unknown byte; proven by one-factor test",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EEnum",
            "len": 1,
            "id": "TemperatureControl",
            "args": {
              "listStr": "TemperatureControlLevels",
              "desc": "Level 1 (Eco) .. 6 (Komfort), factory default 4",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_46",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 8,
            "id": "Unknown_47_54",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "ZigbeeDeviceLinkOne",
            "args": {
              "scale": 1.0,
              "signed": false,
              "decimals": 0,
              "unit": "",
              "desc": "Linked ZigBee device #1 (1-based index, 0 = none)",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "ZigbeeDeviceLinkTwo",
            "args": {
              "scale": 1.0,
              "signed": false,
              "decimals": 0,
              "unit": "",
              "desc": "Linked ZigBee device #2 (1-based index, 0 = none)",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 18,
            "id": "Unknown_57_74",
            "args": {
              "desc": "maybe more linked zigbee devices or other room properties",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EEnum",
            "len": 1,
            "id": "WindowDetection",
            "args": {
              "listStr": "WindowDetectionStates",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 9,
            "id": "Unknown_76_84",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          }
        ],
        "desc": "DeviceLinkOne/Two: 1-based index of linked ZigBee device (0 = not linked). DID of linked device: N<=20: Property=2084+(N-1)*3, N>=21: Property=2260+(N-21)*3; Setpoint=+1, CurrentValues=+2",
        "info": "",
        "acc": "ro"
      }
    }
  },
  "1908": {
    "85": {
      "codec": "O3EComplexType",
      "len": 85,
      "id": "RoomNineProperty",
      "args": {
        "subTypes": [
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_00",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EUtf8",
            "len": 38,
            "id": "Roomname",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 4,
            "id": "Unknown_39_42",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EEnum",
            "len": 1,
            "id": "Roomtype",
            "args": {
              "listStr": "Roomtypes",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EEnum",
            "len": 1,
            "id": "ChildLockActive",
            "args": {
              "listStr": "DeviceChildLockStates",
              "desc": "Room-side mirror of the child lock of the assigned TRV (1 = active); off44, was an unknown byte; proven by one-factor test",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EEnum",
            "len": 1,
            "id": "TemperatureControl",
            "args": {
              "listStr": "TemperatureControlLevels",
              "desc": "Level 1 (Eco) .. 6 (Komfort), factory default 4",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_46",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 8,
            "id": "Unknown_47_54",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "ZigbeeDeviceLinkOne",
            "args": {
              "scale": 1.0,
              "signed": false,
              "decimals": 0,
              "unit": "",
              "desc": "Linked ZigBee device #1 (1-based index, 0 = none)",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "ZigbeeDeviceLinkTwo",
            "args": {
              "scale": 1.0,
              "signed": false,
              "decimals": 0,
              "unit": "",
              "desc": "Linked ZigBee device #2 (1-based index, 0 = none)",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 18,
            "id": "Unknown_57_74",
            "args": {
              "desc": "maybe more linked zigbee devices or other room properties",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EEnum",
            "len": 1,
            "id": "WindowDetection",
            "args": {
              "listStr": "WindowDetectionStates",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 9,
            "id": "Unknown_76_84",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          }
        ],
        "desc": "DeviceLinkOne/Two: 1-based index of linked ZigBee device (0 = not linked). DID of linked device: N<=20: Property=2084+(N-1)*3, N>=21: Property=2260+(N-21)*3; Setpoint=+1, CurrentValues=+2",
        "info": "",
        "acc": "ro"
      }
    }
  },
  "1911": {
    "85": {
      "codec": "O3EComplexType",
      "len": 85,
      "id": "RoomTenProperty",
      "args": {
        "subTypes": [
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_00",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EUtf8",
            "len": 38,
            "id": "Roomname",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 4,
            "id": "Unknown_39_42",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EEnum",
            "len": 1,
            "id": "Roomtype",
            "args": {
              "listStr": "Roomtypes",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EEnum",
            "len": 1,
            "id": "ChildLockActive",
            "args": {
              "listStr": "DeviceChildLockStates",
              "desc": "Room-side mirror of the child lock of the assigned TRV (1 = active); off44, was an unknown byte; proven by one-factor test",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EEnum",
            "len": 1,
            "id": "TemperatureControl",
            "args": {
              "listStr": "TemperatureControlLevels",
              "desc": "Level 1 (Eco) .. 6 (Komfort), factory default 4",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_46",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 8,
            "id": "Unknown_47_54",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "ZigbeeDeviceLinkOne",
            "args": {
              "scale": 1.0,
              "signed": false,
              "decimals": 0,
              "unit": "",
              "desc": "Linked ZigBee device #1 (1-based index, 0 = none)",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "ZigbeeDeviceLinkTwo",
            "args": {
              "scale": 1.0,
              "signed": false,
              "decimals": 0,
              "unit": "",
              "desc": "Linked ZigBee device #2 (1-based index, 0 = none)",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 18,
            "id": "Unknown_57_74",
            "args": {
              "desc": "maybe more linked zigbee devices or other room properties",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EEnum",
            "len": 1,
            "id": "WindowDetection",
            "args": {
              "listStr": "WindowDetectionStates",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 9,
            "id": "Unknown_76_84",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          }
        ],
        "desc": "DeviceLinkOne/Two: 1-based index of linked ZigBee device (0 = not linked). DID of linked device: N<=20: Property=2084+(N-1)*3, N>=21: Property=2260+(N-21)*3; Setpoint=+1, CurrentValues=+2",
        "info": "",
        "acc": "ro"
      }
    }
  },
  "1914": {
    "85": {
      "codec": "O3EComplexType",
      "len": 85,
      "id": "RoomElevenProperty",
      "args": {
        "subTypes": [
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_00",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EUtf8",
            "len": 38,
            "id": "Roomname",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 4,
            "id": "Unknown_39_42",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EEnum",
            "len": 1,
            "id": "Roomtype",
            "args": {
              "listStr": "Roomtypes",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EEnum",
            "len": 1,
            "id": "ChildLockActive",
            "args": {
              "listStr": "DeviceChildLockStates",
              "desc": "Room-side mirror of the child lock of the assigned TRV (1 = active); off44, was an unknown byte; proven by one-factor test",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EEnum",
            "len": 1,
            "id": "TemperatureControl",
            "args": {
              "listStr": "TemperatureControlLevels",
              "desc": "Level 1 (Eco) .. 6 (Komfort), factory default 4",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_46",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 8,
            "id": "Unknown_47_54",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "ZigbeeDeviceLinkOne",
            "args": {
              "scale": 1.0,
              "signed": false,
              "decimals": 0,
              "unit": "",
              "desc": "Linked ZigBee device #1 (1-based index, 0 = none)",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "ZigbeeDeviceLinkTwo",
            "args": {
              "scale": 1.0,
              "signed": false,
              "decimals": 0,
              "unit": "",
              "desc": "Linked ZigBee device #2 (1-based index, 0 = none)",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 18,
            "id": "Unknown_57_74",
            "args": {
              "desc": "maybe more linked zigbee devices or other room properties",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EEnum",
            "len": 1,
            "id": "WindowDetection",
            "args": {
              "listStr": "WindowDetectionStates",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 9,
            "id": "Unknown_76_84",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          }
        ],
        "desc": "DeviceLinkOne/Two: 1-based index of linked ZigBee device (0 = not linked). DID of linked device: N<=20: Property=2084+(N-1)*3, N>=21: Property=2260+(N-21)*3; Setpoint=+1, CurrentValues=+2",
        "info": "",
        "acc": "ro"
      }
    }
  },
  "1917": {
    "85": {
      "codec": "O3EComplexType",
      "len": 85,
      "id": "RoomTwelveProperty",
      "args": {
        "subTypes": [
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_00",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EUtf8",
            "len": 38,
            "id": "Roomname",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 4,
            "id": "Unknown_39_42",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EEnum",
            "len": 1,
            "id": "Roomtype",
            "args": {
              "listStr": "Roomtypes",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EEnum",
            "len": 1,
            "id": "ChildLockActive",
            "args": {
              "listStr": "DeviceChildLockStates",
              "desc": "Room-side mirror of the child lock of the assigned TRV (1 = active); off44, was an unknown byte; proven by one-factor test",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EEnum",
            "len": 1,
            "id": "TemperatureControl",
            "args": {
              "listStr": "TemperatureControlLevels",
              "desc": "Level 1 (Eco) .. 6 (Komfort), factory default 4",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_46",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 8,
            "id": "Unknown_47_54",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "ZigbeeDeviceLinkOne",
            "args": {
              "scale": 1.0,
              "signed": false,
              "decimals": 0,
              "unit": "",
              "desc": "Linked ZigBee device #1 (1-based index, 0 = none)",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "ZigbeeDeviceLinkTwo",
            "args": {
              "scale": 1.0,
              "signed": false,
              "decimals": 0,
              "unit": "",
              "desc": "Linked ZigBee device #2 (1-based index, 0 = none)",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 18,
            "id": "Unknown_57_74",
            "args": {
              "desc": "maybe more linked zigbee devices or other room properties",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EEnum",
            "len": 1,
            "id": "WindowDetection",
            "args": {
              "listStr": "WindowDetectionStates",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 9,
            "id": "Unknown_76_84",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          }
        ],
        "desc": "DeviceLinkOne/Two: 1-based index of linked ZigBee device (0 = not linked). DID of linked device: N<=20: Property=2084+(N-1)*3, N>=21: Property=2260+(N-21)*3; Setpoint=+1, CurrentValues=+2",
        "info": "",
        "acc": "ro"
      }
    }
  },
  "1920": {
    "85": {
      "codec": "O3EComplexType",
      "len": 85,
      "id": "RoomThirteenProperty",
      "args": {
        "subTypes": [
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_00",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EUtf8",
            "len": 38,
            "id": "Roomname",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 4,
            "id": "Unknown_39_42",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EEnum",
            "len": 1,
            "id": "Roomtype",
            "args": {
              "listStr": "Roomtypes",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EEnum",
            "len": 1,
            "id": "ChildLockActive",
            "args": {
              "listStr": "DeviceChildLockStates",
              "desc": "Room-side mirror of the child lock of the assigned TRV (1 = active); off44, was an unknown byte; proven by one-factor test",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EEnum",
            "len": 1,
            "id": "TemperatureControl",
            "args": {
              "listStr": "TemperatureControlLevels",
              "desc": "Level 1 (Eco) .. 6 (Komfort), factory default 4",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_46",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 8,
            "id": "Unknown_47_54",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "ZigbeeDeviceLinkOne",
            "args": {
              "scale": 1.0,
              "signed": false,
              "decimals": 0,
              "unit": "",
              "desc": "Linked ZigBee device #1 (1-based index, 0 = none)",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "ZigbeeDeviceLinkTwo",
            "args": {
              "scale": 1.0,
              "signed": false,
              "decimals": 0,
              "unit": "",
              "desc": "Linked ZigBee device #2 (1-based index, 0 = none)",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 18,
            "id": "Unknown_57_74",
            "args": {
              "desc": "maybe more linked zigbee devices or other room properties",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EEnum",
            "len": 1,
            "id": "WindowDetection",
            "args": {
              "listStr": "WindowDetectionStates",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 9,
            "id": "Unknown_76_84",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          }
        ],
        "desc": "DeviceLinkOne/Two: 1-based index of linked ZigBee device (0 = not linked). DID of linked device: N<=20: Property=2084+(N-1)*3, N>=21: Property=2260+(N-21)*3; Setpoint=+1, CurrentValues=+2",
        "info": "",
        "acc": "ro"
      }
    }
  },
  "1923": {
    "85": {
      "codec": "O3EComplexType",
      "len": 85,
      "id": "RoomFourteenProperty",
      "args": {
        "subTypes": [
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_00",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EUtf8",
            "len": 38,
            "id": "Roomname",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 4,
            "id": "Unknown_39_42",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EEnum",
            "len": 1,
            "id": "Roomtype",
            "args": {
              "listStr": "Roomtypes",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EEnum",
            "len": 1,
            "id": "ChildLockActive",
            "args": {
              "listStr": "DeviceChildLockStates",
              "desc": "Room-side mirror of the child lock of the assigned TRV (1 = active); off44, was an unknown byte; proven by one-factor test",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EEnum",
            "len": 1,
            "id": "TemperatureControl",
            "args": {
              "listStr": "TemperatureControlLevels",
              "desc": "Level 1 (Eco) .. 6 (Komfort), factory default 4",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_46",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 8,
            "id": "Unknown_47_54",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "ZigbeeDeviceLinkOne",
            "args": {
              "scale": 1.0,
              "signed": false,
              "decimals": 0,
              "unit": "",
              "desc": "Linked ZigBee device #1 (1-based index, 0 = none)",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "ZigbeeDeviceLinkTwo",
            "args": {
              "scale": 1.0,
              "signed": false,
              "decimals": 0,
              "unit": "",
              "desc": "Linked ZigBee device #2 (1-based index, 0 = none)",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 18,
            "id": "Unknown_57_74",
            "args": {
              "desc": "maybe more linked zigbee devices or other room properties",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EEnum",
            "len": 1,
            "id": "WindowDetection",
            "args": {
              "listStr": "WindowDetectionStates",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 9,
            "id": "Unknown_76_84",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          }
        ],
        "desc": "DeviceLinkOne/Two: 1-based index of linked ZigBee device (0 = not linked). DID of linked device: N<=20: Property=2084+(N-1)*3, N>=21: Property=2260+(N-21)*3; Setpoint=+1, CurrentValues=+2",
        "info": "",
        "acc": "ro"
      }
    }
  },
  "1926": {
    "85": {
      "codec": "O3EComplexType",
      "len": 85,
      "id": "RoomFifteenProperty",
      "args": {
        "subTypes": [
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_00",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EUtf8",
            "len": 38,
            "id": "Roomname",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 4,
            "id": "Unknown_39_42",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EEnum",
            "len": 1,
            "id": "Roomtype",
            "args": {
              "listStr": "Roomtypes",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EEnum",
            "len": 1,
            "id": "ChildLockActive",
            "args": {
              "listStr": "DeviceChildLockStates",
              "desc": "Room-side mirror of the child lock of the assigned TRV (1 = active); off44, was an unknown byte; proven by one-factor test",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EEnum",
            "len": 1,
            "id": "TemperatureControl",
            "args": {
              "listStr": "TemperatureControlLevels",
              "desc": "Level 1 (Eco) .. 6 (Komfort), factory default 4",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_46",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 8,
            "id": "Unknown_47_54",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "ZigbeeDeviceLinkOne",
            "args": {
              "scale": 1.0,
              "signed": false,
              "decimals": 0,
              "unit": "",
              "desc": "Linked ZigBee device #1 (1-based index, 0 = none)",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "ZigbeeDeviceLinkTwo",
            "args": {
              "scale": 1.0,
              "signed": false,
              "decimals": 0,
              "unit": "",
              "desc": "Linked ZigBee device #2 (1-based index, 0 = none)",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 18,
            "id": "Unknown_57_74",
            "args": {
              "desc": "maybe more linked zigbee devices or other room properties",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EEnum",
            "len": 1,
            "id": "WindowDetection",
            "args": {
              "listStr": "WindowDetectionStates",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 9,
            "id": "Unknown_76_84",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          }
        ],
        "desc": "DeviceLinkOne/Two: 1-based index of linked ZigBee device (0 = not linked). DID of linked device: N<=20: Property=2084+(N-1)*3, N>=21: Property=2260+(N-21)*3; Setpoint=+1, CurrentValues=+2",
        "info": "",
        "acc": "ro"
      }
    }
  },
  "1929": {
    "85": {
      "codec": "O3EComplexType",
      "len": 85,
      "id": "RoomSixteenProperty",
      "args": {
        "subTypes": [
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_00",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EUtf8",
            "len": 38,
            "id": "Roomname",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 4,
            "id": "Unknown_39_42",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EEnum",
            "len": 1,
            "id": "Roomtype",
            "args": {
              "listStr": "Roomtypes",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EEnum",
            "len": 1,
            "id": "ChildLockActive",
            "args": {
              "listStr": "DeviceChildLockStates",
              "desc": "Room-side mirror of the child lock of the assigned TRV (1 = active); off44, was an unknown byte; proven by one-factor test",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EEnum",
            "len": 1,
            "id": "TemperatureControl",
            "args": {
              "listStr": "TemperatureControlLevels",
              "desc": "Level 1 (Eco) .. 6 (Komfort), factory default 4",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_46",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 8,
            "id": "Unknown_47_54",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "ZigbeeDeviceLinkOne",
            "args": {
              "scale": 1.0,
              "signed": false,
              "decimals": 0,
              "unit": "",
              "desc": "Linked ZigBee device #1 (1-based index, 0 = none)",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "ZigbeeDeviceLinkTwo",
            "args": {
              "scale": 1.0,
              "signed": false,
              "decimals": 0,
              "unit": "",
              "desc": "Linked ZigBee device #2 (1-based index, 0 = none)",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 18,
            "id": "Unknown_57_74",
            "args": {
              "desc": "maybe more linked zigbee devices or other room properties",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EEnum",
            "len": 1,
            "id": "WindowDetection",
            "args": {
              "listStr": "WindowDetectionStates",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 9,
            "id": "Unknown_76_84",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          }
        ],
        "desc": "DeviceLinkOne/Two: 1-based index of linked ZigBee device (0 = not linked). DID of linked device: N<=20: Property=2084+(N-1)*3, N>=21: Property=2260+(N-21)*3; Setpoint=+1, CurrentValues=+2",
        "info": "",
        "acc": "ro"
      }
    }
  },
  "1932": {
    "85": {
      "codec": "O3EComplexType",
      "len": 85,
      "id": "RoomSeventeenProperty",
      "args": {
        "subTypes": [
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_00",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EUtf8",
            "len": 38,
            "id": "Roomname",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 4,
            "id": "Unknown_39_42",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EEnum",
            "len": 1,
            "id": "Roomtype",
            "args": {
              "listStr": "Roomtypes",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EEnum",
            "len": 1,
            "id": "ChildLockActive",
            "args": {
              "listStr": "DeviceChildLockStates",
              "desc": "Room-side mirror of the child lock of the assigned TRV (1 = active); off44, was an unknown byte; proven by one-factor test",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EEnum",
            "len": 1,
            "id": "TemperatureControl",
            "args": {
              "listStr": "TemperatureControlLevels",
              "desc": "Level 1 (Eco) .. 6 (Komfort), factory default 4",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_46",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 8,
            "id": "Unknown_47_54",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "ZigbeeDeviceLinkOne",
            "args": {
              "scale": 1.0,
              "signed": false,
              "decimals": 0,
              "unit": "",
              "desc": "Linked ZigBee device #1 (1-based index, 0 = none)",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "ZigbeeDeviceLinkTwo",
            "args": {
              "scale": 1.0,
              "signed": false,
              "decimals": 0,
              "unit": "",
              "desc": "Linked ZigBee device #2 (1-based index, 0 = none)",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 18,
            "id": "Unknown_57_74",
            "args": {
              "desc": "maybe more linked zigbee devices or other room properties",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EEnum",
            "len": 1,
            "id": "WindowDetection",
            "args": {
              "listStr": "WindowDetectionStates",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 9,
            "id": "Unknown_76_84",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          }
        ],
        "desc": "DeviceLinkOne/Two: 1-based index of linked ZigBee device (0 = not linked). DID of linked device: N<=20: Property=2084+(N-1)*3, N>=21: Property=2260+(N-21)*3; Setpoint=+1, CurrentValues=+2",
        "info": "",
        "acc": "ro"
      }
    }
  },
  "1935": {
    "85": {
      "codec": "O3EComplexType",
      "len": 85,
      "id": "RoomEighteenProperty",
      "args": {
        "subTypes": [
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_00",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EUtf8",
            "len": 38,
            "id": "Roomname",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 4,
            "id": "Unknown_39_42",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EEnum",
            "len": 1,
            "id": "Roomtype",
            "args": {
              "listStr": "Roomtypes",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EEnum",
            "len": 1,
            "id": "ChildLockActive",
            "args": {
              "listStr": "DeviceChildLockStates",
              "desc": "Room-side mirror of the child lock of the assigned TRV (1 = active); off44, was an unknown byte; proven by one-factor test",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EEnum",
            "len": 1,
            "id": "TemperatureControl",
            "args": {
              "listStr": "TemperatureControlLevels",
              "desc": "Level 1 (Eco) .. 6 (Komfort), factory default 4",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_46",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 8,
            "id": "Unknown_47_54",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "ZigbeeDeviceLinkOne",
            "args": {
              "scale": 1.0,
              "signed": false,
              "decimals": 0,
              "unit": "",
              "desc": "Linked ZigBee device #1 (1-based index, 0 = none)",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "ZigbeeDeviceLinkTwo",
            "args": {
              "scale": 1.0,
              "signed": false,
              "decimals": 0,
              "unit": "",
              "desc": "Linked ZigBee device #2 (1-based index, 0 = none)",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 18,
            "id": "Unknown_57_74",
            "args": {
              "desc": "maybe more linked zigbee devices or other room properties",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EEnum",
            "len": 1,
            "id": "WindowDetection",
            "args": {
              "listStr": "WindowDetectionStates",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 9,
            "id": "Unknown_76_84",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          }
        ],
        "desc": "DeviceLinkOne/Two: 1-based index of linked ZigBee device (0 = not linked). DID of linked device: N<=20: Property=2084+(N-1)*3, N>=21: Property=2260+(N-21)*3; Setpoint=+1, CurrentValues=+2",
        "info": "",
        "acc": "ro"
      }
    }
  },
  "1938": {
    "85": {
      "codec": "O3EComplexType",
      "len": 85,
      "id": "RoomNineteenProperty",
      "args": {
        "subTypes": [
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_00",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EUtf8",
            "len": 38,
            "id": "Roomname",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 4,
            "id": "Unknown_39_42",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EEnum",
            "len": 1,
            "id": "Roomtype",
            "args": {
              "listStr": "Roomtypes",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EEnum",
            "len": 1,
            "id": "ChildLockActive",
            "args": {
              "listStr": "DeviceChildLockStates",
              "desc": "Room-side mirror of the child lock of the assigned TRV (1 = active); off44, was an unknown byte; proven by one-factor test",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EEnum",
            "len": 1,
            "id": "TemperatureControl",
            "args": {
              "listStr": "TemperatureControlLevels",
              "desc": "Level 1 (Eco) .. 6 (Komfort), factory default 4",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_46",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 8,
            "id": "Unknown_47_54",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "ZigbeeDeviceLinkOne",
            "args": {
              "scale": 1.0,
              "signed": false,
              "decimals": 0,
              "unit": "",
              "desc": "Linked ZigBee device #1 (1-based index, 0 = none)",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "ZigbeeDeviceLinkTwo",
            "args": {
              "scale": 1.0,
              "signed": false,
              "decimals": 0,
              "unit": "",
              "desc": "Linked ZigBee device #2 (1-based index, 0 = none)",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 18,
            "id": "Unknown_57_74",
            "args": {
              "desc": "maybe more linked zigbee devices or other room properties",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EEnum",
            "len": 1,
            "id": "WindowDetection",
            "args": {
              "listStr": "WindowDetectionStates",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 9,
            "id": "Unknown_76_84",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          }
        ],
        "desc": "DeviceLinkOne/Two: 1-based index of linked ZigBee device (0 = not linked). DID of linked device: N<=20: Property=2084+(N-1)*3, N>=21: Property=2260+(N-21)*3; Setpoint=+1, CurrentValues=+2",
        "info": "",
        "acc": "ro"
      }
    }
  },
  "1941": {
    "85": {
      "codec": "O3EComplexType",
      "len": 85,
      "id": "RoomTwentyProperty",
      "args": {
        "subTypes": [
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_00",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EUtf8",
            "len": 38,
            "id": "Roomname",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 4,
            "id": "Unknown_39_42",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EEnum",
            "len": 1,
            "id": "Roomtype",
            "args": {
              "listStr": "Roomtypes",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EEnum",
            "len": 1,
            "id": "ChildLockActive",
            "args": {
              "listStr": "DeviceChildLockStates",
              "desc": "Room-side mirror of the child lock of the assigned TRV (1 = active); off44, was an unknown byte; proven by one-factor test",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EEnum",
            "len": 1,
            "id": "TemperatureControl",
            "args": {
              "listStr": "TemperatureControlLevels",
              "desc": "Level 1 (Eco) .. 6 (Komfort), factory default 4",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_46",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 8,
            "id": "Unknown_47_54",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "ZigbeeDeviceLinkOne",
            "args": {
              "scale": 1.0,
              "signed": false,
              "decimals": 0,
              "unit": "",
              "desc": "Linked ZigBee device #1 (1-based index, 0 = none)",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "ZigbeeDeviceLinkTwo",
            "args": {
              "scale": 1.0,
              "signed": false,
              "decimals": 0,
              "unit": "",
              "desc": "Linked ZigBee device #2 (1-based index, 0 = none)",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 18,
            "id": "Unknown_57_74",
            "args": {
              "desc": "maybe more linked zigbee devices or other room properties",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EEnum",
            "len": 1,
            "id": "WindowDetection",
            "args": {
              "listStr": "WindowDetectionStates",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 9,
            "id": "Unknown_76_84",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          }
        ],
        "desc": "DeviceLinkOne/Two: 1-based index of linked ZigBee device (0 = not linked). DID of linked device: N<=20: Property=2084+(N-1)*3, N>=21: Property=2260+(N-21)*3; Setpoint=+1, CurrentValues=+2",
        "info": "",
        "acc": "ro"
      }
    }
  },
  "2086": {
    "68": {
      "codec": "O3EComplexType",
      "len": 68,
      "id": "ZigBeeOneDeviceCurrentValues",
      "args": {
        "subTypes": [
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_00",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "RSSI",
            "args": {
              "scale": 1.0,
              "signed": true,
              "decimals": 0,
              "unit": "dBm",
              "desc": "Radio signal strength (signed dBm). SignalLevel is the percent representation of this value. 0x00 for FBH zones (no own radio).",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "BatteryLevel",
            "args": {
              "scale": 1.0,
              "signed": false,
              "decimals": 0,
              "unit": "%",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 37,
            "id": "Unknown_03_39",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "SignalLevel",
            "args": {
              "scale": 2.55,
              "signed": false,
              "decimals": 2,
              "unit": "%",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3ESwitch",
            "len": 15,
            "id": "ViCareDevice",
            "args": {
              "listStr": "ViCareDeviceTypes",
              "cases": {
                "0": {
                  "codec": "RawCodec",
                  "len": 14,
                  "id": "Unknown_42_55",
                  "args": {
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "1": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "ActualTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Humidity",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "2": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "ActualTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "ValveOpening",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "DeviceDisplayTurned",
                        "args": {
                          "listStr": "DeviceDisplayModeStates",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "DeviceChildLockActive",
                        "args": {
                          "listStr": "DeviceChildLockStates",
                          "desc": "type2 (TRV) only: child lock (0/1, proven one-factor test). Mirrored in RoomProperty off44 (ChildLockActive).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "DeviceTemperatureSetpoint",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "type2 (TRV) only: TRV own setpoint (0xcd=205 -> 20.5C, scale=10). A room manual setpoint and the program/manual flag are NOT in these records (separate controller room DID).",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "3": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "FlowTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "int16 LE flow temperature, scale 10. Confirmed by live read: bytes 1e 01 -> 28.6 C. off43 is the HIGH BYTE of this value, not a separate state (flow exceeds 25.6 C, e.g. heating). The e3oncan codec reads off43 alone as CurrentWorkingMode, which is therefore just the temperature band (0:<25.6, 1:25.6-51.2, 2:51.2-76.8 C), not a real mode.",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "OperatingMode",
                        "args": {
                          "listStr": "ZigBeeOperatingModes",
                          "desc": "off48 state byte. Observed 0 (Standby, flow 28.6 C) and 2 (Cooling). 1 (Heating) not yet confirmed on a clean capture.",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "4": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_42",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Demand",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "generic zone demand (0/100). Heat vs cool direction comes from the Verteiler OperatingMode, not this byte: reads 100 in cooling too. Proven via condensation cutoff (demand 0 when dew point >= flow temp).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "ValveState",
                        "args": {
                          "listStr": "ValvePositionLevels",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "5": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_42",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Demand",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "generic zone demand (0/100). Heat vs cool direction comes from the Verteiler OperatingMode, not this byte: reads 100 in cooling too. Proven via condensation cutoff (demand 0 when dew point >= flow temp).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "ValveState",
                        "args": {
                          "listStr": "ValvePositionLevels",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                }
              },
              "default": {
                "codec": "RawCodec",
                "len": 14,
                "id": "Unknown_42_55",
                "args": {
                  "desc": "",
                  "info": "",
                  "acc": ""
                }
              },
              "desc": "off41-55, device-dependent. type0: empty slot. type1 (Climate sensor): room temperature (int16) + humidity. type2 (TRV): room temperature (int16) + valve opening %, DisplayTurned (off48), plus ChildLockActive (off54) and DeviceTemperatureSetpoint (off55, scale=10). type3 (Floor thermostat/Verteiler): FlowTemperature is int16 at off42-43 (off43 = high byte, confirmed by live read 28.6 C); OperatingMode at off48. type4/5 (actuator NC/NO): generic Demand % at off43, plus ValveState at off45 (actuator energized 0/1). off45 reads 0 on type1/2/3 (kept as Unknown_45). Unknown_46_47 (off46-47) and Unknown_49_53 (off49-53) always present. off48 is DisplayTurned only on type2, OperatingMode on type3, raw elsewhere. off54/55 carry child lock + setpoint only on type2; raw on all other types.",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_56",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 8,
            "id": "ParentDeviceSerialnumber",
            "args": {
              "desc": "EUI64 of ZigBee routing parent (Repeater/Verteiler). Devices connected directly to the gateway show the coordinator EUI of the gateway radio module, which does not appear in any device list.",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 3,
            "id": "Unknown_65_67",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          }
        ],
        "desc": "",
        "info": "",
        "acc": "ro"
      }
    }
  },
  "2089": {
    "68": {
      "codec": "O3EComplexType",
      "len": 68,
      "id": "ZigBeeTwoDeviceCurrentValues",
      "args": {
        "subTypes": [
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_00",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "RSSI",
            "args": {
              "scale": 1.0,
              "signed": true,
              "decimals": 0,
              "unit": "dBm",
              "desc": "Radio signal strength (signed dBm). SignalLevel is the percent representation of this value. 0x00 for FBH zones (no own radio).",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "BatteryLevel",
            "args": {
              "scale": 1.0,
              "signed": false,
              "decimals": 0,
              "unit": "%",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 37,
            "id": "Unknown_03_39",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "SignalLevel",
            "args": {
              "scale": 2.55,
              "signed": false,
              "decimals": 2,
              "unit": "%",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3ESwitch",
            "len": 15,
            "id": "ViCareDevice",
            "args": {
              "listStr": "ViCareDeviceTypes",
              "cases": {
                "0": {
                  "codec": "RawCodec",
                  "len": 14,
                  "id": "Unknown_42_55",
                  "args": {
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "1": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "ActualTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Humidity",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "2": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "ActualTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "ValveOpening",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "DeviceDisplayTurned",
                        "args": {
                          "listStr": "DeviceDisplayModeStates",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "DeviceChildLockActive",
                        "args": {
                          "listStr": "DeviceChildLockStates",
                          "desc": "type2 (TRV) only: child lock (0/1, proven one-factor test). Mirrored in RoomProperty off44 (ChildLockActive).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "DeviceTemperatureSetpoint",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "type2 (TRV) only: TRV own setpoint (0xcd=205 -> 20.5C, scale=10). A room manual setpoint and the program/manual flag are NOT in these records (separate controller room DID).",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "3": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "FlowTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "int16 LE flow temperature, scale 10. Confirmed by live read: bytes 1e 01 -> 28.6 C. off43 is the HIGH BYTE of this value, not a separate state (flow exceeds 25.6 C, e.g. heating). The e3oncan codec reads off43 alone as CurrentWorkingMode, which is therefore just the temperature band (0:<25.6, 1:25.6-51.2, 2:51.2-76.8 C), not a real mode.",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "OperatingMode",
                        "args": {
                          "listStr": "ZigBeeOperatingModes",
                          "desc": "off48 state byte. Observed 0 (Standby, flow 28.6 C) and 2 (Cooling). 1 (Heating) not yet confirmed on a clean capture.",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "4": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_42",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Demand",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "generic zone demand (0/100). Heat vs cool direction comes from the Verteiler OperatingMode, not this byte: reads 100 in cooling too. Proven via condensation cutoff (demand 0 when dew point >= flow temp).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "ValveState",
                        "args": {
                          "listStr": "ValvePositionLevels",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "5": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_42",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Demand",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "generic zone demand (0/100). Heat vs cool direction comes from the Verteiler OperatingMode, not this byte: reads 100 in cooling too. Proven via condensation cutoff (demand 0 when dew point >= flow temp).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "ValveState",
                        "args": {
                          "listStr": "ValvePositionLevels",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                }
              },
              "default": {
                "codec": "RawCodec",
                "len": 14,
                "id": "Unknown_42_55",
                "args": {
                  "desc": "",
                  "info": "",
                  "acc": ""
                }
              },
              "desc": "off41-55, device-dependent. type0: empty slot. type1 (Climate sensor): room temperature (int16) + humidity. type2 (TRV): room temperature (int16) + valve opening %, DisplayTurned (off48), plus ChildLockActive (off54) and DeviceTemperatureSetpoint (off55, scale=10). type3 (Floor thermostat/Verteiler): FlowTemperature is int16 at off42-43 (off43 = high byte, confirmed by live read 28.6 C); OperatingMode at off48. type4/5 (actuator NC/NO): generic Demand % at off43, plus ValveState at off45 (actuator energized 0/1). off45 reads 0 on type1/2/3 (kept as Unknown_45). Unknown_46_47 (off46-47) and Unknown_49_53 (off49-53) always present. off48 is DisplayTurned only on type2, OperatingMode on type3, raw elsewhere. off54/55 carry child lock + setpoint only on type2; raw on all other types.",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_56",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 8,
            "id": "ParentDeviceSerialnumber",
            "args": {
              "desc": "EUI64 of ZigBee routing parent (Repeater/Verteiler). Devices connected directly to the gateway show the coordinator EUI of the gateway radio module, which does not appear in any device list.",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 3,
            "id": "Unknown_65_67",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          }
        ],
        "desc": "",
        "info": "",
        "acc": "ro"
      }
    }
  },
  "2092": {
    "68": {
      "codec": "O3EComplexType",
      "len": 68,
      "id": "ZigBeeThreeDeviceCurrentValues",
      "args": {
        "subTypes": [
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_00",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "RSSI",
            "args": {
              "scale": 1.0,
              "signed": true,
              "decimals": 0,
              "unit": "dBm",
              "desc": "Radio signal strength (signed dBm). SignalLevel is the percent representation of this value. 0x00 for FBH zones (no own radio).",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "BatteryLevel",
            "args": {
              "scale": 1.0,
              "signed": false,
              "decimals": 0,
              "unit": "%",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 37,
            "id": "Unknown_03_39",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "SignalLevel",
            "args": {
              "scale": 2.55,
              "signed": false,
              "decimals": 2,
              "unit": "%",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3ESwitch",
            "len": 15,
            "id": "ViCareDevice",
            "args": {
              "listStr": "ViCareDeviceTypes",
              "cases": {
                "0": {
                  "codec": "RawCodec",
                  "len": 14,
                  "id": "Unknown_42_55",
                  "args": {
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "1": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "ActualTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Humidity",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "2": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "ActualTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "ValveOpening",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "DeviceDisplayTurned",
                        "args": {
                          "listStr": "DeviceDisplayModeStates",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "DeviceChildLockActive",
                        "args": {
                          "listStr": "DeviceChildLockStates",
                          "desc": "type2 (TRV) only: child lock (0/1, proven one-factor test). Mirrored in RoomProperty off44 (ChildLockActive).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "DeviceTemperatureSetpoint",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "type2 (TRV) only: TRV own setpoint (0xcd=205 -> 20.5C, scale=10). A room manual setpoint and the program/manual flag are NOT in these records (separate controller room DID).",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "3": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "FlowTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "int16 LE flow temperature, scale 10. Confirmed by live read: bytes 1e 01 -> 28.6 C. off43 is the HIGH BYTE of this value, not a separate state (flow exceeds 25.6 C, e.g. heating). The e3oncan codec reads off43 alone as CurrentWorkingMode, which is therefore just the temperature band (0:<25.6, 1:25.6-51.2, 2:51.2-76.8 C), not a real mode.",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "OperatingMode",
                        "args": {
                          "listStr": "ZigBeeOperatingModes",
                          "desc": "off48 state byte. Observed 0 (Standby, flow 28.6 C) and 2 (Cooling). 1 (Heating) not yet confirmed on a clean capture.",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "4": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_42",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Demand",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "generic zone demand (0/100). Heat vs cool direction comes from the Verteiler OperatingMode, not this byte: reads 100 in cooling too. Proven via condensation cutoff (demand 0 when dew point >= flow temp).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "ValveState",
                        "args": {
                          "listStr": "ValvePositionLevels",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "5": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_42",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Demand",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "generic zone demand (0/100). Heat vs cool direction comes from the Verteiler OperatingMode, not this byte: reads 100 in cooling too. Proven via condensation cutoff (demand 0 when dew point >= flow temp).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "ValveState",
                        "args": {
                          "listStr": "ValvePositionLevels",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                }
              },
              "default": {
                "codec": "RawCodec",
                "len": 14,
                "id": "Unknown_42_55",
                "args": {
                  "desc": "",
                  "info": "",
                  "acc": ""
                }
              },
              "desc": "off41-55, device-dependent. type0: empty slot. type1 (Climate sensor): room temperature (int16) + humidity. type2 (TRV): room temperature (int16) + valve opening %, DisplayTurned (off48), plus ChildLockActive (off54) and DeviceTemperatureSetpoint (off55, scale=10). type3 (Floor thermostat/Verteiler): FlowTemperature is int16 at off42-43 (off43 = high byte, confirmed by live read 28.6 C); OperatingMode at off48. type4/5 (actuator NC/NO): generic Demand % at off43, plus ValveState at off45 (actuator energized 0/1). off45 reads 0 on type1/2/3 (kept as Unknown_45). Unknown_46_47 (off46-47) and Unknown_49_53 (off49-53) always present. off48 is DisplayTurned only on type2, OperatingMode on type3, raw elsewhere. off54/55 carry child lock + setpoint only on type2; raw on all other types.",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_56",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 8,
            "id": "ParentDeviceSerialnumber",
            "args": {
              "desc": "EUI64 of ZigBee routing parent (Repeater/Verteiler). Devices connected directly to the gateway show the coordinator EUI of the gateway radio module, which does not appear in any device list.",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 3,
            "id": "Unknown_65_67",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          }
        ],
        "desc": "",
        "info": "",
        "acc": "ro"
      }
    }
  },
  "2095": {
    "68": {
      "codec": "O3EComplexType",
      "len": 68,
      "id": "ZigBeeFourDeviceCurrentValues",
      "args": {
        "subTypes": [
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_00",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "RSSI",
            "args": {
              "scale": 1.0,
              "signed": true,
              "decimals": 0,
              "unit": "dBm",
              "desc": "Radio signal strength (signed dBm). SignalLevel is the percent representation of this value. 0x00 for FBH zones (no own radio).",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "BatteryLevel",
            "args": {
              "scale": 1.0,
              "signed": false,
              "decimals": 0,
              "unit": "%",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 37,
            "id": "Unknown_03_39",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "SignalLevel",
            "args": {
              "scale": 2.55,
              "signed": false,
              "decimals": 2,
              "unit": "%",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3ESwitch",
            "len": 15,
            "id": "ViCareDevice",
            "args": {
              "listStr": "ViCareDeviceTypes",
              "cases": {
                "0": {
                  "codec": "RawCodec",
                  "len": 14,
                  "id": "Unknown_42_55",
                  "args": {
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "1": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "ActualTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Humidity",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "2": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "ActualTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "ValveOpening",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "DeviceDisplayTurned",
                        "args": {
                          "listStr": "DeviceDisplayModeStates",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "DeviceChildLockActive",
                        "args": {
                          "listStr": "DeviceChildLockStates",
                          "desc": "type2 (TRV) only: child lock (0/1, proven one-factor test). Mirrored in RoomProperty off44 (ChildLockActive).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "DeviceTemperatureSetpoint",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "type2 (TRV) only: TRV own setpoint (0xcd=205 -> 20.5C, scale=10). A room manual setpoint and the program/manual flag are NOT in these records (separate controller room DID).",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "3": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "FlowTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "int16 LE flow temperature, scale 10. Confirmed by live read: bytes 1e 01 -> 28.6 C. off43 is the HIGH BYTE of this value, not a separate state (flow exceeds 25.6 C, e.g. heating). The e3oncan codec reads off43 alone as CurrentWorkingMode, which is therefore just the temperature band (0:<25.6, 1:25.6-51.2, 2:51.2-76.8 C), not a real mode.",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "OperatingMode",
                        "args": {
                          "listStr": "ZigBeeOperatingModes",
                          "desc": "off48 state byte. Observed 0 (Standby, flow 28.6 C) and 2 (Cooling). 1 (Heating) not yet confirmed on a clean capture.",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "4": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_42",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Demand",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "generic zone demand (0/100). Heat vs cool direction comes from the Verteiler OperatingMode, not this byte: reads 100 in cooling too. Proven via condensation cutoff (demand 0 when dew point >= flow temp).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "ValveState",
                        "args": {
                          "listStr": "ValvePositionLevels",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "5": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_42",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Demand",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "generic zone demand (0/100). Heat vs cool direction comes from the Verteiler OperatingMode, not this byte: reads 100 in cooling too. Proven via condensation cutoff (demand 0 when dew point >= flow temp).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "ValveState",
                        "args": {
                          "listStr": "ValvePositionLevels",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                }
              },
              "default": {
                "codec": "RawCodec",
                "len": 14,
                "id": "Unknown_42_55",
                "args": {
                  "desc": "",
                  "info": "",
                  "acc": ""
                }
              },
              "desc": "off41-55, device-dependent. type0: empty slot. type1 (Climate sensor): room temperature (int16) + humidity. type2 (TRV): room temperature (int16) + valve opening %, DisplayTurned (off48), plus ChildLockActive (off54) and DeviceTemperatureSetpoint (off55, scale=10). type3 (Floor thermostat/Verteiler): FlowTemperature is int16 at off42-43 (off43 = high byte, confirmed by live read 28.6 C); OperatingMode at off48. type4/5 (actuator NC/NO): generic Demand % at off43, plus ValveState at off45 (actuator energized 0/1). off45 reads 0 on type1/2/3 (kept as Unknown_45). Unknown_46_47 (off46-47) and Unknown_49_53 (off49-53) always present. off48 is DisplayTurned only on type2, OperatingMode on type3, raw elsewhere. off54/55 carry child lock + setpoint only on type2; raw on all other types.",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_56",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 8,
            "id": "ParentDeviceSerialnumber",
            "args": {
              "desc": "EUI64 of ZigBee routing parent (Repeater/Verteiler). Devices connected directly to the gateway show the coordinator EUI of the gateway radio module, which does not appear in any device list.",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 3,
            "id": "Unknown_65_67",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          }
        ],
        "desc": "",
        "info": "",
        "acc": "ro"
      }
    }
  },
  "2098": {
    "68": {
      "codec": "O3EComplexType",
      "len": 68,
      "id": "ZigBeeFiveDeviceCurrentValues",
      "args": {
        "subTypes": [
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_00",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "RSSI",
            "args": {
              "scale": 1.0,
              "signed": true,
              "decimals": 0,
              "unit": "dBm",
              "desc": "Radio signal strength (signed dBm). SignalLevel is the percent representation of this value. 0x00 for FBH zones (no own radio).",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "BatteryLevel",
            "args": {
              "scale": 1.0,
              "signed": false,
              "decimals": 0,
              "unit": "%",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 37,
            "id": "Unknown_03_39",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "SignalLevel",
            "args": {
              "scale": 2.55,
              "signed": false,
              "decimals": 2,
              "unit": "%",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3ESwitch",
            "len": 15,
            "id": "ViCareDevice",
            "args": {
              "listStr": "ViCareDeviceTypes",
              "cases": {
                "0": {
                  "codec": "RawCodec",
                  "len": 14,
                  "id": "Unknown_42_55",
                  "args": {
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "1": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "ActualTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Humidity",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "2": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "ActualTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "ValveOpening",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "DeviceDisplayTurned",
                        "args": {
                          "listStr": "DeviceDisplayModeStates",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "DeviceChildLockActive",
                        "args": {
                          "listStr": "DeviceChildLockStates",
                          "desc": "type2 (TRV) only: child lock (0/1, proven one-factor test). Mirrored in RoomProperty off44 (ChildLockActive).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "DeviceTemperatureSetpoint",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "type2 (TRV) only: TRV own setpoint (0xcd=205 -> 20.5C, scale=10). A room manual setpoint and the program/manual flag are NOT in these records (separate controller room DID).",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "3": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "FlowTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "int16 LE flow temperature, scale 10. Confirmed by live read: bytes 1e 01 -> 28.6 C. off43 is the HIGH BYTE of this value, not a separate state (flow exceeds 25.6 C, e.g. heating). The e3oncan codec reads off43 alone as CurrentWorkingMode, which is therefore just the temperature band (0:<25.6, 1:25.6-51.2, 2:51.2-76.8 C), not a real mode.",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "OperatingMode",
                        "args": {
                          "listStr": "ZigBeeOperatingModes",
                          "desc": "off48 state byte. Observed 0 (Standby, flow 28.6 C) and 2 (Cooling). 1 (Heating) not yet confirmed on a clean capture.",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "4": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_42",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Demand",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "generic zone demand (0/100). Heat vs cool direction comes from the Verteiler OperatingMode, not this byte: reads 100 in cooling too. Proven via condensation cutoff (demand 0 when dew point >= flow temp).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "ValveState",
                        "args": {
                          "listStr": "ValvePositionLevels",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "5": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_42",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Demand",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "generic zone demand (0/100). Heat vs cool direction comes from the Verteiler OperatingMode, not this byte: reads 100 in cooling too. Proven via condensation cutoff (demand 0 when dew point >= flow temp).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "ValveState",
                        "args": {
                          "listStr": "ValvePositionLevels",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                }
              },
              "default": {
                "codec": "RawCodec",
                "len": 14,
                "id": "Unknown_42_55",
                "args": {
                  "desc": "",
                  "info": "",
                  "acc": ""
                }
              },
              "desc": "off41-55, device-dependent. type0: empty slot. type1 (Climate sensor): room temperature (int16) + humidity. type2 (TRV): room temperature (int16) + valve opening %, DisplayTurned (off48), plus ChildLockActive (off54) and DeviceTemperatureSetpoint (off55, scale=10). type3 (Floor thermostat/Verteiler): FlowTemperature is int16 at off42-43 (off43 = high byte, confirmed by live read 28.6 C); OperatingMode at off48. type4/5 (actuator NC/NO): generic Demand % at off43, plus ValveState at off45 (actuator energized 0/1). off45 reads 0 on type1/2/3 (kept as Unknown_45). Unknown_46_47 (off46-47) and Unknown_49_53 (off49-53) always present. off48 is DisplayTurned only on type2, OperatingMode on type3, raw elsewhere. off54/55 carry child lock + setpoint only on type2; raw on all other types.",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_56",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 8,
            "id": "ParentDeviceSerialnumber",
            "args": {
              "desc": "EUI64 of ZigBee routing parent (Repeater/Verteiler). Devices connected directly to the gateway show the coordinator EUI of the gateway radio module, which does not appear in any device list.",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 3,
            "id": "Unknown_65_67",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          }
        ],
        "desc": "",
        "info": "",
        "acc": "ro"
      }
    }
  },
  "2101": {
    "68": {
      "codec": "O3EComplexType",
      "len": 68,
      "id": "ZigBeeSixDeviceCurrentValues",
      "args": {
        "subTypes": [
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_00",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "RSSI",
            "args": {
              "scale": 1.0,
              "signed": true,
              "decimals": 0,
              "unit": "dBm",
              "desc": "Radio signal strength (signed dBm). SignalLevel is the percent representation of this value. 0x00 for FBH zones (no own radio).",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "BatteryLevel",
            "args": {
              "scale": 1.0,
              "signed": false,
              "decimals": 0,
              "unit": "%",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 37,
            "id": "Unknown_03_39",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "SignalLevel",
            "args": {
              "scale": 2.55,
              "signed": false,
              "decimals": 2,
              "unit": "%",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3ESwitch",
            "len": 15,
            "id": "ViCareDevice",
            "args": {
              "listStr": "ViCareDeviceTypes",
              "cases": {
                "0": {
                  "codec": "RawCodec",
                  "len": 14,
                  "id": "Unknown_42_55",
                  "args": {
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "1": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "ActualTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Humidity",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "2": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "ActualTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "ValveOpening",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "DeviceDisplayTurned",
                        "args": {
                          "listStr": "DeviceDisplayModeStates",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "DeviceChildLockActive",
                        "args": {
                          "listStr": "DeviceChildLockStates",
                          "desc": "type2 (TRV) only: child lock (0/1, proven one-factor test). Mirrored in RoomProperty off44 (ChildLockActive).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "DeviceTemperatureSetpoint",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "type2 (TRV) only: TRV own setpoint (0xcd=205 -> 20.5C, scale=10). A room manual setpoint and the program/manual flag are NOT in these records (separate controller room DID).",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "3": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "FlowTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "int16 LE flow temperature, scale 10. Confirmed by live read: bytes 1e 01 -> 28.6 C. off43 is the HIGH BYTE of this value, not a separate state (flow exceeds 25.6 C, e.g. heating). The e3oncan codec reads off43 alone as CurrentWorkingMode, which is therefore just the temperature band (0:<25.6, 1:25.6-51.2, 2:51.2-76.8 C), not a real mode.",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "OperatingMode",
                        "args": {
                          "listStr": "ZigBeeOperatingModes",
                          "desc": "off48 state byte. Observed 0 (Standby, flow 28.6 C) and 2 (Cooling). 1 (Heating) not yet confirmed on a clean capture.",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "4": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_42",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Demand",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "generic zone demand (0/100). Heat vs cool direction comes from the Verteiler OperatingMode, not this byte: reads 100 in cooling too. Proven via condensation cutoff (demand 0 when dew point >= flow temp).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "ValveState",
                        "args": {
                          "listStr": "ValvePositionLevels",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "5": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_42",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Demand",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "generic zone demand (0/100). Heat vs cool direction comes from the Verteiler OperatingMode, not this byte: reads 100 in cooling too. Proven via condensation cutoff (demand 0 when dew point >= flow temp).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "ValveState",
                        "args": {
                          "listStr": "ValvePositionLevels",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                }
              },
              "default": {
                "codec": "RawCodec",
                "len": 14,
                "id": "Unknown_42_55",
                "args": {
                  "desc": "",
                  "info": "",
                  "acc": ""
                }
              },
              "desc": "off41-55, device-dependent. type0: empty slot. type1 (Climate sensor): room temperature (int16) + humidity. type2 (TRV): room temperature (int16) + valve opening %, DisplayTurned (off48), plus ChildLockActive (off54) and DeviceTemperatureSetpoint (off55, scale=10). type3 (Floor thermostat/Verteiler): FlowTemperature is int16 at off42-43 (off43 = high byte, confirmed by live read 28.6 C); OperatingMode at off48. type4/5 (actuator NC/NO): generic Demand % at off43, plus ValveState at off45 (actuator energized 0/1). off45 reads 0 on type1/2/3 (kept as Unknown_45). Unknown_46_47 (off46-47) and Unknown_49_53 (off49-53) always present. off48 is DisplayTurned only on type2, OperatingMode on type3, raw elsewhere. off54/55 carry child lock + setpoint only on type2; raw on all other types.",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_56",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 8,
            "id": "ParentDeviceSerialnumber",
            "args": {
              "desc": "EUI64 of ZigBee routing parent (Repeater/Verteiler). Devices connected directly to the gateway show the coordinator EUI of the gateway radio module, which does not appear in any device list.",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 3,
            "id": "Unknown_65_67",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          }
        ],
        "desc": "",
        "info": "",
        "acc": "ro"
      }
    }
  },
  "2104": {
    "68": {
      "codec": "O3EComplexType",
      "len": 68,
      "id": "ZigBeeSevenDeviceCurrentValues",
      "args": {
        "subTypes": [
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_00",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "RSSI",
            "args": {
              "scale": 1.0,
              "signed": true,
              "decimals": 0,
              "unit": "dBm",
              "desc": "Radio signal strength (signed dBm). SignalLevel is the percent representation of this value. 0x00 for FBH zones (no own radio).",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "BatteryLevel",
            "args": {
              "scale": 1.0,
              "signed": false,
              "decimals": 0,
              "unit": "%",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 37,
            "id": "Unknown_03_39",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "SignalLevel",
            "args": {
              "scale": 2.55,
              "signed": false,
              "decimals": 2,
              "unit": "%",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3ESwitch",
            "len": 15,
            "id": "ViCareDevice",
            "args": {
              "listStr": "ViCareDeviceTypes",
              "cases": {
                "0": {
                  "codec": "RawCodec",
                  "len": 14,
                  "id": "Unknown_42_55",
                  "args": {
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "1": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "ActualTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Humidity",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "2": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "ActualTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "ValveOpening",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "DeviceDisplayTurned",
                        "args": {
                          "listStr": "DeviceDisplayModeStates",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "DeviceChildLockActive",
                        "args": {
                          "listStr": "DeviceChildLockStates",
                          "desc": "type2 (TRV) only: child lock (0/1, proven one-factor test). Mirrored in RoomProperty off44 (ChildLockActive).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "DeviceTemperatureSetpoint",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "type2 (TRV) only: TRV own setpoint (0xcd=205 -> 20.5C, scale=10). A room manual setpoint and the program/manual flag are NOT in these records (separate controller room DID).",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "3": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "FlowTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "int16 LE flow temperature, scale 10. Confirmed by live read: bytes 1e 01 -> 28.6 C. off43 is the HIGH BYTE of this value, not a separate state (flow exceeds 25.6 C, e.g. heating). The e3oncan codec reads off43 alone as CurrentWorkingMode, which is therefore just the temperature band (0:<25.6, 1:25.6-51.2, 2:51.2-76.8 C), not a real mode.",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "OperatingMode",
                        "args": {
                          "listStr": "ZigBeeOperatingModes",
                          "desc": "off48 state byte. Observed 0 (Standby, flow 28.6 C) and 2 (Cooling). 1 (Heating) not yet confirmed on a clean capture.",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "4": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_42",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Demand",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "generic zone demand (0/100). Heat vs cool direction comes from the Verteiler OperatingMode, not this byte: reads 100 in cooling too. Proven via condensation cutoff (demand 0 when dew point >= flow temp).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "ValveState",
                        "args": {
                          "listStr": "ValvePositionLevels",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "5": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_42",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Demand",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "generic zone demand (0/100). Heat vs cool direction comes from the Verteiler OperatingMode, not this byte: reads 100 in cooling too. Proven via condensation cutoff (demand 0 when dew point >= flow temp).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "ValveState",
                        "args": {
                          "listStr": "ValvePositionLevels",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                }
              },
              "default": {
                "codec": "RawCodec",
                "len": 14,
                "id": "Unknown_42_55",
                "args": {
                  "desc": "",
                  "info": "",
                  "acc": ""
                }
              },
              "desc": "off41-55, device-dependent. type0: empty slot. type1 (Climate sensor): room temperature (int16) + humidity. type2 (TRV): room temperature (int16) + valve opening %, DisplayTurned (off48), plus ChildLockActive (off54) and DeviceTemperatureSetpoint (off55, scale=10). type3 (Floor thermostat/Verteiler): FlowTemperature is int16 at off42-43 (off43 = high byte, confirmed by live read 28.6 C); OperatingMode at off48. type4/5 (actuator NC/NO): generic Demand % at off43, plus ValveState at off45 (actuator energized 0/1). off45 reads 0 on type1/2/3 (kept as Unknown_45). Unknown_46_47 (off46-47) and Unknown_49_53 (off49-53) always present. off48 is DisplayTurned only on type2, OperatingMode on type3, raw elsewhere. off54/55 carry child lock + setpoint only on type2; raw on all other types.",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_56",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 8,
            "id": "ParentDeviceSerialnumber",
            "args": {
              "desc": "EUI64 of ZigBee routing parent (Repeater/Verteiler). Devices connected directly to the gateway show the coordinator EUI of the gateway radio module, which does not appear in any device list.",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 3,
            "id": "Unknown_65_67",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          }
        ],
        "desc": "",
        "info": "",
        "acc": "ro"
      }
    }
  },
  "2107": {
    "68": {
      "codec": "O3EComplexType",
      "len": 68,
      "id": "ZigBeeEightDeviceCurrentValues",
      "args": {
        "subTypes": [
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_00",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "RSSI",
            "args": {
              "scale": 1.0,
              "signed": true,
              "decimals": 0,
              "unit": "dBm",
              "desc": "Radio signal strength (signed dBm). SignalLevel is the percent representation of this value. 0x00 for FBH zones (no own radio).",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "BatteryLevel",
            "args": {
              "scale": 1.0,
              "signed": false,
              "decimals": 0,
              "unit": "%",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 37,
            "id": "Unknown_03_39",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "SignalLevel",
            "args": {
              "scale": 2.55,
              "signed": false,
              "decimals": 2,
              "unit": "%",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3ESwitch",
            "len": 15,
            "id": "ViCareDevice",
            "args": {
              "listStr": "ViCareDeviceTypes",
              "cases": {
                "0": {
                  "codec": "RawCodec",
                  "len": 14,
                  "id": "Unknown_42_55",
                  "args": {
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "1": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "ActualTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Humidity",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "2": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "ActualTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "ValveOpening",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "DeviceDisplayTurned",
                        "args": {
                          "listStr": "DeviceDisplayModeStates",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "DeviceChildLockActive",
                        "args": {
                          "listStr": "DeviceChildLockStates",
                          "desc": "type2 (TRV) only: child lock (0/1, proven one-factor test). Mirrored in RoomProperty off44 (ChildLockActive).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "DeviceTemperatureSetpoint",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "type2 (TRV) only: TRV own setpoint (0xcd=205 -> 20.5C, scale=10). A room manual setpoint and the program/manual flag are NOT in these records (separate controller room DID).",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "3": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "FlowTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "int16 LE flow temperature, scale 10. Confirmed by live read: bytes 1e 01 -> 28.6 C. off43 is the HIGH BYTE of this value, not a separate state (flow exceeds 25.6 C, e.g. heating). The e3oncan codec reads off43 alone as CurrentWorkingMode, which is therefore just the temperature band (0:<25.6, 1:25.6-51.2, 2:51.2-76.8 C), not a real mode.",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "OperatingMode",
                        "args": {
                          "listStr": "ZigBeeOperatingModes",
                          "desc": "off48 state byte. Observed 0 (Standby, flow 28.6 C) and 2 (Cooling). 1 (Heating) not yet confirmed on a clean capture.",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "4": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_42",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Demand",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "generic zone demand (0/100). Heat vs cool direction comes from the Verteiler OperatingMode, not this byte: reads 100 in cooling too. Proven via condensation cutoff (demand 0 when dew point >= flow temp).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "ValveState",
                        "args": {
                          "listStr": "ValvePositionLevels",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "5": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_42",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Demand",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "generic zone demand (0/100). Heat vs cool direction comes from the Verteiler OperatingMode, not this byte: reads 100 in cooling too. Proven via condensation cutoff (demand 0 when dew point >= flow temp).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "ValveState",
                        "args": {
                          "listStr": "ValvePositionLevels",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                }
              },
              "default": {
                "codec": "RawCodec",
                "len": 14,
                "id": "Unknown_42_55",
                "args": {
                  "desc": "",
                  "info": "",
                  "acc": ""
                }
              },
              "desc": "off41-55, device-dependent. type0: empty slot. type1 (Climate sensor): room temperature (int16) + humidity. type2 (TRV): room temperature (int16) + valve opening %, DisplayTurned (off48), plus ChildLockActive (off54) and DeviceTemperatureSetpoint (off55, scale=10). type3 (Floor thermostat/Verteiler): FlowTemperature is int16 at off42-43 (off43 = high byte, confirmed by live read 28.6 C); OperatingMode at off48. type4/5 (actuator NC/NO): generic Demand % at off43, plus ValveState at off45 (actuator energized 0/1). off45 reads 0 on type1/2/3 (kept as Unknown_45). Unknown_46_47 (off46-47) and Unknown_49_53 (off49-53) always present. off48 is DisplayTurned only on type2, OperatingMode on type3, raw elsewhere. off54/55 carry child lock + setpoint only on type2; raw on all other types.",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_56",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 8,
            "id": "ParentDeviceSerialnumber",
            "args": {
              "desc": "EUI64 of ZigBee routing parent (Repeater/Verteiler). Devices connected directly to the gateway show the coordinator EUI of the gateway radio module, which does not appear in any device list.",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 3,
            "id": "Unknown_65_67",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          }
        ],
        "desc": "",
        "info": "",
        "acc": "ro"
      }
    }
  },
  "2110": {
    "68": {
      "codec": "O3EComplexType",
      "len": 68,
      "id": "ZigBeeNineDeviceCurrentValues",
      "args": {
        "subTypes": [
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_00",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "RSSI",
            "args": {
              "scale": 1.0,
              "signed": true,
              "decimals": 0,
              "unit": "dBm",
              "desc": "Radio signal strength (signed dBm). SignalLevel is the percent representation of this value. 0x00 for FBH zones (no own radio).",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "BatteryLevel",
            "args": {
              "scale": 1.0,
              "signed": false,
              "decimals": 0,
              "unit": "%",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 37,
            "id": "Unknown_03_39",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "SignalLevel",
            "args": {
              "scale": 2.55,
              "signed": false,
              "decimals": 2,
              "unit": "%",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3ESwitch",
            "len": 15,
            "id": "ViCareDevice",
            "args": {
              "listStr": "ViCareDeviceTypes",
              "cases": {
                "0": {
                  "codec": "RawCodec",
                  "len": 14,
                  "id": "Unknown_42_55",
                  "args": {
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "1": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "ActualTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Humidity",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "2": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "ActualTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "ValveOpening",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "DeviceDisplayTurned",
                        "args": {
                          "listStr": "DeviceDisplayModeStates",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "DeviceChildLockActive",
                        "args": {
                          "listStr": "DeviceChildLockStates",
                          "desc": "type2 (TRV) only: child lock (0/1, proven one-factor test). Mirrored in RoomProperty off44 (ChildLockActive).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "DeviceTemperatureSetpoint",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "type2 (TRV) only: TRV own setpoint (0xcd=205 -> 20.5C, scale=10). A room manual setpoint and the program/manual flag are NOT in these records (separate controller room DID).",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "3": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "FlowTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "int16 LE flow temperature, scale 10. Confirmed by live read: bytes 1e 01 -> 28.6 C. off43 is the HIGH BYTE of this value, not a separate state (flow exceeds 25.6 C, e.g. heating). The e3oncan codec reads off43 alone as CurrentWorkingMode, which is therefore just the temperature band (0:<25.6, 1:25.6-51.2, 2:51.2-76.8 C), not a real mode.",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "OperatingMode",
                        "args": {
                          "listStr": "ZigBeeOperatingModes",
                          "desc": "off48 state byte. Observed 0 (Standby, flow 28.6 C) and 2 (Cooling). 1 (Heating) not yet confirmed on a clean capture.",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "4": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_42",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Demand",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "generic zone demand (0/100). Heat vs cool direction comes from the Verteiler OperatingMode, not this byte: reads 100 in cooling too. Proven via condensation cutoff (demand 0 when dew point >= flow temp).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "ValveState",
                        "args": {
                          "listStr": "ValvePositionLevels",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "5": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_42",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Demand",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "generic zone demand (0/100). Heat vs cool direction comes from the Verteiler OperatingMode, not this byte: reads 100 in cooling too. Proven via condensation cutoff (demand 0 when dew point >= flow temp).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "ValveState",
                        "args": {
                          "listStr": "ValvePositionLevels",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                }
              },
              "default": {
                "codec": "RawCodec",
                "len": 14,
                "id": "Unknown_42_55",
                "args": {
                  "desc": "",
                  "info": "",
                  "acc": ""
                }
              },
              "desc": "off41-55, device-dependent. type0: empty slot. type1 (Climate sensor): room temperature (int16) + humidity. type2 (TRV): room temperature (int16) + valve opening %, DisplayTurned (off48), plus ChildLockActive (off54) and DeviceTemperatureSetpoint (off55, scale=10). type3 (Floor thermostat/Verteiler): FlowTemperature is int16 at off42-43 (off43 = high byte, confirmed by live read 28.6 C); OperatingMode at off48. type4/5 (actuator NC/NO): generic Demand % at off43, plus ValveState at off45 (actuator energized 0/1). off45 reads 0 on type1/2/3 (kept as Unknown_45). Unknown_46_47 (off46-47) and Unknown_49_53 (off49-53) always present. off48 is DisplayTurned only on type2, OperatingMode on type3, raw elsewhere. off54/55 carry child lock + setpoint only on type2; raw on all other types.",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_56",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 8,
            "id": "ParentDeviceSerialnumber",
            "args": {
              "desc": "EUI64 of ZigBee routing parent (Repeater/Verteiler). Devices connected directly to the gateway show the coordinator EUI of the gateway radio module, which does not appear in any device list.",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 3,
            "id": "Unknown_65_67",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          }
        ],
        "desc": "",
        "info": "",
        "acc": "ro"
      }
    }
  },
  "2113": {
    "68": {
      "codec": "O3EComplexType",
      "len": 68,
      "id": "ZigBeeTenDeviceCurrentValues",
      "args": {
        "subTypes": [
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_00",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "RSSI",
            "args": {
              "scale": 1.0,
              "signed": true,
              "decimals": 0,
              "unit": "dBm",
              "desc": "Radio signal strength (signed dBm). SignalLevel is the percent representation of this value. 0x00 for FBH zones (no own radio).",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "BatteryLevel",
            "args": {
              "scale": 1.0,
              "signed": false,
              "decimals": 0,
              "unit": "%",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 37,
            "id": "Unknown_03_39",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "SignalLevel",
            "args": {
              "scale": 2.55,
              "signed": false,
              "decimals": 2,
              "unit": "%",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3ESwitch",
            "len": 15,
            "id": "ViCareDevice",
            "args": {
              "listStr": "ViCareDeviceTypes",
              "cases": {
                "0": {
                  "codec": "RawCodec",
                  "len": 14,
                  "id": "Unknown_42_55",
                  "args": {
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "1": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "ActualTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Humidity",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "2": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "ActualTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "ValveOpening",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "DeviceDisplayTurned",
                        "args": {
                          "listStr": "DeviceDisplayModeStates",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "DeviceChildLockActive",
                        "args": {
                          "listStr": "DeviceChildLockStates",
                          "desc": "type2 (TRV) only: child lock (0/1, proven one-factor test). Mirrored in RoomProperty off44 (ChildLockActive).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "DeviceTemperatureSetpoint",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "type2 (TRV) only: TRV own setpoint (0xcd=205 -> 20.5C, scale=10). A room manual setpoint and the program/manual flag are NOT in these records (separate controller room DID).",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "3": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "FlowTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "int16 LE flow temperature, scale 10. Confirmed by live read: bytes 1e 01 -> 28.6 C. off43 is the HIGH BYTE of this value, not a separate state (flow exceeds 25.6 C, e.g. heating). The e3oncan codec reads off43 alone as CurrentWorkingMode, which is therefore just the temperature band (0:<25.6, 1:25.6-51.2, 2:51.2-76.8 C), not a real mode.",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "OperatingMode",
                        "args": {
                          "listStr": "ZigBeeOperatingModes",
                          "desc": "off48 state byte. Observed 0 (Standby, flow 28.6 C) and 2 (Cooling). 1 (Heating) not yet confirmed on a clean capture.",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "4": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_42",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Demand",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "generic zone demand (0/100). Heat vs cool direction comes from the Verteiler OperatingMode, not this byte: reads 100 in cooling too. Proven via condensation cutoff (demand 0 when dew point >= flow temp).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "ValveState",
                        "args": {
                          "listStr": "ValvePositionLevels",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "5": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_42",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Demand",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "generic zone demand (0/100). Heat vs cool direction comes from the Verteiler OperatingMode, not this byte: reads 100 in cooling too. Proven via condensation cutoff (demand 0 when dew point >= flow temp).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "ValveState",
                        "args": {
                          "listStr": "ValvePositionLevels",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                }
              },
              "default": {
                "codec": "RawCodec",
                "len": 14,
                "id": "Unknown_42_55",
                "args": {
                  "desc": "",
                  "info": "",
                  "acc": ""
                }
              },
              "desc": "off41-55, device-dependent. type0: empty slot. type1 (Climate sensor): room temperature (int16) + humidity. type2 (TRV): room temperature (int16) + valve opening %, DisplayTurned (off48), plus ChildLockActive (off54) and DeviceTemperatureSetpoint (off55, scale=10). type3 (Floor thermostat/Verteiler): FlowTemperature is int16 at off42-43 (off43 = high byte, confirmed by live read 28.6 C); OperatingMode at off48. type4/5 (actuator NC/NO): generic Demand % at off43, plus ValveState at off45 (actuator energized 0/1). off45 reads 0 on type1/2/3 (kept as Unknown_45). Unknown_46_47 (off46-47) and Unknown_49_53 (off49-53) always present. off48 is DisplayTurned only on type2, OperatingMode on type3, raw elsewhere. off54/55 carry child lock + setpoint only on type2; raw on all other types.",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_56",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 8,
            "id": "ParentDeviceSerialnumber",
            "args": {
              "desc": "EUI64 of ZigBee routing parent (Repeater/Verteiler). Devices connected directly to the gateway show the coordinator EUI of the gateway radio module, which does not appear in any device list.",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 3,
            "id": "Unknown_65_67",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          }
        ],
        "desc": "",
        "info": "",
        "acc": "ro"
      }
    }
  },
  "2116": {
    "68": {
      "codec": "O3EComplexType",
      "len": 68,
      "id": "ZigBeeElevenDeviceCurrentValues",
      "args": {
        "subTypes": [
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_00",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "RSSI",
            "args": {
              "scale": 1.0,
              "signed": true,
              "decimals": 0,
              "unit": "dBm",
              "desc": "Radio signal strength (signed dBm). SignalLevel is the percent representation of this value. 0x00 for FBH zones (no own radio).",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "BatteryLevel",
            "args": {
              "scale": 1.0,
              "signed": false,
              "decimals": 0,
              "unit": "%",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 37,
            "id": "Unknown_03_39",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "SignalLevel",
            "args": {
              "scale": 2.55,
              "signed": false,
              "decimals": 2,
              "unit": "%",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3ESwitch",
            "len": 15,
            "id": "ViCareDevice",
            "args": {
              "listStr": "ViCareDeviceTypes",
              "cases": {
                "0": {
                  "codec": "RawCodec",
                  "len": 14,
                  "id": "Unknown_42_55",
                  "args": {
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "1": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "ActualTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Humidity",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "2": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "ActualTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "ValveOpening",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "DeviceDisplayTurned",
                        "args": {
                          "listStr": "DeviceDisplayModeStates",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "DeviceChildLockActive",
                        "args": {
                          "listStr": "DeviceChildLockStates",
                          "desc": "type2 (TRV) only: child lock (0/1, proven one-factor test). Mirrored in RoomProperty off44 (ChildLockActive).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "DeviceTemperatureSetpoint",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "type2 (TRV) only: TRV own setpoint (0xcd=205 -> 20.5C, scale=10). A room manual setpoint and the program/manual flag are NOT in these records (separate controller room DID).",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "3": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "FlowTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "int16 LE flow temperature, scale 10. Confirmed by live read: bytes 1e 01 -> 28.6 C. off43 is the HIGH BYTE of this value, not a separate state (flow exceeds 25.6 C, e.g. heating). The e3oncan codec reads off43 alone as CurrentWorkingMode, which is therefore just the temperature band (0:<25.6, 1:25.6-51.2, 2:51.2-76.8 C), not a real mode.",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "OperatingMode",
                        "args": {
                          "listStr": "ZigBeeOperatingModes",
                          "desc": "off48 state byte. Observed 0 (Standby, flow 28.6 C) and 2 (Cooling). 1 (Heating) not yet confirmed on a clean capture.",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "4": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_42",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Demand",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "generic zone demand (0/100). Heat vs cool direction comes from the Verteiler OperatingMode, not this byte: reads 100 in cooling too. Proven via condensation cutoff (demand 0 when dew point >= flow temp).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "ValveState",
                        "args": {
                          "listStr": "ValvePositionLevels",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "5": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_42",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Demand",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "generic zone demand (0/100). Heat vs cool direction comes from the Verteiler OperatingMode, not this byte: reads 100 in cooling too. Proven via condensation cutoff (demand 0 when dew point >= flow temp).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "ValveState",
                        "args": {
                          "listStr": "ValvePositionLevels",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                }
              },
              "default": {
                "codec": "RawCodec",
                "len": 14,
                "id": "Unknown_42_55",
                "args": {
                  "desc": "",
                  "info": "",
                  "acc": ""
                }
              },
              "desc": "off41-55, device-dependent. type0: empty slot. type1 (Climate sensor): room temperature (int16) + humidity. type2 (TRV): room temperature (int16) + valve opening %, DisplayTurned (off48), plus ChildLockActive (off54) and DeviceTemperatureSetpoint (off55, scale=10). type3 (Floor thermostat/Verteiler): FlowTemperature is int16 at off42-43 (off43 = high byte, confirmed by live read 28.6 C); OperatingMode at off48. type4/5 (actuator NC/NO): generic Demand % at off43, plus ValveState at off45 (actuator energized 0/1). off45 reads 0 on type1/2/3 (kept as Unknown_45). Unknown_46_47 (off46-47) and Unknown_49_53 (off49-53) always present. off48 is DisplayTurned only on type2, OperatingMode on type3, raw elsewhere. off54/55 carry child lock + setpoint only on type2; raw on all other types.",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_56",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 8,
            "id": "ParentDeviceSerialnumber",
            "args": {
              "desc": "EUI64 of ZigBee routing parent (Repeater/Verteiler). Devices connected directly to the gateway show the coordinator EUI of the gateway radio module, which does not appear in any device list.",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 3,
            "id": "Unknown_65_67",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          }
        ],
        "desc": "",
        "info": "",
        "acc": "ro"
      }
    }
  },
  "2119": {
    "68": {
      "codec": "O3EComplexType",
      "len": 68,
      "id": "ZigBeeTwelveDeviceCurrentValues",
      "args": {
        "subTypes": [
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_00",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "RSSI",
            "args": {
              "scale": 1.0,
              "signed": true,
              "decimals": 0,
              "unit": "dBm",
              "desc": "Radio signal strength (signed dBm). SignalLevel is the percent representation of this value. 0x00 for FBH zones (no own radio).",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "BatteryLevel",
            "args": {
              "scale": 1.0,
              "signed": false,
              "decimals": 0,
              "unit": "%",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 37,
            "id": "Unknown_03_39",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "SignalLevel",
            "args": {
              "scale": 2.55,
              "signed": false,
              "decimals": 2,
              "unit": "%",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3ESwitch",
            "len": 15,
            "id": "ViCareDevice",
            "args": {
              "listStr": "ViCareDeviceTypes",
              "cases": {
                "0": {
                  "codec": "RawCodec",
                  "len": 14,
                  "id": "Unknown_42_55",
                  "args": {
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "1": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "ActualTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Humidity",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "2": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "ActualTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "ValveOpening",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "DeviceDisplayTurned",
                        "args": {
                          "listStr": "DeviceDisplayModeStates",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "DeviceChildLockActive",
                        "args": {
                          "listStr": "DeviceChildLockStates",
                          "desc": "type2 (TRV) only: child lock (0/1, proven one-factor test). Mirrored in RoomProperty off44 (ChildLockActive).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "DeviceTemperatureSetpoint",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "type2 (TRV) only: TRV own setpoint (0xcd=205 -> 20.5C, scale=10). A room manual setpoint and the program/manual flag are NOT in these records (separate controller room DID).",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "3": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "FlowTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "int16 LE flow temperature, scale 10. Confirmed by live read: bytes 1e 01 -> 28.6 C. off43 is the HIGH BYTE of this value, not a separate state (flow exceeds 25.6 C, e.g. heating). The e3oncan codec reads off43 alone as CurrentWorkingMode, which is therefore just the temperature band (0:<25.6, 1:25.6-51.2, 2:51.2-76.8 C), not a real mode.",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "OperatingMode",
                        "args": {
                          "listStr": "ZigBeeOperatingModes",
                          "desc": "off48 state byte. Observed 0 (Standby, flow 28.6 C) and 2 (Cooling). 1 (Heating) not yet confirmed on a clean capture.",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "4": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_42",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Demand",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "generic zone demand (0/100). Heat vs cool direction comes from the Verteiler OperatingMode, not this byte: reads 100 in cooling too. Proven via condensation cutoff (demand 0 when dew point >= flow temp).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "ValveState",
                        "args": {
                          "listStr": "ValvePositionLevels",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "5": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_42",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Demand",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "generic zone demand (0/100). Heat vs cool direction comes from the Verteiler OperatingMode, not this byte: reads 100 in cooling too. Proven via condensation cutoff (demand 0 when dew point >= flow temp).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "ValveState",
                        "args": {
                          "listStr": "ValvePositionLevels",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                }
              },
              "default": {
                "codec": "RawCodec",
                "len": 14,
                "id": "Unknown_42_55",
                "args": {
                  "desc": "",
                  "info": "",
                  "acc": ""
                }
              },
              "desc": "off41-55, device-dependent. type0: empty slot. type1 (Climate sensor): room temperature (int16) + humidity. type2 (TRV): room temperature (int16) + valve opening %, DisplayTurned (off48), plus ChildLockActive (off54) and DeviceTemperatureSetpoint (off55, scale=10). type3 (Floor thermostat/Verteiler): FlowTemperature is int16 at off42-43 (off43 = high byte, confirmed by live read 28.6 C); OperatingMode at off48. type4/5 (actuator NC/NO): generic Demand % at off43, plus ValveState at off45 (actuator energized 0/1). off45 reads 0 on type1/2/3 (kept as Unknown_45). Unknown_46_47 (off46-47) and Unknown_49_53 (off49-53) always present. off48 is DisplayTurned only on type2, OperatingMode on type3, raw elsewhere. off54/55 carry child lock + setpoint only on type2; raw on all other types.",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_56",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 8,
            "id": "ParentDeviceSerialnumber",
            "args": {
              "desc": "EUI64 of ZigBee routing parent (Repeater/Verteiler). Devices connected directly to the gateway show the coordinator EUI of the gateway radio module, which does not appear in any device list.",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 3,
            "id": "Unknown_65_67",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          }
        ],
        "desc": "",
        "info": "",
        "acc": "ro"
      }
    }
  },
  "2122": {
    "68": {
      "codec": "O3EComplexType",
      "len": 68,
      "id": "ZigBeeThirteenDeviceCurrentValues",
      "args": {
        "subTypes": [
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_00",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "RSSI",
            "args": {
              "scale": 1.0,
              "signed": true,
              "decimals": 0,
              "unit": "dBm",
              "desc": "Radio signal strength (signed dBm). SignalLevel is the percent representation of this value. 0x00 for FBH zones (no own radio).",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "BatteryLevel",
            "args": {
              "scale": 1.0,
              "signed": false,
              "decimals": 0,
              "unit": "%",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 37,
            "id": "Unknown_03_39",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "SignalLevel",
            "args": {
              "scale": 2.55,
              "signed": false,
              "decimals": 2,
              "unit": "%",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3ESwitch",
            "len": 15,
            "id": "ViCareDevice",
            "args": {
              "listStr": "ViCareDeviceTypes",
              "cases": {
                "0": {
                  "codec": "RawCodec",
                  "len": 14,
                  "id": "Unknown_42_55",
                  "args": {
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "1": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "ActualTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Humidity",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "2": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "ActualTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "ValveOpening",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "DeviceDisplayTurned",
                        "args": {
                          "listStr": "DeviceDisplayModeStates",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "DeviceChildLockActive",
                        "args": {
                          "listStr": "DeviceChildLockStates",
                          "desc": "type2 (TRV) only: child lock (0/1, proven one-factor test). Mirrored in RoomProperty off44 (ChildLockActive).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "DeviceTemperatureSetpoint",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "type2 (TRV) only: TRV own setpoint (0xcd=205 -> 20.5C, scale=10). A room manual setpoint and the program/manual flag are NOT in these records (separate controller room DID).",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "3": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "FlowTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "int16 LE flow temperature, scale 10. Confirmed by live read: bytes 1e 01 -> 28.6 C. off43 is the HIGH BYTE of this value, not a separate state (flow exceeds 25.6 C, e.g. heating). The e3oncan codec reads off43 alone as CurrentWorkingMode, which is therefore just the temperature band (0:<25.6, 1:25.6-51.2, 2:51.2-76.8 C), not a real mode.",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "OperatingMode",
                        "args": {
                          "listStr": "ZigBeeOperatingModes",
                          "desc": "off48 state byte. Observed 0 (Standby, flow 28.6 C) and 2 (Cooling). 1 (Heating) not yet confirmed on a clean capture.",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "4": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_42",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Demand",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "generic zone demand (0/100). Heat vs cool direction comes from the Verteiler OperatingMode, not this byte: reads 100 in cooling too. Proven via condensation cutoff (demand 0 when dew point >= flow temp).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "ValveState",
                        "args": {
                          "listStr": "ValvePositionLevels",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "5": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_42",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Demand",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "generic zone demand (0/100). Heat vs cool direction comes from the Verteiler OperatingMode, not this byte: reads 100 in cooling too. Proven via condensation cutoff (demand 0 when dew point >= flow temp).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "ValveState",
                        "args": {
                          "listStr": "ValvePositionLevels",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                }
              },
              "default": {
                "codec": "RawCodec",
                "len": 14,
                "id": "Unknown_42_55",
                "args": {
                  "desc": "",
                  "info": "",
                  "acc": ""
                }
              },
              "desc": "off41-55, device-dependent. type0: empty slot. type1 (Climate sensor): room temperature (int16) + humidity. type2 (TRV): room temperature (int16) + valve opening %, DisplayTurned (off48), plus ChildLockActive (off54) and DeviceTemperatureSetpoint (off55, scale=10). type3 (Floor thermostat/Verteiler): FlowTemperature is int16 at off42-43 (off43 = high byte, confirmed by live read 28.6 C); OperatingMode at off48. type4/5 (actuator NC/NO): generic Demand % at off43, plus ValveState at off45 (actuator energized 0/1). off45 reads 0 on type1/2/3 (kept as Unknown_45). Unknown_46_47 (off46-47) and Unknown_49_53 (off49-53) always present. off48 is DisplayTurned only on type2, OperatingMode on type3, raw elsewhere. off54/55 carry child lock + setpoint only on type2; raw on all other types.",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_56",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 8,
            "id": "ParentDeviceSerialnumber",
            "args": {
              "desc": "EUI64 of ZigBee routing parent (Repeater/Verteiler). Devices connected directly to the gateway show the coordinator EUI of the gateway radio module, which does not appear in any device list.",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 3,
            "id": "Unknown_65_67",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          }
        ],
        "desc": "",
        "info": "",
        "acc": "ro"
      }
    }
  },
  "2125": {
    "68": {
      "codec": "O3EComplexType",
      "len": 68,
      "id": "ZigBeeFourteenDeviceCurrentValues",
      "args": {
        "subTypes": [
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_00",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "RSSI",
            "args": {
              "scale": 1.0,
              "signed": true,
              "decimals": 0,
              "unit": "dBm",
              "desc": "Radio signal strength (signed dBm). SignalLevel is the percent representation of this value. 0x00 for FBH zones (no own radio).",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "BatteryLevel",
            "args": {
              "scale": 1.0,
              "signed": false,
              "decimals": 0,
              "unit": "%",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 37,
            "id": "Unknown_03_39",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "SignalLevel",
            "args": {
              "scale": 2.55,
              "signed": false,
              "decimals": 2,
              "unit": "%",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3ESwitch",
            "len": 15,
            "id": "ViCareDevice",
            "args": {
              "listStr": "ViCareDeviceTypes",
              "cases": {
                "0": {
                  "codec": "RawCodec",
                  "len": 14,
                  "id": "Unknown_42_55",
                  "args": {
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "1": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "ActualTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Humidity",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "2": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "ActualTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "ValveOpening",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "DeviceDisplayTurned",
                        "args": {
                          "listStr": "DeviceDisplayModeStates",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "DeviceChildLockActive",
                        "args": {
                          "listStr": "DeviceChildLockStates",
                          "desc": "type2 (TRV) only: child lock (0/1, proven one-factor test). Mirrored in RoomProperty off44 (ChildLockActive).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "DeviceTemperatureSetpoint",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "type2 (TRV) only: TRV own setpoint (0xcd=205 -> 20.5C, scale=10). A room manual setpoint and the program/manual flag are NOT in these records (separate controller room DID).",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "3": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "FlowTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "int16 LE flow temperature, scale 10. Confirmed by live read: bytes 1e 01 -> 28.6 C. off43 is the HIGH BYTE of this value, not a separate state (flow exceeds 25.6 C, e.g. heating). The e3oncan codec reads off43 alone as CurrentWorkingMode, which is therefore just the temperature band (0:<25.6, 1:25.6-51.2, 2:51.2-76.8 C), not a real mode.",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "OperatingMode",
                        "args": {
                          "listStr": "ZigBeeOperatingModes",
                          "desc": "off48 state byte. Observed 0 (Standby, flow 28.6 C) and 2 (Cooling). 1 (Heating) not yet confirmed on a clean capture.",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "4": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_42",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Demand",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "generic zone demand (0/100). Heat vs cool direction comes from the Verteiler OperatingMode, not this byte: reads 100 in cooling too. Proven via condensation cutoff (demand 0 when dew point >= flow temp).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "ValveState",
                        "args": {
                          "listStr": "ValvePositionLevels",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "5": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_42",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Demand",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "generic zone demand (0/100). Heat vs cool direction comes from the Verteiler OperatingMode, not this byte: reads 100 in cooling too. Proven via condensation cutoff (demand 0 when dew point >= flow temp).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "ValveState",
                        "args": {
                          "listStr": "ValvePositionLevels",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                }
              },
              "default": {
                "codec": "RawCodec",
                "len": 14,
                "id": "Unknown_42_55",
                "args": {
                  "desc": "",
                  "info": "",
                  "acc": ""
                }
              },
              "desc": "off41-55, device-dependent. type0: empty slot. type1 (Climate sensor): room temperature (int16) + humidity. type2 (TRV): room temperature (int16) + valve opening %, DisplayTurned (off48), plus ChildLockActive (off54) and DeviceTemperatureSetpoint (off55, scale=10). type3 (Floor thermostat/Verteiler): FlowTemperature is int16 at off42-43 (off43 = high byte, confirmed by live read 28.6 C); OperatingMode at off48. type4/5 (actuator NC/NO): generic Demand % at off43, plus ValveState at off45 (actuator energized 0/1). off45 reads 0 on type1/2/3 (kept as Unknown_45). Unknown_46_47 (off46-47) and Unknown_49_53 (off49-53) always present. off48 is DisplayTurned only on type2, OperatingMode on type3, raw elsewhere. off54/55 carry child lock + setpoint only on type2; raw on all other types.",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_56",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 8,
            "id": "ParentDeviceSerialnumber",
            "args": {
              "desc": "EUI64 of ZigBee routing parent (Repeater/Verteiler). Devices connected directly to the gateway show the coordinator EUI of the gateway radio module, which does not appear in any device list.",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 3,
            "id": "Unknown_65_67",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          }
        ],
        "desc": "",
        "info": "",
        "acc": "ro"
      }
    }
  },
  "2128": {
    "68": {
      "codec": "O3EComplexType",
      "len": 68,
      "id": "ZigBeeFifteenDeviceCurrentValues",
      "args": {
        "subTypes": [
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_00",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "RSSI",
            "args": {
              "scale": 1.0,
              "signed": true,
              "decimals": 0,
              "unit": "dBm",
              "desc": "Radio signal strength (signed dBm). SignalLevel is the percent representation of this value. 0x00 for FBH zones (no own radio).",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "BatteryLevel",
            "args": {
              "scale": 1.0,
              "signed": false,
              "decimals": 0,
              "unit": "%",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 37,
            "id": "Unknown_03_39",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "SignalLevel",
            "args": {
              "scale": 2.55,
              "signed": false,
              "decimals": 2,
              "unit": "%",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3ESwitch",
            "len": 15,
            "id": "ViCareDevice",
            "args": {
              "listStr": "ViCareDeviceTypes",
              "cases": {
                "0": {
                  "codec": "RawCodec",
                  "len": 14,
                  "id": "Unknown_42_55",
                  "args": {
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "1": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "ActualTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Humidity",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "2": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "ActualTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "ValveOpening",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "DeviceDisplayTurned",
                        "args": {
                          "listStr": "DeviceDisplayModeStates",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "DeviceChildLockActive",
                        "args": {
                          "listStr": "DeviceChildLockStates",
                          "desc": "type2 (TRV) only: child lock (0/1, proven one-factor test). Mirrored in RoomProperty off44 (ChildLockActive).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "DeviceTemperatureSetpoint",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "type2 (TRV) only: TRV own setpoint (0xcd=205 -> 20.5C, scale=10). A room manual setpoint and the program/manual flag are NOT in these records (separate controller room DID).",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "3": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "FlowTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "int16 LE flow temperature, scale 10. Confirmed by live read: bytes 1e 01 -> 28.6 C. off43 is the HIGH BYTE of this value, not a separate state (flow exceeds 25.6 C, e.g. heating). The e3oncan codec reads off43 alone as CurrentWorkingMode, which is therefore just the temperature band (0:<25.6, 1:25.6-51.2, 2:51.2-76.8 C), not a real mode.",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "OperatingMode",
                        "args": {
                          "listStr": "ZigBeeOperatingModes",
                          "desc": "off48 state byte. Observed 0 (Standby, flow 28.6 C) and 2 (Cooling). 1 (Heating) not yet confirmed on a clean capture.",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "4": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_42",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Demand",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "generic zone demand (0/100). Heat vs cool direction comes from the Verteiler OperatingMode, not this byte: reads 100 in cooling too. Proven via condensation cutoff (demand 0 when dew point >= flow temp).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "ValveState",
                        "args": {
                          "listStr": "ValvePositionLevels",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "5": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_42",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Demand",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "generic zone demand (0/100). Heat vs cool direction comes from the Verteiler OperatingMode, not this byte: reads 100 in cooling too. Proven via condensation cutoff (demand 0 when dew point >= flow temp).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "ValveState",
                        "args": {
                          "listStr": "ValvePositionLevels",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                }
              },
              "default": {
                "codec": "RawCodec",
                "len": 14,
                "id": "Unknown_42_55",
                "args": {
                  "desc": "",
                  "info": "",
                  "acc": ""
                }
              },
              "desc": "off41-55, device-dependent. type0: empty slot. type1 (Climate sensor): room temperature (int16) + humidity. type2 (TRV): room temperature (int16) + valve opening %, DisplayTurned (off48), plus ChildLockActive (off54) and DeviceTemperatureSetpoint (off55, scale=10). type3 (Floor thermostat/Verteiler): FlowTemperature is int16 at off42-43 (off43 = high byte, confirmed by live read 28.6 C); OperatingMode at off48. type4/5 (actuator NC/NO): generic Demand % at off43, plus ValveState at off45 (actuator energized 0/1). off45 reads 0 on type1/2/3 (kept as Unknown_45). Unknown_46_47 (off46-47) and Unknown_49_53 (off49-53) always present. off48 is DisplayTurned only on type2, OperatingMode on type3, raw elsewhere. off54/55 carry child lock + setpoint only on type2; raw on all other types.",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_56",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 8,
            "id": "ParentDeviceSerialnumber",
            "args": {
              "desc": "EUI64 of ZigBee routing parent (Repeater/Verteiler). Devices connected directly to the gateway show the coordinator EUI of the gateway radio module, which does not appear in any device list.",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 3,
            "id": "Unknown_65_67",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          }
        ],
        "desc": "",
        "info": "",
        "acc": "ro"
      }
    }
  },
  "2131": {
    "68": {
      "codec": "O3EComplexType",
      "len": 68,
      "id": "ZigBeeSixteenDeviceCurrentValues",
      "args": {
        "subTypes": [
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_00",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "RSSI",
            "args": {
              "scale": 1.0,
              "signed": true,
              "decimals": 0,
              "unit": "dBm",
              "desc": "Radio signal strength (signed dBm). SignalLevel is the percent representation of this value. 0x00 for FBH zones (no own radio).",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "BatteryLevel",
            "args": {
              "scale": 1.0,
              "signed": false,
              "decimals": 0,
              "unit": "%",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 37,
            "id": "Unknown_03_39",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "SignalLevel",
            "args": {
              "scale": 2.55,
              "signed": false,
              "decimals": 2,
              "unit": "%",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3ESwitch",
            "len": 15,
            "id": "ViCareDevice",
            "args": {
              "listStr": "ViCareDeviceTypes",
              "cases": {
                "0": {
                  "codec": "RawCodec",
                  "len": 14,
                  "id": "Unknown_42_55",
                  "args": {
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "1": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "ActualTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Humidity",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "2": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "ActualTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "ValveOpening",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "DeviceDisplayTurned",
                        "args": {
                          "listStr": "DeviceDisplayModeStates",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "DeviceChildLockActive",
                        "args": {
                          "listStr": "DeviceChildLockStates",
                          "desc": "type2 (TRV) only: child lock (0/1, proven one-factor test). Mirrored in RoomProperty off44 (ChildLockActive).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "DeviceTemperatureSetpoint",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "type2 (TRV) only: TRV own setpoint (0xcd=205 -> 20.5C, scale=10). A room manual setpoint and the program/manual flag are NOT in these records (separate controller room DID).",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "3": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "FlowTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "int16 LE flow temperature, scale 10. Confirmed by live read: bytes 1e 01 -> 28.6 C. off43 is the HIGH BYTE of this value, not a separate state (flow exceeds 25.6 C, e.g. heating). The e3oncan codec reads off43 alone as CurrentWorkingMode, which is therefore just the temperature band (0:<25.6, 1:25.6-51.2, 2:51.2-76.8 C), not a real mode.",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "OperatingMode",
                        "args": {
                          "listStr": "ZigBeeOperatingModes",
                          "desc": "off48 state byte. Observed 0 (Standby, flow 28.6 C) and 2 (Cooling). 1 (Heating) not yet confirmed on a clean capture.",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "4": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_42",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Demand",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "generic zone demand (0/100). Heat vs cool direction comes from the Verteiler OperatingMode, not this byte: reads 100 in cooling too. Proven via condensation cutoff (demand 0 when dew point >= flow temp).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "ValveState",
                        "args": {
                          "listStr": "ValvePositionLevels",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "5": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_42",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Demand",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "generic zone demand (0/100). Heat vs cool direction comes from the Verteiler OperatingMode, not this byte: reads 100 in cooling too. Proven via condensation cutoff (demand 0 when dew point >= flow temp).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "ValveState",
                        "args": {
                          "listStr": "ValvePositionLevels",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                }
              },
              "default": {
                "codec": "RawCodec",
                "len": 14,
                "id": "Unknown_42_55",
                "args": {
                  "desc": "",
                  "info": "",
                  "acc": ""
                }
              },
              "desc": "off41-55, device-dependent. type0: empty slot. type1 (Climate sensor): room temperature (int16) + humidity. type2 (TRV): room temperature (int16) + valve opening %, DisplayTurned (off48), plus ChildLockActive (off54) and DeviceTemperatureSetpoint (off55, scale=10). type3 (Floor thermostat/Verteiler): FlowTemperature is int16 at off42-43 (off43 = high byte, confirmed by live read 28.6 C); OperatingMode at off48. type4/5 (actuator NC/NO): generic Demand % at off43, plus ValveState at off45 (actuator energized 0/1). off45 reads 0 on type1/2/3 (kept as Unknown_45). Unknown_46_47 (off46-47) and Unknown_49_53 (off49-53) always present. off48 is DisplayTurned only on type2, OperatingMode on type3, raw elsewhere. off54/55 carry child lock + setpoint only on type2; raw on all other types.",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_56",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 8,
            "id": "ParentDeviceSerialnumber",
            "args": {
              "desc": "EUI64 of ZigBee routing parent (Repeater/Verteiler). Devices connected directly to the gateway show the coordinator EUI of the gateway radio module, which does not appear in any device list.",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 3,
            "id": "Unknown_65_67",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          }
        ],
        "desc": "",
        "info": "",
        "acc": "ro"
      }
    }
  },
  "2134": {
    "68": {
      "codec": "O3EComplexType",
      "len": 68,
      "id": "ZigBeeSeventeenDeviceCurrentValues",
      "args": {
        "subTypes": [
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_00",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "RSSI",
            "args": {
              "scale": 1.0,
              "signed": true,
              "decimals": 0,
              "unit": "dBm",
              "desc": "Radio signal strength (signed dBm). SignalLevel is the percent representation of this value. 0x00 for FBH zones (no own radio).",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "BatteryLevel",
            "args": {
              "scale": 1.0,
              "signed": false,
              "decimals": 0,
              "unit": "%",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 37,
            "id": "Unknown_03_39",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "SignalLevel",
            "args": {
              "scale": 2.55,
              "signed": false,
              "decimals": 2,
              "unit": "%",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3ESwitch",
            "len": 15,
            "id": "ViCareDevice",
            "args": {
              "listStr": "ViCareDeviceTypes",
              "cases": {
                "0": {
                  "codec": "RawCodec",
                  "len": 14,
                  "id": "Unknown_42_55",
                  "args": {
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "1": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "ActualTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Humidity",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "2": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "ActualTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "ValveOpening",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "DeviceDisplayTurned",
                        "args": {
                          "listStr": "DeviceDisplayModeStates",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "DeviceChildLockActive",
                        "args": {
                          "listStr": "DeviceChildLockStates",
                          "desc": "type2 (TRV) only: child lock (0/1, proven one-factor test). Mirrored in RoomProperty off44 (ChildLockActive).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "DeviceTemperatureSetpoint",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "type2 (TRV) only: TRV own setpoint (0xcd=205 -> 20.5C, scale=10). A room manual setpoint and the program/manual flag are NOT in these records (separate controller room DID).",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "3": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "FlowTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "int16 LE flow temperature, scale 10. Confirmed by live read: bytes 1e 01 -> 28.6 C. off43 is the HIGH BYTE of this value, not a separate state (flow exceeds 25.6 C, e.g. heating). The e3oncan codec reads off43 alone as CurrentWorkingMode, which is therefore just the temperature band (0:<25.6, 1:25.6-51.2, 2:51.2-76.8 C), not a real mode.",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "OperatingMode",
                        "args": {
                          "listStr": "ZigBeeOperatingModes",
                          "desc": "off48 state byte. Observed 0 (Standby, flow 28.6 C) and 2 (Cooling). 1 (Heating) not yet confirmed on a clean capture.",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "4": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_42",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Demand",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "generic zone demand (0/100). Heat vs cool direction comes from the Verteiler OperatingMode, not this byte: reads 100 in cooling too. Proven via condensation cutoff (demand 0 when dew point >= flow temp).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "ValveState",
                        "args": {
                          "listStr": "ValvePositionLevels",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "5": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_42",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Demand",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "generic zone demand (0/100). Heat vs cool direction comes from the Verteiler OperatingMode, not this byte: reads 100 in cooling too. Proven via condensation cutoff (demand 0 when dew point >= flow temp).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "ValveState",
                        "args": {
                          "listStr": "ValvePositionLevels",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                }
              },
              "default": {
                "codec": "RawCodec",
                "len": 14,
                "id": "Unknown_42_55",
                "args": {
                  "desc": "",
                  "info": "",
                  "acc": ""
                }
              },
              "desc": "off41-55, device-dependent. type0: empty slot. type1 (Climate sensor): room temperature (int16) + humidity. type2 (TRV): room temperature (int16) + valve opening %, DisplayTurned (off48), plus ChildLockActive (off54) and DeviceTemperatureSetpoint (off55, scale=10). type3 (Floor thermostat/Verteiler): FlowTemperature is int16 at off42-43 (off43 = high byte, confirmed by live read 28.6 C); OperatingMode at off48. type4/5 (actuator NC/NO): generic Demand % at off43, plus ValveState at off45 (actuator energized 0/1). off45 reads 0 on type1/2/3 (kept as Unknown_45). Unknown_46_47 (off46-47) and Unknown_49_53 (off49-53) always present. off48 is DisplayTurned only on type2, OperatingMode on type3, raw elsewhere. off54/55 carry child lock + setpoint only on type2; raw on all other types.",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_56",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 8,
            "id": "ParentDeviceSerialnumber",
            "args": {
              "desc": "EUI64 of ZigBee routing parent (Repeater/Verteiler). Devices connected directly to the gateway show the coordinator EUI of the gateway radio module, which does not appear in any device list.",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 3,
            "id": "Unknown_65_67",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          }
        ],
        "desc": "",
        "info": "",
        "acc": "ro"
      }
    }
  },
  "2137": {
    "68": {
      "codec": "O3EComplexType",
      "len": 68,
      "id": "ZigBeeEighteenDeviceCurrentValues",
      "args": {
        "subTypes": [
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_00",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "RSSI",
            "args": {
              "scale": 1.0,
              "signed": true,
              "decimals": 0,
              "unit": "dBm",
              "desc": "Radio signal strength (signed dBm). SignalLevel is the percent representation of this value. 0x00 for FBH zones (no own radio).",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "BatteryLevel",
            "args": {
              "scale": 1.0,
              "signed": false,
              "decimals": 0,
              "unit": "%",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 37,
            "id": "Unknown_03_39",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "SignalLevel",
            "args": {
              "scale": 2.55,
              "signed": false,
              "decimals": 2,
              "unit": "%",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3ESwitch",
            "len": 15,
            "id": "ViCareDevice",
            "args": {
              "listStr": "ViCareDeviceTypes",
              "cases": {
                "0": {
                  "codec": "RawCodec",
                  "len": 14,
                  "id": "Unknown_42_55",
                  "args": {
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "1": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "ActualTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Humidity",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "2": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "ActualTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "ValveOpening",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "DeviceDisplayTurned",
                        "args": {
                          "listStr": "DeviceDisplayModeStates",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "DeviceChildLockActive",
                        "args": {
                          "listStr": "DeviceChildLockStates",
                          "desc": "type2 (TRV) only: child lock (0/1, proven one-factor test). Mirrored in RoomProperty off44 (ChildLockActive).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "DeviceTemperatureSetpoint",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "type2 (TRV) only: TRV own setpoint (0xcd=205 -> 20.5C, scale=10). A room manual setpoint and the program/manual flag are NOT in these records (separate controller room DID).",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "3": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "FlowTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "int16 LE flow temperature, scale 10. Confirmed by live read: bytes 1e 01 -> 28.6 C. off43 is the HIGH BYTE of this value, not a separate state (flow exceeds 25.6 C, e.g. heating). The e3oncan codec reads off43 alone as CurrentWorkingMode, which is therefore just the temperature band (0:<25.6, 1:25.6-51.2, 2:51.2-76.8 C), not a real mode.",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "OperatingMode",
                        "args": {
                          "listStr": "ZigBeeOperatingModes",
                          "desc": "off48 state byte. Observed 0 (Standby, flow 28.6 C) and 2 (Cooling). 1 (Heating) not yet confirmed on a clean capture.",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "4": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_42",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Demand",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "generic zone demand (0/100). Heat vs cool direction comes from the Verteiler OperatingMode, not this byte: reads 100 in cooling too. Proven via condensation cutoff (demand 0 when dew point >= flow temp).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "ValveState",
                        "args": {
                          "listStr": "ValvePositionLevels",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "5": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_42",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Demand",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "generic zone demand (0/100). Heat vs cool direction comes from the Verteiler OperatingMode, not this byte: reads 100 in cooling too. Proven via condensation cutoff (demand 0 when dew point >= flow temp).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "ValveState",
                        "args": {
                          "listStr": "ValvePositionLevels",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                }
              },
              "default": {
                "codec": "RawCodec",
                "len": 14,
                "id": "Unknown_42_55",
                "args": {
                  "desc": "",
                  "info": "",
                  "acc": ""
                }
              },
              "desc": "off41-55, device-dependent. type0: empty slot. type1 (Climate sensor): room temperature (int16) + humidity. type2 (TRV): room temperature (int16) + valve opening %, DisplayTurned (off48), plus ChildLockActive (off54) and DeviceTemperatureSetpoint (off55, scale=10). type3 (Floor thermostat/Verteiler): FlowTemperature is int16 at off42-43 (off43 = high byte, confirmed by live read 28.6 C); OperatingMode at off48. type4/5 (actuator NC/NO): generic Demand % at off43, plus ValveState at off45 (actuator energized 0/1). off45 reads 0 on type1/2/3 (kept as Unknown_45). Unknown_46_47 (off46-47) and Unknown_49_53 (off49-53) always present. off48 is DisplayTurned only on type2, OperatingMode on type3, raw elsewhere. off54/55 carry child lock + setpoint only on type2; raw on all other types.",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_56",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 8,
            "id": "ParentDeviceSerialnumber",
            "args": {
              "desc": "EUI64 of ZigBee routing parent (Repeater/Verteiler). Devices connected directly to the gateway show the coordinator EUI of the gateway radio module, which does not appear in any device list.",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 3,
            "id": "Unknown_65_67",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          }
        ],
        "desc": "",
        "info": "",
        "acc": "ro"
      }
    }
  },
  "2140": {
    "68": {
      "codec": "O3EComplexType",
      "len": 68,
      "id": "ZigBeeNineteenDeviceCurrentValues",
      "args": {
        "subTypes": [
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_00",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "RSSI",
            "args": {
              "scale": 1.0,
              "signed": true,
              "decimals": 0,
              "unit": "dBm",
              "desc": "Radio signal strength (signed dBm). SignalLevel is the percent representation of this value. 0x00 for FBH zones (no own radio).",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "BatteryLevel",
            "args": {
              "scale": 1.0,
              "signed": false,
              "decimals": 0,
              "unit": "%",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 37,
            "id": "Unknown_03_39",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "SignalLevel",
            "args": {
              "scale": 2.55,
              "signed": false,
              "decimals": 2,
              "unit": "%",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3ESwitch",
            "len": 15,
            "id": "ViCareDevice",
            "args": {
              "listStr": "ViCareDeviceTypes",
              "cases": {
                "0": {
                  "codec": "RawCodec",
                  "len": 14,
                  "id": "Unknown_42_55",
                  "args": {
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "1": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "ActualTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Humidity",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "2": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "ActualTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "ValveOpening",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "DeviceDisplayTurned",
                        "args": {
                          "listStr": "DeviceDisplayModeStates",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "DeviceChildLockActive",
                        "args": {
                          "listStr": "DeviceChildLockStates",
                          "desc": "type2 (TRV) only: child lock (0/1, proven one-factor test). Mirrored in RoomProperty off44 (ChildLockActive).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "DeviceTemperatureSetpoint",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "type2 (TRV) only: TRV own setpoint (0xcd=205 -> 20.5C, scale=10). A room manual setpoint and the program/manual flag are NOT in these records (separate controller room DID).",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "3": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "FlowTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "int16 LE flow temperature, scale 10. Confirmed by live read: bytes 1e 01 -> 28.6 C. off43 is the HIGH BYTE of this value, not a separate state (flow exceeds 25.6 C, e.g. heating). The e3oncan codec reads off43 alone as CurrentWorkingMode, which is therefore just the temperature band (0:<25.6, 1:25.6-51.2, 2:51.2-76.8 C), not a real mode.",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "OperatingMode",
                        "args": {
                          "listStr": "ZigBeeOperatingModes",
                          "desc": "off48 state byte. Observed 0 (Standby, flow 28.6 C) and 2 (Cooling). 1 (Heating) not yet confirmed on a clean capture.",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "4": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_42",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Demand",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "generic zone demand (0/100). Heat vs cool direction comes from the Verteiler OperatingMode, not this byte: reads 100 in cooling too. Proven via condensation cutoff (demand 0 when dew point >= flow temp).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "ValveState",
                        "args": {
                          "listStr": "ValvePositionLevels",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "5": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_42",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Demand",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "generic zone demand (0/100). Heat vs cool direction comes from the Verteiler OperatingMode, not this byte: reads 100 in cooling too. Proven via condensation cutoff (demand 0 when dew point >= flow temp).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "ValveState",
                        "args": {
                          "listStr": "ValvePositionLevels",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                }
              },
              "default": {
                "codec": "RawCodec",
                "len": 14,
                "id": "Unknown_42_55",
                "args": {
                  "desc": "",
                  "info": "",
                  "acc": ""
                }
              },
              "desc": "off41-55, device-dependent. type0: empty slot. type1 (Climate sensor): room temperature (int16) + humidity. type2 (TRV): room temperature (int16) + valve opening %, DisplayTurned (off48), plus ChildLockActive (off54) and DeviceTemperatureSetpoint (off55, scale=10). type3 (Floor thermostat/Verteiler): FlowTemperature is int16 at off42-43 (off43 = high byte, confirmed by live read 28.6 C); OperatingMode at off48. type4/5 (actuator NC/NO): generic Demand % at off43, plus ValveState at off45 (actuator energized 0/1). off45 reads 0 on type1/2/3 (kept as Unknown_45). Unknown_46_47 (off46-47) and Unknown_49_53 (off49-53) always present. off48 is DisplayTurned only on type2, OperatingMode on type3, raw elsewhere. off54/55 carry child lock + setpoint only on type2; raw on all other types.",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_56",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 8,
            "id": "ParentDeviceSerialnumber",
            "args": {
              "desc": "EUI64 of ZigBee routing parent (Repeater/Verteiler). Devices connected directly to the gateway show the coordinator EUI of the gateway radio module, which does not appear in any device list.",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 3,
            "id": "Unknown_65_67",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          }
        ],
        "desc": "",
        "info": "",
        "acc": "ro"
      }
    }
  },
  "2143": {
    "68": {
      "codec": "O3EComplexType",
      "len": 68,
      "id": "ZigBeeTwentyDeviceCurrentValues",
      "args": {
        "subTypes": [
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_00",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "RSSI",
            "args": {
              "scale": 1.0,
              "signed": true,
              "decimals": 0,
              "unit": "dBm",
              "desc": "Radio signal strength (signed dBm). SignalLevel is the percent representation of this value. 0x00 for FBH zones (no own radio).",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "BatteryLevel",
            "args": {
              "scale": 1.0,
              "signed": false,
              "decimals": 0,
              "unit": "%",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 37,
            "id": "Unknown_03_39",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "SignalLevel",
            "args": {
              "scale": 2.55,
              "signed": false,
              "decimals": 2,
              "unit": "%",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3ESwitch",
            "len": 15,
            "id": "ViCareDevice",
            "args": {
              "listStr": "ViCareDeviceTypes",
              "cases": {
                "0": {
                  "codec": "RawCodec",
                  "len": 14,
                  "id": "Unknown_42_55",
                  "args": {
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "1": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "ActualTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Humidity",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "2": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "ActualTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "ValveOpening",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "DeviceDisplayTurned",
                        "args": {
                          "listStr": "DeviceDisplayModeStates",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "DeviceChildLockActive",
                        "args": {
                          "listStr": "DeviceChildLockStates",
                          "desc": "type2 (TRV) only: child lock (0/1, proven one-factor test). Mirrored in RoomProperty off44 (ChildLockActive).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "DeviceTemperatureSetpoint",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "type2 (TRV) only: TRV own setpoint (0xcd=205 -> 20.5C, scale=10). A room manual setpoint and the program/manual flag are NOT in these records (separate controller room DID).",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "3": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "FlowTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "int16 LE flow temperature, scale 10. Confirmed by live read: bytes 1e 01 -> 28.6 C. off43 is the HIGH BYTE of this value, not a separate state (flow exceeds 25.6 C, e.g. heating). The e3oncan codec reads off43 alone as CurrentWorkingMode, which is therefore just the temperature band (0:<25.6, 1:25.6-51.2, 2:51.2-76.8 C), not a real mode.",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "OperatingMode",
                        "args": {
                          "listStr": "ZigBeeOperatingModes",
                          "desc": "off48 state byte. Observed 0 (Standby, flow 28.6 C) and 2 (Cooling). 1 (Heating) not yet confirmed on a clean capture.",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "4": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_42",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Demand",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "generic zone demand (0/100). Heat vs cool direction comes from the Verteiler OperatingMode, not this byte: reads 100 in cooling too. Proven via condensation cutoff (demand 0 when dew point >= flow temp).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "ValveState",
                        "args": {
                          "listStr": "ValvePositionLevels",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "5": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_42",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Demand",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "generic zone demand (0/100). Heat vs cool direction comes from the Verteiler OperatingMode, not this byte: reads 100 in cooling too. Proven via condensation cutoff (demand 0 when dew point >= flow temp).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "ValveState",
                        "args": {
                          "listStr": "ValvePositionLevels",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                }
              },
              "default": {
                "codec": "RawCodec",
                "len": 14,
                "id": "Unknown_42_55",
                "args": {
                  "desc": "",
                  "info": "",
                  "acc": ""
                }
              },
              "desc": "off41-55, device-dependent. type0: empty slot. type1 (Climate sensor): room temperature (int16) + humidity. type2 (TRV): room temperature (int16) + valve opening %, DisplayTurned (off48), plus ChildLockActive (off54) and DeviceTemperatureSetpoint (off55, scale=10). type3 (Floor thermostat/Verteiler): FlowTemperature is int16 at off42-43 (off43 = high byte, confirmed by live read 28.6 C); OperatingMode at off48. type4/5 (actuator NC/NO): generic Demand % at off43, plus ValveState at off45 (actuator energized 0/1). off45 reads 0 on type1/2/3 (kept as Unknown_45). Unknown_46_47 (off46-47) and Unknown_49_53 (off49-53) always present. off48 is DisplayTurned only on type2, OperatingMode on type3, raw elsewhere. off54/55 carry child lock + setpoint only on type2; raw on all other types.",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_56",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 8,
            "id": "ParentDeviceSerialnumber",
            "args": {
              "desc": "EUI64 of ZigBee routing parent (Repeater/Verteiler). Devices connected directly to the gateway show the coordinator EUI of the gateway radio module, which does not appear in any device list.",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 3,
            "id": "Unknown_65_67",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          }
        ],
        "desc": "",
        "info": "",
        "acc": "ro"
      }
    }
  },
  "2262": {
    "68": {
      "codec": "O3EComplexType",
      "len": 68,
      "id": "ZigBeeTwentyOneDeviceCurrentValues",
      "args": {
        "subTypes": [
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_00",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "RSSI",
            "args": {
              "scale": 1.0,
              "signed": true,
              "decimals": 0,
              "unit": "dBm",
              "desc": "Radio signal strength (signed dBm). SignalLevel is the percent representation of this value. 0x00 for FBH zones (no own radio).",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "BatteryLevel",
            "args": {
              "scale": 1.0,
              "signed": false,
              "decimals": 0,
              "unit": "%",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 37,
            "id": "Unknown_03_39",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "SignalLevel",
            "args": {
              "scale": 2.55,
              "signed": false,
              "decimals": 2,
              "unit": "%",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3ESwitch",
            "len": 15,
            "id": "ViCareDevice",
            "args": {
              "listStr": "ViCareDeviceTypes",
              "cases": {
                "0": {
                  "codec": "RawCodec",
                  "len": 14,
                  "id": "Unknown_42_55",
                  "args": {
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "1": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "ActualTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Humidity",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "2": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "ActualTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "ValveOpening",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "DeviceDisplayTurned",
                        "args": {
                          "listStr": "DeviceDisplayModeStates",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "DeviceChildLockActive",
                        "args": {
                          "listStr": "DeviceChildLockStates",
                          "desc": "type2 (TRV) only: child lock (0/1, proven one-factor test). Mirrored in RoomProperty off44 (ChildLockActive).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "DeviceTemperatureSetpoint",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "type2 (TRV) only: TRV own setpoint (0xcd=205 -> 20.5C, scale=10). A room manual setpoint and the program/manual flag are NOT in these records (separate controller room DID).",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "3": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "FlowTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "int16 LE flow temperature, scale 10. Confirmed by live read: bytes 1e 01 -> 28.6 C. off43 is the HIGH BYTE of this value, not a separate state (flow exceeds 25.6 C, e.g. heating). The e3oncan codec reads off43 alone as CurrentWorkingMode, which is therefore just the temperature band (0:<25.6, 1:25.6-51.2, 2:51.2-76.8 C), not a real mode.",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "OperatingMode",
                        "args": {
                          "listStr": "ZigBeeOperatingModes",
                          "desc": "off48 state byte. Observed 0 (Standby, flow 28.6 C) and 2 (Cooling). 1 (Heating) not yet confirmed on a clean capture.",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "4": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_42",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Demand",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "generic zone demand (0/100). Heat vs cool direction comes from the Verteiler OperatingMode, not this byte: reads 100 in cooling too. Proven via condensation cutoff (demand 0 when dew point >= flow temp).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "ValveState",
                        "args": {
                          "listStr": "ValvePositionLevels",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "5": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_42",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Demand",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "generic zone demand (0/100). Heat vs cool direction comes from the Verteiler OperatingMode, not this byte: reads 100 in cooling too. Proven via condensation cutoff (demand 0 when dew point >= flow temp).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "ValveState",
                        "args": {
                          "listStr": "ValvePositionLevels",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                }
              },
              "default": {
                "codec": "RawCodec",
                "len": 14,
                "id": "Unknown_42_55",
                "args": {
                  "desc": "",
                  "info": "",
                  "acc": ""
                }
              },
              "desc": "off41-55, device-dependent. type0: empty slot. type1 (Climate sensor): room temperature (int16) + humidity. type2 (TRV): room temperature (int16) + valve opening %, DisplayTurned (off48), plus ChildLockActive (off54) and DeviceTemperatureSetpoint (off55, scale=10). type3 (Floor thermostat/Verteiler): FlowTemperature is int16 at off42-43 (off43 = high byte, confirmed by live read 28.6 C); OperatingMode at off48. type4/5 (actuator NC/NO): generic Demand % at off43, plus ValveState at off45 (actuator energized 0/1). off45 reads 0 on type1/2/3 (kept as Unknown_45). Unknown_46_47 (off46-47) and Unknown_49_53 (off49-53) always present. off48 is DisplayTurned only on type2, OperatingMode on type3, raw elsewhere. off54/55 carry child lock + setpoint only on type2; raw on all other types.",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_56",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 8,
            "id": "ParentDeviceSerialnumber",
            "args": {
              "desc": "EUI64 of ZigBee routing parent (Repeater/Verteiler). Devices connected directly to the gateway show the coordinator EUI of the gateway radio module, which does not appear in any device list.",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 3,
            "id": "Unknown_65_67",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          }
        ],
        "desc": "",
        "info": "",
        "acc": "ro"
      }
    }
  },
  "2265": {
    "68": {
      "codec": "O3EComplexType",
      "len": 68,
      "id": "ZigBeeTwentyTwoDeviceCurrentValues",
      "args": {
        "subTypes": [
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_00",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "RSSI",
            "args": {
              "scale": 1.0,
              "signed": true,
              "decimals": 0,
              "unit": "dBm",
              "desc": "Radio signal strength (signed dBm). SignalLevel is the percent representation of this value. 0x00 for FBH zones (no own radio).",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "BatteryLevel",
            "args": {
              "scale": 1.0,
              "signed": false,
              "decimals": 0,
              "unit": "%",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 37,
            "id": "Unknown_03_39",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "SignalLevel",
            "args": {
              "scale": 2.55,
              "signed": false,
              "decimals": 2,
              "unit": "%",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3ESwitch",
            "len": 15,
            "id": "ViCareDevice",
            "args": {
              "listStr": "ViCareDeviceTypes",
              "cases": {
                "0": {
                  "codec": "RawCodec",
                  "len": 14,
                  "id": "Unknown_42_55",
                  "args": {
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "1": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "ActualTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Humidity",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "2": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "ActualTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "ValveOpening",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "DeviceDisplayTurned",
                        "args": {
                          "listStr": "DeviceDisplayModeStates",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "DeviceChildLockActive",
                        "args": {
                          "listStr": "DeviceChildLockStates",
                          "desc": "type2 (TRV) only: child lock (0/1, proven one-factor test). Mirrored in RoomProperty off44 (ChildLockActive).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "DeviceTemperatureSetpoint",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "type2 (TRV) only: TRV own setpoint (0xcd=205 -> 20.5C, scale=10). A room manual setpoint and the program/manual flag are NOT in these records (separate controller room DID).",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "3": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "FlowTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "int16 LE flow temperature, scale 10. Confirmed by live read: bytes 1e 01 -> 28.6 C. off43 is the HIGH BYTE of this value, not a separate state (flow exceeds 25.6 C, e.g. heating). The e3oncan codec reads off43 alone as CurrentWorkingMode, which is therefore just the temperature band (0:<25.6, 1:25.6-51.2, 2:51.2-76.8 C), not a real mode.",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "OperatingMode",
                        "args": {
                          "listStr": "ZigBeeOperatingModes",
                          "desc": "off48 state byte. Observed 0 (Standby, flow 28.6 C) and 2 (Cooling). 1 (Heating) not yet confirmed on a clean capture.",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "4": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_42",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Demand",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "generic zone demand (0/100). Heat vs cool direction comes from the Verteiler OperatingMode, not this byte: reads 100 in cooling too. Proven via condensation cutoff (demand 0 when dew point >= flow temp).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "ValveState",
                        "args": {
                          "listStr": "ValvePositionLevels",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "5": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_42",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Demand",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "generic zone demand (0/100). Heat vs cool direction comes from the Verteiler OperatingMode, not this byte: reads 100 in cooling too. Proven via condensation cutoff (demand 0 when dew point >= flow temp).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "ValveState",
                        "args": {
                          "listStr": "ValvePositionLevels",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                }
              },
              "default": {
                "codec": "RawCodec",
                "len": 14,
                "id": "Unknown_42_55",
                "args": {
                  "desc": "",
                  "info": "",
                  "acc": ""
                }
              },
              "desc": "off41-55, device-dependent. type0: empty slot. type1 (Climate sensor): room temperature (int16) + humidity. type2 (TRV): room temperature (int16) + valve opening %, DisplayTurned (off48), plus ChildLockActive (off54) and DeviceTemperatureSetpoint (off55, scale=10). type3 (Floor thermostat/Verteiler): FlowTemperature is int16 at off42-43 (off43 = high byte, confirmed by live read 28.6 C); OperatingMode at off48. type4/5 (actuator NC/NO): generic Demand % at off43, plus ValveState at off45 (actuator energized 0/1). off45 reads 0 on type1/2/3 (kept as Unknown_45). Unknown_46_47 (off46-47) and Unknown_49_53 (off49-53) always present. off48 is DisplayTurned only on type2, OperatingMode on type3, raw elsewhere. off54/55 carry child lock + setpoint only on type2; raw on all other types.",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_56",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 8,
            "id": "ParentDeviceSerialnumber",
            "args": {
              "desc": "EUI64 of ZigBee routing parent (Repeater/Verteiler). Devices connected directly to the gateway show the coordinator EUI of the gateway radio module, which does not appear in any device list.",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 3,
            "id": "Unknown_65_67",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          }
        ],
        "desc": "",
        "info": "",
        "acc": "ro"
      }
    }
  },
  "2268": {
    "68": {
      "codec": "O3EComplexType",
      "len": 68,
      "id": "ZigBeeTwentyThreeDeviceCurrentValues",
      "args": {
        "subTypes": [
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_00",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "RSSI",
            "args": {
              "scale": 1.0,
              "signed": true,
              "decimals": 0,
              "unit": "dBm",
              "desc": "Radio signal strength (signed dBm). SignalLevel is the percent representation of this value. 0x00 for FBH zones (no own radio).",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "BatteryLevel",
            "args": {
              "scale": 1.0,
              "signed": false,
              "decimals": 0,
              "unit": "%",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 37,
            "id": "Unknown_03_39",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "SignalLevel",
            "args": {
              "scale": 2.55,
              "signed": false,
              "decimals": 2,
              "unit": "%",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3ESwitch",
            "len": 15,
            "id": "ViCareDevice",
            "args": {
              "listStr": "ViCareDeviceTypes",
              "cases": {
                "0": {
                  "codec": "RawCodec",
                  "len": 14,
                  "id": "Unknown_42_55",
                  "args": {
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "1": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "ActualTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Humidity",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "2": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "ActualTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "ValveOpening",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "DeviceDisplayTurned",
                        "args": {
                          "listStr": "DeviceDisplayModeStates",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "DeviceChildLockActive",
                        "args": {
                          "listStr": "DeviceChildLockStates",
                          "desc": "type2 (TRV) only: child lock (0/1, proven one-factor test). Mirrored in RoomProperty off44 (ChildLockActive).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "DeviceTemperatureSetpoint",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "type2 (TRV) only: TRV own setpoint (0xcd=205 -> 20.5C, scale=10). A room manual setpoint and the program/manual flag are NOT in these records (separate controller room DID).",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "3": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "FlowTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "int16 LE flow temperature, scale 10. Confirmed by live read: bytes 1e 01 -> 28.6 C. off43 is the HIGH BYTE of this value, not a separate state (flow exceeds 25.6 C, e.g. heating). The e3oncan codec reads off43 alone as CurrentWorkingMode, which is therefore just the temperature band (0:<25.6, 1:25.6-51.2, 2:51.2-76.8 C), not a real mode.",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "OperatingMode",
                        "args": {
                          "listStr": "ZigBeeOperatingModes",
                          "desc": "off48 state byte. Observed 0 (Standby, flow 28.6 C) and 2 (Cooling). 1 (Heating) not yet confirmed on a clean capture.",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "4": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_42",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Demand",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "generic zone demand (0/100). Heat vs cool direction comes from the Verteiler OperatingMode, not this byte: reads 100 in cooling too. Proven via condensation cutoff (demand 0 when dew point >= flow temp).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "ValveState",
                        "args": {
                          "listStr": "ValvePositionLevels",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "5": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_42",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Demand",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "generic zone demand (0/100). Heat vs cool direction comes from the Verteiler OperatingMode, not this byte: reads 100 in cooling too. Proven via condensation cutoff (demand 0 when dew point >= flow temp).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "ValveState",
                        "args": {
                          "listStr": "ValvePositionLevels",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                }
              },
              "default": {
                "codec": "RawCodec",
                "len": 14,
                "id": "Unknown_42_55",
                "args": {
                  "desc": "",
                  "info": "",
                  "acc": ""
                }
              },
              "desc": "off41-55, device-dependent. type0: empty slot. type1 (Climate sensor): room temperature (int16) + humidity. type2 (TRV): room temperature (int16) + valve opening %, DisplayTurned (off48), plus ChildLockActive (off54) and DeviceTemperatureSetpoint (off55, scale=10). type3 (Floor thermostat/Verteiler): FlowTemperature is int16 at off42-43 (off43 = high byte, confirmed by live read 28.6 C); OperatingMode at off48. type4/5 (actuator NC/NO): generic Demand % at off43, plus ValveState at off45 (actuator energized 0/1). off45 reads 0 on type1/2/3 (kept as Unknown_45). Unknown_46_47 (off46-47) and Unknown_49_53 (off49-53) always present. off48 is DisplayTurned only on type2, OperatingMode on type3, raw elsewhere. off54/55 carry child lock + setpoint only on type2; raw on all other types.",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_56",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 8,
            "id": "ParentDeviceSerialnumber",
            "args": {
              "desc": "EUI64 of ZigBee routing parent (Repeater/Verteiler). Devices connected directly to the gateway show the coordinator EUI of the gateway radio module, which does not appear in any device list.",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 3,
            "id": "Unknown_65_67",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          }
        ],
        "desc": "",
        "info": "",
        "acc": "ro"
      }
    }
  },
  "2271": {
    "68": {
      "codec": "O3EComplexType",
      "len": 68,
      "id": "ZigBeeTwentyFourDeviceCurrentValues",
      "args": {
        "subTypes": [
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_00",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "RSSI",
            "args": {
              "scale": 1.0,
              "signed": true,
              "decimals": 0,
              "unit": "dBm",
              "desc": "Radio signal strength (signed dBm). SignalLevel is the percent representation of this value. 0x00 for FBH zones (no own radio).",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "BatteryLevel",
            "args": {
              "scale": 1.0,
              "signed": false,
              "decimals": 0,
              "unit": "%",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 37,
            "id": "Unknown_03_39",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "SignalLevel",
            "args": {
              "scale": 2.55,
              "signed": false,
              "decimals": 2,
              "unit": "%",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3ESwitch",
            "len": 15,
            "id": "ViCareDevice",
            "args": {
              "listStr": "ViCareDeviceTypes",
              "cases": {
                "0": {
                  "codec": "RawCodec",
                  "len": 14,
                  "id": "Unknown_42_55",
                  "args": {
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "1": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "ActualTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Humidity",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "2": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "ActualTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "ValveOpening",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "DeviceDisplayTurned",
                        "args": {
                          "listStr": "DeviceDisplayModeStates",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "DeviceChildLockActive",
                        "args": {
                          "listStr": "DeviceChildLockStates",
                          "desc": "type2 (TRV) only: child lock (0/1, proven one-factor test). Mirrored in RoomProperty off44 (ChildLockActive).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "DeviceTemperatureSetpoint",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "type2 (TRV) only: TRV own setpoint (0xcd=205 -> 20.5C, scale=10). A room manual setpoint and the program/manual flag are NOT in these records (separate controller room DID).",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "3": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "FlowTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "int16 LE flow temperature, scale 10. Confirmed by live read: bytes 1e 01 -> 28.6 C. off43 is the HIGH BYTE of this value, not a separate state (flow exceeds 25.6 C, e.g. heating). The e3oncan codec reads off43 alone as CurrentWorkingMode, which is therefore just the temperature band (0:<25.6, 1:25.6-51.2, 2:51.2-76.8 C), not a real mode.",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "OperatingMode",
                        "args": {
                          "listStr": "ZigBeeOperatingModes",
                          "desc": "off48 state byte. Observed 0 (Standby, flow 28.6 C) and 2 (Cooling). 1 (Heating) not yet confirmed on a clean capture.",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "4": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_42",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Demand",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "generic zone demand (0/100). Heat vs cool direction comes from the Verteiler OperatingMode, not this byte: reads 100 in cooling too. Proven via condensation cutoff (demand 0 when dew point >= flow temp).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "ValveState",
                        "args": {
                          "listStr": "ValvePositionLevels",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "5": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_42",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Demand",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "generic zone demand (0/100). Heat vs cool direction comes from the Verteiler OperatingMode, not this byte: reads 100 in cooling too. Proven via condensation cutoff (demand 0 when dew point >= flow temp).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "ValveState",
                        "args": {
                          "listStr": "ValvePositionLevels",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                }
              },
              "default": {
                "codec": "RawCodec",
                "len": 14,
                "id": "Unknown_42_55",
                "args": {
                  "desc": "",
                  "info": "",
                  "acc": ""
                }
              },
              "desc": "off41-55, device-dependent. type0: empty slot. type1 (Climate sensor): room temperature (int16) + humidity. type2 (TRV): room temperature (int16) + valve opening %, DisplayTurned (off48), plus ChildLockActive (off54) and DeviceTemperatureSetpoint (off55, scale=10). type3 (Floor thermostat/Verteiler): FlowTemperature is int16 at off42-43 (off43 = high byte, confirmed by live read 28.6 C); OperatingMode at off48. type4/5 (actuator NC/NO): generic Demand % at off43, plus ValveState at off45 (actuator energized 0/1). off45 reads 0 on type1/2/3 (kept as Unknown_45). Unknown_46_47 (off46-47) and Unknown_49_53 (off49-53) always present. off48 is DisplayTurned only on type2, OperatingMode on type3, raw elsewhere. off54/55 carry child lock + setpoint only on type2; raw on all other types.",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_56",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 8,
            "id": "ParentDeviceSerialnumber",
            "args": {
              "desc": "EUI64 of ZigBee routing parent (Repeater/Verteiler). Devices connected directly to the gateway show the coordinator EUI of the gateway radio module, which does not appear in any device list.",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 3,
            "id": "Unknown_65_67",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          }
        ],
        "desc": "",
        "info": "",
        "acc": "ro"
      }
    }
  },
  "2274": {
    "68": {
      "codec": "O3EComplexType",
      "len": 68,
      "id": "ZigBeeTwentyFiveDeviceCurrentValues",
      "args": {
        "subTypes": [
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_00",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "RSSI",
            "args": {
              "scale": 1.0,
              "signed": true,
              "decimals": 0,
              "unit": "dBm",
              "desc": "Radio signal strength (signed dBm). SignalLevel is the percent representation of this value. 0x00 for FBH zones (no own radio).",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "BatteryLevel",
            "args": {
              "scale": 1.0,
              "signed": false,
              "decimals": 0,
              "unit": "%",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 37,
            "id": "Unknown_03_39",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "SignalLevel",
            "args": {
              "scale": 2.55,
              "signed": false,
              "decimals": 2,
              "unit": "%",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3ESwitch",
            "len": 15,
            "id": "ViCareDevice",
            "args": {
              "listStr": "ViCareDeviceTypes",
              "cases": {
                "0": {
                  "codec": "RawCodec",
                  "len": 14,
                  "id": "Unknown_42_55",
                  "args": {
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "1": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "ActualTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Humidity",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "2": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "ActualTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "ValveOpening",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "DeviceDisplayTurned",
                        "args": {
                          "listStr": "DeviceDisplayModeStates",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "DeviceChildLockActive",
                        "args": {
                          "listStr": "DeviceChildLockStates",
                          "desc": "type2 (TRV) only: child lock (0/1, proven one-factor test). Mirrored in RoomProperty off44 (ChildLockActive).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "DeviceTemperatureSetpoint",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "type2 (TRV) only: TRV own setpoint (0xcd=205 -> 20.5C, scale=10). A room manual setpoint and the program/manual flag are NOT in these records (separate controller room DID).",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "3": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "FlowTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "int16 LE flow temperature, scale 10. Confirmed by live read: bytes 1e 01 -> 28.6 C. off43 is the HIGH BYTE of this value, not a separate state (flow exceeds 25.6 C, e.g. heating). The e3oncan codec reads off43 alone as CurrentWorkingMode, which is therefore just the temperature band (0:<25.6, 1:25.6-51.2, 2:51.2-76.8 C), not a real mode.",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "OperatingMode",
                        "args": {
                          "listStr": "ZigBeeOperatingModes",
                          "desc": "off48 state byte. Observed 0 (Standby, flow 28.6 C) and 2 (Cooling). 1 (Heating) not yet confirmed on a clean capture.",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "4": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_42",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Demand",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "generic zone demand (0/100). Heat vs cool direction comes from the Verteiler OperatingMode, not this byte: reads 100 in cooling too. Proven via condensation cutoff (demand 0 when dew point >= flow temp).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "ValveState",
                        "args": {
                          "listStr": "ValvePositionLevels",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "5": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_42",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Demand",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "generic zone demand (0/100). Heat vs cool direction comes from the Verteiler OperatingMode, not this byte: reads 100 in cooling too. Proven via condensation cutoff (demand 0 when dew point >= flow temp).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "ValveState",
                        "args": {
                          "listStr": "ValvePositionLevels",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                }
              },
              "default": {
                "codec": "RawCodec",
                "len": 14,
                "id": "Unknown_42_55",
                "args": {
                  "desc": "",
                  "info": "",
                  "acc": ""
                }
              },
              "desc": "off41-55, device-dependent. type0: empty slot. type1 (Climate sensor): room temperature (int16) + humidity. type2 (TRV): room temperature (int16) + valve opening %, DisplayTurned (off48), plus ChildLockActive (off54) and DeviceTemperatureSetpoint (off55, scale=10). type3 (Floor thermostat/Verteiler): FlowTemperature is int16 at off42-43 (off43 = high byte, confirmed by live read 28.6 C); OperatingMode at off48. type4/5 (actuator NC/NO): generic Demand % at off43, plus ValveState at off45 (actuator energized 0/1). off45 reads 0 on type1/2/3 (kept as Unknown_45). Unknown_46_47 (off46-47) and Unknown_49_53 (off49-53) always present. off48 is DisplayTurned only on type2, OperatingMode on type3, raw elsewhere. off54/55 carry child lock + setpoint only on type2; raw on all other types.",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_56",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 8,
            "id": "ParentDeviceSerialnumber",
            "args": {
              "desc": "EUI64 of ZigBee routing parent (Repeater/Verteiler). Devices connected directly to the gateway show the coordinator EUI of the gateway radio module, which does not appear in any device list.",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 3,
            "id": "Unknown_65_67",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          }
        ],
        "desc": "",
        "info": "",
        "acc": "ro"
      }
    }
  },
  "2277": {
    "68": {
      "codec": "O3EComplexType",
      "len": 68,
      "id": "ZigBeeTwentySixDeviceCurrentValues",
      "args": {
        "subTypes": [
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_00",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "RSSI",
            "args": {
              "scale": 1.0,
              "signed": true,
              "decimals": 0,
              "unit": "dBm",
              "desc": "Radio signal strength (signed dBm). SignalLevel is the percent representation of this value. 0x00 for FBH zones (no own radio).",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "BatteryLevel",
            "args": {
              "scale": 1.0,
              "signed": false,
              "decimals": 0,
              "unit": "%",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 37,
            "id": "Unknown_03_39",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "SignalLevel",
            "args": {
              "scale": 2.55,
              "signed": false,
              "decimals": 2,
              "unit": "%",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3ESwitch",
            "len": 15,
            "id": "ViCareDevice",
            "args": {
              "listStr": "ViCareDeviceTypes",
              "cases": {
                "0": {
                  "codec": "RawCodec",
                  "len": 14,
                  "id": "Unknown_42_55",
                  "args": {
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "1": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "ActualTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Humidity",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "2": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "ActualTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "ValveOpening",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "DeviceDisplayTurned",
                        "args": {
                          "listStr": "DeviceDisplayModeStates",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "DeviceChildLockActive",
                        "args": {
                          "listStr": "DeviceChildLockStates",
                          "desc": "type2 (TRV) only: child lock (0/1, proven one-factor test). Mirrored in RoomProperty off44 (ChildLockActive).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "DeviceTemperatureSetpoint",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "type2 (TRV) only: TRV own setpoint (0xcd=205 -> 20.5C, scale=10). A room manual setpoint and the program/manual flag are NOT in these records (separate controller room DID).",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "3": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "FlowTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "int16 LE flow temperature, scale 10. Confirmed by live read: bytes 1e 01 -> 28.6 C. off43 is the HIGH BYTE of this value, not a separate state (flow exceeds 25.6 C, e.g. heating). The e3oncan codec reads off43 alone as CurrentWorkingMode, which is therefore just the temperature band (0:<25.6, 1:25.6-51.2, 2:51.2-76.8 C), not a real mode.",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "OperatingMode",
                        "args": {
                          "listStr": "ZigBeeOperatingModes",
                          "desc": "off48 state byte. Observed 0 (Standby, flow 28.6 C) and 2 (Cooling). 1 (Heating) not yet confirmed on a clean capture.",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "4": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_42",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Demand",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "generic zone demand (0/100). Heat vs cool direction comes from the Verteiler OperatingMode, not this byte: reads 100 in cooling too. Proven via condensation cutoff (demand 0 when dew point >= flow temp).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "ValveState",
                        "args": {
                          "listStr": "ValvePositionLevels",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "5": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_42",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Demand",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "generic zone demand (0/100). Heat vs cool direction comes from the Verteiler OperatingMode, not this byte: reads 100 in cooling too. Proven via condensation cutoff (demand 0 when dew point >= flow temp).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "ValveState",
                        "args": {
                          "listStr": "ValvePositionLevels",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                }
              },
              "default": {
                "codec": "RawCodec",
                "len": 14,
                "id": "Unknown_42_55",
                "args": {
                  "desc": "",
                  "info": "",
                  "acc": ""
                }
              },
              "desc": "off41-55, device-dependent. type0: empty slot. type1 (Climate sensor): room temperature (int16) + humidity. type2 (TRV): room temperature (int16) + valve opening %, DisplayTurned (off48), plus ChildLockActive (off54) and DeviceTemperatureSetpoint (off55, scale=10). type3 (Floor thermostat/Verteiler): FlowTemperature is int16 at off42-43 (off43 = high byte, confirmed by live read 28.6 C); OperatingMode at off48. type4/5 (actuator NC/NO): generic Demand % at off43, plus ValveState at off45 (actuator energized 0/1). off45 reads 0 on type1/2/3 (kept as Unknown_45). Unknown_46_47 (off46-47) and Unknown_49_53 (off49-53) always present. off48 is DisplayTurned only on type2, OperatingMode on type3, raw elsewhere. off54/55 carry child lock + setpoint only on type2; raw on all other types.",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_56",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 8,
            "id": "ParentDeviceSerialnumber",
            "args": {
              "desc": "EUI64 of ZigBee routing parent (Repeater/Verteiler). Devices connected directly to the gateway show the coordinator EUI of the gateway radio module, which does not appear in any device list.",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 3,
            "id": "Unknown_65_67",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          }
        ],
        "desc": "",
        "info": "",
        "acc": "ro"
      }
    }
  },
  "2280": {
    "68": {
      "codec": "O3EComplexType",
      "len": 68,
      "id": "ZigBeeTwentySevenDeviceCurrentValues",
      "args": {
        "subTypes": [
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_00",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "RSSI",
            "args": {
              "scale": 1.0,
              "signed": true,
              "decimals": 0,
              "unit": "dBm",
              "desc": "Radio signal strength (signed dBm). SignalLevel is the percent representation of this value. 0x00 for FBH zones (no own radio).",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "BatteryLevel",
            "args": {
              "scale": 1.0,
              "signed": false,
              "decimals": 0,
              "unit": "%",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 37,
            "id": "Unknown_03_39",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "SignalLevel",
            "args": {
              "scale": 2.55,
              "signed": false,
              "decimals": 2,
              "unit": "%",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3ESwitch",
            "len": 15,
            "id": "ViCareDevice",
            "args": {
              "listStr": "ViCareDeviceTypes",
              "cases": {
                "0": {
                  "codec": "RawCodec",
                  "len": 14,
                  "id": "Unknown_42_55",
                  "args": {
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "1": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "ActualTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Humidity",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "2": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "ActualTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "ValveOpening",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "DeviceDisplayTurned",
                        "args": {
                          "listStr": "DeviceDisplayModeStates",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "DeviceChildLockActive",
                        "args": {
                          "listStr": "DeviceChildLockStates",
                          "desc": "type2 (TRV) only: child lock (0/1, proven one-factor test). Mirrored in RoomProperty off44 (ChildLockActive).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "DeviceTemperatureSetpoint",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "type2 (TRV) only: TRV own setpoint (0xcd=205 -> 20.5C, scale=10). A room manual setpoint and the program/manual flag are NOT in these records (separate controller room DID).",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "3": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "FlowTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "int16 LE flow temperature, scale 10. Confirmed by live read: bytes 1e 01 -> 28.6 C. off43 is the HIGH BYTE of this value, not a separate state (flow exceeds 25.6 C, e.g. heating). The e3oncan codec reads off43 alone as CurrentWorkingMode, which is therefore just the temperature band (0:<25.6, 1:25.6-51.2, 2:51.2-76.8 C), not a real mode.",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "OperatingMode",
                        "args": {
                          "listStr": "ZigBeeOperatingModes",
                          "desc": "off48 state byte. Observed 0 (Standby, flow 28.6 C) and 2 (Cooling). 1 (Heating) not yet confirmed on a clean capture.",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "4": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_42",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Demand",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "generic zone demand (0/100). Heat vs cool direction comes from the Verteiler OperatingMode, not this byte: reads 100 in cooling too. Proven via condensation cutoff (demand 0 when dew point >= flow temp).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "ValveState",
                        "args": {
                          "listStr": "ValvePositionLevels",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "5": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_42",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Demand",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "generic zone demand (0/100). Heat vs cool direction comes from the Verteiler OperatingMode, not this byte: reads 100 in cooling too. Proven via condensation cutoff (demand 0 when dew point >= flow temp).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "ValveState",
                        "args": {
                          "listStr": "ValvePositionLevels",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                }
              },
              "default": {
                "codec": "RawCodec",
                "len": 14,
                "id": "Unknown_42_55",
                "args": {
                  "desc": "",
                  "info": "",
                  "acc": ""
                }
              },
              "desc": "off41-55, device-dependent. type0: empty slot. type1 (Climate sensor): room temperature (int16) + humidity. type2 (TRV): room temperature (int16) + valve opening %, DisplayTurned (off48), plus ChildLockActive (off54) and DeviceTemperatureSetpoint (off55, scale=10). type3 (Floor thermostat/Verteiler): FlowTemperature is int16 at off42-43 (off43 = high byte, confirmed by live read 28.6 C); OperatingMode at off48. type4/5 (actuator NC/NO): generic Demand % at off43, plus ValveState at off45 (actuator energized 0/1). off45 reads 0 on type1/2/3 (kept as Unknown_45). Unknown_46_47 (off46-47) and Unknown_49_53 (off49-53) always present. off48 is DisplayTurned only on type2, OperatingMode on type3, raw elsewhere. off54/55 carry child lock + setpoint only on type2; raw on all other types.",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_56",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 8,
            "id": "ParentDeviceSerialnumber",
            "args": {
              "desc": "EUI64 of ZigBee routing parent (Repeater/Verteiler). Devices connected directly to the gateway show the coordinator EUI of the gateway radio module, which does not appear in any device list.",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 3,
            "id": "Unknown_65_67",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          }
        ],
        "desc": "",
        "info": "",
        "acc": "ro"
      }
    }
  },
  "2283": {
    "68": {
      "codec": "O3EComplexType",
      "len": 68,
      "id": "ZigBeeTwentyEightDeviceCurrentValues",
      "args": {
        "subTypes": [
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_00",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "RSSI",
            "args": {
              "scale": 1.0,
              "signed": true,
              "decimals": 0,
              "unit": "dBm",
              "desc": "Radio signal strength (signed dBm). SignalLevel is the percent representation of this value. 0x00 for FBH zones (no own radio).",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "BatteryLevel",
            "args": {
              "scale": 1.0,
              "signed": false,
              "decimals": 0,
              "unit": "%",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 37,
            "id": "Unknown_03_39",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "SignalLevel",
            "args": {
              "scale": 2.55,
              "signed": false,
              "decimals": 2,
              "unit": "%",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3ESwitch",
            "len": 15,
            "id": "ViCareDevice",
            "args": {
              "listStr": "ViCareDeviceTypes",
              "cases": {
                "0": {
                  "codec": "RawCodec",
                  "len": 14,
                  "id": "Unknown_42_55",
                  "args": {
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "1": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "ActualTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Humidity",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "2": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "ActualTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "ValveOpening",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "DeviceDisplayTurned",
                        "args": {
                          "listStr": "DeviceDisplayModeStates",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "DeviceChildLockActive",
                        "args": {
                          "listStr": "DeviceChildLockStates",
                          "desc": "type2 (TRV) only: child lock (0/1, proven one-factor test). Mirrored in RoomProperty off44 (ChildLockActive).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "DeviceTemperatureSetpoint",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "type2 (TRV) only: TRV own setpoint (0xcd=205 -> 20.5C, scale=10). A room manual setpoint and the program/manual flag are NOT in these records (separate controller room DID).",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "3": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "FlowTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "int16 LE flow temperature, scale 10. Confirmed by live read: bytes 1e 01 -> 28.6 C. off43 is the HIGH BYTE of this value, not a separate state (flow exceeds 25.6 C, e.g. heating). The e3oncan codec reads off43 alone as CurrentWorkingMode, which is therefore just the temperature band (0:<25.6, 1:25.6-51.2, 2:51.2-76.8 C), not a real mode.",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "OperatingMode",
                        "args": {
                          "listStr": "ZigBeeOperatingModes",
                          "desc": "off48 state byte. Observed 0 (Standby, flow 28.6 C) and 2 (Cooling). 1 (Heating) not yet confirmed on a clean capture.",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "4": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_42",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Demand",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "generic zone demand (0/100). Heat vs cool direction comes from the Verteiler OperatingMode, not this byte: reads 100 in cooling too. Proven via condensation cutoff (demand 0 when dew point >= flow temp).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "ValveState",
                        "args": {
                          "listStr": "ValvePositionLevels",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "5": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_42",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Demand",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "generic zone demand (0/100). Heat vs cool direction comes from the Verteiler OperatingMode, not this byte: reads 100 in cooling too. Proven via condensation cutoff (demand 0 when dew point >= flow temp).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "ValveState",
                        "args": {
                          "listStr": "ValvePositionLevels",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                }
              },
              "default": {
                "codec": "RawCodec",
                "len": 14,
                "id": "Unknown_42_55",
                "args": {
                  "desc": "",
                  "info": "",
                  "acc": ""
                }
              },
              "desc": "off41-55, device-dependent. type0: empty slot. type1 (Climate sensor): room temperature (int16) + humidity. type2 (TRV): room temperature (int16) + valve opening %, DisplayTurned (off48), plus ChildLockActive (off54) and DeviceTemperatureSetpoint (off55, scale=10). type3 (Floor thermostat/Verteiler): FlowTemperature is int16 at off42-43 (off43 = high byte, confirmed by live read 28.6 C); OperatingMode at off48. type4/5 (actuator NC/NO): generic Demand % at off43, plus ValveState at off45 (actuator energized 0/1). off45 reads 0 on type1/2/3 (kept as Unknown_45). Unknown_46_47 (off46-47) and Unknown_49_53 (off49-53) always present. off48 is DisplayTurned only on type2, OperatingMode on type3, raw elsewhere. off54/55 carry child lock + setpoint only on type2; raw on all other types.",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_56",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 8,
            "id": "ParentDeviceSerialnumber",
            "args": {
              "desc": "EUI64 of ZigBee routing parent (Repeater/Verteiler). Devices connected directly to the gateway show the coordinator EUI of the gateway radio module, which does not appear in any device list.",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 3,
            "id": "Unknown_65_67",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          }
        ],
        "desc": "",
        "info": "",
        "acc": "ro"
      }
    }
  },
  "2286": {
    "68": {
      "codec": "O3EComplexType",
      "len": 68,
      "id": "ZigBeeTwentyNineDeviceCurrentValues",
      "args": {
        "subTypes": [
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_00",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "RSSI",
            "args": {
              "scale": 1.0,
              "signed": true,
              "decimals": 0,
              "unit": "dBm",
              "desc": "Radio signal strength (signed dBm). SignalLevel is the percent representation of this value. 0x00 for FBH zones (no own radio).",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "BatteryLevel",
            "args": {
              "scale": 1.0,
              "signed": false,
              "decimals": 0,
              "unit": "%",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 37,
            "id": "Unknown_03_39",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "SignalLevel",
            "args": {
              "scale": 2.55,
              "signed": false,
              "decimals": 2,
              "unit": "%",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3ESwitch",
            "len": 15,
            "id": "ViCareDevice",
            "args": {
              "listStr": "ViCareDeviceTypes",
              "cases": {
                "0": {
                  "codec": "RawCodec",
                  "len": 14,
                  "id": "Unknown_42_55",
                  "args": {
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "1": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "ActualTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Humidity",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "2": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "ActualTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "ValveOpening",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "DeviceDisplayTurned",
                        "args": {
                          "listStr": "DeviceDisplayModeStates",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "DeviceChildLockActive",
                        "args": {
                          "listStr": "DeviceChildLockStates",
                          "desc": "type2 (TRV) only: child lock (0/1, proven one-factor test). Mirrored in RoomProperty off44 (ChildLockActive).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "DeviceTemperatureSetpoint",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "type2 (TRV) only: TRV own setpoint (0xcd=205 -> 20.5C, scale=10). A room manual setpoint and the program/manual flag are NOT in these records (separate controller room DID).",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "3": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "FlowTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "int16 LE flow temperature, scale 10. Confirmed by live read: bytes 1e 01 -> 28.6 C. off43 is the HIGH BYTE of this value, not a separate state (flow exceeds 25.6 C, e.g. heating). The e3oncan codec reads off43 alone as CurrentWorkingMode, which is therefore just the temperature band (0:<25.6, 1:25.6-51.2, 2:51.2-76.8 C), not a real mode.",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "OperatingMode",
                        "args": {
                          "listStr": "ZigBeeOperatingModes",
                          "desc": "off48 state byte. Observed 0 (Standby, flow 28.6 C) and 2 (Cooling). 1 (Heating) not yet confirmed on a clean capture.",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "4": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_42",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Demand",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "generic zone demand (0/100). Heat vs cool direction comes from the Verteiler OperatingMode, not this byte: reads 100 in cooling too. Proven via condensation cutoff (demand 0 when dew point >= flow temp).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "ValveState",
                        "args": {
                          "listStr": "ValvePositionLevels",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "5": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_42",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Demand",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "generic zone demand (0/100). Heat vs cool direction comes from the Verteiler OperatingMode, not this byte: reads 100 in cooling too. Proven via condensation cutoff (demand 0 when dew point >= flow temp).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "ValveState",
                        "args": {
                          "listStr": "ValvePositionLevels",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                }
              },
              "default": {
                "codec": "RawCodec",
                "len": 14,
                "id": "Unknown_42_55",
                "args": {
                  "desc": "",
                  "info": "",
                  "acc": ""
                }
              },
              "desc": "off41-55, device-dependent. type0: empty slot. type1 (Climate sensor): room temperature (int16) + humidity. type2 (TRV): room temperature (int16) + valve opening %, DisplayTurned (off48), plus ChildLockActive (off54) and DeviceTemperatureSetpoint (off55, scale=10). type3 (Floor thermostat/Verteiler): FlowTemperature is int16 at off42-43 (off43 = high byte, confirmed by live read 28.6 C); OperatingMode at off48. type4/5 (actuator NC/NO): generic Demand % at off43, plus ValveState at off45 (actuator energized 0/1). off45 reads 0 on type1/2/3 (kept as Unknown_45). Unknown_46_47 (off46-47) and Unknown_49_53 (off49-53) always present. off48 is DisplayTurned only on type2, OperatingMode on type3, raw elsewhere. off54/55 carry child lock + setpoint only on type2; raw on all other types.",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_56",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 8,
            "id": "ParentDeviceSerialnumber",
            "args": {
              "desc": "EUI64 of ZigBee routing parent (Repeater/Verteiler). Devices connected directly to the gateway show the coordinator EUI of the gateway radio module, which does not appear in any device list.",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 3,
            "id": "Unknown_65_67",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          }
        ],
        "desc": "",
        "info": "",
        "acc": "ro"
      }
    }
  },
  "2289": {
    "68": {
      "codec": "O3EComplexType",
      "len": 68,
      "id": "ZigBeeThirtyDeviceCurrentValues",
      "args": {
        "subTypes": [
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_00",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "RSSI",
            "args": {
              "scale": 1.0,
              "signed": true,
              "decimals": 0,
              "unit": "dBm",
              "desc": "Radio signal strength (signed dBm). SignalLevel is the percent representation of this value. 0x00 for FBH zones (no own radio).",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "BatteryLevel",
            "args": {
              "scale": 1.0,
              "signed": false,
              "decimals": 0,
              "unit": "%",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 37,
            "id": "Unknown_03_39",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "SignalLevel",
            "args": {
              "scale": 2.55,
              "signed": false,
              "decimals": 2,
              "unit": "%",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3ESwitch",
            "len": 15,
            "id": "ViCareDevice",
            "args": {
              "listStr": "ViCareDeviceTypes",
              "cases": {
                "0": {
                  "codec": "RawCodec",
                  "len": 14,
                  "id": "Unknown_42_55",
                  "args": {
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "1": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "ActualTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Humidity",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "2": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "ActualTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "ValveOpening",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "DeviceDisplayTurned",
                        "args": {
                          "listStr": "DeviceDisplayModeStates",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "DeviceChildLockActive",
                        "args": {
                          "listStr": "DeviceChildLockStates",
                          "desc": "type2 (TRV) only: child lock (0/1, proven one-factor test). Mirrored in RoomProperty off44 (ChildLockActive).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "DeviceTemperatureSetpoint",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "type2 (TRV) only: TRV own setpoint (0xcd=205 -> 20.5C, scale=10). A room manual setpoint and the program/manual flag are NOT in these records (separate controller room DID).",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "3": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "FlowTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "int16 LE flow temperature, scale 10. Confirmed by live read: bytes 1e 01 -> 28.6 C. off43 is the HIGH BYTE of this value, not a separate state (flow exceeds 25.6 C, e.g. heating). The e3oncan codec reads off43 alone as CurrentWorkingMode, which is therefore just the temperature band (0:<25.6, 1:25.6-51.2, 2:51.2-76.8 C), not a real mode.",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "OperatingMode",
                        "args": {
                          "listStr": "ZigBeeOperatingModes",
                          "desc": "off48 state byte. Observed 0 (Standby, flow 28.6 C) and 2 (Cooling). 1 (Heating) not yet confirmed on a clean capture.",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "4": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_42",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Demand",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "generic zone demand (0/100). Heat vs cool direction comes from the Verteiler OperatingMode, not this byte: reads 100 in cooling too. Proven via condensation cutoff (demand 0 when dew point >= flow temp).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "ValveState",
                        "args": {
                          "listStr": "ValvePositionLevels",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "5": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_42",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Demand",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "generic zone demand (0/100). Heat vs cool direction comes from the Verteiler OperatingMode, not this byte: reads 100 in cooling too. Proven via condensation cutoff (demand 0 when dew point >= flow temp).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "ValveState",
                        "args": {
                          "listStr": "ValvePositionLevels",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                }
              },
              "default": {
                "codec": "RawCodec",
                "len": 14,
                "id": "Unknown_42_55",
                "args": {
                  "desc": "",
                  "info": "",
                  "acc": ""
                }
              },
              "desc": "off41-55, device-dependent. type0: empty slot. type1 (Climate sensor): room temperature (int16) + humidity. type2 (TRV): room temperature (int16) + valve opening %, DisplayTurned (off48), plus ChildLockActive (off54) and DeviceTemperatureSetpoint (off55, scale=10). type3 (Floor thermostat/Verteiler): FlowTemperature is int16 at off42-43 (off43 = high byte, confirmed by live read 28.6 C); OperatingMode at off48. type4/5 (actuator NC/NO): generic Demand % at off43, plus ValveState at off45 (actuator energized 0/1). off45 reads 0 on type1/2/3 (kept as Unknown_45). Unknown_46_47 (off46-47) and Unknown_49_53 (off49-53) always present. off48 is DisplayTurned only on type2, OperatingMode on type3, raw elsewhere. off54/55 carry child lock + setpoint only on type2; raw on all other types.",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_56",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 8,
            "id": "ParentDeviceSerialnumber",
            "args": {
              "desc": "EUI64 of ZigBee routing parent (Repeater/Verteiler). Devices connected directly to the gateway show the coordinator EUI of the gateway radio module, which does not appear in any device list.",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 3,
            "id": "Unknown_65_67",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          }
        ],
        "desc": "",
        "info": "",
        "acc": "ro"
      }
    }
  },
  "2292": {
    "68": {
      "codec": "O3EComplexType",
      "len": 68,
      "id": "ZigBeeThirtyOneDeviceCurrentValues",
      "args": {
        "subTypes": [
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_00",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "RSSI",
            "args": {
              "scale": 1.0,
              "signed": true,
              "decimals": 0,
              "unit": "dBm",
              "desc": "Radio signal strength (signed dBm). SignalLevel is the percent representation of this value. 0x00 for FBH zones (no own radio).",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "BatteryLevel",
            "args": {
              "scale": 1.0,
              "signed": false,
              "decimals": 0,
              "unit": "%",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 37,
            "id": "Unknown_03_39",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "SignalLevel",
            "args": {
              "scale": 2.55,
              "signed": false,
              "decimals": 2,
              "unit": "%",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3ESwitch",
            "len": 15,
            "id": "ViCareDevice",
            "args": {
              "listStr": "ViCareDeviceTypes",
              "cases": {
                "0": {
                  "codec": "RawCodec",
                  "len": 14,
                  "id": "Unknown_42_55",
                  "args": {
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "1": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "ActualTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Humidity",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "2": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "ActualTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "ValveOpening",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "DeviceDisplayTurned",
                        "args": {
                          "listStr": "DeviceDisplayModeStates",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "DeviceChildLockActive",
                        "args": {
                          "listStr": "DeviceChildLockStates",
                          "desc": "type2 (TRV) only: child lock (0/1, proven one-factor test). Mirrored in RoomProperty off44 (ChildLockActive).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "DeviceTemperatureSetpoint",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "type2 (TRV) only: TRV own setpoint (0xcd=205 -> 20.5C, scale=10). A room manual setpoint and the program/manual flag are NOT in these records (separate controller room DID).",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "3": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "FlowTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "int16 LE flow temperature, scale 10. Confirmed by live read: bytes 1e 01 -> 28.6 C. off43 is the HIGH BYTE of this value, not a separate state (flow exceeds 25.6 C, e.g. heating). The e3oncan codec reads off43 alone as CurrentWorkingMode, which is therefore just the temperature band (0:<25.6, 1:25.6-51.2, 2:51.2-76.8 C), not a real mode.",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "OperatingMode",
                        "args": {
                          "listStr": "ZigBeeOperatingModes",
                          "desc": "off48 state byte. Observed 0 (Standby, flow 28.6 C) and 2 (Cooling). 1 (Heating) not yet confirmed on a clean capture.",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "4": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_42",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Demand",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "generic zone demand (0/100). Heat vs cool direction comes from the Verteiler OperatingMode, not this byte: reads 100 in cooling too. Proven via condensation cutoff (demand 0 when dew point >= flow temp).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "ValveState",
                        "args": {
                          "listStr": "ValvePositionLevels",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "5": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_42",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Demand",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "generic zone demand (0/100). Heat vs cool direction comes from the Verteiler OperatingMode, not this byte: reads 100 in cooling too. Proven via condensation cutoff (demand 0 when dew point >= flow temp).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "ValveState",
                        "args": {
                          "listStr": "ValvePositionLevels",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                }
              },
              "default": {
                "codec": "RawCodec",
                "len": 14,
                "id": "Unknown_42_55",
                "args": {
                  "desc": "",
                  "info": "",
                  "acc": ""
                }
              },
              "desc": "off41-55, device-dependent. type0: empty slot. type1 (Climate sensor): room temperature (int16) + humidity. type2 (TRV): room temperature (int16) + valve opening %, DisplayTurned (off48), plus ChildLockActive (off54) and DeviceTemperatureSetpoint (off55, scale=10). type3 (Floor thermostat/Verteiler): FlowTemperature is int16 at off42-43 (off43 = high byte, confirmed by live read 28.6 C); OperatingMode at off48. type4/5 (actuator NC/NO): generic Demand % at off43, plus ValveState at off45 (actuator energized 0/1). off45 reads 0 on type1/2/3 (kept as Unknown_45). Unknown_46_47 (off46-47) and Unknown_49_53 (off49-53) always present. off48 is DisplayTurned only on type2, OperatingMode on type3, raw elsewhere. off54/55 carry child lock + setpoint only on type2; raw on all other types.",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_56",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 8,
            "id": "ParentDeviceSerialnumber",
            "args": {
              "desc": "EUI64 of ZigBee routing parent (Repeater/Verteiler). Devices connected directly to the gateway show the coordinator EUI of the gateway radio module, which does not appear in any device list.",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 3,
            "id": "Unknown_65_67",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          }
        ],
        "desc": "",
        "info": "",
        "acc": "ro"
      }
    }
  },
  "2295": {
    "68": {
      "codec": "O3EComplexType",
      "len": 68,
      "id": "ZigBeeThirtyTwoDeviceCurrentValues",
      "args": {
        "subTypes": [
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_00",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "RSSI",
            "args": {
              "scale": 1.0,
              "signed": true,
              "decimals": 0,
              "unit": "dBm",
              "desc": "Radio signal strength (signed dBm). SignalLevel is the percent representation of this value. 0x00 for FBH zones (no own radio).",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "BatteryLevel",
            "args": {
              "scale": 1.0,
              "signed": false,
              "decimals": 0,
              "unit": "%",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 37,
            "id": "Unknown_03_39",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "SignalLevel",
            "args": {
              "scale": 2.55,
              "signed": false,
              "decimals": 2,
              "unit": "%",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3ESwitch",
            "len": 15,
            "id": "ViCareDevice",
            "args": {
              "listStr": "ViCareDeviceTypes",
              "cases": {
                "0": {
                  "codec": "RawCodec",
                  "len": 14,
                  "id": "Unknown_42_55",
                  "args": {
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "1": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "ActualTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Humidity",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "2": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "ActualTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "ValveOpening",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "DeviceDisplayTurned",
                        "args": {
                          "listStr": "DeviceDisplayModeStates",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "DeviceChildLockActive",
                        "args": {
                          "listStr": "DeviceChildLockStates",
                          "desc": "type2 (TRV) only: child lock (0/1, proven one-factor test). Mirrored in RoomProperty off44 (ChildLockActive).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "DeviceTemperatureSetpoint",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "type2 (TRV) only: TRV own setpoint (0xcd=205 -> 20.5C, scale=10). A room manual setpoint and the program/manual flag are NOT in these records (separate controller room DID).",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "3": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "FlowTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "int16 LE flow temperature, scale 10. Confirmed by live read: bytes 1e 01 -> 28.6 C. off43 is the HIGH BYTE of this value, not a separate state (flow exceeds 25.6 C, e.g. heating). The e3oncan codec reads off43 alone as CurrentWorkingMode, which is therefore just the temperature band (0:<25.6, 1:25.6-51.2, 2:51.2-76.8 C), not a real mode.",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "OperatingMode",
                        "args": {
                          "listStr": "ZigBeeOperatingModes",
                          "desc": "off48 state byte. Observed 0 (Standby, flow 28.6 C) and 2 (Cooling). 1 (Heating) not yet confirmed on a clean capture.",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "4": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_42",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Demand",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "generic zone demand (0/100). Heat vs cool direction comes from the Verteiler OperatingMode, not this byte: reads 100 in cooling too. Proven via condensation cutoff (demand 0 when dew point >= flow temp).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "ValveState",
                        "args": {
                          "listStr": "ValvePositionLevels",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "5": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_42",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Demand",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "generic zone demand (0/100). Heat vs cool direction comes from the Verteiler OperatingMode, not this byte: reads 100 in cooling too. Proven via condensation cutoff (demand 0 when dew point >= flow temp).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "ValveState",
                        "args": {
                          "listStr": "ValvePositionLevels",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                }
              },
              "default": {
                "codec": "RawCodec",
                "len": 14,
                "id": "Unknown_42_55",
                "args": {
                  "desc": "",
                  "info": "",
                  "acc": ""
                }
              },
              "desc": "off41-55, device-dependent. type0: empty slot. type1 (Climate sensor): room temperature (int16) + humidity. type2 (TRV): room temperature (int16) + valve opening %, DisplayTurned (off48), plus ChildLockActive (off54) and DeviceTemperatureSetpoint (off55, scale=10). type3 (Floor thermostat/Verteiler): FlowTemperature is int16 at off42-43 (off43 = high byte, confirmed by live read 28.6 C); OperatingMode at off48. type4/5 (actuator NC/NO): generic Demand % at off43, plus ValveState at off45 (actuator energized 0/1). off45 reads 0 on type1/2/3 (kept as Unknown_45). Unknown_46_47 (off46-47) and Unknown_49_53 (off49-53) always present. off48 is DisplayTurned only on type2, OperatingMode on type3, raw elsewhere. off54/55 carry child lock + setpoint only on type2; raw on all other types.",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_56",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 8,
            "id": "ParentDeviceSerialnumber",
            "args": {
              "desc": "EUI64 of ZigBee routing parent (Repeater/Verteiler). Devices connected directly to the gateway show the coordinator EUI of the gateway radio module, which does not appear in any device list.",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 3,
            "id": "Unknown_65_67",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          }
        ],
        "desc": "",
        "info": "",
        "acc": "ro"
      }
    }
  },
  "2298": {
    "68": {
      "codec": "O3EComplexType",
      "len": 68,
      "id": "ZigBeeThirtyThreeDeviceCurrentValues",
      "args": {
        "subTypes": [
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_00",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "RSSI",
            "args": {
              "scale": 1.0,
              "signed": true,
              "decimals": 0,
              "unit": "dBm",
              "desc": "Radio signal strength (signed dBm). SignalLevel is the percent representation of this value. 0x00 for FBH zones (no own radio).",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "BatteryLevel",
            "args": {
              "scale": 1.0,
              "signed": false,
              "decimals": 0,
              "unit": "%",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 37,
            "id": "Unknown_03_39",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "SignalLevel",
            "args": {
              "scale": 2.55,
              "signed": false,
              "decimals": 2,
              "unit": "%",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3ESwitch",
            "len": 15,
            "id": "ViCareDevice",
            "args": {
              "listStr": "ViCareDeviceTypes",
              "cases": {
                "0": {
                  "codec": "RawCodec",
                  "len": 14,
                  "id": "Unknown_42_55",
                  "args": {
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "1": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "ActualTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Humidity",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "2": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "ActualTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "ValveOpening",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "DeviceDisplayTurned",
                        "args": {
                          "listStr": "DeviceDisplayModeStates",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "DeviceChildLockActive",
                        "args": {
                          "listStr": "DeviceChildLockStates",
                          "desc": "type2 (TRV) only: child lock (0/1, proven one-factor test). Mirrored in RoomProperty off44 (ChildLockActive).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "DeviceTemperatureSetpoint",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "type2 (TRV) only: TRV own setpoint (0xcd=205 -> 20.5C, scale=10). A room manual setpoint and the program/manual flag are NOT in these records (separate controller room DID).",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "3": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "FlowTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "int16 LE flow temperature, scale 10. Confirmed by live read: bytes 1e 01 -> 28.6 C. off43 is the HIGH BYTE of this value, not a separate state (flow exceeds 25.6 C, e.g. heating). The e3oncan codec reads off43 alone as CurrentWorkingMode, which is therefore just the temperature band (0:<25.6, 1:25.6-51.2, 2:51.2-76.8 C), not a real mode.",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "OperatingMode",
                        "args": {
                          "listStr": "ZigBeeOperatingModes",
                          "desc": "off48 state byte. Observed 0 (Standby, flow 28.6 C) and 2 (Cooling). 1 (Heating) not yet confirmed on a clean capture.",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "4": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_42",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Demand",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "generic zone demand (0/100). Heat vs cool direction comes from the Verteiler OperatingMode, not this byte: reads 100 in cooling too. Proven via condensation cutoff (demand 0 when dew point >= flow temp).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "ValveState",
                        "args": {
                          "listStr": "ValvePositionLevels",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "5": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_42",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Demand",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "generic zone demand (0/100). Heat vs cool direction comes from the Verteiler OperatingMode, not this byte: reads 100 in cooling too. Proven via condensation cutoff (demand 0 when dew point >= flow temp).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "ValveState",
                        "args": {
                          "listStr": "ValvePositionLevels",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                }
              },
              "default": {
                "codec": "RawCodec",
                "len": 14,
                "id": "Unknown_42_55",
                "args": {
                  "desc": "",
                  "info": "",
                  "acc": ""
                }
              },
              "desc": "off41-55, device-dependent. type0: empty slot. type1 (Climate sensor): room temperature (int16) + humidity. type2 (TRV): room temperature (int16) + valve opening %, DisplayTurned (off48), plus ChildLockActive (off54) and DeviceTemperatureSetpoint (off55, scale=10). type3 (Floor thermostat/Verteiler): FlowTemperature is int16 at off42-43 (off43 = high byte, confirmed by live read 28.6 C); OperatingMode at off48. type4/5 (actuator NC/NO): generic Demand % at off43, plus ValveState at off45 (actuator energized 0/1). off45 reads 0 on type1/2/3 (kept as Unknown_45). Unknown_46_47 (off46-47) and Unknown_49_53 (off49-53) always present. off48 is DisplayTurned only on type2, OperatingMode on type3, raw elsewhere. off54/55 carry child lock + setpoint only on type2; raw on all other types.",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_56",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 8,
            "id": "ParentDeviceSerialnumber",
            "args": {
              "desc": "EUI64 of ZigBee routing parent (Repeater/Verteiler). Devices connected directly to the gateway show the coordinator EUI of the gateway radio module, which does not appear in any device list.",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 3,
            "id": "Unknown_65_67",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          }
        ],
        "desc": "",
        "info": "",
        "acc": "ro"
      }
    }
  },
  "2301": {
    "68": {
      "codec": "O3EComplexType",
      "len": 68,
      "id": "ZigBeeThirtyFourDeviceCurrentValues",
      "args": {
        "subTypes": [
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_00",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "RSSI",
            "args": {
              "scale": 1.0,
              "signed": true,
              "decimals": 0,
              "unit": "dBm",
              "desc": "Radio signal strength (signed dBm). SignalLevel is the percent representation of this value. 0x00 for FBH zones (no own radio).",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "BatteryLevel",
            "args": {
              "scale": 1.0,
              "signed": false,
              "decimals": 0,
              "unit": "%",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 37,
            "id": "Unknown_03_39",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "SignalLevel",
            "args": {
              "scale": 2.55,
              "signed": false,
              "decimals": 2,
              "unit": "%",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3ESwitch",
            "len": 15,
            "id": "ViCareDevice",
            "args": {
              "listStr": "ViCareDeviceTypes",
              "cases": {
                "0": {
                  "codec": "RawCodec",
                  "len": 14,
                  "id": "Unknown_42_55",
                  "args": {
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "1": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "ActualTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Humidity",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "2": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "ActualTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "ValveOpening",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "DeviceDisplayTurned",
                        "args": {
                          "listStr": "DeviceDisplayModeStates",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "DeviceChildLockActive",
                        "args": {
                          "listStr": "DeviceChildLockStates",
                          "desc": "type2 (TRV) only: child lock (0/1, proven one-factor test). Mirrored in RoomProperty off44 (ChildLockActive).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "DeviceTemperatureSetpoint",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "type2 (TRV) only: TRV own setpoint (0xcd=205 -> 20.5C, scale=10). A room manual setpoint and the program/manual flag are NOT in these records (separate controller room DID).",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "3": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "FlowTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "int16 LE flow temperature, scale 10. Confirmed by live read: bytes 1e 01 -> 28.6 C. off43 is the HIGH BYTE of this value, not a separate state (flow exceeds 25.6 C, e.g. heating). The e3oncan codec reads off43 alone as CurrentWorkingMode, which is therefore just the temperature band (0:<25.6, 1:25.6-51.2, 2:51.2-76.8 C), not a real mode.",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "OperatingMode",
                        "args": {
                          "listStr": "ZigBeeOperatingModes",
                          "desc": "off48 state byte. Observed 0 (Standby, flow 28.6 C) and 2 (Cooling). 1 (Heating) not yet confirmed on a clean capture.",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "4": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_42",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Demand",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "generic zone demand (0/100). Heat vs cool direction comes from the Verteiler OperatingMode, not this byte: reads 100 in cooling too. Proven via condensation cutoff (demand 0 when dew point >= flow temp).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "ValveState",
                        "args": {
                          "listStr": "ValvePositionLevels",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "5": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_42",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Demand",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "generic zone demand (0/100). Heat vs cool direction comes from the Verteiler OperatingMode, not this byte: reads 100 in cooling too. Proven via condensation cutoff (demand 0 when dew point >= flow temp).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "ValveState",
                        "args": {
                          "listStr": "ValvePositionLevels",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                }
              },
              "default": {
                "codec": "RawCodec",
                "len": 14,
                "id": "Unknown_42_55",
                "args": {
                  "desc": "",
                  "info": "",
                  "acc": ""
                }
              },
              "desc": "off41-55, device-dependent. type0: empty slot. type1 (Climate sensor): room temperature (int16) + humidity. type2 (TRV): room temperature (int16) + valve opening %, DisplayTurned (off48), plus ChildLockActive (off54) and DeviceTemperatureSetpoint (off55, scale=10). type3 (Floor thermostat/Verteiler): FlowTemperature is int16 at off42-43 (off43 = high byte, confirmed by live read 28.6 C); OperatingMode at off48. type4/5 (actuator NC/NO): generic Demand % at off43, plus ValveState at off45 (actuator energized 0/1). off45 reads 0 on type1/2/3 (kept as Unknown_45). Unknown_46_47 (off46-47) and Unknown_49_53 (off49-53) always present. off48 is DisplayTurned only on type2, OperatingMode on type3, raw elsewhere. off54/55 carry child lock + setpoint only on type2; raw on all other types.",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_56",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 8,
            "id": "ParentDeviceSerialnumber",
            "args": {
              "desc": "EUI64 of ZigBee routing parent (Repeater/Verteiler). Devices connected directly to the gateway show the coordinator EUI of the gateway radio module, which does not appear in any device list.",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 3,
            "id": "Unknown_65_67",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          }
        ],
        "desc": "",
        "info": "",
        "acc": "ro"
      }
    }
  },
  "2304": {
    "68": {
      "codec": "O3EComplexType",
      "len": 68,
      "id": "ZigBeeThirtyFiveDeviceCurrentValues",
      "args": {
        "subTypes": [
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_00",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "RSSI",
            "args": {
              "scale": 1.0,
              "signed": true,
              "decimals": 0,
              "unit": "dBm",
              "desc": "Radio signal strength (signed dBm). SignalLevel is the percent representation of this value. 0x00 for FBH zones (no own radio).",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "BatteryLevel",
            "args": {
              "scale": 1.0,
              "signed": false,
              "decimals": 0,
              "unit": "%",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 37,
            "id": "Unknown_03_39",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "SignalLevel",
            "args": {
              "scale": 2.55,
              "signed": false,
              "decimals": 2,
              "unit": "%",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3ESwitch",
            "len": 15,
            "id": "ViCareDevice",
            "args": {
              "listStr": "ViCareDeviceTypes",
              "cases": {
                "0": {
                  "codec": "RawCodec",
                  "len": 14,
                  "id": "Unknown_42_55",
                  "args": {
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "1": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "ActualTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Humidity",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "2": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "ActualTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "ValveOpening",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "DeviceDisplayTurned",
                        "args": {
                          "listStr": "DeviceDisplayModeStates",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "DeviceChildLockActive",
                        "args": {
                          "listStr": "DeviceChildLockStates",
                          "desc": "type2 (TRV) only: child lock (0/1, proven one-factor test). Mirrored in RoomProperty off44 (ChildLockActive).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "DeviceTemperatureSetpoint",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "type2 (TRV) only: TRV own setpoint (0xcd=205 -> 20.5C, scale=10). A room manual setpoint and the program/manual flag are NOT in these records (separate controller room DID).",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "3": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "FlowTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "int16 LE flow temperature, scale 10. Confirmed by live read: bytes 1e 01 -> 28.6 C. off43 is the HIGH BYTE of this value, not a separate state (flow exceeds 25.6 C, e.g. heating). The e3oncan codec reads off43 alone as CurrentWorkingMode, which is therefore just the temperature band (0:<25.6, 1:25.6-51.2, 2:51.2-76.8 C), not a real mode.",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "OperatingMode",
                        "args": {
                          "listStr": "ZigBeeOperatingModes",
                          "desc": "off48 state byte. Observed 0 (Standby, flow 28.6 C) and 2 (Cooling). 1 (Heating) not yet confirmed on a clean capture.",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "4": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_42",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Demand",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "generic zone demand (0/100). Heat vs cool direction comes from the Verteiler OperatingMode, not this byte: reads 100 in cooling too. Proven via condensation cutoff (demand 0 when dew point >= flow temp).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "ValveState",
                        "args": {
                          "listStr": "ValvePositionLevels",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "5": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_42",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Demand",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "generic zone demand (0/100). Heat vs cool direction comes from the Verteiler OperatingMode, not this byte: reads 100 in cooling too. Proven via condensation cutoff (demand 0 when dew point >= flow temp).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "ValveState",
                        "args": {
                          "listStr": "ValvePositionLevels",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                }
              },
              "default": {
                "codec": "RawCodec",
                "len": 14,
                "id": "Unknown_42_55",
                "args": {
                  "desc": "",
                  "info": "",
                  "acc": ""
                }
              },
              "desc": "off41-55, device-dependent. type0: empty slot. type1 (Climate sensor): room temperature (int16) + humidity. type2 (TRV): room temperature (int16) + valve opening %, DisplayTurned (off48), plus ChildLockActive (off54) and DeviceTemperatureSetpoint (off55, scale=10). type3 (Floor thermostat/Verteiler): FlowTemperature is int16 at off42-43 (off43 = high byte, confirmed by live read 28.6 C); OperatingMode at off48. type4/5 (actuator NC/NO): generic Demand % at off43, plus ValveState at off45 (actuator energized 0/1). off45 reads 0 on type1/2/3 (kept as Unknown_45). Unknown_46_47 (off46-47) and Unknown_49_53 (off49-53) always present. off48 is DisplayTurned only on type2, OperatingMode on type3, raw elsewhere. off54/55 carry child lock + setpoint only on type2; raw on all other types.",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_56",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 8,
            "id": "ParentDeviceSerialnumber",
            "args": {
              "desc": "EUI64 of ZigBee routing parent (Repeater/Verteiler). Devices connected directly to the gateway show the coordinator EUI of the gateway radio module, which does not appear in any device list.",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 3,
            "id": "Unknown_65_67",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          }
        ],
        "desc": "",
        "info": "",
        "acc": "ro"
      }
    }
  },
  "2307": {
    "68": {
      "codec": "O3EComplexType",
      "len": 68,
      "id": "ZigBeeThirtySixDeviceCurrentValues",
      "args": {
        "subTypes": [
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_00",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "RSSI",
            "args": {
              "scale": 1.0,
              "signed": true,
              "decimals": 0,
              "unit": "dBm",
              "desc": "Radio signal strength (signed dBm). SignalLevel is the percent representation of this value. 0x00 for FBH zones (no own radio).",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "BatteryLevel",
            "args": {
              "scale": 1.0,
              "signed": false,
              "decimals": 0,
              "unit": "%",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 37,
            "id": "Unknown_03_39",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "SignalLevel",
            "args": {
              "scale": 2.55,
              "signed": false,
              "decimals": 2,
              "unit": "%",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3ESwitch",
            "len": 15,
            "id": "ViCareDevice",
            "args": {
              "listStr": "ViCareDeviceTypes",
              "cases": {
                "0": {
                  "codec": "RawCodec",
                  "len": 14,
                  "id": "Unknown_42_55",
                  "args": {
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "1": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "ActualTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Humidity",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "2": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "ActualTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "ValveOpening",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "DeviceDisplayTurned",
                        "args": {
                          "listStr": "DeviceDisplayModeStates",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "DeviceChildLockActive",
                        "args": {
                          "listStr": "DeviceChildLockStates",
                          "desc": "type2 (TRV) only: child lock (0/1, proven one-factor test). Mirrored in RoomProperty off44 (ChildLockActive).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "DeviceTemperatureSetpoint",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "type2 (TRV) only: TRV own setpoint (0xcd=205 -> 20.5C, scale=10). A room manual setpoint and the program/manual flag are NOT in these records (separate controller room DID).",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "3": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "FlowTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "int16 LE flow temperature, scale 10. Confirmed by live read: bytes 1e 01 -> 28.6 C. off43 is the HIGH BYTE of this value, not a separate state (flow exceeds 25.6 C, e.g. heating). The e3oncan codec reads off43 alone as CurrentWorkingMode, which is therefore just the temperature band (0:<25.6, 1:25.6-51.2, 2:51.2-76.8 C), not a real mode.",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "OperatingMode",
                        "args": {
                          "listStr": "ZigBeeOperatingModes",
                          "desc": "off48 state byte. Observed 0 (Standby, flow 28.6 C) and 2 (Cooling). 1 (Heating) not yet confirmed on a clean capture.",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "4": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_42",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Demand",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "generic zone demand (0/100). Heat vs cool direction comes from the Verteiler OperatingMode, not this byte: reads 100 in cooling too. Proven via condensation cutoff (demand 0 when dew point >= flow temp).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "ValveState",
                        "args": {
                          "listStr": "ValvePositionLevels",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "5": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_42",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Demand",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "generic zone demand (0/100). Heat vs cool direction comes from the Verteiler OperatingMode, not this byte: reads 100 in cooling too. Proven via condensation cutoff (demand 0 when dew point >= flow temp).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "ValveState",
                        "args": {
                          "listStr": "ValvePositionLevels",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                }
              },
              "default": {
                "codec": "RawCodec",
                "len": 14,
                "id": "Unknown_42_55",
                "args": {
                  "desc": "",
                  "info": "",
                  "acc": ""
                }
              },
              "desc": "off41-55, device-dependent. type0: empty slot. type1 (Climate sensor): room temperature (int16) + humidity. type2 (TRV): room temperature (int16) + valve opening %, DisplayTurned (off48), plus ChildLockActive (off54) and DeviceTemperatureSetpoint (off55, scale=10). type3 (Floor thermostat/Verteiler): FlowTemperature is int16 at off42-43 (off43 = high byte, confirmed by live read 28.6 C); OperatingMode at off48. type4/5 (actuator NC/NO): generic Demand % at off43, plus ValveState at off45 (actuator energized 0/1). off45 reads 0 on type1/2/3 (kept as Unknown_45). Unknown_46_47 (off46-47) and Unknown_49_53 (off49-53) always present. off48 is DisplayTurned only on type2, OperatingMode on type3, raw elsewhere. off54/55 carry child lock + setpoint only on type2; raw on all other types.",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_56",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 8,
            "id": "ParentDeviceSerialnumber",
            "args": {
              "desc": "EUI64 of ZigBee routing parent (Repeater/Verteiler). Devices connected directly to the gateway show the coordinator EUI of the gateway radio module, which does not appear in any device list.",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 3,
            "id": "Unknown_65_67",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          }
        ],
        "desc": "",
        "info": "",
        "acc": "ro"
      }
    }
  },
  "2310": {
    "68": {
      "codec": "O3EComplexType",
      "len": 68,
      "id": "ZigBeeThirtySevenDeviceCurrentValues",
      "args": {
        "subTypes": [
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_00",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "RSSI",
            "args": {
              "scale": 1.0,
              "signed": true,
              "decimals": 0,
              "unit": "dBm",
              "desc": "Radio signal strength (signed dBm). SignalLevel is the percent representation of this value. 0x00 for FBH zones (no own radio).",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "BatteryLevel",
            "args": {
              "scale": 1.0,
              "signed": false,
              "decimals": 0,
              "unit": "%",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 37,
            "id": "Unknown_03_39",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "SignalLevel",
            "args": {
              "scale": 2.55,
              "signed": false,
              "decimals": 2,
              "unit": "%",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3ESwitch",
            "len": 15,
            "id": "ViCareDevice",
            "args": {
              "listStr": "ViCareDeviceTypes",
              "cases": {
                "0": {
                  "codec": "RawCodec",
                  "len": 14,
                  "id": "Unknown_42_55",
                  "args": {
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "1": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "ActualTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Humidity",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "2": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "ActualTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "ValveOpening",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "DeviceDisplayTurned",
                        "args": {
                          "listStr": "DeviceDisplayModeStates",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "DeviceChildLockActive",
                        "args": {
                          "listStr": "DeviceChildLockStates",
                          "desc": "type2 (TRV) only: child lock (0/1, proven one-factor test). Mirrored in RoomProperty off44 (ChildLockActive).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "DeviceTemperatureSetpoint",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "type2 (TRV) only: TRV own setpoint (0xcd=205 -> 20.5C, scale=10). A room manual setpoint and the program/manual flag are NOT in these records (separate controller room DID).",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "3": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "FlowTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "int16 LE flow temperature, scale 10. Confirmed by live read: bytes 1e 01 -> 28.6 C. off43 is the HIGH BYTE of this value, not a separate state (flow exceeds 25.6 C, e.g. heating). The e3oncan codec reads off43 alone as CurrentWorkingMode, which is therefore just the temperature band (0:<25.6, 1:25.6-51.2, 2:51.2-76.8 C), not a real mode.",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "OperatingMode",
                        "args": {
                          "listStr": "ZigBeeOperatingModes",
                          "desc": "off48 state byte. Observed 0 (Standby, flow 28.6 C) and 2 (Cooling). 1 (Heating) not yet confirmed on a clean capture.",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "4": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_42",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Demand",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "generic zone demand (0/100). Heat vs cool direction comes from the Verteiler OperatingMode, not this byte: reads 100 in cooling too. Proven via condensation cutoff (demand 0 when dew point >= flow temp).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "ValveState",
                        "args": {
                          "listStr": "ValvePositionLevels",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "5": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_42",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Demand",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "generic zone demand (0/100). Heat vs cool direction comes from the Verteiler OperatingMode, not this byte: reads 100 in cooling too. Proven via condensation cutoff (demand 0 when dew point >= flow temp).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "ValveState",
                        "args": {
                          "listStr": "ValvePositionLevels",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                }
              },
              "default": {
                "codec": "RawCodec",
                "len": 14,
                "id": "Unknown_42_55",
                "args": {
                  "desc": "",
                  "info": "",
                  "acc": ""
                }
              },
              "desc": "off41-55, device-dependent. type0: empty slot. type1 (Climate sensor): room temperature (int16) + humidity. type2 (TRV): room temperature (int16) + valve opening %, DisplayTurned (off48), plus ChildLockActive (off54) and DeviceTemperatureSetpoint (off55, scale=10). type3 (Floor thermostat/Verteiler): FlowTemperature is int16 at off42-43 (off43 = high byte, confirmed by live read 28.6 C); OperatingMode at off48. type4/5 (actuator NC/NO): generic Demand % at off43, plus ValveState at off45 (actuator energized 0/1). off45 reads 0 on type1/2/3 (kept as Unknown_45). Unknown_46_47 (off46-47) and Unknown_49_53 (off49-53) always present. off48 is DisplayTurned only on type2, OperatingMode on type3, raw elsewhere. off54/55 carry child lock + setpoint only on type2; raw on all other types.",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_56",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 8,
            "id": "ParentDeviceSerialnumber",
            "args": {
              "desc": "EUI64 of ZigBee routing parent (Repeater/Verteiler). Devices connected directly to the gateway show the coordinator EUI of the gateway radio module, which does not appear in any device list.",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 3,
            "id": "Unknown_65_67",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          }
        ],
        "desc": "",
        "info": "",
        "acc": "ro"
      }
    }
  },
  "2313": {
    "68": {
      "codec": "O3EComplexType",
      "len": 68,
      "id": "ZigBeeThirtyEightDeviceCurrentValues",
      "args": {
        "subTypes": [
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_00",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "RSSI",
            "args": {
              "scale": 1.0,
              "signed": true,
              "decimals": 0,
              "unit": "dBm",
              "desc": "Radio signal strength (signed dBm). SignalLevel is the percent representation of this value. 0x00 for FBH zones (no own radio).",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "BatteryLevel",
            "args": {
              "scale": 1.0,
              "signed": false,
              "decimals": 0,
              "unit": "%",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 37,
            "id": "Unknown_03_39",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "SignalLevel",
            "args": {
              "scale": 2.55,
              "signed": false,
              "decimals": 2,
              "unit": "%",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3ESwitch",
            "len": 15,
            "id": "ViCareDevice",
            "args": {
              "listStr": "ViCareDeviceTypes",
              "cases": {
                "0": {
                  "codec": "RawCodec",
                  "len": 14,
                  "id": "Unknown_42_55",
                  "args": {
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "1": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "ActualTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Humidity",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "2": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "ActualTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "ValveOpening",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "DeviceDisplayTurned",
                        "args": {
                          "listStr": "DeviceDisplayModeStates",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "DeviceChildLockActive",
                        "args": {
                          "listStr": "DeviceChildLockStates",
                          "desc": "type2 (TRV) only: child lock (0/1, proven one-factor test). Mirrored in RoomProperty off44 (ChildLockActive).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "DeviceTemperatureSetpoint",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "type2 (TRV) only: TRV own setpoint (0xcd=205 -> 20.5C, scale=10). A room manual setpoint and the program/manual flag are NOT in these records (separate controller room DID).",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "3": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "FlowTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "int16 LE flow temperature, scale 10. Confirmed by live read: bytes 1e 01 -> 28.6 C. off43 is the HIGH BYTE of this value, not a separate state (flow exceeds 25.6 C, e.g. heating). The e3oncan codec reads off43 alone as CurrentWorkingMode, which is therefore just the temperature band (0:<25.6, 1:25.6-51.2, 2:51.2-76.8 C), not a real mode.",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "OperatingMode",
                        "args": {
                          "listStr": "ZigBeeOperatingModes",
                          "desc": "off48 state byte. Observed 0 (Standby, flow 28.6 C) and 2 (Cooling). 1 (Heating) not yet confirmed on a clean capture.",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "4": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_42",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Demand",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "generic zone demand (0/100). Heat vs cool direction comes from the Verteiler OperatingMode, not this byte: reads 100 in cooling too. Proven via condensation cutoff (demand 0 when dew point >= flow temp).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "ValveState",
                        "args": {
                          "listStr": "ValvePositionLevels",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "5": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_42",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Demand",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "generic zone demand (0/100). Heat vs cool direction comes from the Verteiler OperatingMode, not this byte: reads 100 in cooling too. Proven via condensation cutoff (demand 0 when dew point >= flow temp).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "ValveState",
                        "args": {
                          "listStr": "ValvePositionLevels",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                }
              },
              "default": {
                "codec": "RawCodec",
                "len": 14,
                "id": "Unknown_42_55",
                "args": {
                  "desc": "",
                  "info": "",
                  "acc": ""
                }
              },
              "desc": "off41-55, device-dependent. type0: empty slot. type1 (Climate sensor): room temperature (int16) + humidity. type2 (TRV): room temperature (int16) + valve opening %, DisplayTurned (off48), plus ChildLockActive (off54) and DeviceTemperatureSetpoint (off55, scale=10). type3 (Floor thermostat/Verteiler): FlowTemperature is int16 at off42-43 (off43 = high byte, confirmed by live read 28.6 C); OperatingMode at off48. type4/5 (actuator NC/NO): generic Demand % at off43, plus ValveState at off45 (actuator energized 0/1). off45 reads 0 on type1/2/3 (kept as Unknown_45). Unknown_46_47 (off46-47) and Unknown_49_53 (off49-53) always present. off48 is DisplayTurned only on type2, OperatingMode on type3, raw elsewhere. off54/55 carry child lock + setpoint only on type2; raw on all other types.",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_56",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 8,
            "id": "ParentDeviceSerialnumber",
            "args": {
              "desc": "EUI64 of ZigBee routing parent (Repeater/Verteiler). Devices connected directly to the gateway show the coordinator EUI of the gateway radio module, which does not appear in any device list.",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 3,
            "id": "Unknown_65_67",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          }
        ],
        "desc": "",
        "info": "",
        "acc": "ro"
      }
    }
  },
  "2316": {
    "68": {
      "codec": "O3EComplexType",
      "len": 68,
      "id": "ZigBeeThirtyNineDeviceCurrentValues",
      "args": {
        "subTypes": [
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_00",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "RSSI",
            "args": {
              "scale": 1.0,
              "signed": true,
              "decimals": 0,
              "unit": "dBm",
              "desc": "Radio signal strength (signed dBm). SignalLevel is the percent representation of this value. 0x00 for FBH zones (no own radio).",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "BatteryLevel",
            "args": {
              "scale": 1.0,
              "signed": false,
              "decimals": 0,
              "unit": "%",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 37,
            "id": "Unknown_03_39",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "SignalLevel",
            "args": {
              "scale": 2.55,
              "signed": false,
              "decimals": 2,
              "unit": "%",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3ESwitch",
            "len": 15,
            "id": "ViCareDevice",
            "args": {
              "listStr": "ViCareDeviceTypes",
              "cases": {
                "0": {
                  "codec": "RawCodec",
                  "len": 14,
                  "id": "Unknown_42_55",
                  "args": {
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "1": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "ActualTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Humidity",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "2": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "ActualTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "ValveOpening",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "DeviceDisplayTurned",
                        "args": {
                          "listStr": "DeviceDisplayModeStates",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "DeviceChildLockActive",
                        "args": {
                          "listStr": "DeviceChildLockStates",
                          "desc": "type2 (TRV) only: child lock (0/1, proven one-factor test). Mirrored in RoomProperty off44 (ChildLockActive).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "DeviceTemperatureSetpoint",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "type2 (TRV) only: TRV own setpoint (0xcd=205 -> 20.5C, scale=10). A room manual setpoint and the program/manual flag are NOT in these records (separate controller room DID).",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "3": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "FlowTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "int16 LE flow temperature, scale 10. Confirmed by live read: bytes 1e 01 -> 28.6 C. off43 is the HIGH BYTE of this value, not a separate state (flow exceeds 25.6 C, e.g. heating). The e3oncan codec reads off43 alone as CurrentWorkingMode, which is therefore just the temperature band (0:<25.6, 1:25.6-51.2, 2:51.2-76.8 C), not a real mode.",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "OperatingMode",
                        "args": {
                          "listStr": "ZigBeeOperatingModes",
                          "desc": "off48 state byte. Observed 0 (Standby, flow 28.6 C) and 2 (Cooling). 1 (Heating) not yet confirmed on a clean capture.",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "4": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_42",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Demand",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "generic zone demand (0/100). Heat vs cool direction comes from the Verteiler OperatingMode, not this byte: reads 100 in cooling too. Proven via condensation cutoff (demand 0 when dew point >= flow temp).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "ValveState",
                        "args": {
                          "listStr": "ValvePositionLevels",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "5": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_42",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Demand",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "generic zone demand (0/100). Heat vs cool direction comes from the Verteiler OperatingMode, not this byte: reads 100 in cooling too. Proven via condensation cutoff (demand 0 when dew point >= flow temp).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "ValveState",
                        "args": {
                          "listStr": "ValvePositionLevels",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                }
              },
              "default": {
                "codec": "RawCodec",
                "len": 14,
                "id": "Unknown_42_55",
                "args": {
                  "desc": "",
                  "info": "",
                  "acc": ""
                }
              },
              "desc": "off41-55, device-dependent. type0: empty slot. type1 (Climate sensor): room temperature (int16) + humidity. type2 (TRV): room temperature (int16) + valve opening %, DisplayTurned (off48), plus ChildLockActive (off54) and DeviceTemperatureSetpoint (off55, scale=10). type3 (Floor thermostat/Verteiler): FlowTemperature is int16 at off42-43 (off43 = high byte, confirmed by live read 28.6 C); OperatingMode at off48. type4/5 (actuator NC/NO): generic Demand % at off43, plus ValveState at off45 (actuator energized 0/1). off45 reads 0 on type1/2/3 (kept as Unknown_45). Unknown_46_47 (off46-47) and Unknown_49_53 (off49-53) always present. off48 is DisplayTurned only on type2, OperatingMode on type3, raw elsewhere. off54/55 carry child lock + setpoint only on type2; raw on all other types.",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_56",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 8,
            "id": "ParentDeviceSerialnumber",
            "args": {
              "desc": "EUI64 of ZigBee routing parent (Repeater/Verteiler). Devices connected directly to the gateway show the coordinator EUI of the gateway radio module, which does not appear in any device list.",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 3,
            "id": "Unknown_65_67",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          }
        ],
        "desc": "",
        "info": "",
        "acc": "ro"
      }
    }
  },
  "2319": {
    "68": {
      "codec": "O3EComplexType",
      "len": 68,
      "id": "ZigBeeFourtyDeviceCurrentValues",
      "args": {
        "subTypes": [
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_00",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "RSSI",
            "args": {
              "scale": 1.0,
              "signed": true,
              "decimals": 0,
              "unit": "dBm",
              "desc": "Radio signal strength (signed dBm). SignalLevel is the percent representation of this value. 0x00 for FBH zones (no own radio).",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "BatteryLevel",
            "args": {
              "scale": 1.0,
              "signed": false,
              "decimals": 0,
              "unit": "%",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 37,
            "id": "Unknown_03_39",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3EInt8",
            "len": 1,
            "id": "SignalLevel",
            "args": {
              "scale": 2.55,
              "signed": false,
              "decimals": 2,
              "unit": "%",
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "O3ESwitch",
            "len": 15,
            "id": "ViCareDevice",
            "args": {
              "listStr": "ViCareDeviceTypes",
              "cases": {
                "0": {
                  "codec": "RawCodec",
                  "len": 14,
                  "id": "Unknown_42_55",
                  "args": {
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "1": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "ActualTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Humidity",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "2": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "ActualTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "ValveOpening",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "DeviceDisplayTurned",
                        "args": {
                          "listStr": "DeviceDisplayModeStates",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "DeviceChildLockActive",
                        "args": {
                          "listStr": "DeviceChildLockStates",
                          "desc": "type2 (TRV) only: child lock (0/1, proven one-factor test). Mirrored in RoomProperty off44 (ChildLockActive).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "DeviceTemperatureSetpoint",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "type2 (TRV) only: TRV own setpoint (0xcd=205 -> 20.5C, scale=10). A room manual setpoint and the program/manual flag are NOT in these records (separate controller room DID).",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "3": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "O3EInt16",
                        "len": 2,
                        "id": "FlowTemperature",
                        "args": {
                          "scale": 10,
                          "signed": false,
                          "decimals": 0,
                          "unit": "\u00b0C",
                          "desc": "int16 LE flow temperature, scale 10. Confirmed by live read: bytes 1e 01 -> 28.6 C. off43 is the HIGH BYTE of this value, not a separate state (flow exceeds 25.6 C, e.g. heating). The e3oncan codec reads off43 alone as CurrentWorkingMode, which is therefore just the temperature band (0:<25.6, 1:25.6-51.2, 2:51.2-76.8 C), not a real mode.",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_45",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "OperatingMode",
                        "args": {
                          "listStr": "ZigBeeOperatingModes",
                          "desc": "off48 state byte. Observed 0 (Standby, flow 28.6 C) and 2 (Cooling). 1 (Heating) not yet confirmed on a clean capture.",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "4": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_42",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Demand",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "generic zone demand (0/100). Heat vs cool direction comes from the Verteiler OperatingMode, not this byte: reads 100 in cooling too. Proven via condensation cutoff (demand 0 when dew point >= flow temp).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "ValveState",
                        "args": {
                          "listStr": "ValvePositionLevels",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                },
                "5": {
                  "codec": "O3EComplexType",
                  "len": 14,
                  "id": "Data",
                  "args": {
                    "subTypes": [
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_42",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EInt8",
                        "len": 1,
                        "id": "Demand",
                        "args": {
                          "scale": 1.0,
                          "signed": false,
                          "decimals": 0,
                          "unit": "%",
                          "desc": "generic zone demand (0/100). Heat vs cool direction comes from the Verteiler OperatingMode, not this byte: reads 100 in cooling too. Proven via condensation cutoff (demand 0 when dew point >= flow temp).",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_44",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "O3EEnum",
                        "len": 1,
                        "id": "ValveState",
                        "args": {
                          "listStr": "ValvePositionLevels",
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 2,
                        "id": "Unknown_46_47",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_48",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 5,
                        "id": "Unknown_49_53",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_54",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      },
                      {
                        "codec": "RawCodec",
                        "len": 1,
                        "id": "Unknown_55",
                        "args": {
                          "desc": "",
                          "info": "",
                          "acc": ""
                        }
                      }
                    ],
                    "desc": "",
                    "info": "",
                    "acc": ""
                  }
                }
              },
              "default": {
                "codec": "RawCodec",
                "len": 14,
                "id": "Unknown_42_55",
                "args": {
                  "desc": "",
                  "info": "",
                  "acc": ""
                }
              },
              "desc": "off41-55, device-dependent. type0: empty slot. type1 (Climate sensor): room temperature (int16) + humidity. type2 (TRV): room temperature (int16) + valve opening %, DisplayTurned (off48), plus ChildLockActive (off54) and DeviceTemperatureSetpoint (off55, scale=10). type3 (Floor thermostat/Verteiler): FlowTemperature is int16 at off42-43 (off43 = high byte, confirmed by live read 28.6 C); OperatingMode at off48. type4/5 (actuator NC/NO): generic Demand % at off43, plus ValveState at off45 (actuator energized 0/1). off45 reads 0 on type1/2/3 (kept as Unknown_45). Unknown_46_47 (off46-47) and Unknown_49_53 (off49-53) always present. off48 is DisplayTurned only on type2, OperatingMode on type3, raw elsewhere. off54/55 carry child lock + setpoint only on type2; raw on all other types.",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 1,
            "id": "Unknown_56",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 8,
            "id": "ParentDeviceSerialnumber",
            "args": {
              "desc": "EUI64 of ZigBee routing parent (Repeater/Verteiler). Devices connected directly to the gateway show the coordinator EUI of the gateway radio module, which does not appear in any device list.",
              "info": "",
              "acc": ""
            }
          },
          {
            "codec": "RawCodec",
            "len": 3,
            "id": "Unknown_65_67",
            "args": {
              "desc": "",
              "info": "",
              "acc": ""
            }
          }
        ],
        "desc": "",
        "info": "",
        "acc": "ro"
      }
    }
  },
  "Version": "20260630"
}