Duet wifi S3D

  • administrators

    You will need to enclose the filename in double quotes when sending it if you want it to work on filenames with ( or ) or ; in the name.

  • Hi all:

    curl –data-binary "@[output_filepath]" "http://192.168.x.x/rr_upload?name=gcodes/[output_filename].gcode"

    –data-binary don't losse the NewLine or CarriageReturns as -d do.
    and don't add extra data to the gcode file as -F do.


  • The best that worked for me is:

    curl --data-binary "@[output_filepath]" "http://192.168..XX.XX/rr_upload?name=gcodes%2F[output_filename].gcode"

    curl "http://192.168.XX.XX/rr_gcode?gcode=M32 [output_filename].gcode"

    But there are still some problems...

    1. If you have a Space in the name, the file is only saved as the first part til the space (e.g. Test file.gcode is saved as Test.gcode)
    2. Special Characters (e.g. äöü) aren't saved properly
    3. Is there a possibility to delete the file on the local computer after uploading it to the duet? Couldn't find any solution...

    greetings kuhni

  • @dc42

    hmm, i guess this is a stupid question, but I am unclear

    1. where to put these lovely scripts to load the file.

  • @brianhanifin said in Duet wifi S3D:

    Content-Disposition: form-data; name="file"; filename="curl_test.gcode"
    Content-Type: application/octet-stream

    I'm currently implementing the G-Code upload for Slic3rPE and struggeling with the same problem mentioned by @BrianHanifin .
    Some parts of the HTTP-Header are saved in the G-Code after upload when uploading the G-Code using form_add of libcurl.
    Is it somehow possible to support forms in the firmware?

    Best regards

  • HI,

    I have just installed a Duet Wifi and running well...However, I cant work out how to get the slicer to control bed temp. Simplify3D wants tools and laser to be indicated as T0 to T5, and Duet indicates bed as 'B' .... Yes, I can and do control bed temp manually prior to printing, but I want it auto controlled by g-code.

    Could the gurus here help please ?


  • I think you are overthinking it. Do you have multiple beds?
    If not, default setting in S3D is OK, it will output M140 S70 to set bed temperature to 70°C, and that works with Duet

  • In case anyone's interested... here's how I print from Linux...

    #!/usr/bin/env bash
    echo "$(date) $@" >> /var/log/pp.log
    printit() {
       set +xe
       of=$(basename "$op")
       ncftpput -t 5 duet0 /gcodes/ "$op" || ncftpput -t 5 -v duet0 /gcodes/ "$op"
    #  I do the ncftpput again if the first one fails as it does sometimes.
       fn=$(python -c "import urllib ; print(urllib.urlencode({'gcode': 'M32 \"$of\"'}))")
       echo $fn
       curl "http://duet0/rr_gcode?$fn"
       echo "Done"
    printit "$@" 2>&1 >> /var/log/pp.log

    save that someplace and make it executable. You do need ncftpput (part of ncftp package), curl and python (both of which are standard). There are no issues with spaces in the filename BTW.

    In Simplify3D Process, Scripts, Post Processing put something like...

    /bin/bash /data1/3d/duet/pp.sh "[output_filepath]"

    substituting "/data1/3d/duet/pp.sh" with wherever you put the script.
    All you have to do now is 'Save Toolpaths To Disk" and the file should transfer and start printing after the save is complete.

    I have also had good luck printing directly from Simplify3D.
    Like others have said, you need to set "M555 P2" at the end of your config.g to turn on Marlin emulation and you also have to set "Hardware Flow Control" in the firmware Communications settings.

    If I didn't have the PanelDue 7i, I'd print directly. I'm not overly fond of having to switch desktop windows around to start the print.

  • I've cobbled up a quick powershell script for the purpose when I got my Duet. It watches a folder for new/changed .gcode files and offers to upload them.

    # adjust these to your values
    $folder = "e:\3dprint\gcodes"
    $filter = "*.gcode"
    $Global:baseUri = "http://duet3d.local/rr_upload?name=gcodes/"
    Add-Type -AssemblyName PresentationCore,PresentationFramework
    $Global:lastPath = ''
    $Global:lastTime = Get-Date
    $Watcher = New-Object IO.FileSystemWatcher $folder, $filter -Property @{ 
        IncludeSubdirectories = $false
        NotifyFilter = [IO.NotifyFilters]'FileName, LastWrite'
    $changeAction = [scriptblock]::Create('
        $path = $Event.SourceEventArgs.FullPath
        $name = $Event.SourceEventArgs.Name
        $timeGenerated = $Event.TimeGenerated
        # usually multile change events are triggered when a file is written, no need to spam those
        if ($Global:lastPath -ne $path -or ($Global:lastTime - $timeGenerated).TotalSeconds -lt -10) {
            $Global:lastPath = $path;
            $Global:lastTime = $timeGenerated
            $msgBoxResult =  [System.Windows.MessageBox]::Show(("Upload `"{0}`" to the printer?" -f $Event.SourceEventArgs.Name),"GCode Upload","YesNo","Question")
            switch  ($msgBoxResult) {
                "Yes" {
                    try {
                        Invoke-WebRequest -Uri ("{0}{1}" -f $baseUri, $name) -Method Post -InFile $path 
                    } catch {
                "No" {
    $onChanged = Register-ObjectEvent $Watcher Changed -SourceIdentifier FileChanged -Action $changeAction
    # prevent the console from closing
    while (1) {
        sleep 2

    Save somewhere with .ps1 extension and edit line 2-4 to match your settings. To run it rightclick the file -> "Run with PowerShell" and leave the powershell window open. To trigger the upload question just save your gcode file into the folder you specified in line 2.

  • For anyone still looking through this thread, the following S3D script will upload the file to your printer (with a timestamp) and tell it to start printing that file much like Slic3r would do:

    curl  -F "file=@[output_filepath]" "http://XXX.XXX.XXX.XXX/rr_upload?name=gcodes/[output_filename].gcode&time=YYY"
    curl "http://XXX.XXX.XXX.XXX/rr_gcode?gcode=M32[output_filename].gcode"

    Copy and paste into "Additional terminal commands for post processing" under the Scripts tab and replace XXX.XXX.XXX.XXX with your printer's IP address or hostname if applicable. As mentioned above, DWC will throw a couple of errors but doesn't seem to impact the print in any way. Happy printing!

  • administrators

    You may wish to add the following line at the end:

    curl "http://XXX.XXX.XXX.XXX/rr_disconnect"

    This will avoid RRF buffering up messages that S3D isn't going to fetch.

  • I have try pathio alpha/beta versions and have Duet integration, to upload files, and they do not add any header to gcode file uploaded.

  • Worked on this for a while and was able to resolve the issue where file names are truncated if the name contains a space.

    Basically all it does is replace spaces in the file name with %20, a simple form of URL Encode. It also uses --data-binary and does not add any extra text to the Gcode like the -F option does. Paste this into the 'Additional terminal commands for post processing' on the Scripts tab of Simplify 3d... don't forget to change the IP address. I'm sure there's a more elegant way but this works on a Mac.

    bash -c "echo 'http://xxx.xxx.xxx.xxx/rr_upload?name=gcodes/[output_filename].gcode' | sed 's/ /%20/g' | curl --data-binary '@[output_filepath]' $(</dev/stdin)";


Looks like your connection to Duet3D was lost, please wait while we try to reconnect.