Skip to content

Releases: ahmedbebars/klipper-auto-eject

v0.18.0 - Tall prints stay on the bed, and an easier installer

Choose a tag to compare

@ahmedbebars ahmedbebars released this 23 Oct 07:10

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, as DEMON_END does), AUTO_EJECT HOME=1 has 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_SETUP asks 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, and AUTO_EJECT_GUARD stops 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.sh finds 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 in CONTRIBUTING.md.

Changed

  • The button that stops background cooling says what it does: Stop, I'll take them off.
  • push/farm.py and web/app.js are 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

Choose a tag to compare

@ahmedbebars ahmedbebars released this 23 Oct 04:14

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_GUARD goes in DEMON's _CUSTOM_PRE_START hook,
    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") when DEMON_START has 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 --demon on a printer that has
    auto-eject already): AUTO_EJECT_GUARD FROM=DEMON in _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 a farm/ 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_GUARD holds a print started by hand meanwhile.

Changed

  • CI also lints the Python (ruff) and the web page (eslint); CONTRIBUTING.md says how to run
    them.

v0.16.0 - The farm for one printer or a hundred, updated from one place, and a clearer page

Choose a tag to compare

@ahmedbebars ahmedbebars released this 22 Oct 14:32

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 --notify asks 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 with AUTO_EJECT_GUARD above them, why HOME=1 stays after DEMON_END, warns when
    home_method is "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.
  • install.sh puts 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 above SAVE_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.updates in 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

Choose a tag to compare

@ahmedbebars ahmedbebars released this 22 Oct 04:18

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 settings spool_low_action ("stop",
    "notify", "off") and spool_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.conf and 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_OFF on,
    DEMON_END switches the printer off 5 s later, and Klipper runs that timer even while
    AUTO_EJECT pushes. AUTO_EJECT now 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

Choose a tag to compare

@ahmedbebars ahmedbebars released this 21 Oct 15:55

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_a on 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 --farm or
    --push updates the nginx file for large files).

Fixed

  • AUTO_EJECT HOME=1 could 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

Choose a tag to compare

@ahmedbebars ahmedbebars released this 20 Oct 14:01

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_GUARD holds 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 run AUTO_EJECT last.
  • 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

Choose a tag to compare

@ahmedbebars ahmedbebars released this 20 Oct 11:11

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.sh asks 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.md says 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 the klipper-auto-eject service (push/farm.py), which
    nginx publishes at /auto-eject/api/ (--farm and --push add that to a page installed before).

  • AUTO_EJECT_GUARD checks 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_EJECT in 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 --push installs
    the klipper-auto-eject service (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 --notify sets up ntfy through Moonraker's
    [notifier] (a random topic, kept when run again, and an optional notification for every finished
    print); the new notify setting 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 --remote sets 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's trusted_clients (with a backup, restarting Moonraker only when idle) and serves the
    printer over HTTPS with tailscale serve. --uninstall takes 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 absolute http:// address, so
    behind an HTTPS proxy such as tailscale serve the page lost HTTPS. The redirect is relative now;
    run install.sh --web again to update the nginx file.

v0.11.0 - web page, eject after the end macro

Choose a tag to compare

@ahmedbebars ahmedbebars released this 20 Oct 05:05

Upgrading: move AUTO_EJECT below your end macro. The slicer end G-code is now:

PRINT_END
AUTO_EJECT HEIGHT=[max_layer_z] HOME=1

Use 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_EJECT now goes after your end macro, as AUTO_EJECT HEIGHT=[max_layer_z] HOME=1.
    End macros retract the filament (G1 E-2), and once AUTO_EJECT had 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=1 homes again around the parts if the motors
    were turned off. Your own PRINT_END can instead call it after its retract. See
    docs/integration.md; the DEMON _CUSTOM_PRE_END hook 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 to nozzle_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_EJECT before another macro.
  • A web page for the printer's web interface, with its own entry in the Mainsail sidebar
    (install.sh --web, see docs/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_EJECT in 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. ?demo runs 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=1 goes 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=1 could 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, or mesh_radius on a round bed), where the probe is known to work.
  • auto_eject.cfg held 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.yml publishes 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_EJECT goes 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

Pre-release

Choose a tag to compare

@ahmedbebars ahmedbebars released this 19 Oct 18:19

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 after cool_timeout (30 min) and push the parts anyway, with a warning. The default cool_temp is 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

Pre-release

Choose a tag to compare

@ahmedbebars ahmedbebars released this 19 Oct 17:57

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.