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:
1 parent
2b1e36634a
commit
5081212212
23 files changed
+559
-65
No files matched your search
+30
-3
@@ -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}
|
||||
|
||||
Reference in new issue
Block a user