Configuration¶
Settings come in three layers, each overriding the one before:
| Layer | Where | Who changes it |
|---|---|---|
| Defaults | _AUTO_EJECT_DEFAULTS in auto_eject.cfg |
Updated with each release |
| Your settings | _AUTO_EJECT_SETTINGS in auto_eject_settings.cfg |
You |
| Saved | [save_variables] (auto_eject_*) |
AUTO_EJECT_SETUP, the web page or AUTO_EJECT_SET |
Your file only needs the values you want to change. Settings added in a new release work straight away with their defaults, and updates never touch your file.
Text values must be in double quotes ("columns"). Numbers and True/False are written
without quotes. Run FIRMWARE_RESTART after editing.
The easiest way is the guided setup,
AUTO_EJECT_SETUP(setup-wizard.md).AUTO_EJECT_SETUP STEP=resetforgets what it saved.One setting at a time: the Settings section of the web page, or from the console
AUTO_EJECT_SET KEY=cool_temp VALUE=35. The value is checked and saved, and is kept after a restart.AUTO_EJECT_SET KEY=cool_temp RESET=1goes back to your file.
On or off¶
| Setting | Default | Description |
|---|---|---|
enabled |
True |
Push the parts off when a print ends. False: the AUTO_EJECT in the end G-code leaves them on the bed with a dialog, nothing moves, and the job queue waits for you (thin_pause_queue) |
Switch it with the big switch at the top of the web page's Overview, or from the console:
AUTO_EJECT_SET KEY=enabled VALUE=off and AUTO_EJECT_SET KEY=enabled VALUE=on. It is kept after
a restart, so there is no need to change the slicer's end G-code.
Switched off, nothing is pushed at all: AUTO_EJECT typed by hand, the page's Eject now and
Push now say it is off, and an eject already waiting for the bed to cool stops and leaves the
parts. AUTO_EJECT_GUARD does not check the bed either, so the next print starts on whatever is
there: take the parts off first. A print that ends without an eject (no AUTO_EJECT in the end
G-code, or cancelled) opens no dialog and sends nothing to the phone. A dry run still works. The parts of the last print stay stored,
so once it is switched on again the next print checks the bed for them (guard_action).
Strategy and direction¶
| Setting | Default | Description |
|---|---|---|
strategy |
"columns" |
How the path is calculated: "columns", "objects" or "full_width". See strategies.md. Can be overridden per run with AUTO_EJECT STRATEGY=... |
direction |
"front" |
Edge the parts fall off: "front" (Y-), "back" (Y+), "left" (X-), "right" (X+) |
no_objects_action |
"skip" |
When the print has no labelled objects: "skip", "full_width" or "error" |
Blade geometry¶
Measure these after mounting the blade, with AUTO_EJECT_SETUP or by hand
(hardware.md). With Voron Tap, AUTO_EJECT_CALIBRATE measures them for you
(setup-wizard.md).
| Setting | Default | Description |
|---|---|---|
blade_offset |
20.0 |
Distance from the nozzle to the blade's pushing face, along the push direction, in mm. Positive means the blade is ahead of the nozzle |
blade_width |
80.0 |
Blade width across the push direction, in mm, centred on the nozzle |
blade_lift |
"unknown" |
Height of the blade's lower edge above the nozzle tip, in mm. Set by AUTO_EJECT_CALIBRATE. Retries use it so a blade hanging below the nozzle never drags on the bed |
blade_clearance |
1.0 |
Where AUTO_EJECT_CALIBRATE puts the blade's lower edge while pushing, in mm above the bed. The nozzle never goes below push_z_min |
column_overlap |
15.0 |
Overlap between neighbouring lanes (columns / full_width) |
head_depth |
40.0 |
Toolhead depth behind the blade. objects uses it to check there is room to lower the blade |
side_margin |
5.0 |
Extra side margin for that check |
If the blade is not centred on the nozzle, centre it in the hardware, or use a width that covers the offset side as well.
Motion¶
| Setting | Default | Description |
|---|---|---|
push_z |
1.5 |
Nozzle Z while pushing. The blade's lower edge sits at push_z + blade lift. Start high (3–5 mm) and lower it after watching a run |
push_end |
"auto" |
Where each push ends on the push axis. "auto" = the axis limit on the drop side. A number pushes only to that coordinate |
rear_clearance |
10.0 |
Gap behind a part before the blade comes down |
allow_clamped_start |
False |
Allow a push to start at the axis limit when the blade cannot get fully behind a part. The blade may then land on the part |
push_speed |
1500 |
mm/min while pushing (25 mm/s) |
travel_speed |
9000 |
mm/min for travel moves |
z_speed |
600 |
mm/min for Z moves |
push_accel |
1500 |
Acceleration while ejecting. The previous value is restored afterwards |
z_hop |
5.0 |
Added to the current Z height for travel moves |
min_safe_z |
20.0 |
Travel moves never go below this Z. It must be taller than your tallest part |
dry_pause |
500 |
Pause in ms at each start point during DRY=1 |
Safe Z. Travel height is
max(current Z + z_hop, min_safe_z). At the end of a print the toolhead is above the tallest layer, so the current Z is usually enough. If your end G-code lowers Z before callingAUTO_EJECT, raisemin_safe_z.
Motor current¶
| Setting | Default | Description |
|---|---|---|
reduce_current |
True |
Lower the current of the steppers below while pushing |
current_steppers |
"stepper_x,stepper_y" |
Comma-separated stepper names. CoreXY needs both. A Cartesian printer pushing along Y needs "stepper_y" (add stepper_y1 for dual Y) |
push_current |
0.5 |
Amps while pushing. The configured run_current is restored afterwards |
The TMC driver section (tmc2209 stepper_x, tmc5160 stepper_y, …) is found automatically.
Steppers without a TMC section are skipped.
Choose push_current so that a part that won't move makes the motor skip. Start around 50–60% of
run_current, and lower it if the blade can bend or tear anything.
Cooling¶
| Setting | Default | Description |
|---|---|---|
cool_mode |
"temperature" |
"temperature" waits for the bed to reach cool_temp, "time" waits cool_time seconds, "none" doesn't wait |
cool_temp |
32 |
Bed temperature in °C at which parts release. PEI and CryoGrip usually release PLA below 30–35 °C |
cool_temps |
"" |
Another temperature for some materials, as MATERIAL=temperature with commas and no spaces, e.g. PETG=25,ABS=45. PETG often holds on to a smooth PEI sheet until the bed is cooler. It needs the material in the end G-code: AUTO_EJECT HEIGHT=[max_layer_z] MATERIAL=[filament_type] HOME=1 (slicer-setup.md). Materials not listed, and prints without MATERIAL, use cool_temp; PLA+ uses PLA's if it has none of its own |
cool_timeout |
1800 |
The longest wait for cool_temp, in seconds. In a warm room the bed may never get there: after this the parts are pushed anyway, with a warning |
cool_time |
600 |
Seconds, for "time" mode (also for beds without a heater_bed) |
heaters_off |
True |
Turn the hotend and bed heaters off before cooling |
cool_fan_speed |
1.0 |
Part fan speed while cooling, from 0.0 to 1.0. Turned off after the sweep |
cool_tour |
True |
While waiting, circle over the parts so the fan blows on each one in turn |
cool_tour_gap |
8.0 |
Gap in mm between the nozzle and the tallest part while circling. With an unknown print height the toolhead stays at min_safe_z |
cool_tour_dwell |
5.0 |
Seconds over each part per pass |
cool_background |
False |
Cool with the printer free: Push now and Stop, I'll take them off work while it cools (below) |
The bed is a heavy plate and its sensor cools at its own pace, but the air on the parts cools them and the sheet right under them, which is what makes them let go. Each pass checks the bed temperature (or the time) again, so the toolhead stops circling as soon as cooling is done.
Cooling with the printer free¶
Without cool_background, AUTO_EJECT waits for the bed inside the print's end G-code, and
Klipper takes no other command until the eject ends: no button can say "push now" or "I already
took them off". With cool_background: True:
- The print ends, and the job queue waits (it is paused for the eject).
- The bed cools in steps of a few seconds, the fan over one part at a time; between the steps the printer is free.
- Push now (
AUTO_EJECT_PUSH_NOW) pushes once the current step ends, without waiting for the bed. Stop, I'll take them off (AUTO_EJECT_CLEAR) stops the cooling and pushes nothing: the toolhead stops after the step that runs now (a few seconds), so press it first, then take the parts off. The job queue keeps waiting until Bed is clear, continue the queue (AUTO_EJECT_CONTINUE), so the next print never starts while your hands are in the printer. Both are on the web page's Overview and on the printer's farm card. - Otherwise, once the bed is cool (or
cool_timeouthas passed), the eject goes on as always: push, check the bed, and start the job queue again.
AUTO_EJECT_GUARD in the start G-code holds a print started by hand while the bed still cools.
A part left on the bed after the eject leaves the queue paused, as without this setting. If
Klipper restarts while the bed cools, the parts stay stored for the next print's check, and the
queue stays paused until you start it.
After the sweep¶
| Setting | Default | Description |
|---|---|---|
rehome_xy |
True |
Home X and Y again after pushing. A part that would not move makes the motor skip on purpose, and re-homing makes the position exact again before probing. If your homing macro un-homes Z, Z is found again around the parts |
retries |
1 |
How many times a part found still on the bed is pushed again (0–2). Each retry only sweeps the parts that were left |
retry_z_step |
0.3 |
Each retry pushes this many mm lower than the one before |
push_z_min |
0.5 |
A retry never pushes lower than this, and never higher than push_z |
retry_current_step |
0.15 |
Each retry adds this many amps to push_current, never more than the stepper's run_current |
With the defaults, a part left after the first sweep is pushed once more at push_z − 0.3 and
push_current + 0.15 A, then checked again. If it is still there, the queue stops.
Thin parts¶
Stencils, flat signs and other prints only a few layers tall are too thin for the blade to catch.
AUTO_EJECT leaves them alone: no cool-down wait, no movement, no probing. It forgets them,
pauses Moonraker's job queue so the next job does not print on top of them, and opens a dialog.
Take the part off and click Bed is clear - continue the queue (or run AUTO_EJECT_CONTINUE).
| Setting | Default | Description |
|---|---|---|
min_part_height |
2.0 |
Prints lower than this, in mm, count as thin. 0 turns this off |
thin_parts_action |
"ignore" |
"ignore" leaves them on the bed, "eject" pushes them anyway (for a blade that rides on the bed) |
thin_pause_queue |
True |
Pause Moonraker's job queue while thin parts are on the bed. Turn it off without Moonraker |
The print height comes from the slicer when the end G-code passes it
(AUTO_EJECT HEIGHT=[max_layer_z], see slicer-setup.md). Otherwise it is the
highest Z seen while printing. Slicers that report layers (SET_PRINT_STATS_INFO, as OrcaSlicer
does) keep homing and probing moves of the start G-code out of it. If the height is unknown, the
parts are ejected as usual.
Verification follows the height too: the probe treats anything higher than half the print height
(at least 0.2 mm, at most verify_threshold) as a part still on the bed.
Tall parts¶
While the blade pushes, and while the probe finds the bed after the motors were switched off, the
toolhead and the gantry it runs on (the X beam) pass just above the bed, over its whole width. A
part taller than the gap under them would be hit, however far the probe spot is from it. Many end
macros switch the motors off (M84), DEMON's DEMON_END among them, so AUTO_EJECT ... HOME=1
has to find Z again with parts on the bed.
So prints taller than max_part_height are left alone, like thin ones: no homing, no movement,
no probing. They stay stored, the job queue pauses (thin_pause_queue) and a dialog opens. Take
them off and click Bed is clear - continue the queue. Until then AUTO_EJECT_GUARD stops the
next print instead of checking the bed with the probe, and AUTO_EJECT HOME=1 refuses to home.
| Setting | Default | Description |
|---|---|---|
max_part_height |
25.0 |
The tallest print to push, in mm. Measure from the nozzle tip up to the lowest point of the gantry, the fans or the cables on the toolhead, and take a little less. AUTO_EJECT_SETUP asks for it |
It needs the print height, so pass it in the end G-code: AUTO_EJECT HEIGHT=[max_layer_z]. A
dry run (DRY=1) moves above the parts and still works.
Verification¶
| Setting | Default | Description |
|---|---|---|
verify |
True |
Probe where the parts were after the sweep. Requires [probe] or [bltouch] |
verify_points |
"outline" |
"outline" probes three points just inside each part's outline, which works for hollow parts like cookie cutters and frames. "center" probes one point in the centre, for solid parts |
verify_inset |
1.0 |
How far inside the outline the outline points are, in mm |
verify_threshold |
1.0 |
A probe trigger more than this many mm above the empty-bed trigger height (z_offset) means a part is still there |
verify_z |
10.0 |
Z height for moves between probe points |
The probe's x_offset/y_offset are applied, so BLTouch-style probes probe at the right spot.
Points the toolhead cannot reach are skipped.
Probe¶
| Setting | Default | Description |
|---|---|---|
probe_type |
"auto" |
"auto" detects [probe]/[bltouch] as contact, and probe_eddy_current, beacon, cartographer, scanner and probe_eddy_ng as eddy. Set "contact" or "eddy" to override |
verify_probe_gcode |
"PROBE" |
Command run at each verification point. Eddy probes need their contact/touch command here, otherwise verification is skipped with a warning |
home_z_gcode |
"PROBE" |
Command AUTO_EJECT HOME=1 uses to find Z at the chosen spot. With "PROBE", Z is set from the probe result. Any other command must home Z by itself at the current XY |
nozzle_clearance |
5.0 |
Offset probes: while probing, the nozzle stays at least this far from where any part was |
nozzle_probe_max_temp |
150.0 |
Probes that touch the bed with the nozzle (Voron Tap, eddy touch modes): wait until the nozzle is this cool, in °C, before touching the bed, so a hot nozzle does not mark the print sheet. 0 = do not wait |
nozzle_part_max_temp |
50.0 |
The same probes, before touching where parts are or were: wait until the nozzle is this cool, below where PLA softens, so it does not dent or stick to a part. The part fan helps. 0 = do not wait |
verify_unsafe_action |
"error" |
A part that cannot be probed without the nozzle passing over a part: "error" stops, "skip" warns |
notify |
"" |
Name of a Moonraker [notifier] that gets auto-eject's messages: a part still on the bed, parts too thin to push, a print that ended without an eject, a print that did not start. "" = none. install.sh --notify sets it up (notifications.md) |
See probes.md for how offset and eddy-current probes are handled.
The parts box¶
The box under the drop edge fills up on a long night. auto-eject counts every part it pushes off, and keeps the count across restarts.
| Setting | Default | What it does |
|---|---|---|
bin_capacity |
0 |
How many parts the box holds. At 80 % you get a message (and a notification), at the limit another. 0 = no messages; the web page still shows the count |
bin_full_action |
"stop" |
When the box is full: "stop" holds the next print in AUTO_EJECT_GUARD until you empty it (so AUTO_EJECT_GUARD must be in the start G-code), "notify" only sends the message |
After emptying the box, run AUTO_EJECT_BIN_EMPTY or press I emptied the box in the web page
(on the overview, or the printer's card in the farm). Count by the biggest parts you print: a box
that holds 40 cookie cutters holds fewer vases.
The spool (Spoolman)¶
With Spoolman linked to Moonraker ([spoolman]), the queue is
checked against what is left on the printer's spool (spoolman.md). Without Spoolman,
these do nothing.
| Setting | Default | What it does |
|---|---|---|
spool_low_action |
"stop" |
Before a job the spool cannot finish: "stop" stops the job queue before it and sends a message (needs the klipper-auto-eject service, install.sh --push), "notify" only sends the message, "off" does not check |
spool_reserve |
10.0 |
Grams to keep on the spool, since slicer weights are estimates |
Recovery¶
| Setting | Default | Description |
|---|---|---|
persist_state |
True |
Save part outlines and print height in [save_variables] while printing |
guard_action |
"check" |
What AUTO_EJECT_GUARD does when old parts may be on the bed: "check" probes where they were and prints if the bed is clear, "error" stops the print, "eject" ejects them (recovery.md) |
home_method |
"auto" |
AUTO_EJECT HOME=1: "auto", "probe" or "g28" |
home_clearance |
20.0 |
Minimum distance in mm between any part and the probe, the nozzle or the blade while Z is homed |
home_edge_margin |
15.0 |
Distance in mm kept from the ends of the X and Y axes when choosing that spot. With a [bed_mesh], the spot is also kept inside the mesh area, so Z is found on the print sheet, not on clips, screws or holes past its edge |
Details in recovery.md.
EJECT_PURGE¶
| Setting | Default | Description |
|---|---|---|
purge_length |
30.0 |
Filament to purge, in mm |
purge_height |
6.0 |
Pellet height in mm. The nozzle rises while extruding |
purge_start_z |
0.4 |
Z where the pellet starts |
purge_flow |
8.0 |
Volumetric flow in mm³/s. Sets how fast the nozzle rises |
purge_retract |
0.8 |
Retraction after the pellet |
purge_gap |
15.0 |
Distance between the pellet and the nearest part |
purge_edge_margin |
50.0 |
Minimum distance between the pellet and the drop edge. Keep the pellet on the build surface |
filament_diameter |
1.75 |
A pellet extrudes a lot of filament over a short move, so Klipper's
max_extrude_cross_section in [extruder] must be large enough. EJECT_PURGE tells you the
value it needs. 50 is a common setting on printers that already use adaptive purging.