Commit Graph
291 Commits
Author SHA1 Message Date
maziggy 2c61ba930a Updated version to 0.1.6b4 2026-01-01 14:10:41 +01:00
maziggyandClaude Opus 4.5 1234e44eb2 - Docker update detection for in-app updates
- Added _is_docker_environment() function
  - Check endpoint returns is_docker and update_method fields
  - Apply endpoint rejects Docker with helpful instructions
- Added updates API tests
- Updated CHANGELOG

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-01 14:06:06 +01:00
MartinNYHC 7e3fcec02d Merge pull request #42 from maziggy/0.1.6b4
v0.1.6b4

### New Features

  # Printer Cards
  - Refactored AMS section for better visual grouping and spacing

### Bugfixes

  ### Printer Hour Counter
  - Fixed runtime_seconds not incrementing during prints
  - Bug fix: first timestamp was set but never committed

  ### Slicer Protocol
  - Add OS detection for slicer protocol handler
  - Windows: `bambustudio://`, macOS/Linux: `bambustudioopen://`
  - Updated all usages in Archives and Model Viewer
  - 
  ### Camera Popup Window
  - Auto-resize to fit video resolution on first open
  - Persist window size and position to localStorage
  - Restore saved window state for subsequent opens

  ### Maintenance Page
  - Improved duration display with better precision (weeks instead of imprecise months)
  - Large print hours now show readable units (e.g., 478h → 3w, 100h → 4d)
v0.1.6b4
2026-01-01 12:38:59 +01:00
maziggy 865f3d78fb Updated CHANGELOG 2026-01-01 12:36:32 +01:00
maziggy 079e9fc2cc - Camera popup window:
- Auto-resize to fit video resolution on first open
  - Persist window size and position to localStorage
  - Restore saved window state for subsequent opens
2026-01-01 12:29:25 +01:00
maziggy d3686a1b60 - Fixed maintenance interval display on status page 2026-01-01 12:21:12 +01:00
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
MartinNYHC fca1fe9611 Merge pull request #39 from maziggy/0.1.6b3
Housekeeping 0.1.6b3
2025-12-31 12:25:46 +01:00
maziggy 297c3212fa Housekeeping 2025-12-31 12:24:17 +01:00
MartinNYHC ec1828e73a Merge pull request #38 from maziggy/0.1.6b3
0.1.6b3

*  Bug Fixes
    - Fixed printer hour counter inconsistency - Printer card and maintenance page now show consistent hour values (both use Math.round)
    - Improved printer hour tracking accuracy - Introduced real-time runtime counter that tracks actual machine active time (RUNNING/PAUSE states), including calibration, heating, and bed leveling. This provides more accurate hours matching the printer's display
    - Fixed Add Smart Plug modal scrolling - Modal now scrolls properly on lower resolution screens (https://github.com/maziggy/bambuddy/issues/34)
    - Excluded virtual printer from discovery - Bambuddy's own virtual printer no longer appears in "Add Printer → Discovery" results
    - Fixed bottom sidebar layout

*  New Features
    - Confirmation modal for quick power switch - Sidebar smart plug toggle now requires confirmation before turning on/off to prevent accidental clicks

* Repository
   - Added community files: CODE_OF_CONDUCT.md, CONTRIBUTING.md, SECURITY.md
   - Updated screenshots
v0.1.6b3
2025-12-31 12:17:36 +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
MartinNYHC 29215de097 Update README.md 2025-12-30 15:49:12 +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 a0c4106aef Deleted .github/FUNDING.yml 2025-12-30 11:03:29 +01:00
maziggy 86b4fd9c6b Deleted .github/FUNDING.yml 2025-12-30 11:03:09 +01:00
maziggy ac6cbd757a - Added
- .github/FUNDING.yml
  - CODE_OF_CONDUCT.md
  - CONTRIBUTING.md
  - SECURITY.md
2025-12-30 10:58:34 +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 b1d07a4ef2 Added new screenshots 2025-12-30 09:48:47 +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