Files
grotti/docs/internal/Ops-Queue-Alerts.md

4.5 KiB
Raw Permalink Blame History

Grotti Ops: Queue, Alerts, Steuerung

Stand 14.10.2026.

Einstellungen

Seite /einstellungen: Druckernamen/Host/Familie/gesperrt (PostgreSQL printers, drucker.json nur Seed), Automatik (auto_queue in config.json), Telegram, Energie. Live-API und Wand nutzen die DB-Namen. Gesperrte Drucker und auto_queue: false verhindern neue „wenn frei“-Starts; laufende Abläufe laufen weiter.

Live-Quelle

StateWatcher pollt die Drucker (ca. 10 s). GET /drucker?live=1 und der Print-Queue-Dispatcher lesen diesen Stand. Nur wenn der Cache älter als ~60 s / 30 s ist, wird einmal direkt abgefragt. Lange Ablauf-Schritte (Upload, Schieben, Tasten) laufen in Worker-Threads.

Druckwarteschlange „wenn frei“

Dateien → „Dieser Drucker“ (belegt) oder „Nächster passender“ → when_free in POST /api/v1/senden. Einträge in print_queue; Dispatcher startet, sobald der Host (oder ein freier Drucker) standby/complete/cancelled ist, Platte frei und nicht gesperrt. Material-Score: Katalog-Sorte aus filament_settings_id (streng), Farbe soft; bei ACE und leerer Map baut Grotti die Zuordnung aus Spulen. Alle freien Drucker im selben Tick (Upload/Start je Host im Worker parallel) — nicht einer alle ~8 s. Sidebar und Seite /warteschlange. Sofort-Senden bleibt über die Send-Queue (mehrere Worker). Hängender Fehler wird nur geräumt, wenn für den Host ein Auftrag wartet. Ablauf: Phase starting vor Upload; Timeout 10 min ohne print_active.

Spulen

Ort = Regal oder Drucker (+ ace_slot). Unique-Index (printer_host, ace_slot). Beim Start löst Grotti die Spule(n) aus Host + ace_map auf; Materialtyp der Datei muss passen. sends speichert ace_map und bed_leveling. Nach „fertig“ synct der Watcher das Protokoll und zieht Spulen ab (ACE anteilig).

Telegram / Ereignisse

Jedes Ereignis landet in events und auf der Seite /aktivitaet. Telegram ist pro Art abschaltbar und wird je Host und Art entprellt (Watcher 60 s, Queue 30 s). Das Speichern wird nie entprellt. Gemeinsamer Weg: notify.record().

Art Woher Alert Telegram-Standard
fertig Watcher, printing→complete nein, Platte unter „Aufgaben“ an
fehler Watcher, Zustand error ja an
abbruch Watcher, printing/paused→cancelled/standby ja wie fehler
offline Watcher, ≥2 Polls weg; auch „wieder erreichbar“. Beendet den Lauf nicht und zieht nichts ab — der letzte Druckzustand bleibt gemerkt ja an
spule Watcher, Rest unter Job-Gewicht ja an
queue Dispatcher: Queue-Fehler, Ablauf gestoppt ja an
start Watcher: Druck startet, Pause, Fortsetzen nein aus
ablauf Dispatcher: Start, Schritte, Wiederholung, fertig; App: eingereiht, von Hand abgebrochen nein aus

„Alert“ heißt: ungelesen, steht in der Sidebar. start, ablauf und fertig werden gleich als gelesen gespeichert (store.QUIET_EVENT_KINDS), damit unter Alerts nur Probleme stehen.

„Aufgaben“ (Sidebar, GET /api/v1/aufgaben): Drucker mit bed_status.needs_clear, ohne laufenden Queue-Eintrag und nicht am Drucken. Knopf „geräumt“ ruft POST /api/v1/drucker/<host>/abraeumen mit confirm: true (Zwei-Klick), fährt nichts.

API: GET /api/v1/ereignisse?limit=&host=&kind=a,b&since=<ISO>&unread=1, POST /api/v1/ereignisse/gelesen.

Bei print_stats.state=error ist message auf Anycubic oft leer. Grotti ergänzt dann nur aus dem G-code-Log (echte Must home-/Fehlerzeilen) oder „Druck sofort abgebrochen“. Leeres homed_axes allein gilt nicht als Fehler — Idle schaltet die Stepper ab, das ist normal.

Nach Fehler: Watcher schaltet Bett/Düse/Lüfter aus (nicht weiter heizen). Vor Start und zwischen Ablauf-Schritten: hängender print_stats=error wird per SDCARD_RESET_FILE geräumt und der Druck gestartet. Kein Homing-Zwang vorher — der Slice-Start macht G28. Nur mitten im Druck (print_active) bricht ein error den Ablauf ab.

Steuerung

Wand-Details: Düse/Bett, Speed/Flow/Fan, E-Stop und Exclude-Object über POST /api/v1/drucker/<host>/steuern (Whitelist, keine freie Konsole; exclude_object braucht confirm + name). Abbruch weiterhin Moonraker-cancel + MQTT-stop.

Kein Firmware-Restart: Auf GoKlipper/Rinkhals deadlocked FIRMWARE_RESTART gklib bis Power-Cycle (Rinkhals #32). Grotti lehnt den Befehl ab. printer.cfg nur über Display-Reboot oder Strom. Hängenden print_stats=error: Wand Fehler löschen (SDCARD_RESET_FILE + Heizung aus).