code: async def send_rpc(self, client_id, conn_string, address, rpc_id, payload, timeout):
          
  
          conn_id = self._client_connection(client_id, conn_string)
          return await self.adapter.send_rpc(conn_id, address, rpc_id, payload, timeout)
docs: 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.