Duet Buddy - a proof of concept remote monitor
-
@richardmckenna That is exactly what I was looking into doing also!
Do you have any documentation or guides on how to do this? I don't know how to code a Raspberry Pi..Just saw your comment, would love to see a guide in the future!
-
@zapta so will this be connected over wifi? Awesome idea since most users use just the UI online and not a touch screen
-
That's really cool.
On a side note, can you post the gcode for the shave and a haircut two bits tune in the background of the video? Asking for a friend...
-
@UnderDoneSushi said in Duet Buddy - a proof of concept remote monitor:
@zapta so will this be connected over wifi? Awesome idea since most users use just the UI online and not a touch screen
Yes, it's uses wifi to connect to the duet. It can work on batteries (there are third party replacement batteries with larger capacity if you need) or connected to a usb charger (Type C cable).
@Phaedrux, that tune is from here https://github.com/zapta/misc/blob/3639b3ed30d71bf4465b09f19e08cb888792e71a/duet3d_monitor/arduino/beeper.cpp#L111 this is Arduino code.
-
@zapta Thanks. I think I can translate that into gcode.
-
Just found out. The M5Stack has built in magnets and sticks to things
-
@zapta said in Duet Buddy - a proof of concept remote monitor:
@Phaedrux, that tune is from here https://github.com/zapta/misc/blob/3639b3ed30d71bf4465b09f19e08cb888792e71a/duet3d_monitor/arduino/beeper.cpp#L111 this is Arduino code.
Thanks again. Translated for Duet Gcode here:
; 0:/macros/Tunes/TwoBits.g ; Shave and a haircut, two bits ; NOTE(NOTE_C6, 4), 1047 ; NOTE(NOTE_G5, 8), 784 ; NOTE(NOTE_G5, 8), 784 ; NOTE(NOTE_A5, 4), 880 ; NOTE(NOTE_G5, 4), 784 ; NOTE(0, 4), ; NOTE(NOTE_B5, 4), 988 ; NOTE(NOTE_C6, 4), 1047 M300 P400 S1047 G4 P410 M300 P350 S783 G4 P355 M300 P400 S785 G4 P410 M300 P400 S880 G4 P410 M300 P400 S784 G4 P850 M300 P400 S988 G4 P410 M300 P600 S1047 G4 P600
Works good on my old style PanelDue 7"
Sorry for the distraction.
-
@Phaedrux said in Duet Buddy - a proof of concept remote monitor:
Works good on my old style PanelDue 7"
I thought you said it was 'for a friend'?!
Ian
-
@droftarts Well I had to test it out for him, obviously...
-
I use this tune to let me know when the printer is in pause mode (e.g. to insert magnets half way). My serial duet monitor detects the state from the PanelDue communication and plays it every few seconds.
Should be easily to do the same with the M4Stack since it knows the printer's state and has a 1W speaker.
(I tried to play tunes via gcode but barely hear them from the PanelDue's speaker).
-
Had more progress with the firmware and it's stable and usefulnow. Here is a video that demonstrates how it behaves with the sequence: print, pause, resume, pause, cancel.
The full source code is here https://github.com/zapta/misc/tree/master/duet3d_buddy/arduino and is in public domain so feel to do with it whatever you like. The main flow is straight forward Arduino style and should be easy to understand and modify.
If any programmer here is looking for ideas on how to improve it, here are a few:
- Some mechanism that will allow people to buy the M5Stack and program it by inserting a SD card with downloaded software.
- UI to select from a few duet related mini apps (e.g. a Pressure Advance Buddy that allow to increase/decrease pressure advance on the fly using a + and - buttons)
- Sound effects. E.g. a periodic tune when in pause mode to get the attention of the operator.
-
@zapta is it working with the DUET3 & RRF3?
-
@tobias_munich said in Duet Buddy - a proof of concept remote monitor:
@zapta is it working with the DUET3 & RRF3?
Didn't tested it with duet3 and RRF3 (I have neither) but it it doesn't work, a small change should fix it.
The duet buddy polls the printer at the URL below with xx.xx.xx.xx representing the IP address of the printer.
http://xx.xx.xx.xx/rr_status?type=3
It expect to get back a json document with the printer status and then extract a few values such as progress, temp and z height. You can try it manually from a browser and see if you get a json doc. If you will post it here, I can text if the existing firmware will parse it correctly.
-
@zapta not sure about standalone mode duet3 but I don't think it will work with duet3 + pi as DSF has a new REST API so it would be a GET at http://{{RASP_PI_IP}}/machine/status.
Also not sure if the JSON model that is returned has changed from the old version. I will see what it returns tonight if no one else has by the time I get to it
-
@richardmckenna, shouldn't be too difficult to handle the difference. The duet buddy reads its configuration from an SD card so instead of the duet IP it can read the full duet status URL. As for json field names, if they changed, should be difficult to select an alternative parsing.
This is the current duet status parser logic. It's straight forward and can be easily adapted to pick whatever fields.
https://github.com/zapta/misc/blob/master/duet3d_buddy/arduino/duet_parser.cpp
-
@zapta said in Duet Buddy - a proof of concept remote monitor:
@tobias_munich said in Duet Buddy - a proof of concept remote monitor:
@zapta is it working with the DUET3 & RRF3?
Didn't tested it with duet3 and RRF3 (I have neither) but it it doesn't work, a small change should fix it.
The duet buddy polls the printer at the URL below with xx.xx.xx.xx representing the IP address of the printer.
http://xx.xx.xx.xx/rr_status?type=3
It expect to get back a json document with the printer status and then extract a few values such as progress, temp and z height. You can try it manually from a browser and see if you get a json doc. If you will post it here, I can text if the existing firmware will parse it correctly.
If you look at DWC2, it contains a javascript module that figures out whether the printer is using HTTP Polling or using WebSockets, connects, and then handles future requests in an abstract way. Shouldn't be too hard to reproduce this in the M5stack device. That would allow it to connect to either old or new very easily.
-
@Danal, that makes sense. I already change the format of the configuration to allow specification of full url. The determination of the protocol can be added as an automatic logic or a user configured flag. This platform is very flexible.
https://github.com/zapta/misc/blob/master/duet3d_buddy/arduino/arduino.ino#L9
Edit: the 'type=3' in the URL has nothing to do with RRF3.
-
@richardmckenna @zapta
this is the output from the standalone version.{"status":"I","coords":{"axesHomed":[1,1,1],"wpl":1,"xyz":[15.000,0.000,4.850],"machine":[15.000,0.000,4.850],"extr":[0.0]},"speeds":{"requested":0.0,"top":0.0},"currentTool":-1,"params":{"atxPower":-1,"fanPercent":[0,100],"speedFactor":100.0,"extrFactors":[100.0],"babystep":0.000},"seq":1,"sensors":{"probeValue":0,"fanRPM":[-1,-1]},"temps":{"bed":{"current":24.2,"active":0.0,"standby":0.0,"state":0,"heater":0},"current":[24.2,23.4],"state":[0,0],"tools":{"active":[[0.0]],"standby":[[0.0]]},"extra":[{"name":"*MCU-Temp","temp":48.0},{"name":"*Chamber Temp","temp":28.3},{"name":"*Chamber Hum[%]","temp":28.3}]},"time":149.0,"currentLayer":0,"currentLayerTime":0.0,"extrRaw":[0.0],"fractionPrinted":0.0,"filePosition":0,"firstLayerDuration":0.0,"firstLayerHeight":0.00,"printDuration":0.0,"warmUpDuration":0.0,"timesLeft":{"file":0.0,"filament":0.0,"layer":0.0}}
-
If you don't need to full two way interface... There is a way to get status (only) from a Duet3/RRF3 with HTTP only (no socket needed). Here is a Python example that returns a JSON object of "Current Position" from either 2 or 3 via auto-detection:
# Python Script to return JSON object of current position from a Duet printer # Auto-detects RRF2 vs RRF3 protocol # # Copyright (C) 2020 Danal Estes all rights reserved. # Released under The MIT License. Full text available via https://opensource.org/licenses/MIT # import requests import json import sys endpoint2='/rr_status?type=1' # RRF2 request endpoint3='/machine/status' # RRF3 request endpointA=endpoint2 # Active def getCoords(base_url): global endpointA if (endpointA == endpoint2): try: r = requests.get(f'{base_url}{endpointA}') j=json.loads(r.text) jc=j['coords']['xyz'] ret=json.loads('{}') for i in range(0,len(jc)): ret[ 'xyz'[i] ] = jc[i] return(ret) except: endpointA = endpoint3 if (endpointA == endpoint3): try: r = requests.get(f'{base_url}{endpointA}') j=json.loads(r.text) ja=j['result']['move']['axes'] jd=j['result']['move']['drives'] ad=json.loads('{}') for i in range(0,len(ja)): ad[ ja[i]['letter'] ] = ja[i]['drives'][0] ret=json.loads('{}') for i in range(0,len(ja)): ret[ ja[i]['letter'] ] = jd[i]['position'] return(ret) except: print(base_url," does not appear to be a RRF2 or RRF3 printer", file=sys.stderr) raise # Test cases print(getCoords('http://192.168.7.100')) print(getCoords('http://127.0.0.1')) print(getCoords('http://192.168.7.101'))
And example output:
{'x': 0.0, 'y': 0.0, 'z': 626.751} {'X': 271.4, 'Y': 341.1, 'Z': 5.7, 'U': 0} {'X': 271.4, 'Y': 341.1, 'Z': 5.7, 'U': 0}
-
Thanks Danal. I am currently using '/rr_status?type=3' but this can be configured in the M5Stack SD card config file to any url. Picked =3 because this is what my DWC keeps polling.
Currently the response parser looks for these json fields:
status, fractionPrinted, coords.xyz[2], temps.current[0] and temps.current[1]. If RRF3 has them then it work with no change. Otherwise, adding them to the parser should be easy.Response parser is straight forward and anybody make changes for RRF3 please send me a pull request.
https://github.com/zapta/misc/blob/master/duet3d_buddy/arduino/duet_parser.cpp