Commit Graph
279 Commits
Author SHA1 Message Date
maziggy ccdb084f23 - Refactored printer card's AMS section for better experience 2026-01-01 12:08:55 +01:00
maziggy 569dbc3d21 - Printer Hour Counter:
- Fix runtime_seconds never incrementing during prints
  - Bug: first timestamp was set but never committed (updated_count was 0)
  - Add needs_commit flag to ensure timestamp is saved on first iteration
2026-01-01 07:58:23 +01:00
maziggy 01bc211616 - Slicer Protocol:
- Add utils/slicer.ts with OS detection for protocol handler
  - Windows: bambustudio://, macOS/Linux: bambustudioopen://
  - Update all usages in ArchivesPage.tsx and ModelViewerModal.tsx
2026-01-01 07:52:47 +01:00
maziggy 2457577f54 - Added frontend/backend tests for new theme functions
- Fixed some bugs, where settings were not backed up or restored
- Docker: Fixed mounting of database for persistence
2025-12-31 17:07:15 +01:00
maziggy bca1a80172 * Add customizable theme system with style, background, and accent options
Implement comprehensive theme customization with independent settings for
  dark and light modes:

  - Style layer: Classic (clean shadows), Glow (accent-colored glow effects),
    Vibrant (dramatic deep shadows)
  - Background layer: Neutral, Warm, Cool (light mode); plus OLED, Slate,
    Forest (dark mode only)
  - Accent colors: Green, Teal, Blue, Orange, Purple, Red

  All combinations work independently (e.g., Glow + Forest + Teal). Settings
  sync across devices via database and show toast confirmations on change.

  Backend:
  - Add 6 new settings fields (dark_style, dark_background, dark_accent,
    light_style, light_background, light_accent)
  - Add integration test for theme settings API

  Frontend:
  - Refactor index.css with 3-layer CSS variable system
  - Update ThemeContext for dual-mode theme management
  - Add Appearance section to Settings page with 6 dropdowns
  - Update components for new ThemeContext API
2025-12-31 15:44:52 +01:00
maziggy 297c3212fa Housekeeping 2025-12-31 12:24:17 +01:00
maziggy 219d26b8ab - Fixed bug in printer's hour counter 2025-12-31 12:01:17 +01:00
maziggy 16c21cf1fa - Added confirmation modal to sidebar's quick power switch 2025-12-31 11:40:14 +01:00
maziggy 9f665a9382 Housekeeping 2025-12-31 11:36:53 +01:00
maziggy d267e8b605 Housekeeping 2025-12-31 11:32:50 +01:00
maziggy 22222e502c - Excluded Bambuddy virtual printer from SSDP discovery 2025-12-30 15:58:11 +01:00
maziggy 0291f09649 - Fixed bug where add smart plug modal doesn't scroll on lower resolution screens (https://github.com/maziggy/bambuddy/issues/34) 2025-12-30 12:22:22 +01:00
maziggy 86b4fd9c6b Deleted .github/FUNDING.yml 2025-12-30 11:03:09 +01:00
maziggy d0940b9209 - Added
- .github/FUNDING.yml
  - CODE_OF_CONDUCT.md
  - CONTRIBUTING.md
  - SECURITY.md
2025-12-30 10:57:44 +01:00
maziggy 9a9ef36a33 Changed version to 0.1.6b3 2025-12-30 10:28:57 +01:00
maziggy 4ccf048dc1 Added new screenshots 2025-12-30 09:46:21 +01:00
maziggy 88487f8f46 Bottom sidebar layout fix 2025-12-30 09:28:32 +01:00
MartinNYHC 86239d38f2 Merge pull request #33 from maziggy/0.1.6b2
0.1.6b2

