Repository navigation
Releases: ahmedbebars/klipper-auto-eject
Release list
v0.18.0 - Tall prints stay on the bed, and an easier installer
Safety first in this release: tall prints are now left on the bed instead of being pushed, and the installer is easier to get through.
Fixed
- Tall prints no longer bring the gantry down on themselves. When the end macro switches the motors off (
M84, asDEMON_ENDdoes),AUTO_EJECT HOME=1has to find Z again. The probe spot kept the nozzle, the probe and the blade clear of the parts, but the gantry spans the whole bed: with 220 mm tall parts it came down on one. A new setting,max_part_height(25 mm unless you set it;AUTO_EJECT_SETUPasks for it), is the tallest print to push. Taller prints stay on the bed with nothing moving, not even homing; the queue waits, a dialog and the phone say why, andAUTO_EJECT_GUARDstops the next print until they are taken off. - A print that stopped before its first layer no longer leaves parts on the bed (a start G-code that failed, say).
- The file lists show every file, not only the newest 300.
- Ctrl+C at the Tailscale login no longer stops the whole setup, and the login shows a QR code. The install command also works a second time.
Added
install.shfinds Spoolman on the network by itself and offers it.- CI opens every view of the web page at phone, tablet and desktop widths, in English and Arabic, and fails on layout problems or console errors.
SECURITY.md, and a real-printer checklist before each release inCONTRIBUTING.md.
Changed
- The button that stops background cooling says what it does: Stop, I'll take them off.
push/farm.pyandweb/app.jsare split into smaller files by what each part does. Nothing changes in how they work, and there is still no build step.
Update: through Mainsail or Fluidd's update manager (or the page's Updates tab), then restart Klipper when the printer is idle. Set max_part_height for each printer (AUTO_EJECT_SETUP, or the page's Settings).
Full list: CHANGELOG.md
v0.17.0 - The farm runs the printers together, and DEMON's bed check in the right place
Upgrading: update from Mainsail or Fluidd (or git pull), then restart Klipper (FIRMWARE_RESTART, never while printing): the guard and the cooling macros changed. Moonraker restarts the klipper-auto-eject service by itself if you installed the notifications or the farm. With DEMON Klipper Essentials, run once ~/klipper-auto-eject/install.sh --demon: it moves the bed check into DEMON's _CUSTOM_PRE_START (a copy of DEMON's file is saved first) and restarts Klipper unless it prints; an AUTO_EJECT_GUARD left in the slicer then does nothing. A page left open offers Reload. Your settings are kept.
بالعربية: المزرعة صارت تدير الطابعات معًا: أمر واحد لعدة طابعات، وقائمة واحدة توزّع نسخ الملف على أول طابعة متاحة، وإعدادات جاهزة لكل نوع من الطابعات تُنسخ بضغطة، وملصق QR لكل طابعة، وبكرة كل طابعة على بطاقتها، وتقرير الإنتاج مع ملف CSV. ومع التبريد والطابعة متاحة (cool_background) يعمل ادفع الآن وأزلت القطع أثناء التبريد، ولا تكمل القائمة إلا بعد السرير فارغ، أكمل القائمة. وإصلاح مهم لمستخدمي DEMON: كان وضع AUTO_EJECT_GUARD في أول G-code البداية يجعل DEMON يوقف الطابعة إيقاف طوارئ؛ صار يعمل داخل _CUSTOM_PRE_START، ويضبطه install.sh --demon وحده. والقوائم لم تعد تقفز لأعلى، والصور تكبر تحت الفأرة.
Tested: 592 tests, and ruff and eslint in CI. The DEMON fix on a Voron Trident with DEMON 2.3.9 (install.sh --demon on the real printer, then prints with the bed check in DEMON's hook), and cooling with the printer free on the same printer at the end of a real print, with Push now and Bed is clear live on its farm card. The farm queue, settings sets and QR labels in the demo and against pretend printers; the QR codes module by module against a reference encoder for every version and level. Not yet tried on real printers: the farm queue sending copies.
Fixed
- With DEMON Klipper Essentials,
AUTO_EJECT_GUARDgoes in DEMON's_CUSTOM_PRE_STARThook,
not first in the slicer's start G-code as the docs said. DEMON stops the printer (an emergency
stop, "Machine Start Gcode is not functional") whenDEMON_STARThas not come a few seconds into
a print, and checking the bed for parts left from the last print takes longer.install.sh
now sets the hook up by itself when it finds DEMON (install.sh --demonon a printer that has
auto-eject already):AUTO_EJECT_GUARD FROM=DEMONin_CUSTOM_PRE_START, a copy of the file
saved first. A guard left in the slicer then does nothing and says so; without the hook it stops
such a print itself with a message that says where it belongs. The In your slicer card shows
the command, and when the hook is set up. - A list keeps its place when the page is drawn again. The print queue's file list, which
redraws the page as it loads each file's facts, jumped back to the top while being scrolled;
every list and dialog now stays where it was. - The farm's list at about 1280 px wide: a printer's facts wrap instead of pushing its buttons out.
Added
- Pictures, bigger under the mouse, anywhere in the page: a file's thumbnail, a camera, a
drawing shows larger next to the pointer, on the backdrop its thumbnail has. - One command for several farm printers (farm.md):
tick printers, a group or everything shown, then Bed is clear, Start the queue,
Push now, Pause, Resume, Turn on, Turn off, Cancel the print or
Emergency stop, each only to the printers it suits now; and Send a file to every free
printer selected, printed on each if you ask. - One queue for the whole farm (farm.md): files
printed so many times, each copy sent to the next free printer it may go to (bed empty, nothing
in its own queue, the file's filament on its spool), into afarm/folder. A printer without
auto-eject waits for Bed is clear, and any printer after a copy that stopped. Move jobs,
change their copies, pause the queue; it is kept across restarts. - The spool on each farm printer's card, from Moonraker's
[spoolman]: colour, filament and
grams left, in orange when it runs low. - Production at the foot of the farm: what each printer made today, in 7 or 30 days (prints,
ended well, stopped, success, hours, filament), the whole farm, and a CSV to download. - Settings for a kind of printer (farm.md): one
printer's auto-eject settings onto the printers ticked, or a set saved under a name (Voron 2.4
350) for the next printer of that kind. Each printer gets only what differs, with
AUTO_EJECT_SET; its own notifier and what only the settings file can hold stay as they are. - A QR label on each printer (farm.md): its name and
a QR code of its page, at home or through Tailscale, to print and stick on it; a phone camera
opens the page. One printer's from ✎, or a sheet for the printers ticked. The codes are made in
the page, offline. - Push now, or I took the parts off, while the bed cools (
cool_background: True, off by
default; configuration.md). The print
ends first and the job queue waits; the bed cools in steps of a few seconds with the printer
free in between, so Push now (AUTO_EJECT_PUSH_NOW) pushes without waiting for the bed,
and I took the parts off (AUTO_EJECT_CLEAR) stops the eject; the queue waits for Bed is
clear, continue the queue, so the next print never starts on a hand in the printer.
Both are on the Overview and on the printer's farm card. Then the eject goes on as always and
starts the queue again.AUTO_EJECT_GUARDholds a print started by hand meanwhile.
Changed
- CI also lints the Python (ruff) and the web page (eslint);
CONTRIBUTING.mdsays how to run
them.
v0.16.0 - The farm for one printer or a hundred, updated from one place, and a clearer page
Upgrading: update from Mainsail or Fluidd (or git pull), then restart Klipper (FIRMWARE_RESTART, never while printing): one macro changed, so an eject stopped by an error no longer shows as running. If you installed the notifications or the farm, Moonraker restarts the klipper-auto-eject service by itself after the update. A page left open says that a newer one is ready, with Reload. If you installed the page as an app, close and open it once or twice so it takes the new files; to get the shortcuts on its icon, install it again. Nothing changes in the slicer, and your settings are kept.
بالعربية: صفحة المزرعة تصلح الآن لطابعة واحدة أو لمئة: تصفية وبحث وقائمة بسطر لكل طابعة ومجموعات حسب الرف أو الغرفة، ولم تعد الطابعات المطفأة تبطئ البقية. وتحديث المزرعة كلها من تبويب التحديثات، للطابعات التي لا تفعل شيئًا فقط وبترتيب آمن. وتبويب جديد للتحديثات يشرح ما تغيّر في Klipper وهل تحتاج اللوحات إعادة برمجة، وزر الإبلاغ عن مشكلة، والإشعارات على Telegram أو Discord. والصفحة أوضح وأسهل على الهاتف: ألوان تستوفي معيار التباين، وشريط بأربعة أقسام والمزيد، وأزرار بحجم الإصبع. والتطبيق أكمل: اختصارات على الأيقونة، وعدد الطابعات التي تحتاجك عليها، وإبقاء الشاشة مضاءة. وإصلاح: الإخراج الذي يتوقف بخطأ لم يعد يظهر وكأنه ما زال يعمل.
Tested: 526 tests. Every tab of the page checked in both languages and both themes, on a computer and a phone, for contrast, target sizes, names and headings; the farm with 100 pretend printers, ten of them switched off; updating the whole farm in a safe order against a pretend Moonraker; an eject stopped by a probe error in the macro simulator; where install.sh puts the [include] lines, run with bash on pretend printer.cfg files.
Added
- A more complete app (web-page.md): an install
button at the top of the page when the browser offers it; pictures of the app in the install
dialog; shortcuts on the icon (farm, print queue, check a file); the number of printers that
need you on the icon; splash screens on iPhone and iPad; a monochrome notification icon for
Android; a notice with Reload when the printer has a newer page than the one open; and
Keep the screen on for a tablet by the printers. A shortcut or a notification opens the app
already open, which also starts faster. - The farm, for one printer or a hundred (farm.md): filters with
counts (needs you, printing, free, switched off, not answering), a search by name, address,
group or file, a list with one line for each printer (by itself above 12 printers, or by
choice), and groups (Shelf A, Room 2) set in each printer's ✎. - Update the whole farm from the Updates tab: every printer's version of auto-eject,
Klipper, Moonraker and its web page, and its boards against its Klipper. Update one printer
or Update the free ones: only printers that do nothing, checked again before each software,
everything in a safe order with auto-eject last, and Klipper restarted once at the end when
configs or macros changed. Boards are not flashed from here. - Notifications on Telegram or Discord:
install.sh --notifyasks where they should go (the
ntfy app, Telegram or Discord), and the plain install asks too. For Telegram it checks the bot's
token with Telegram and finds your chat by itself from a message you send the bot; for Discord it
takes the channel's webhook link. Moonraker sends them through Apprise, so no bot program is
installed. The page shows only which service, never the token. - An Updates tab: what changed in Klipper and the rest since your versions, from Moonraker's
update manager. Each update in Klipper's words, with what it is about (motion, heaters, board
firmware…); whether the updates change the code on the boards, so they need a reflash after
updating; and Klipper's notes on config changes. Each board's firmware against Klipper, and
whether it needs a reflash, also under each board on Hardware. What an update changes is
read from GitHub in the browser and kept there; without internet the list still shows. - Report a problem on Hardware and Activity: one text with what a GitHub issue asks
for (the versions, the printer, its state, the settings you changed, the console), without IP
addresses or host names, to copy or save, with a link to klippy.log and to a new issue. - In your slicer finds DEMON Klipper Essentials by itself: it says to keep DEMON's start lines
as they are withAUTO_EJECT_GUARDabove them, whyHOME=1stays afterDEMON_END, warns when
home_methodis"g28", and says when DEMON's auto power-off is on and how the eject holds it.
Changed
- The web page's look comes from design tokens, in three layers: the raw palette and scales,
what each value is for (per theme), and each control's measures. Text sizes are on one scale
(from 20 sizes to 7, none under 12 px), corners on one (from 15 to 8), and no rule writes a
colour of its own. A printer's state has one colour everywhere. With the system's reduce
motion setting, nothing on the page pulses, spins or slides. - The web page is easier to read and to use, after a check of every tab in both languages
and themes, on a computer and a phone:- Text passes WCAG AA contrast (4.5:1) in both themes. The light theme's orange is deeper, so
white on the orange buttons and orange links can be read; grey text is a little darker; on a
dark page, the red and green badges and messages take dark text. - On a phone, the bar at the bottom holds four sections and More for the rest, instead of
ten that scrolled off the screen; every button, box and switch is at least 44 px. - The search boxes are named for screen readers, headings no longer skip a level, and a
Skip to the content button comes first for the keyboard. - A farm printer that is offline is no longer faded, which made its text hard to read.
- Text passes WCAG AA contrast (4.5:1) in both themes. The light theme's orange is deeper, so
install.shputs the[include]lines next to the printer's own[include]lines at the top of
printer.cfg, where people look for them, instead of at the bottom aboveSAVE_CONFIG(still
the place when there are none at the top), and says on which line.- The farm asks all printers at once (up to 32 at a time), and a printer that does not answer is
asked again after 10 seconds, then less often, up to once a minute: 100 printers take about as
long as one, and printers switched off no longer slow the others.
Fixed
- An eject stopped by an error (a probe that timed out, say) left its "ejecting" flag set: the
page and the farm showed the printer clearing its bed until someone cleared it by hand, the
page's buttons stayed off, and the parts-left dialog and notification never came. Now the
printer says the eject stopped, keeps the parts for the next print's check, and asks. - The Updates section had no short name on a phone and showed
navs.updatesin the bar. - A farm printer showed as offline when only its print history, camera or power switch could not
be read; now only a printer that does not answer at all is offline.
v0.15.0 - Spoolman: the queue stops before a spool runs out; DEMON's auto power-off
Upgrading: update from Mainsail or Fluidd (or git pull), then restart Klipper (FIRMWARE_RESTART, never while printing): the macros changed, for the DEMON fix and the two new settings. If you installed the notifications or the farm, Moonraker restarts the klipper-auto-eject service by itself after the update, and it starts checking the spool. To link a printer to Spoolman, run ~/klipper-auto-eject/install.sh --spoolman on it (docs/spoolman.md). Nothing changes in the slicer, and your settings are kept.
بالعربية: مع Spoolman تتوقف قائمة الطباعة قبل مهمة لا تكفيها البكرة المركّبة، مع بطاقة البكرة في قائمة الطباعة وإشعار على الهاتف، وinstall.sh --spoolman يربط Moonraker بـ Spoolman. وإطفاء DEMON التلقائي لم يعد يقطع الكهرباء في منتصف الدفع. وصفحة جديدة لإزالة المشروع.
Tested: 476 tests. The page and the service give the same plan for the same spool and queue (compared in the tests); the DEMON hold in the macro simulator, with a part left on the bed and a queue that goes on; install.sh --spoolman run in a scratch folder, and its config tool on its own.
Added
- DEMON in integration.md: the start G-code, the
auto power-off, the shared variables file, the purge and the heat soak before each job. DEMON's
logo joins the "works with" row. - Spoolman (docs/spoolman.md): with Moonraker's
[spoolman], the queue is
checked against what is left on the spool on the printer. The print queue gets a Spool card
(the spool, the grams left, whether the queue fits, Change the spool) and the grams each job
needs; the job the spool cannot finish is marked, and Start the queue asks first. The
service stops the queue before that job and sends a notification, also with the page closed,
and warns when the print running may run out. New settingsspool_low_action("stop",
"notify","off") andspool_reserve(grams kept back, 10). Without Spoolman nothing
changes. Spoolman's logo joins the "works with" row. install.sh --spoolman, and a question in the plain install: it asks for Spoolman's address
(as typed in a browser), checks that Spoolman answers there, adds[spoolman]to
moonraker.confand restarts Moonraker when the printer is idle. Removing auto-eject leaves
[spoolman], which Mainsail and Fluidd use too.- Removing it, a page in English and Arabic (docs/uninstall.md): what to
take out of the slicer first, the one line, what it removes, the restart, and what it leaves.
Linked from the READMEs, the FAQ, the installation page and the website.
Fixed
- DEMON's auto power-off no longer cuts an eject short. With
PRINTER_AUTO_OFFon,
DEMON_ENDswitches the printer off 5 s later, and Klipper runs that timer even while
AUTO_EJECTpushes.AUTO_EJECTnow holds it while it clears the bed, then lets DEMON switch
off two minutes after, unless the queue has started the next print. Found by itself; nothing
changes without DEMON.
v0.14.0 - Hardware tab, hardware notifications, print pictures, printing from the farm
Upgrading: update from Mainsail or Fluidd (or git pull), then restart Klipper (FIRMWARE_RESTART, never while printing): the macros changed, for the HOME=1 fix below. If you installed the notifications or the farm, Moonraker restarts the klipper-auto-eject service by itself after the update; run install.sh --farm (or --push) once more so nginx accepts large files for Send it from the farm. Nothing changes in the slicer, and your settings are kept.
بالعربية: تبويب العتاد مع تحذيراته على الموبايل، وصور المطبوعات في القوائم والمزرعة، والطباعة من المزرعة من أي مكان، وتذكير الصيانة والتقرير اليومي، وتصميم أنظف لصفحتي الإعدادات والعتاد، وإصلاح توقف الطابعة بخطأ "Timer too close" مع HOME=1. الشرح في docs/ar.
Tested: the HOME=1 fix in the macro simulator, with a new test that fails without it; the new search for the spot to home Z at picked the same spot as the old one on 300 random beds, and on a BTT CB2 it takes 27 ms instead of 124 ms for 2 parts and 99 ms instead of 1457 ms for 30. On a real Voron Trident 450 the eject then homed Z at the new spot and finished. The Hardware tab ran against that Voron (CB2, a Kraken and a CAN toolhead) and against the demo; the hardware warnings were checked against its live data with no false alarm. The farm's cameras were checked on the Voron. All the tests pass, with Jinja2 2.11 and 3.1.
Added
- A cleaner Settings page: the sections at the side with how many you have set in each,
Only my changes, every control in one column, and only your own values marked. - Hardware opens with a tile for each part (boards, motors, each heater, the computer, the
camera) that says how it is and takes you to it; board and computer figures in small boxes; the
explanations folded under About these figures. - The farm's cameras show a new picture as soon as the last has arrived (at most one a second)
instead of every 4 s, and a tap opens one large and live. - The print queue's Add files picks a file by its picture, with a search, as on Check a
file. While the bed cools, Overview says the time it pushes at the latest (cool_timeout). - A setting changed while the bed is being cleared now says it waits for the end of the eject:
Klipper takes no command until then. Before, nothing showed, and each click sent it again. - A Hardware tab in the web page: everything Klipper and Moonraker tell about the machine, live,
with a line at the top that says whether all is normal. Boards: each MCU's chip, link (USB,
CAN, serial), load, round trip, resent and corrupt bytes, firmware and temperature, and the CAN
bus state. Heaters: temperature, target, power and the last ten minutes, with a warning when
one cannot hold its target at full power. Fans: speed and turns per minute, with a warning when
one with a speed sensor stops. Computer: processor use and temperature, memory, storage,
network errors, low voltage on a Raspberry Pi. Sensors, the camera, and the prints that
stopped with an error. The extruder shows its flow (mm³/s) and the highest so far, as it
turns too slowly for StallGuard. With the page closed, the notification service watches the serious
ones (a fan with a speed sensor that stopped, driver warnings, a hot motor, a board link resending
data, an unhealthy CAN bus, a heater that cannot hold its target, the computer too hot or short of
voltage, memory or storage) and sends each once to the phones, opening the Hardware tab; each
phone can turn them off. Every motor with a TMC driver (X, Y, every Z motor and every
extruder), live once a second: moving, holding or off; its current; its StallGuard reading with
the last ten minutes as a line (TMC2130, 2240, 2660 and 5160 report it); its driver's warnings
(overheating, shorts, a dropped supply, an open coil); and the motor's own temperature from a
thermistor named after it (temperature_sensor motor_x,motor_aon CoreXY…). A line at the top
says whether all motors are normal, from the warnings and temperatures only: StallGuard also drops
at low speed, so it raises no alarm. Read only; shown only when Klipper has TMC drivers. - Pictures of the prints: the files in Check a file, the print queue, the farm cards and
the farm's Print dialog show the picture the slicer put in the G-code (OrcaSlicer,
PrusaSlicer, SuperSlicer, Cura with Create Thumbnail), with the print time, filament, height
and material. Check a file opens with a large picture and everything the file says about the
print; Overview shows the picture of the print on the bed. A black part on the dark page, or
a white one on the light page, gets a backdrop that shows it. Lists read each file only when it
comes into view. Other farm printers' pictures come through the farm printer, which keeps them
in memory. - Maintenance reminders in the farm: every 100 to 1000 hours of printing, per printer, from
Moonraker's print history. The card counts them (Maintenance: 450 / 1000 h), a notification
comes once when it is due, and Maintenance done starts again from zero. - A daily report of the farm to the phones, at a time you choose: today's prints that ended
well and stopped, the printers printing and needing you, the hours printed, and the maintenance
due. Tapping it opens the farm. - Print from the farm, from anywhere: a free printer's card has Print: pick one of its
G-code files, or send it one from the phone or computer (Send it, Send it and print,
with progress). Printing cards have Pause, Resume and Cancel the print. All of it goes
through the farm printer, so it works away from the printers' network without Tailscale on the
other printers. The farm refuses to start a print on a busy printer or on one with parts on its
bed. Uploads are kept on the card, not in memory, while they go on (install.sh --farmor
--pushupdates the nginx file for large files).
Fixed
AUTO_EJECT HOME=1could stop the printer with "Timer too close". After a nozzle probe waits
for the nozzle to cool, the part fan was switched off and the spot to home Z at was worked out
before that fan command went out; on a slower printer computer that took up to 1.5 s (Klipper
allows 0.25). The fan command is now sent first, and the search is 5 to 20 times faster: under
0.1 s for 30 parts on a BTT CB2.- In the farm, Open did not work from a phone away from the printers' network: it opened the
printer's local address. When the page is opened through Tailscale, it now opens the printer's
Tailscale address, found by its network card, if that printer has Tailscale; without it, Open
says Open (on its network) instead of a link that does not open.
v0.13.0 - parts box counter, power switches, slicer card, farm statistics
Upgrading: update from Mainsail or Fluidd (or git pull), then restart Klipper (FIRMWARE_RESTART, never while printing): the macros changed, for the parts box. If you installed the notifications or the farm, Moonraker restarts the klipper-auto-eject service by itself after the update. Nothing changes in the slicer, and your settings are kept. To use the parts box, set how many parts your box holds: in the web page, Settings, Parts box, bin_capacity.
بالعربية: عدّاد صندوق القطع، والتحكم في الكهرباء من المزرعة، وبطاقة السلايسر مع زر النسخ، وإحصائيات كل طابعة. الشرح في docs/ar.
Tested: the parts box in the macro simulator (counting, the warnings, the guard holding the next print, the count after a restart) and in the demo; the slicer card and the print statistics in the demo and against a real Voron Trident 450 (its own history and end macro). The power switches were tested with simulated Moonraker devices and in the demo only: none of the test printers has a [power] device yet. Reports from printers with smart plugs are very welcome.
Added
- The parts box (
bin_capacity,bin_full_action,AUTO_EJECT_BIN_EMPTY): auto-eject counts
the parts it pushes into the box under the drop edge, keeps the count across restarts, and says
when the box is almost full (80 %) and full, with a notification. With"stop"(the default)
AUTO_EJECT_GUARDholds the next print until the box is emptied. The web page shows the count
(Box: 26 / 30) with I emptied the box, and the farm shows it on every printer. - Power switches in the farm: printers with a Moonraker
[power]device get Turn on and
Turn off (never while printing or with the nozzle above 50 °C, whose fan would stop), show
Switched off when off, and can switch off by themselves after 15 minutes to 4 hours with
nothing to do; a notification says so. - In your slicer, a card in the web page's Blade and setup tab: where each setting is in
OrcaSlicer, PrusaSlicer/SuperSlicer or Cura, and the start and end G-code to paste with a
Copy button. The end G-code names the end macro the printer really uses: the one its newest
file runs, or else the one in its config (PRINT_END,END_PRINT,DEMON_END…); the slicer of
the newest file is picked by itself. Check a file opens it with Show me what to paste in
the slicer when a file is not labelled or does not runAUTO_EJECTlast. - The printer farm shows what each printer has done, from Moonraker's print history: hours
printed, how many of the last 50 prints ended well, and today's prints; the top line adds up the
whole farm.
v0.12.0 - printer farm, phone app, one-line install, Arabic docs
Upgrading: update from Mainsail or Fluidd (or git pull) and restart Klipper (FIRMWARE_RESTART, never while printing) to load the new macros. The slicer's end G-code stays the same, and your settings are kept. AUTO_EJECT_GUARD now checks the bed itself by default (guard_action: "check", see below). Then run ~/klipper-auto-eject/install.sh once over SSH: it asks which of the new parts you want (the web page, your phone from anywhere, notifications, a printer farm) and sets them up.
New here? One line on the printer installs it and asks a few questions:
cd ~ && git clone https://github.com/ahmedbebars/klipper-auto-eject.git && ./klipper-auto-eject/install.shبالعربية: الشروحات الأساسية متاحة الآن بالعربية في docs/ar.
Tested on a Voron Trident 450 with Voron Tap: the printer farm on a real network of five Klipper printers (the search found the other four in about 7 seconds, one of them over both the network and Tailscale, listed once), remote access over Tailscale with HTTPS, the web page installed as an app, and ntfy notifications. The installer was tested in a scratch config folder, with and without the blade.
Changed
- The installer asks what you want. Run with no options from a terminal,
install.shasks a
few yes/no questions in plain words (the blade, the web page, your phone, notifications, more
than one printer) and sets up what you said yes to; the options still work as before. It adds
the Klipper sections auto-eject needs ([exclude_object],[respond],[save_variables]) when
your config lacks them, asking Klipper itself which ones it has, and offers to restart Klipper at
the end, only when it is not printing. Install is one line:
cd ~ && git clone https://github.com/ahmedbebars/klipper-auto-eject.git && ./klipper-auto-eject/install.sh. - On phones, the language list at the top of the web page is a globe button, so the title fits.
Added
-
Documentation in Arabic (
docs/ar/): the home page, getting started, installation, the web
page, remote access, notifications, the printer farm, the FAQ and safety. On the website they
read right to left, with commands left to right. -
New pictures: the page clearing a bed, the app on a phone (clearing the bed, the farm in Arabic,
the blade), the printer farm, its network search and Check a file; and a "works with" row
with the logos of Klipper, Mainsail, Fluidd, OrcaSlicer and PrusaSlicer
(docs/images/logos/README.mdsays where each comes from). -
The farm's network search lists a printer found both on the local network and over Tailscale
once (it compares their network cards), asks only Linux devices on Tailscale, and remembers the
printers you left out: they come last and unticked the next time. -
A printer farm (
install.sh --farm,docs/farm.md): every Klipper printer of the network on
one page, the Printer farm tab, with the ones that need you first: a print to take off, a part
that stayed on the bed, an error, a paused queue. Installed on one printer only: Search the
network finds the others (its own network and Tailscale) and adds them; they need nothing
installed, and printers without auto-eject show their prints too. Buttons per printer: Bed is
clear, Start the queue, Emergency stop (both ask first), Open its own page, rename
or remove; camera pictures come through the farm printer, so the whole farm works from a phone
with remote access on that printer alone. Phones with notifications on get them from every
printer, with its name. It runs in theklipper-auto-ejectservice (push/farm.py), which
nginx publishes at/auto-eject/api/(--farmand--pushadd that to a page installed before). -
AUTO_EJECT_GUARDchecks the bed itself (guard_action: "check", the new default). When
the printer remembers parts from an earlier print that was not ejected, the next print first
homes around them and probes where they were: nothing there, the print simply starts and nobody
has to click Bed is clear; a tall part, it is pushed off first; a thin part such as a
stencil, the print stops until it is taken off. Without a probe that can touch plastic, or with
no free spot to home Z, it stops like"error". -
Thin parts are found reliably: for parts thinner than twice
verify_threshold, the probe also
touches the bare bed on two sides of the part and compares with the lower reading, so a bed a
little out of flat or a purge line next to the part does not hide a 0.4 mm stencil. -
nozzle_part_max_temp(50 °C): a nozzle probe waits until the nozzle is this cool before it
touches where parts are or were, so it cannot dent or stick to a part, with the part fan on to
cool it faster. The wait before homing Z on the bare sheet uses the fan too. -
A dialog after a print that ended without an eject (no
AUTO_EJECTin the end G-code,
cancelled, or stopped): take the parts off and click Bed is clear. -
The web page is an app on phones (PWA). Over HTTPS it installs with its own icon (Android:
Install the app on the page, iPhone: Add to Home Screen) and opens without the browser's
bars; a service worker keeps a copy of its own files, so it opens and shows that the printer is
unreachable without a connection. On phones the sections move to a tab bar at the bottom, and the
page keeps clear of notches and the home indicator. -
Notifications in the app, even while it is closed (Web Push):
install.sh --pushinstalls
theklipper-auto-ejectservice (push/auto_eject_push.py), which watches the printer through
Moonraker and sends each notification, encrypted for that device (RFC 8291, VAPID), to the push
service of every phone or computer that turned them on in the app. Devices subscribe through
Moonraker's database, so the service needs no port; Moonraker restarts it after updates. Each
device chooses whether it also wants every finished print. Android, iPhone (iOS 16.4+, from the
Home Screen) and desktop browsers. -
Notifications on your phone:
install.sh --notifysets up ntfy through Moonraker's
[notifier](a random topic, kept when run again, and an optional notification for every finished
print); the newnotifysetting sends auto-eject's own messages: a part still on the bed, parts
too thin to push, a print that ended without an eject, a print the guard did not start. Tapping a
notification opens the auto-eject page. The installed app also notifies by itself while it is open
or in the background. New guide:docs/notifications.md. -
Remote access for everyone:
install.sh --remotesets up Tailscale so Mainsail and the
auto-eject page open from a phone anywhere, without opening the printer to the internet. It asks
before every step: installs Tailscale if needed, connects the printer, adds the Tailscale range to
Moonraker'strusted_clients(with a backup, restarting Moonraker only when idle) and serves the
printer over HTTPS withtailscale serve.--uninstalltakes the range out again. New guide:
docs/remote-access.md; the web page's Blade and setup tab shows how you are connected and
what is missing.
Fixed
- The farm API read the request only after deciding the answer; on some systems that reset the
connection. http://<printer>/auto-eject/redirected to the page with an absolutehttp://address, so
behind an HTTPS proxy such astailscale servethe page lost HTTPS. The redirect is relative now;
runinstall.sh --webagain to update the nginx file.
v0.11.0 - web page, eject after the end macro
Upgrading: move AUTO_EJECT below your end macro. The slicer end G-code is now:
PRINT_END
AUTO_EJECT HEIGHT=[max_layer_z] HOME=1Use your end macro's name (DEMON_END, END_PRINT, …). Details in docs/integration.md. Update from Mainsail or Fluidd (or git pull), restart Klipper, and run ~/klipper-auto-eject/install.sh --web once if you want the new web page.
Tested end to end on a Voron Trident 450 with Voron Tap and DEMON Klipper Essentials: print, end macro, eject of five parts, check with the probe, job completed.
Changed
AUTO_EJECTnow goes after your end macro, asAUTO_EJECT HEIGHT=[max_layer_z] HOME=1.
End macros retract the filament (G1 E-2), and onceAUTO_EJECThad let the nozzle cool,
Klipper refused that retract ("Extrude below minimum temp"): the print ended with an error and
the job queue stopped. After the end macro,HOME=1homes again around the parts if the motors
were turned off. Your ownPRINT_ENDcan instead call it after its retract. See
docs/integration.md; the DEMON_CUSTOM_PRE_ENDhook method is gone for the same reason.
Added
- Probes that touch the bed with the nozzle (Voron Tap, eddy touch modes) wait for the nozzle to
cool tonozzle_probe_max_temp(150 °C) before homing Z or checking the bed, so a nozzle the end
macro has only just turned off does not mark the print sheet. - The web page's Check a file warns when a file runs
AUTO_EJECTbefore another macro. - A web page for the printer's web interface, with its own entry in the Mainsail sidebar
(install.sh --web, seedocs/web-page.md). It shows the printer's state and a live map of
the bed with the parts, the push lanes and the toolhead; ejects, dry-runs or forgets the parts
(asking first); manages Moonraker's job queue; checks a G-code file before it is printed (labels,
AUTO_EJECTin the end G-code, height, whether the blade can get behind every part); shows the
blade setup and opens the setup dialogs in the page; and edits every setting. English and
Arabic, light and dark, works on a phone, loads nothing from the internet.?demoruns it
against a pretend printer. AUTO_EJECT_SET KEY=<setting> VALUE=<value>changes one setting, checks the value against the
setting's type and keeps it after a restart.RESET=1goes back to the settings file.
Fixed
- Klipper could stop with "MCU shutdown: Timer too close" at the start of an eject when the bed
was already cool. The 240 cooling passes, all with nothing left to do, ran back to back while
the toolhead was still rising, and the move reached the board too late. Now no cooling pass runs
when the bed is already cool, the passes left after cooling return at once, and every move
finishes (M400) before the macros that take Klipper a moment to work out: the push plan, the
check with the probe and homing Z around the parts. The tests check that none of these starts
while a move is pending. AUTO_EJECT HOME=1could find Z past the edge of the print sheet: on a Voron 450 with the middle
of the bed full, it probed the bare plate at the front, among its holes, and every height after
that was 0.6 mm off. With a[bed_mesh]the spot now stays inside the mesh area (mesh_min/
mesh_max, ormesh_radiuson a round bed), where the probe is known to work.auto_eject.cfgheld six copies of the last lines of its defaults. Klipper ignored them (the
values were the same), and a test now makes sure no option is given twice.
Documentation
- A project website built from
docs/with MkDocs Material (mkdocs.yml,website/): a home
page, search, light and dark, and the web page running as a live demo in the browser.
.github/workflows/website.ymlpublishes it on GitHub Pages. - Rewritten for beginners. A new step-by-step guide (
docs/getting-started.md) goes from checking
the bed to printing in a row, with a check after every step. New pages: FAQ, glossary, every
command with its options, and a documentation home (docs/README.md) grouped by what you want
to do. The README now leads with how it works, who it is for and the eight steps. - The blade measurement pages described a 20 mm cube; they now describe the 3.5 mm printed
calibration block, and the troubleshooting page lists every reason the measurement can stop. - Where
AUTO_EJECTgoes for every kind of end G-code (DEMON, Klippain, RatOS, stock Voron, plain
commands, Cura), and when you need to tell the printer the bed is clear (FAQ).
v0.10.5 - cooling never hangs
Fixed
- In a warm room the bed may never cool to
cool_temp, and the wait then lasted forever. Cooling now waits in short passes that give up aftercool_timeout(30 min) and push the parts anyway, with a warning. The defaultcool_tempis 32 °C instead of 28 °C. - "sweep finished" was printed when the macro started, before anything had moved. It now appears once the sweep is done.
v0.10.4 - warm-bed blade measurement
Fixed
- On build sheets that release cold parts (such as BIQU CryoGrip), a calibration block on a bed below 40 °C was not stuck well, and the edge search pushed it back. The block then ended up under the nozzle and the blade was reported as level with the nozzle tip. The measurement now runs on a warm bed (up to 55 °C) right after the block is printed, checks the block's front edge again at the end, and says plainly when the block moved.