From 09e6bfd12114466d66ec4f8dc549c7558a8ebc9a Mon Sep 17 00:00:00 2001 From: maziggy Date: Mon, 23 Feb 2026 11:19:58 +0100 Subject: [PATCH] moved from scale_diag import NAU7802 and NAU7802() inside the try/except block in ScaleReader.__init__. Previously, NAU7802() opened /dev/i2c-0 in its constructor before the try/except, so the FileNotFoundError was unhandled and crashed the entire daemon via asyncio.gather(). MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Now when the scale hardware isn't available (no /dev/i2c-0), it logs "Scale init failed" and sets self._ok = False, so scale_poll_loop will skip polling with "Scale not available, skipping scale polling" — same graceful degradation the NFC reader already has. --- spoolbuddy/daemon/scale_reader.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/spoolbuddy/daemon/scale_reader.py b/spoolbuddy/daemon/scale_reader.py index 87d9368d5..c0420df8a 100644 --- a/spoolbuddy/daemon/scale_reader.py +++ b/spoolbuddy/daemon/scale_reader.py @@ -11,9 +11,7 @@ MOVING_AVG_SIZE = 5 class ScaleReader: def __init__(self, tare_offset: int = 0, calibration_factor: float = 1.0): - from scale_diag import NAU7802 - - self._scale = NAU7802() + self._scale = None self._tare_offset = tare_offset self._calibration_factor = calibration_factor self._samples: deque[float] = deque(maxlen=MOVING_AVG_SIZE) @@ -22,6 +20,9 @@ class ScaleReader: self._last_raw = 0 try: + from scale_diag import NAU7802 + + self._scale = NAU7802() self._scale.init() self._ok = True logger.info("Scale initialized (tare=%d, cal=%.6f)", tare_offset, calibration_factor) @@ -38,7 +39,8 @@ class ScaleReader: def close(self): try: - self._scale.close() + if self._scale: + self._scale.close() except Exception: pass