* New Features

    - Add Virtual Printer feature - SSDP discovery, TLS/MQTT, queue/auto-start modes, Docker support
        - Emulates a Bambu Lab printer on your network - Bambuddy pretends to be a real printer
        - Auto-discovery - appears automatically in Bambu Studio/Orca Slicer via SSDP protocol
        - Send prints from slicer - slice and send directly to Bambuddy without a physical printer connected
        - Two modes:
            - Queue mode - prints go to "Pending Uploads" for manual review/scheduling
            - Auto-start mode - prints immediately start on your default printer
        - Secure communication - TLS 1.3 encrypted MQTT + FTPS with auto-generated certificates
        - Access code authentication - 8-digit code like real Bambu printers
        - Docker compatible - requires network_mode: host and volume mount for certificate persistence

    - All archive page filters are now persistent

* Bugfixes
    - Fix AMS filament matching in reprint modal
    - Archive card: fixed cache bug with wrong cover image
    - Minor bugfixes in queueing module (re-queue modal fix)

* Housekeeping
    - Added frontend/backend tests for archive card AMS mapping
v0.1.6b2
2025-12-29 16:08:42 +01:00
maziggy a322b8fad4 Minor bugfixes in queueing module 2025-12-29 16:00:49 +01:00
maziggy 88e84ca45a - Add Virtual Printer feature - emulate Bambu printer on network
- Virtual printer appears in Bambu Studio/Orca Slicer via SSDP discovery
  - Secure TLS/MQTT communication with auto-generated certificates
  - Queue mode (pending uploads) or auto-start mode
  - Configurable access code for authentication
  - Docker support with network_mode: host and certificate persistence
  - Fix backup/restore for virtual printer settings (auto-save no longer overwrites)
