Skip to content

v0.12.0 - printer farm, phone app, one-line install, Arabic docs

Pre-release
Pre-release

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.