Skip to content

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=reset forgets 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=1 goes 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 calling AUTO_EJECT, raise min_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:

  1. The print ends, and the job queue waits (it is paused for the eject).
  2. The bed cools in steps of a few seconds, the fan over one part at a time; between the steps the printer is free.
  3. 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.
  4. Otherwise, once the bed is cool (or cool_timeout has 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.