2025-12-29 15:52:48 +01:00
maziggy c3c36719a5 Changed version to 0.1.6b2 2025-12-29 10:16:54 +01:00
maziggy 1dff7ceae1 Added frontend/backend tests for archive card ams mapping 2025-12-29 10:15:19 +01:00
maziggy 3cba1c0989 - Fix AMS filament matching in reprint modal
- Add fuzzy color matching for filament comparison
    Colors within RGB threshold of 40 are considered a match, fixing
    cases where 3MF and printer report slightly different hex values
    for the same filament color (e.g., beige #F5F5DC vs #FCECD6)

  - Add POST /printers/{id}/refresh-status endpoint
    Sends MQTT pushall command to request fresh AMS data from printer

  - Improve Re-read button in filament check section
    - Now triggers backend refresh before refetching status
    - More prominent styling with text label and border
    - 500ms delay after pushall to allow printer to respond

  - Add AMS slot labels to matched filament display
    Shows location like "PLA (AMS-B Slot 3)" instead of just "PLA"

  - Add color hex tooltips on filament color circles
2025-12-29 10:03:51 +01:00
maziggy a008be96ee - All archive page filters are now persitent 2025-12-29 09:16:28 +01:00
maziggy e97d697d90 - Archive card: fixed a cache bug, where wrong cover image was shown 2025-12-29 09:05:10 +01:00
MartinNYHC ee704b4158 Merge pull request #32 from maziggy/0.1.6b
New Features (0.1.6b)

  Smart Plugs

  - Tasmota device discovery - Auto-detect network and scan for Tasmota devices. Supports devices with/without authentication.
  - Switchbar quick access - Sidebar widget for controlling smart plugs from anywhere. Shows real-time status and power consumption.

  Timelapse

  - Timelapse editor - Trim, speed adjustment (0.25x-4x), and music overlay with FFmpeg server-side processing.

  Printer Discovery & Cards

  - Docker subnet scanning - Auto-detect Docker environment and enable subnet input for discovering printers
  - Printer model mapping - Show friendly names (X1C, H2D, P1S) instead of raw SSDP codes
  - Detailed status stages - Show heater states and print status stages on printer cards
  - Dual nozzle temperature - Fixed display for H2D printers

  Archives & Projects

  - AMS filament preview - Reprint modal shows filament comparison (type + color match indicators)
  - File type badges - GCODE (green) or SOURCE (orange) badges on archive cards
  - Project filament colors - Display filament swatches from assigned archives
  - BOM filter - "Hide done" toggle for completed items
  - Projects in backup/restore - Include projects, BOM items, and attachments
  - Attachment validation - File type validation for project attachments

  Maintenance

  - Custom maintenance types - No longer auto-assign to all printers; manual per-printer assignment
  - Delete printer options - Choose to keep or delete archives when deleting a printer

  UI Improvements

  - Project card design - Enhanced with gradients, shadows, and glow effects
  - Confirmation modals - Replace browser confirm dialogs with styled modals
  - Default timelapse speed - Changed from 2x to 1x

  ---
  Bug Fixes

  - Notifications sent when printer offline - Fixed notification module
  - Camera stream stopping - Increased timeouts, added auto-reconnection with exponential backoff
  - A1/P1 camera streaming - Fixed with extended timeouts and lower FPS cap; removed deprecated -stimeout option
  - Attachment uploads not persisting - Fixed SQLAlchemy JSON column mutation detection
  - Total print hours calculation - Now includes all prints, not just completed
  - Mock state bug - Fixed in test fixtures
v0.1.6b
2025-12-28 15:07:39 +01:00
maziggy 0bcedd2c16 - Add Tasmota device discovery and switchbar quick access
- Features:
    - Tasmota device discovery: Auto-detect network and scan for Tasmota devices
      in Add Smart Plug modal. Supports devices with/without authentication.
    - Switchbar: Quick access widget in sidebar footer for controlling smart plugs
      from anywhere in the app. Shows real-time status and power consumption.
2025-12-28 15:02:42 +01:00
maziggy b3ef6ccb32 - Add AMS filament preview for reprints and file type badges
- AMS Filament Preview:
    - Add GET /archives/{id}/filament-requirements endpoint to extract
      filament data from archived 3MF slice_info.config
    - Show filament comparison in reprint modal when printer is selected
    - Compare both filament type AND color with visual indicators:
      - Green checkmark: Type and color match
      - Yellow warning: Same type, different color
      - Orange warning: Different type or empty slot
    - Handle AMS-HT units (id >= 128) and virtual tray (slot 254)
    - Normalize color formats between API (RRGGBBAA) and 3MF (#RRGGBB)

- File Type Badge:
  - Archive cards show GCODE (green) or SOURCE (orange) badge
  - Helps users identify which files have print data vs source-only
  - Badge appears next to printer name in card content area

- Camera Stream Stability:
  - Increase ffmpeg read timeout from 10s to 30s
  - Add ffmpeg RTSP options: -timeout, -buffer_size, -max_delay
  - Add frontend auto-reconnection with exponential backoff (2s-30s)
  - Show reconnection UI with countdown and attempt counter
2025-12-28 13:50:29 +01:00
maziggy 530a7a4608 - Fix camera stream stopping after a few minutes
- Backend:
    - Increase ffmpeg stdout read timeout from 10s to 30s
    - Add ffmpeg RTSP stability options: -timeout, -buffer_size, -max_delay
  - Frontend:
    - Add auto-reconnection with exponential backoff (2s→30s max)
    - Show reconnection UI with countdown and attempt counter
    - Maximum 5 reconnection attempts before showing error
    - "Reconnect now" button to skip countdown
    - Reset reconnection state on manual refresh or mode switch
2025-12-28 13:16:14 +01:00
maziggy b1be35ba8c - Add timelapse editor with trim, speed adjustment, and music overlay
- Add TimelapseEditorModal component with visual timeline scrubber
  - Add timelapse processing endpoints (info, thumbnails, process)
  - Add TimelapseProcessor service using FFmpeg for video processing
  - Support trim (start/end), speed (0.25x-4x), and audio overlay
  - Add Edit button to TimelapseViewer
  - Fix browser caching with timestamp query parameter
  - Change default timelapse playback speed from 2x to 1x
2025-12-28 13:06:30 +01:00
maziggy db5cb86d3a - Project page enhancements and bug fixes
- Add filament color swatches to project cards showing colors from assigned archives
  - Add "Hide done" toggle to filter completed BOM items
  - Include projects in backup/restore (with BOM items and attachments)
  - Add file type validation for project attachments
  - Enhance project card design with gradients, shadows, and glow effects
  - Improve layout spacing on project list and detail pages
  - Replace browser confirm dialogs with styled confirmation modals
  - Fix attachment uploads not persisting (SQLAlchemy JSON column mutation)
2025-12-28 12:04:33 +01:00
maziggy 8acc91d3cd - Add subnet scanning for printer discovery in Docker environments
- Detect Docker environment automatically via /.dockerenv and cgroup
  - Show subnet input field in Add Printer dialog when running in Docker
  - Scan IP range for Bambu printer ports (8883 MQTT, 990 FTPS)
  - Query SSDP to get printer name/serial/model from discovered IPs
  - Map raw SSDP model codes to friendly names (BL-P001→X1C, O1D→H2D)
2025-12-28 09:40:47 +01:00
MartinNYHC 459b781fe8 Add firmware version input to bug report template 2025-12-28 08:57:27 +01:00
MartinNYHC 017e36a0a6 Add firmware version input to bug report template
Added input field for specifying printer firmware version in bug report template.
2025-12-28 08:55:28 +01:00
maziggy 49b9fb854b - Fixed bug in notification module where notifictions were sent although printer is offline 2025-12-27 18:48:14 +01:00
maziggy e9193276a6 Summary of Fixes
1. "Unknown Status (255)" bug

  File: backend/app/services/printer_manager.py:291-293

  Problem: A1/P1 printers send stg_cur=255 when idle (unlike X1 which uses -1). The code treated 255 as a valid stage number and returned "Unknown stage (255)".

  Fix: Changed the condition from if state.stg_cur >= 0: to if 0 <= state.stg_cur < 255: so that 255 is now treated as "no calibration stage" (same as -1).

  2. AMS humidity/temp displaced on mobile

  File: frontend/src/pages/PrintersPage.tsx:1164-1212

  Problem: The AMS row used a rigid horizontal flex layout that didn't adapt to narrow mobile screens, causing humidity/temperature indicators to be displaced.

  Fix:
  - Added flex-wrap to allow wrapping on very narrow screens
  - Added ml-auto to humidity/temp section to keep it right-aligned
  - Added max-w-[60px] sm:max-w-none to truncate long filament names on mobile
  - Changed gap from fixed gap-3 to responsive gap-2 sm:gap-3

  Tests Added

  4 new unit tests for get_derived_status_name:
  - test_stg_cur_255_returns_none - Verifies A1/P1 idle state
  - test_stg_cur_negative_one_returns_none_when_idle - Verifies X1 idle state
  - test_valid_stage_returns_name - Verifies valid stages work
  - test_stg_cur_zero_returns_printing - Verifies printing state

  All 382 tests pass.
2025-12-27 15:53:37 +01:00
maziggy a66500b605 Fixed bug in mock_state 2025-12-27 15:46:13 +01:00
maziggy 11a6bb282a Key Discovery
A1/P1 printers don't support RTSP - they use a custom chamber image protocol on port 6000:
  - SSL/TLS connection
  - 80-byte binary auth payload (magic + "bblp" + access code)
  - 16-byte header with payload size + JPEG data

  Changes Made

  backend/app/services/camera.py

  - Added supports_rtsp() - detects X1/H2/P2 (RTSP) vs A1/P1 (chamber image)
  - Added is_chamber_image_model() - inverse check
  - Added _create_chamber_auth_payload() - builds 80-byte auth
  - Added _create_ssl_context() - SSL for self-signed certs
  - Added read_chamber_image_frame() - single frame capture
  - Added generate_chamber_image_stream() - persistent connection
  - Added read_next_chamber_frame() - read from stream
  - Updated capture_camera_frame() - uses correct protocol per model

  backend/app/api/routes/camera.py

  - Added generate_chamber_mjpeg_stream() - MJPEG from chamber protocol
  - Renamed generate_mjpeg_stream() → generate_rtsp_mjpeg_stream()
  - Updated camera_stream endpoint - chooses protocol based on model
  - Updated stop_camera_stream - cleans up both stream types
  - Added tracking for _active_chamber_streams

  Protocol Matrix

  | Model                       | Protocol      | Port |
  |-----------------------------|---------------|------|
  | X1, X1C, X1E, H2C, H2D, P2S | RTSP          | 322  |
  | A1, A1MINI, P1P, P1S        | Chamber Image | 6000 |
2025-12-25 07:44:53 +01:00
maziggy 01989b7182 - Fix A1/P1 camera streaming with extended timeouts and lower FPS cap
- Removed deprecated -stimeout option (renamed to -timeout in ffmpeg 5.0+).
2025-12-24 13:43:35 +01:00
maziggy 7622d2ae5c - Fix total print hours calculation in set_total_hours to include all
prints (not just completed), matching get_printer_total_hours behavior
  - Add option to keep or delete archives when deleting a printer
  - Custom maintenance types no longer auto-assign to all printers
  - Add UI to manually assign/remove custom maintenance types per printer
  - Add backend endpoints for assigning types to printers and removing items
  - Exclude static/assets from large file pre-commit check
  - Fix A1/P1 camera streaming with extended timeouts and lower FPS cap
2025-12-24 08:41:23 +01:00
maziggy 929c4c8cd6 - Fix total print hours calculation in set_total_hours to include all
prints (not just completed), matching get_printer_total_hours behavior
  - Add option to keep or delete archives when deleting a printer
  - Custom maintenance types no longer auto-assign to all printers
  - Add UI to manually assign/remove custom maintenance types per printer
  - Add backend endpoints for assigning types to printers and removing items
  - Exclude static/assets from large file pre-commit check
2025-12-23 09:00:36 +01:00
maziggyandClaude Opus 4.5 288a495041 - Fix dual nozzle temperature display for H2D printers
- Use extruder_info[0].temp for right nozzle instead of nozzle_temper field which incorrectly mirrors left nozzle
- Gate dual nozzle parsing with has_h2d_extruder_info to prevent single nozzle printers showing two temps
- Add nozzle_heating calculation for single nozzle printers

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-22 13:07:06 +01:00
maziggy ef68804fa9 - Added printer auto discovery to add printer modal 2025-12-21 11:23:20 +01:00
maziggy 0da5de0f46 - Printer cards now shows heater states 2025-12-21 10:48:50 +01:00
maziggy 0200f69ba3 - Show detailed printer status stages on printer cards
- Add getStatusDisplay() helper in frontend to format status nicely
  - Add get_derived_status_name() in backend to compute status from:
    - stg_cur calibration stages (bed leveling, vibration comp, etc.)
    - Temperature data when stg_cur unavailable (heating heatbed/nozzle)
  - Include stg_cur and stg_cur_name in WebSocket broadcasts
  - Update broadcast status key to detect heating phase changes

  Printer cards now show: "Heating heatbed", "Heating nozzle", "Preparing",
  "Auto bed leveling", "Cleaning nozzle tip", and 60+ other stage names
  instead of just "Printing" or "Idle".
2025-12-21 10:24:26 +01:00
maziggy 3ffe032635 - Fix total print hours to include all prints 2025-12-21 09:56:34 +01:00
MartinNYHC 77f21bf6f8 Merge pull request #27 from maziggy/0.1.5-final
Release Notes for 0.1.5

  Highlights

  This release focuses on stability improvements and bug fixes, with major fixes for browser freezing and UI responsiveness issues.

  Bug Fixes

  - Browser freeze on print completion - Fixed a critical issue where the browser would freeze when a print completed with the camera stream open. The fix uses buffered camera frames instead of spawning duplicate ffmpeg processes.
  - Printer status "timelapse" effect - Fixed an issue where navigating to the printer page after a print completed showed metrics animating slowly from mid-print values to the final state. Printer status messages now bypass the throttled queue for immediate updates.
  - Timelapse auto-download - Complete rewrite with retry mechanism and support for multiple storage paths.
  - Timelapse detection for H2D - Fixed detection using the correct ipcam.timelapse field instead of xcam.timelapse.
  - Reprint from archive - Fixed bug where the print button sent the slicer source file instead of the sliced gcode.
  - Import shadowing bugs - Fixed ArchiveService import shadowing causing "cannot access local variable" errors.

  New Features

  - Failure reason detection - Automatically detects failure reasons from HMS errors (filament runout, layer shift, clogged nozzle)
  - Hide failed prints filter - Toggle to hide failed/aborted prints with localStorage persistence
  - Docker test suite - Comprehensive tests for build, backend, frontend, and integration
  - Pre-commit hooks - Ruff linter and formatter for code quality
  - Code quality tests - Static analysis to catch import shadowing bugs automatically

  Changes

  - Timelapse viewer default playback speed changed from 0.5x to 2x
  - Archive badges now show "cancelled" for aborted prints
  - WebSocket throttle reduced to 100ms for smoother updates
  - Added ffmpeg to Docker image

  Upgrading

  cd bambuddy && git pull && docker compose up -d --build

  Or use the auto-update feature in Settings.
v0.1.5-final
2025-12-19 08:32:10 +01:00
maziggy 866f4835a3 0.1.6b 2025-12-19 08:31:18 +01:00
maziggy 5e771b70c9 Release Notes for 0.1.5
Highlights

  This release focuses on stability improvements and bug fixes, with major fixes for browser freezing and UI responsiveness issues.

  Bug Fixes

  - Browser freeze on print completion - Fixed a critical issue where the browser would freeze when a print completed with the camera stream open. The fix uses buffered camera frames instead of spawning duplicate ffmpeg processes.
  - Printer status "timelapse" effect - Fixed an issue where navigating to the printer page after a print completed showed metrics animating slowly from mid-print values to the final state. Printer status messages now bypass the throttled queue for immediate updates.
  - Timelapse auto-download - Complete rewrite with retry mechanism and support for multiple storage paths.
  - Timelapse detection for H2D - Fixed detection using the correct ipcam.timelapse field instead of xcam.timelapse.
  - Reprint from archive - Fixed bug where the print button sent the slicer source file instead of the sliced gcode.
  - Import shadowing bugs - Fixed ArchiveService import shadowing causing "cannot access local variable" errors.

  New Features

  - Failure reason detection - Automatically detects failure reasons from HMS errors (filament runout, layer shift, clogged nozzle)
  - Hide failed prints filter - Toggle to hide failed/aborted prints with localStorage persistence
  - Docker test suite - Comprehensive tests for build, backend, frontend, and integration
  - Pre-commit hooks - Ruff linter and formatter for code quality
  - Code quality tests - Static analysis to catch import shadowing bugs automatically

  Changes

  - Timelapse viewer default playback speed changed from 0.5x to 2x
  - Archive badges now show "cancelled" for aborted prints
  - WebSocket throttle reduced to 100ms for smoother updates
  - Added ffmpeg to Docker image

  Upgrading

  cd bambuddy && git pull && docker compose up -d --build

  Or use the auto-update feature in Settings.
2025-12-19 08:28:13 +01:00
maziggy 34193c2d89 Uodated .gitignore 2025-12-18 19:53:40 +01:00