code: async def send_rpc(self, conn_id, address, rpc_id, payload, timeout):
          
  
          self._ensure_connection(conn_id, True)
          dev = self._get_property(conn_id, 'device')
  
          try:
              res = dev.call_rpc(address, rpc_id, bytes(payload))
              if inspect.iscoroutine(res):
                  return await res
              else:
                  return res
          except (RPCInvalidIDError, RPCNotFoundError, TileNotFoundError, RPCErrorCode, BusyRPCResponse):
              raise
          except Exception:
              self._logger.exception("Exception inside rpc %d:0x%04X, payload=%s",
                                     address, rpc_id, payload)
              raise
docs: Asynchronously send an RPC to this IOTile device
  
          Args:
              conn_id (int): A unique identifier that will refer to this connection
              address (int): the address of the tile that we wish to send the RPC to
              rpc_id (int): the 16-bit id of the RPC we want to call
              payload (bytearray): the payload of the command
              timeout (float): the number of seconds to wait for the RPC to execute