Use the vendor's empty spool weight as tare in Spoolman mode (#3195)

Spoolman resolves a spool's tare from the spool, then the filament, then
the vendor's empty_spool_weight. Bambuddy skipped the vendor and fell
back to 250 g, so weighing a spool whose tare was set only on its vendor
gave the wrong remaining weight. The inventory weigh action, the
SpoolBuddy scale and the displayed core weight now share one lookup, and
"keep old weight" on a filament change stamps a vendor-inherited tare.
This commit is contained in:
maziggy
2026-09-30 08:43:21 +02:00
parent d2a7a2d20f
commit c145b3ebc1
6 changed files with 215 additions and 20 deletions
+6 -7
View File
@@ -891,7 +891,7 @@ async def update_spool_weight(
update while the Spoolman row the user is actually looking at stayed
unchanged (#1530). Mirrors the routing already used by ``nfc/tag-scanned``.
"""
from backend.app.api.routes._spoolman_helpers import _safe_float
from backend.app.api.routes._spoolman_helpers import _safe_float, spoolman_tare
from backend.app.models.spool import Spool
sm_client = await _get_spoolman_client_or_none(db)
@@ -921,18 +921,17 @@ async def update_spool_weight(
sm_spool = await sm_client.get_spool(req.spool_id)
filament = sm_spool.get("filament") or {}
spool_tare = sm_spool.get("spool_weight")
raw_tare = spool_tare if spool_tare is not None else filament.get("spool_weight")
core_weight, tare_source = spoolman_tare(sm_spool)
spool_weight_warning: str | None = None
if raw_tare is None:
if tare_source == "fallback":
logger.warning(
"Spoolman spool %d has no spool_weight set; using 250g fallback for tare",
"Spoolman spool %d has no spool_weight or vendor empty_spool_weight set; using 250g fallback for tare",
req.spool_id,
)
spool_weight_warning = (
"spool_weight_not_set: Spoolman filament has no spool_weight configured; weight estimate uses 250g fallback"
"spool_weight_not_set: Spoolman spool, filament and vendor have no empty-spool weight configured; "
"weight estimate uses 250g fallback"
)
core_weight = _safe_float(raw_tare, 250.0)
label_weight = _safe_float(filament.get("weight"), 1000.0)
remaining_weight = max(0.0, req.weight_grams - core_weight)