code: def _dissect_msg(self, match):
          
          recvfrom = match.group(1)
          frame = bytes.fromhex(match.group(2))
          if recvfrom == 'E':
              _LOGGER.warning("Received erroneous message, ignoring: %s", frame)
              return (None, None, None, None, None)
          msgtype = self._get_msgtype(frame[0])
          if msgtype in (READ_ACK, WRITE_ACK, READ_DATA, WRITE_DATA):
              # Some info is best read from the READ/WRITE_DATA messages
              # as the boiler may not support the data ID.
              # Slice syntax is used to prevent implicit cast to int.
              data_id = frame[1:2]
              data_msb = frame[2:3]
              data_lsb = frame[3:4]
              return (recvfrom, msgtype, data_id, data_msb, data_lsb)
          return (None, None, None, None, None)
docs: Split messages into bytes and return a tuple of bytes.