mirror of
https://github.com/maziggy/bambuddy.git
synced 2026-10-01 03:31:25 +02:00
67f91d94de1d94ac9a4c3d1411a3aca4e7bf9e9c
1847
Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
b16b12bf8d | Fixed install/start_bambuddy.bat | ||
|
|
940810cba3 |
Show filament subtypes in all mapping dropdowns (#624)
All filament mapping dropdowns (single-printer, multi-printer, and "Print to Any" model-based) showed only the base material type (e.g. "PLA") without distinguishing subtypes like "PLA Basic" vs "PLA Matte", making entries with different subtypes but same color look identical. Backend: Add tray_sub_brands to available-filaments response and include it in the dedup key so different subtypes of the same color appear as separate entries. Frontend: Show tray_sub_brands in FilamentMapping, FilamentOverride, and PrinterSelector dropdowns, falling back to base type when unset. Add traySubBrands field to LoadedFilament interface. |
||
|
|
5f8f5aae30 |
Merge pull request #627 from aneopsy/fix-i8n
Sync i18n locales: add 655 translated keys, remove 127 stale keys |
||
|
|
ae7c6b4dd2 |
Add missing i18n keys and remove stale keys across 5 locales
Sync all locale files to match EN's 3,054-key structure: - it: add 485 missing keys, remove 1 stale key - pt-BR: add 51 missing keys, remove 10 stale keys - fr: add 47 missing keys - ja: add 47 missing keys, remove 116 stale keys - zh-CN: add 25 missing keys, remove 1 stale key All 655 new keys are properly translated. Stale keys from past refactors are cleaned up (127 total removed). |
||
|
|
f77cbbd7d8 | Added scripts/import_spoolman.py | ||
|
|
1bc3da3fad |
Fix multi-printer filament mapping ignoring nozzle on dual-nozzle printers (#624)
The per-printer InlineMappingEditor showed filaments from both nozzles
on H2D printers. The single-printer FilamentMapping dropdown was fixed
in
|
||
|
|
becc4669b1 |
Fix greenlet_spawn error in spool auto-assign
Two lazy-load bugs caused greenlet_spawn errors in the RFID auto-assign
flow:
1. create_spool_from_tray set spool.k_profiles=[] AFTER db.flush(),
but assigning to a relationship on a persistent object triggers a
lazy load (SQLAlchemy loads the current collection before replacing).
Moved initialization to BEFORE db.add().
2. spool.assignments was never initialized or eagerly loaded, so
db.add(SpoolAssignment) triggered a back_populates lazy load
outside the async greenlet. Added assignments=[] in create and
selectinload(Spool.assignments) in get_spool_by_tag.
Also added exc_info=True to error handlers for full tracebacks, and
19 new tests including greenlet regression tests that reproduce the
exact failure.
|
||
|
|
4981c60389 |
Add --branch support to install script with validation
The install script hardcoded origin/main, so beta testers told to install from a dev branch silently got the stable release instead. Add a --branch CLI option and interactive prompt (defaults to main). Invalid branch names are validated via git ls-remote before any work is done, showing available branches on failure. |
||
|
|
3a0b3f8035 |
Add --branch support to install script
The install script hardcoded origin/main, so beta testers told to install from a dev branch silently got the stable release instead. Add a --branch CLI option and interactive prompt (defaults to main). Fresh installs use git clone --branch, existing installs checkout and reset to the selected branch. |
||
|
|
0faf03ecb3 |
Fix Python 3.10 compatibility (StrEnum requires 3.11)
enum.StrEnum was added in Python 3.11, but the documented minimum is 3.10. Add a compatibility shim in backend/app/core/compat.py that falls back to (str, Enum) on older versions. Updated all 5 import sites and lowered pyproject.toml target-version to py310. |
||
|
|
aa39f6c866 |
Fix Bind-TLS proxy handshake failure on OpenSSL 3.x
Bambu printers only support plain RSA key exchange ciphers (AES256-GCM-SHA384, AES128-GCM-SHA256), but Python's OpenSSL 3.x defaults exclude them in favor of forward-secrecy (ECDHE/DHE) only. Add the RSA ciphers to the client SSL context so the TLS proxy can connect to the printer's bind port (3002). |
||
|
|
150eaffe1c |
Fix bug report bubble overlapping toast notifications
Move the toast container from bottom-4 to bottom-20 so toast notifications and upload progress stack above the bug report bubble instead of rendering on top of each other. |
||
|
|
0bff20662c |
Add scheduler diagnostic logging for queue stall debugging (#616)
When the print queue scheduler finds pending items but doesn't start any, there was no logging to explain why. Added INFO-level summary after each queue check showing skip reasons (manual_start, scheduled_future) and busy printer details (state, connected, plate_cleared). Also added DEBUG-level logging in _is_printer_idle() for the specific condition that failed. |
||
|
|
ed462c5cca |
Add tests, docs, and lint fix for AMS Info Card feature (#570)
- Add 12 backend integration tests for AMS labels API (GET/PUT/DELETE,
serial resolution, synthetic key fallback, whitespace handling, validation)
- Add 10 frontend tests for FilamentSlotCircle component (rendering,
border styles, background colors, text contrast inversion)
- Fix ruff W293 trailing whitespace in inventory.py from contributor fix
- Add ams_label model import to test conftest.py
- Update CHANGELOG, README, website features page, and wiki AMS docs
|
||
|
|
7ba67012f6 |
Feature AMS Info Card (#570)
* AMS Labels addition to PrintersPage * Added database reinitialization for schema migrations on database restore * Bug fixes and AMS Label persistence updates * Update database.py to resolve PR conflicts * PR Comment Resolution * Resolve conflicts in database.py for PR#570 * Updates to address PR#570 additional comments * Optimize visibility handling for popup component * Improve serial key handling in printers.py Refactor serial key assignment to handle empty AMS serial gracefully. * Implement error handling in serial number mapping Add error handling for serial number mapping. * Add migration to drop old ams_labels table --------- Co-authored-by: MartinNYHC <mz@v8w.de> |
||
|
|
5ee2ef8dbf |
Fix Windows server shutdown after 60s from ffmpeg cleanup (#605)
On Windows, process.terminate() on ffmpeg broadcasts CTRL_C_EVENT to the entire process group, causing uvicorn to shut down. Spawn ffmpeg with CREATE_NEW_PROCESS_GROUP so cleanup doesn't affect the server. |
||
|
|
dba43530cb | Bumped version | ||
|
|
b3a91d7314 |
Revert "v0.2.2b1 (#602)" (#603)
This reverts commit
v0.2.2-b2
v0.2.2b3
|
||
|
|
3dd1ffb485 |
v0.2.2b1 (#602)
* feat(queue): show spool grams left in filament slot mapping
* Bumped version
* Add SpoolBuddy AMS slot config, external slots, and dashboard redesign
- AMS page: external spool slots (Ext/Ext-L/Ext-R), click-to-configure
modal on all slots, temperature/humidity threshold-colored indicators,
nozzle L/R badges for dual-nozzle printers, compact AMS-HT layout
- Dashboard: two-column layout with device status + printers list (left)
and current spool card (right), state-colored scale/NFC icons, dashed
border card styling
- Daemon: suppress redundant scale reports (±2g threshold + stability
state change detection) to prevent weight display bouncing
- TopBar: auto-select online printers only, SpoolBuddy logo
* Fix SpoolBuddy daemon crash when read_tag module is missing
NFCReader.__init__ imported read_tag and instantiated PN5180() outside
the try/except block, so a missing module crashed the entire daemon.
Moved the import inside the existing try/except so the daemon gracefully
skips NFC polling — matching the scale reader's existing behavior.
* Fix SpoolBuddy daemon failing to import hardware drivers
The daemon imports read_tag and scale_diag as bare modules, but they
live in spoolbuddy/scripts/ which isn't on sys.path when systemd runs
the daemon. Added scripts/ to sys.path at startup, resolved relative
to the module file. Also moved the read_tag import inside NFCReader's
try/except (was crashing the daemon instead of skipping gracefully)
and demoted hardware-not-available messages from ERROR to INFO.
* Increase scale moving average window to reduce weight bouncing
5 samples at 100ms (500ms window) wasn't enough to smooth NAU7802 ADC
noise — the averaged value still varied by >2g between 1s report
intervals, and the stability state kept flipping, triggering a report
every cycle. Increased to 20 samples (2s window) so noise is smoothed
before reaching the reporting layer.
* Remove stability flipping as scale report trigger
When ADC noise kept the spread hovering around the 2g stability
threshold, the stable flag toggled every cycle, forcing a report with
a slightly different weight each time. Now only actual weight changes
of >=2g trigger reports. The stable flag is still included in each
report for consumers that need it.
* Fix formatting of option elements in FilamentMapping
* Minor Spoolbuddy frontend improvements
* Updated Spoolbuddy install script to strip down Raspbian
* Updated Spoolbuddy install script
* Add API key auth support to /auth/me for SpoolBuddy kiosk
When Bambuddy auth is enabled, the SpoolBuddy kiosk gets redirected to
the login page because ProtectedRoute requires a user from GET /auth/me,
which only handled JWT tokens. The kiosk daemon already has an API key
but couldn't use it to satisfy the frontend auth check.
- Backend: /auth/me now accepts API keys (Bearer bb_xxx or X-API-Key)
and returns a synthetic admin UserResponse with all permissions
- Frontend: AuthContext reads ?token= from URL on first load, stores in
localStorage, and strips from URL (prevents history/referrer leakage)
- Install script: kiosk URL now includes ?token=${API_KEY}
- Tests: 3 new integration tests (Bearer API key, X-API-Key header,
invalid key rejection)
* SpoolBuddy touch-friendly UI overhaul for 1024x600 kiosk display
Enlarge all interactive elements across 9 SpoolBuddy components to meet
44px minimum tap targets on the RPi touchscreen. Increase nav icons
(20→24px), labels (10→12px), bar heights, section headers, printer
buttons, spool visualizations, fill bars, and status indicators.
Compact the dashboard stats bar and remove the printers card. Add
fullScreen prop to ConfigureAmsSlotModal with two-column layout
(filament list left, K-profile + color right) to eliminate scrolling.
* Updated CI
* Fix naive-vs-aware datetime crash from 0.2.1 timezone migration
The timezone fix (
|
||
|
|
119f1dacc2 | Merge remote-tracking branch 'origin/main' into 0.2.2b1 v0.2.2-b1 v0.2.2b1 | ||
|
|
39a231514c | Housekeeping | ||
|
|
e69d0b8610 |
[Fix]: AMS slot modal infinite scroll loop on Windows (#580)
* Fix AMS slot modal not scrolling to preselected filament The scroll useEffect fired before the loading spinner was replaced by the preset list, so the DOM element didn't exist yet. The ref guard was then set, preventing any retry once buttons appeared. - Move isLoading computation before the scroll effect and add it as a dependency so the effect re-runs when loading completes - Gate scroll on !isLoading so it only runs when buttons exist - Only mark scrolledToRef after the element is actually found - Use requestAnimationFrame to scroll after browser layout - Use block:'center' so the selected item is clearly visible Preselect filament for printer-configured AMS slots When an AMS slot was configured directly on the printer (no savedPresetId), the modal didn't preselect the filament even though it was in the list. Add a third fallback that matches trayInfoIdx against the full filteredPresets list (cloud and builtin sources). * Restore scrolledToRef lost during merge The useRef import, scrolledToRef declaration, and its reset were dropped during the 0.2.2b1 merge, causing a ReferenceError in the scroll-to-preselected-filament effect. * Fix preset scroll loop and wire up useEffect scroll logic - Remove inline ref callbacks with scrollIntoView on both preset button lists (fullscreen + standard) to stop the infinite scroll loop on Windows - Add data-preset-id attribute so the existing useEffect/querySelector scroll logic can actually find the elements - Replace filteredPresets dependency with builtinFilaments in the selection useEffect to prevent search keystrokes from overriding manual preset selection * Adjust scroll behavior in ConfigureAmsSlotModal --------- Co-authored-by: MartinNYHC <mz@v8w.de> |
||
|
|
058f74a7da |
Add in-app bug reporting with relay, debug log collection, and privacy controls
Floating bug report button submits issues via bambuddy.cool relay (no GitHub token needed locally). Collects 30s debug logs with printer push_all, sanitizes all sensitive data, uploads logs as files to GitHub. Screenshot upload/paste/drag with JPEG compression. Translated into all 7 languages. Includes 21 tests. |
||
|
|
4c81a92175 | Post work PR #581 | ||
|
|
3524af4144 |
Merge pull request #581 from aneopsy/refactor-utils
Refactor frontend utility functions to reduce duplication |
||
|
|
ba2abe100d | Merge branch '0.2.2b1' into refactor-utils | ||
|
|
6388b0df9b |
Show ethernet indicator instead of WiFi signal for wired printers (#585)
Parse home_flag bit 18 (0x00040000) from MQTT to detect ethernet connections. When set, the printer card shows a green "Ethernet" badge with a cable icon instead of WiFi signal strength in dBm. The printer info modal also displays "Ethernet" instead of WiFi signal details. |
||
|
|
76fd8c5c48 |
Add SSDP model codes to firmware check mapping (#584)
The firmware check only mapped display names (e.g., "H2D Pro") to API keys but not raw SSDP device codes (e.g., "O1E", "O2D"). If a printer's model was stored as the raw SSDP code, the firmware check either failed or matched the wrong model — H2D Pro matched against H2D firmware, showing a false update-available badge. Add all known SSDP device codes to MODEL_TO_API_KEY so firmware versions resolve correctly regardless of how the model was stored. |
||
|
|
acae51b938 |
Fix spurious 0300_0002 error notification via HMS array path (#583)
The previous fix only filtered status codes (< 0x4000) from the print_error field. Firmware can also send the same false positive through the hms array in MQTT, which had no such filter. Apply the same < 0x4000 check to the HMS parser so status/phase indicators are skipped regardless of which MQTT field carries them. |
||
|
|
abe40f1ed0 |
Consolidate duplicate utility functions into shared modules
Extract repeated helper functions from components into shared utils (colors.ts, date.ts, file.ts) to reduce duplication: - isLightColor, parseFilamentColor, hexToColorName → utils/colors.ts - formatMediaTime, formatDurationFromHours → utils/date.ts - formatFileSize guard hardened for NaN/negative → utils/file.ts - formatBytes (ToastContext), formatTime (Timelapse*) deduplicated Functions with subtly different behavior are intentionally kept local (formatFilament, formatStorageSize, formatBytes, formatUptime, formatDateTime, formatDate, formatTimeAgo) to preserve exact UI output. |
||
|
|
15521deb0a |
Refactor date and currency utility functions
- Extract shared detectSystemDateFormat() helper to eliminate duplicated system locale detection in date.ts - Derive SUPPORTED_CURRENCIES from CURRENCY_SYMBOLS map instead of maintaining a duplicate hardcoded list - Consolidate redundant time-parsing regex paths into one - Use applyTimeFormat() consistently in formatETA() - Add exhaustive switch default for type safety |
||
|
|
19a1a7584b |
Fix archive card showing "Source" badge for sliced .3mf files
The isSlicedFile() check only matched .gcode or .gcode.3mf extensions, so archives from .3mf prints (the standard Bambu slicer output) showed a "SOURCE" badge instead of "GCODE". Since .3mf can be either sliced or a raw CAD export, now checks the archive's total_layers and print_time_seconds metadata to distinguish them. Also passes the original filename when creating archives from file manager prints. |
||
|
|
6b92a99dd8 |
Improve FTP upload progress and widen print modal
FTP upload: reduce chunk size from 1MB to 64KB for smooth progress bar updates (~1s intervals instead of 20+ second gaps). Skip voidresp() for all printer models — H2D delays the 226 response by 30+ seconds after data transfer, causing a hang at 100%. Add transfer speed and TLS handshake timing to logs for diagnosing slow connections. Print/Schedule modal: widen from max-w-lg (512px) to max-w-2xl (672px) to accommodate long filament profile names like "PLA Support for PETG PETG Basic @Bambu Lab H2D 0.4 nozzle". |
||
|
|
330d77198a |
Fix AMS slot showing wrong material for "Support for" profiles
Profiles like "PLA Support for PETG PETG Basic @Bambu Lab H2D" have
filament_type PETG, but both the frontend and backend name parsers
found "PLA" first (iterating material types in order). The MQTT command
sent tray_type=PLA and tray_info_idx=GFL99 (PLA generic), so the
slicer displayed PLA instead of PETG.
- Frontend parsePresetName(): detect "X Support for Y" pattern, extract
material after "Support for"
- Frontend ConfigureAmsSlotModal: prefer corrected parsed material over
stored localPreset.filament_type for tray_type, tray_info_idx, and
temperature fallback
- Backend _parse_material_from_name(): same "Support for" handling for
future profile imports
- Backend assign_spool: prioritize spool.material over lp.filament_type
for generic filament ID lookup
|
||
|
|
23b2d97170 |
Add Hungarian Forint (HUF) currency for filament cost tracking
Closes #579 — adds HUF with symbol "Ft" to the supported currencies list so Hungarian users can track filament costs in their local currency. |
||
|
|
e3ebe86b00 |
Remove obsolete slicer_binary_path setting from database
The slicer_binary_path key was left in the settings table from earlier slicer integration research but is no longer referenced anywhere in the codebase. Add a startup migration step that deletes orphaned settings keys so they don't persist in backups. |
||
|
|
2a740c52eb |
Reverted commit d4aa77f502
|
||
|
|
277db1bd8c |
Revert "Merge pull request #578 from aneopsy/fix-ams-slot"
This reverts commit |
||
|
|
d4aa77f502 |
Merge pull request #578 from aneopsy/fix-ams-slot
[Fix]: AMS slot modal infinite scroll loop on Windows |
||
|
|
01b8fbb14f | Merge branch '0.2.2b1' into fix-ams-slot | ||
|
|
82178f8abd |
Add energy cost to archive card (#573)
* Add energy cost to archive card * Replace Disc3 icon with Coins in ArchivesPage --------- Co-authored-by: MartinNYHC <mz@v8w.de> |
||
|
|
d048d72df2 |
Fix AMS slot modal infinite scroll loop on Windows
Inline callback refs on preset buttons called scrollIntoView on every re-render, creating a scroll → re-render → scrollIntoView loop on Windows. Replace with a useEffect + data attribute approach that only scrolls when the selected preset actually changes. |
||
|
|
f45f3b0500 | Post work PR #569 | ||
|
|
fa9d3779cc |
[Feature]: Printer Page - Add a print button & Drop zone on the printer card (#569)
* Add printer card print flow with drag-drop and reusable LibraryUploadModal Extract inline upload modal from FileManagerPage into a reusable LibraryUploadModal component. Add a Print button and drag-drop zone to printer cards that upload files to the library and open PrintModal with the printer pre-selected. Only .gcode/.gcode.3mf files are accepted for printing. PrintModal hides printer selector when a printer is provided via initialSelectedPrinterIds prop. * Add printer compatibility check for drag-drop and upload-to-print flows Validates sliced_for_model from file metadata against the target printer model before opening the print modal, preventing users from printing with incompatible files. * Improve FileUploadModal: auto-close on success, inline errors, file validation, and i18n - Close modal automatically after successful upload instead of showing summary - Show printer compatibility errors inline in the modal instead of closing - Add validateFile and accept props to restrict file types for print flow - Add onFileUploaded error return to prevent modal close on incompatible files - Internationalize all hardcoded error/warning strings across 6 locales * Clean up incompatible files from library and fix print button i18n - Delete uploaded file from library when printer compatibility check fails in both drag-drop and modal upload flows - Fix print button tooltip to use existing common.print i18n key - Fix accept attribute to use .gcode,.3mf for proper browser support * Add printer information modal accessible from card 3-dot menu Replace inline IP/serial display at bottom of printer card with a dedicated "Printer Information" modal opened via the card menu. The modal shows model, status, state, IP address (copyable), serial number (copyable), WiFi signal, firmware, developer mode, nozzle count, SD card, auto-archive, total print hours, location, and added date, along with the printer image. Includes full i18n support across all 6 locales and accessibility attributes (role="dialog", aria-modal). * Extract getPrinterImage and getWifiStrength into shared printer utils --------- Co-authored-by: MartinNYHC <mz@v8w.de> |
||
|
|
0918c57928 |
Add i18n keys for printer card drag-drop print overlay
PR #569 introduces drag-drop printing on printer cards with inline fallback strings for common.uploading, common.uploadFailed, printers.dropToPrint, and printers.cannotPrint. Add these keys to all 7 locale files so they render in the correct language. |
||
|
|
97f6250a0b |
Add customizable low stock threshold, add low stock filter (#531)
* feat(queue): show spool grams left in filament slot mapping
* Bumped version
* Add SpoolBuddy AMS slot config, external slots, and dashboard redesign
- AMS page: external spool slots (Ext/Ext-L/Ext-R), click-to-configure
modal on all slots, temperature/humidity threshold-colored indicators,
nozzle L/R badges for dual-nozzle printers, compact AMS-HT layout
- Dashboard: two-column layout with device status + printers list (left)
and current spool card (right), state-colored scale/NFC icons, dashed
border card styling
- Daemon: suppress redundant scale reports (±2g threshold + stability
state change detection) to prevent weight display bouncing
- TopBar: auto-select online printers only, SpoolBuddy logo
* Fix SpoolBuddy daemon crash when read_tag module is missing
NFCReader.__init__ imported read_tag and instantiated PN5180() outside
the try/except block, so a missing module crashed the entire daemon.
Moved the import inside the existing try/except so the daemon gracefully
skips NFC polling — matching the scale reader's existing behavior.
* Fix SpoolBuddy daemon failing to import hardware drivers
The daemon imports read_tag and scale_diag as bare modules, but they
live in spoolbuddy/scripts/ which isn't on sys.path when systemd runs
the daemon. Added scripts/ to sys.path at startup, resolved relative
to the module file. Also moved the read_tag import inside NFCReader's
try/except (was crashing the daemon instead of skipping gracefully)
and demoted hardware-not-available messages from ERROR to INFO.
* Increase scale moving average window to reduce weight bouncing
5 samples at 100ms (500ms window) wasn't enough to smooth NAU7802 ADC
noise — the averaged value still varied by >2g between 1s report
intervals, and the stability state kept flipping, triggering a report
every cycle. Increased to 20 samples (2s window) so noise is smoothed
before reaching the reporting layer.
* Remove stability flipping as scale report trigger
When ADC noise kept the spread hovering around the 2g stability
threshold, the stable flag toggled every cycle, forcing a report with
a slightly different weight each time. Now only actual weight changes
of >=2g trigger reports. The stable flag is still included in each
report for consumers that need it.
* Fix formatting of option elements in FilamentMapping
* Make low stock threshold editable
* Add new filter for low spools
* Update bug report template to require additional fields
* Added toast for invalid imputs with locales, updated inputb field restrictions
* Minor Spoolbuddy frontend improvements
* Updated test_backend.sh
* Updated Spoolbuddy install script to strip down Raspbian
* Updated Spoolbuddy install script
* Add API key auth support to /auth/me for SpoolBuddy kiosk
When Bambuddy auth is enabled, the SpoolBuddy kiosk gets redirected to
the login page because ProtectedRoute requires a user from GET /auth/me,
which only handled JWT tokens. The kiosk daemon already has an API key
but couldn't use it to satisfy the frontend auth check.
- Backend: /auth/me now accepts API keys (Bearer bb_xxx or X-API-Key)
and returns a synthetic admin UserResponse with all permissions
- Frontend: AuthContext reads ?token= from URL on first load, stores in
localStorage, and strips from URL (prevents history/referrer leakage)
- Install script: kiosk URL now includes ?token=${API_KEY}
- Tests: 3 new integration tests (Bearer API key, X-API-Key header,
invalid key rejection)
* SpoolBuddy touch-friendly UI overhaul for 1024x600 kiosk display
Enlarge all interactive elements across 9 SpoolBuddy components to meet
44px minimum tap targets on the RPi touchscreen. Increase nav icons
(20→24px), labels (10→12px), bar heights, section headers, printer
buttons, spool visualizations, fill bars, and status indicators.
Compact the dashboard stats bar and remove the printers card. Add
fullScreen prop to ConfigureAmsSlotModal with two-column layout
(filament list left, K-profile + color right) to eliminate scrolling.
* Minor changes, CSS fixes
* Refactor usageFilter state to remove 'lowstock' option for clarity
* Move var saving to API, add test coverage
* fix: threshold validation and cleanup
* Change test input from '150' to '0'
---------
Co-authored-by: tridev <c.tripod@gmx.ch>
Co-authored-by: MartinNYHC <mz@v8w.de>
|
||
|
|
9cdda80849 | Added Simplified Chinese translation zh-CN (Issue #571) | ||
|
|
3c52b5e739 | Updated docker-publish-daily-beta.sh | ||
|
|
e2ba768c2e |
Fix spurious error notifications from print_error status codes
Some firmware sends non-zero print_error values (e.g. 0x03000002 → 0300_0002) during normal printing as status/phase indicators. The parser treated any non-zero value as a real error, triggering notifications. All known real errors have codes >= 0x4000 (fatal, warning, prompt ranges). Now skips print_error values where the low 16 bits are below 0x4000. Also fix K-profile greenlet error on auto-created RFID spools by eagerly setting k_profiles=[] after flush in create_spool_from_tray(). |
||
|
|
219214f0af |
Fix K-profile greenlet error on auto-created RFID spools
create_spool_from_tray() didn't eagerly load the k_profiles relationship, so auto_assign_spool() triggered a lazy load in async context when iterating spool.k_profiles. Set k_profiles=[] on new spools since they can never have K-profiles yet. |