<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 async def send_rpc(self, client_id, conn_string, address, rpc_id, payload, timeout):
 """Send an RPC on behalf of a client. See :meth:`AbstractDeviceAdapter.send_rpc`. Args: client_id (str):
 The client we are working for. conn_string (str):
 A connection string that will be passed to the underlying device adapter to connect. address (int):
 The RPC address. rpc_id (int):
 The ID number of the RPC payload (bytes):
 The RPC argument payload timeout (float):
 The RPC's expected timeout to hand to the underlying device adapter. Returns: bytes: The RPC response. Raises: DeviceServerError: There is an issue with your client_id such as not being connected to the device. TileNotFoundError: The destination tile address does not exist RPCNotFoundError: The rpc_id does not exist on the given tile RPCErrorCode: The RPC was invoked successfully and wishes to fail with a non-zero status code. RPCInvalidIDError: The rpc_id is too large to fit in 16-bits. TileBusSerror: The tile was busy and could not respond to the RPC. Exception: The rpc raised an exception during processing. DeviceAdapterError: If there is a hardware or communication issue invoking the RPC. """


        conn_id = self._client_connection(client_id, conn_string)
        return await self.adapter.send_rpc(conn_id, address, rpc_id, payload, timeout)