Grotti 3.6.1: Abgebrochene Läufe bleiben im Protokoll, Spulenwechsel bucht den laufenden Druck nicht vorzeitig ab, und der Pi öffnet große Dateien nicht mehr parallel.

This commit is contained in:
Dominic Gundel committed 2026-11-01 18:56:14 +01:00
1 parent 2b1e36634a
commit 5081212212
23 files changed
+559 -65

No files matched your search

+30 -3
View File
@@ -128,7 +128,11 @@ def is_filament_resume(
def undo_deduction(conn, run):
"""Spulenabzug eines Laufs zurücknehmen. Abschnitte bleiben."""
"""Spulenabzug eines Laufs zurücknehmen.
Letzten Abschnitt wieder öffnen — nach Filamentpause schließt ein
vorzeitiger History-Abgleich den Abschnitt, bevor der Druck weiterläuft.
"""
if not run or not run.get("deducted"):
return False
rows = conn.execute(
@@ -147,6 +151,20 @@ def undo_deduction(conn, run):
"UPDATE runs SET deducted = false, filament_cost = 0 WHERE id = %s",
(run["id"],),
)
conn.execute(
"""
UPDATE run_segments
SET mm_end = NULL, closed_at = NULL
WHERE id = (
SELECT id FROM run_segments
WHERE run_id = %s
ORDER BY id DESC
LIMIT 1
)
AND mm_end IS NOT NULL
""",
(run["id"],),
)
return True
@@ -583,11 +601,15 @@ def apply_deduction(conn, run, energy, metadata=None):
final_mm = float(run.get("filament_used_mm") or 0)
total_mm = float(run.get("filament_total_mm") or 0)
deltas = usage.segment_deltas(segments, final_mm)
# Messwert (oder Soll) anteilig nach mm — nicht Soll gegen Soll-Gesamtlänge,
# sonst fehlen Gramm, wenn ein Abschnitt zu früh geschlossen wurde.
base_g = used if used > 0 else planned
split_mm = sum(d for _, _, d in deltas) or final_mm or total_mm
for spool_id, ace_slot, delta_mm in deltas:
spool = store.get_spool_row(conn, spool_id)
if not spool:
continue
grams = usage.grams_from_mm(delta_mm, total_mm, planned)
grams = usage.grams_from_mm(delta_mm, split_mm, base_g)
cost = (grams / 1000.0) * float(spool.get("price_per_kg") or 0)
entries.append({
"spool_id": spool_id,
@@ -798,6 +820,10 @@ def _sync_one_job(conn, cfg, printer, job, watcher_resume=False):
conn, printer["host"], ended_at=ended, message=filename or state
)
store.set_printer_active_run(conn, printer["host"], None)
# Resume nach Filamentpause: History kann den alten Teil schon als „fertig“
# melden. Abzug und Segment-Schluss erst beim echten Druckende.
if watcher_resume:
return 0
if apply_deduction(conn, row, cfg["energy"], metadata=metadata):
return 1
return 0
@@ -835,7 +861,8 @@ def sync_history(conn, cfg, host=None, watcher_resume=False):
deducted += _sync_one_job(
conn, cfg, printer, job, watcher_resume=watcher_resume
)
deducted += deduct_stale_live_runs(conn, cfg)
if not watcher_resume:
deducted += deduct_stale_live_runs(conn, cfg)
finally:
conn.execute("SELECT pg_advisory_unlock(%s)", (SYNC_LOCK_KEY,))
return {"gelesen": len(collected), "abgezogen": deducted}