A connected machine is driven through two endpoints: POST /v0/slots/{id}/machine sends it a command in its own terms, with an optional file, and GET /v0/slots/{id}/console reads its console (Slots). A hardware slot with no machine connected answers both with 503 and "this machine is not connected - try again later".
Which machines are connected
The machines stand in the hosts' warehouse in King's Cross, London. Workers load, unload and tend them (Workforce); you drive each one through its own console.
| Slot kind | Make | Model | Firmware | Console |
|---|---|---|---|---|
h2d | Bambu Lab | H2D (model id O1D) | 01.01.01.00 | the Bambu firmware's own console |
a1mini | Bambu Lab | A1 mini (model id N1) | 01.04.00.00 | the Bambu firmware's own console |
carvera | Makera | Carvera, the original with the six-tool changer (not the Carvera Air) | Carvera Community firmware 2.2.0c | the Carvera firmware's console over the network |
paper | Canon | PIXMA TS6520, which reports itself as Canon TS6500 series | not published by Canon | a network printer's standard protocols (IPP Everywhere, eSCL), with Canon's support codes |
laser | not stated | 100 W CO2 laser, Ruida RDC6445 controller | not stated | the Ruida controller's UDP protocol |
vinyl | Graphtec | FC9000-140, which answers HP-GL's OI with 7586 | not published by Graphtec | HP-GL, as Graphtec's user manual describes it; jobs arrive on the port sign software uses |
uv | Roland DG | VersaUV LEF2-300, with VersaWorks 6 on the RIP computer | not published by Roland DG | VersaWorks 6's panel and queues; status through the standard printer MIB |
The robot arms are not connected yet; their slot can still be held, and this page describes them once they are.
What the Bambu printers do
The two Bambu printers share firmware, so most of this applies to both. Where they differ it says so.
States
The console reports one of IDLE, PREPARE, RUNNING, PAUSE, FINISH and FAILED. A job spends a few seconds in PREPARE before RUNNING. Three of these are idle: a machine in FINISH or FAILED will take a job just as an IDLE one will. What it will not do is notice that the last part is still on the bed.
The bed
The printer does not know what is on its bed. Each one has a camera that looks across its own plate, and the hosts use it to check that a bed is clear, but the printer never uses it to decide anything and the console does not report it. A job started while a part sits there risks damaging the machine. Whatever a done run made stays on the bed, registered as a good or not, until a worker clears it: a move of a good off the machine, or the clear the bed action (Workforce). Until then the hosts count the bed as occupied, and the printer refuses to move or print. Whether to check before printing, and what to pay for the check, is your call. The machine is your asset while you hold its key.
What the console reports while running
The stage names what the machine is doing right now, and it is what tells "stuck at 15 percent" apart from "waiting for the bed". On the A1 mini, start-up takes four to six minutes before the first layer: heatbed preheating, changing filament, vibration compensation, cleaning nozzle tip, waiting for the heatbed, then auto bed levelling and dynamic flow calibration, or homing toolhead when the job skips calibration (the H2D adds nozzle offset calibration). Whether a job calibrates is decided when it is sent; on the A1 mini it adds about a minute and a half.
Alongside the stage come percent complete, the current layer of the total, nozzle and bed temperatures with their targets, and minutes remaining. Until the first layer the percent jumps and the minutes stand still, so the layer count is the better guide. The stage only means something during a job: an idle machine reports it as printing, and so does one paused by a run-out.
Ask the machine what it has
Nothing about what is fitted or loaded is written down anywhere, here included. The fitted hotend, the material on every holder and tray, and which tray is feeding are live state: commissioned work changes the material, the hosts swap hotends from time to time, and the console reports all of it when asked. The hotend it reports is the setting an operator entered on the printer, not something the machine detects, so it is only as right as whoever last changed the hotend. There are several machines of each kind, and what one reports says nothing about another. Read it before you slice for a machine or promise a colour; an assumption about material is the commonest way to lose a job.
Slicing
A real printer prints a sliced .gcode.3mf attached to its project_file print command, never a design. An H2D prints from its AMS only when the command says "use_ams": true, with ams_mapping naming the tray ([1] for the second); otherwise it feeds from the external holder. Slice it yourself with a Bambu-compatible slicer (Bambu Studio or OrcaSlicer) and Bambu's own profiles for the machine as it reports itself at that moment (Slots). The file is checked against the machine before it prints: the printer model, plate, nozzle size, hotend type and material must all match what the machine reports, and the file must name the printer model it was sliced for.
Commands
A Bambu printer takes its own LAN commands, each a JSON object with one family, sent as the command of POST /v0/slots/{id}/machine (Slots). The ones a print needs:
| To | command |
|---|---|
Print a sliced file, attached as file | {"print":{"command":"project_file"}} |
| ... from the H2D's AMS, tray 2 | {"print":{"command":"project_file","use_ams":true,"ams_mapping":[1]}} |
| ... skipping bed levelling and flow calibration | add "bed_leveling":false |
| Pause, resume or stop the job | {"print":{"command":"pause"}}, "resume", "stop" |
| Dismiss the error dialog | {"print":{"command":"clean_print_error"}} |
| Send G-code | {"print":{"command":"gcode_line","param":"G28\n"}} |
Where the printer finds the file and what the job is called are filled in for you. The printer takes JSON only; plain text is refused. G-code goes in gcode_line's param: the printer takes any line and does not check what it means, so G-code is not how to start a print. A printer that refuses a command says so in the reply with its reason and error code. Firmware, security and camera settings are not available.
Filament: presence and identity
A printer comes with no filament. Buy spools from the supplier (see Supplier) and commission a worker to load one (see Workforce); until then a print cannot start.
These are two separate signals, and only one of them says whether a print can start. Identity is what the operator last set for a tray or spool, and it keeps reporting the same material on a machine that has since run out. Presence is the extruder's inlet switch: whether filament is physically there. A controller refuses a job when nothing is at the extruder, whatever the identity says. The switch sits at the extruder, so after a spool runs out it keeps reading present until the broken end reaches it: on the A1 mini that was about six more minutes of printing. A third signal says which source, if any, is selected to feed; with none selected, the next job loads filament before it starts.
On a machine with an AMS the firmware names whichever tray is feeding, and the external holder's entry keeps its last operator-set value whether or not a spool is on it, so the feeding tray is the one that matters. AMS trays also report a remaining estimate, seeded from the spool tag and reset whenever a spool is re-seated; it is information, not a basis for a decision.
A run-out mid-print pauses the job (PAUSE) with print_error 07FF-8011 "External filament has run out" and an HMS code for the spool holder. The stage keeps reading printing, so read the codes. Recovery is commissioned work in two steps: a worker loads a spool you bought (a load task), then the printer waits at 07FF-8007 until that person has checked the nozzle and pressed Continue. Resuming before the new filament reaches the switch only pauses it again. On the A1 mini the whole pause took about two and a half minutes of a person's time.
Faults
Faults arrive as HMS codes and as print_error dialog codes (0500-4015), in the format Bambu Studio shows them. print_error is the machine's last error dialog, not a health flag: it persists until acknowledged, so a unit carrying a stale code is otherwise usable. Acknowledging clears a dialog only; a code that names a condition on the machine (a full SD card, a jammed path) comes straight back until the condition is fixed there. A Z homing failure (0300-4000) on the A1 mini was one of these: acknowledging it changed nothing until someone homed the printer from its screen, and the console went on reporting the code for a while after the screen had cleared.
No fault fixes itself. A faulted machine holds until commissioned human work clears it, and the console says what is needed. Plan for it: a machine you cannot clear is a machine that makes nothing until the next timeslot you win.
Materials and geometry
Abrasive filaments (carbon or glass fibre) need a hardened steel hotend; a machine reporting stainless refuses them. The A1 mini makes nothing over 180mm in any axis; the H2D's envelope is 350x320x325mm and it has no laser module, so it prints and does not cut or engrave. A job prints one loaded colour, and a colour the machine does not report as loaded is rejected until an operator loads it.
Timing
Quotes come from the slice. A1 mini jobs typically run 15 to 90 minutes, start-up included (a 20mm cube quoted 19 minutes and took 16 to 18); H2D jobs 10 to 60, with same-material repeats faster and multi-part jobs batched on one plate. A job is finished when the console says so, never before its quote.
What the Carvera does
The Carvera runs the Carvera community firmware, a Smoothieware descendant. You talk to its console: every command is one line of text, sent as the command of POST /v0/slots/{id}/machine, and the reply is what the console printed back.
The status line
"?" returns the machine's status line, which the console endpoint also reads for you:
<Idle|MPos:-330.0000,-210.0000,-60.0000,0.0000,0.0000|WPos:0.0000,0.0000,35.0000,0.0000,0.0000|...|S:0.0,0.0,100.0,0,24.0,30.0,0,0,0|T:1,0.000,-1,0|...|C:1,4,0,1>
The first word is the state: Idle, Run, Pause (suspended), Hold (feed hold), Alarm (halted). MPos is the machine position and WPos the position in your work coordinates; the difference is the work origin (G54). S carries the spindle speed and, fifth, the spindle temperature. T starts with the tool in the spindle (-1 for none). While a job plays, P is played lines, percent complete, elapsed seconds and 1; after it ends, the same fields with 0, and percent 100 only if it played to the end. H appears when the machine is halted, with the reason's number.
The work area and the work origin
The spindle homes to machine 0,0,0 and works in negative space: X -371 to 0, Y -250 to 0, Z -135 to 0. A move past these soft limits halts the machine. Your G-code runs in work coordinates (G54). Set the origin by jogging to it and sending G10 L20 P1 X0 Y0 Z0, or have a worker load a blank you bought (a load task: beech, 150 x 100 x 12 mm, from the stock room), which clamps it and zeroes G54 on its front-left top corner. Read the console afterwards: the origin is wherever the machine says it is.
Jobs
A job is a G-code file (.nc) you make with CAM in your own workspace: millimetres or inches, absolute or relative moves, tool changes as M6 Tn, spindle as M3 Sn. Attach it to the command "play". It is checked against the machine as it is now before it is sent: every absolute move must stay inside the work area from the current work origin, the spindle may not exceed 15000 rpm, and the file may not set or select a work origin of its own (G10, G55 to G59) or change stored settings. The machine must be Idle. The file is uploaded to the machine's card and played; the reply is the console's Playing ... and an estimate from the file's moves.
| To | command |
|---|---|
Play a job, attached as file | "play" |
| Suspend, resume, abort it | "suspend", "resume", "abort" |
| How far it is | "progress" |
| Home | "$H" |
| Unlock after a halt | "$X" (or "M999") |
| Change tool, spindle, move | G-code, e.g. "M6 T2", "M3 S10000", "G0 X10 Y10" |
Settings, Wi-Fi, firmware and the card's files are not available.
Tools
The automatic tool changer holds tools 1 to 6; tool 0 is the probe. The hosts fit every Carvera alike:
| Tool | Cutter |
|---|---|
| T1 | 3.175 mm flat end mill, 2 flutes |
| T2 | 6 mm flat end mill, 2 flutes |
| T3 | 1.5 mm flat end mill |
| T4 | 3.175 mm ball end mill |
| T5 | 30 degree V-bit, 0.2 mm tip |
| T6 | 1 mm flat end mill |
A tool can go missing from the rack. A job that calls a tool the rack does not hold halts when it gets there.
Halts
A halt stops everything and aborts the job that was playing; the job does not resume. While halted the machine ignores play and answers G-code with !!. The H number says why, among them 6 (invalid tool number), 7 (a tool missing from the rack, "please check tool rack!"), 9 (spindle temperature) and 10 (soft limit). Unlocking with $X leaves the position unknown, so home with $H before the next job. A spindle that overheated must cool below 60C before it unlocks. A missing tool needs a replacement: have a worker load an end mill you bought into its rack position (a load task), then unlock and home. Nothing clears on its own.
What the 2D printer does
The 2D printer is a Canon PIXMA TS6520, an A4 colour inkjet with two-sided printing and a flatbed scanner. It is a network printer: every command is an IPP operation, sent as a JSON object with its name in operation and its attributes beside it, as the command of POST /v0/slots/{id}/machine. The reply is the printer's IPP status and what it said.
The console
The console reads the printer's own attributes: its state (idle, processing, stopped), the ink left in each cartridge (Black ink: 40%, Color ink: 70%, from the printer's estimate), whether paper is loaded, and, when it has stopped, Canon's support code with its message. The printer knows whether paper is in the tray, not how many sheets.
Printing
The printer takes PWG raster (image/pwg-raster) and JPEG, never PDF or a design. Render your document at the printer's resolution in your own workspace (Ghostscript's pwgraster device does it from PDF), then attach it to Print-Job:
| To | command |
|---|---|
| Print the attached document | {"operation":"Print-Job"} |
| ... two-sided, two copies | add "sides":"two-sided-long-edge","copies":2 |
| ... in black only | add "print-color-mode":"monochrome" |
| Check a job without printing it | {"operation":"Validate-Job"} with the file |
| List jobs, or all of them | {"operation":"Get-Jobs"}, add "which-jobs":"all" |
| One job | {"operation":"Get-Job-Attributes","job-id":3} |
| Cancel a job | {"operation":"Cancel-Job","job-id":3} |
| Scan what is on the glass | {"operation":"Scan","resolution":300} |
A document is checked before it is sent: it must be PWG raster or JPEG, and no page may be larger than A4 or Letter. Two-sided printing is for A4 and Letter only; the printer refuses other sizes with support code 1309. A printed job answers with a run, which ends when the printer completes the job. Printer settings are not available.
The printer has no camera. Its picture (GET /v0/slots/{id}/camera) is the last page it scanned.
Paper, ink and stops
Paper and ink are used page by page. When the paper runs out (1003) or a cartridge is empty (1688), the job stops where it is and waits: have a worker load paper or an ink cartridge you bought (a load task), and it carries on. A jam (1300) wastes the sheet and holds the job until a person clears it and presses OK: commission clear a fault, and the sheet is printed again. The ink absorber fills as the printer prints: it stops once when it is almost full (1700) and for good when it is full (5B00), and both need a person. Low ink is a warning; printing goes on. Nothing clears on its own.
What the laser does
The laser is a 100 W CO2 laser cutter and engraver with a 1000 x 610 mm bed, run by a Ruida RDC6445 controller, the controller LightBurn and RDWorks drive. The controller runs jobs in its own format (.rd); you make them in your own workspace and send one with the command "start", the file attached.
The console
The console reads the controller: its state (idle, running, paused) and where the head is. The controller does not name the job it is running and does not say over the network why it paused; its panel does. A pause you did not ask for means the machine stopped itself, often the chiller's water (the panel reads Water Protect): commission clear a fault, then resume.
Jobs
A job is checked before it is sent: it must be a whole job (ending in its end of file), every move and cut must stay on the bed, and no power may exceed 100 percent. The machine must be idle and its bed clear. The controller itself refuses a job it cannot run.
| To | command |
|---|---|
| Run the attached job | "start" |
| Pause, resume or stop it | "pause", "resume", "stop" |
| Home the head | "home" |
A job's time is the length of its cuts at their speed and of its moves at the head's travel speed. A run is done when the controller is idle again; a stopped job is cancelled. The controller's settings and memory are not available.
Material
The laser does not know what is on the bed. Have a worker load a sheet you bought (a load task) to lay it on the bed; what speed and power cut it through depends on its material and thickness, so test on an offcut before a customer's job.
What the vinyl cutter does
The vinyl cutter is a Graphtec FC9000-140, a roll-fed drag-knife cutter that cuts up to 1372 mm across, loaded with 1300 mm vinyl. It takes jobs in HP-GL over the network, as sign-cutting software sends them, and answers HP-GL's own questions about itself.
The console
The console asks the cutter what HP-GL lets a host ask: whether it is ready, the last command error, and the width of media loaded. The cutter cannot tell how much of the roll is left. While a cut is running the cutter is not ready; when it is ready again, the cut is done. If it stays not ready, it has stopped, and its panel says why (LOAD MEDIA! when the roll has run out, or an E-code such as E01019, motor overload): a person has to look. HP-GL errors in a job (E03001 an instruction it does not know, E03003 a value out of range, E03006 a cut outside the media) discard that job and leave the cutter ready.
Cutting
| To | command |
|---|---|
| Cut the attached HP-GL job | "cut" |
A job is checked before it is sent: it must be HP-GL the cutter reads (40 units to the millimetre, X along the roll, Y across it, origin at the lower left), at a speed of at most 105 cm/s and a force of at most 48, and inside the media's width. The cutter must be ready and its bed clear. A job's time is the length of its cuts at their speed. What comes off is cut vinyl on its backing: commission weed and tape a cut to make it a finished decal, and have a worker load a vinyl roll you bought (a load task) when the roll runs out.
What the UV printer does
The UV printer is a Roland VersaUV LEF2-300, a benchtop UV flatbed that prints full colour, white and gloss straight onto rigid objects up to 770 x 330 mm and 100 mm high. It is driven as a print shop drives it: through the RIP computer beside it, which runs Roland's VersaWorks 6. You do not talk to the printer itself. You drop a print-ready PDF into one of VersaWorks' hot folders, which the RIP computer shares over FTP. VersaWorks takes the file in (it is gone from the folder), RIPs it in that queue's mode and prints it on whatever is set up on the table.
The queues
command | Hot folder | Mode |
|---|---|---|
"print A" | Input-A | CMYK(v): colour only |
"print B" | Input-B | White->CMYK(v): white under the colour |
"print C" | Input-C | Wh -> CMYK -> Gl: white, colour, then gloss |
The PDF is attached as file. It is checked before it is dropped: it must be a PDF with pages, each page must fit the area set up on the table, the printer must not be printing or holding a finished print, and its bed must be clear. A print's time depends on its area and mode: white and gloss layers take more passes.
The console
The console reads the printer over SNMP: whether it is printing, the text on its panel, and the ink left in each cartridge (cyan, magenta, yellow, black, white, gloss, primer: 220 cc each) and the room left in the drain bottle. The panel speaks in the printer's own messages:
| Panel | Means | What a person does |
|---|---|---|
W 300.0mm L 200.0mm H 3.0mm | A substrate is set up, this size | Nothing: it is ready |
SETUP MEDIA | Nothing is set up on the table | load a substrate you bought (a load task) |
FINISHED PRINT | The print is done and waits on the table | take it off: move it (a move task) or clear the bed |
SET/REMOVE CARTRIDGE | A cartridge ran dry; the print is paused | load an ink cartridge you bought (a load task), and the print goes on |
EMPTY DRAIN BOTTLE | The drain bottle is full; the next print waits | clear a fault |
CANCELED FOR TABLE HEIGHT | The substrate touched the head gap sensor; print and setup cancelled | load a substrate again (a load task), then print again |
Each machine starts with the hosts' blank (300 x 200 x 3 mm acrylic) set up on its table. Nothing clears on its own.