Releases: Keralots/BambuHelper
v2.8
BambuHelper v2.8 - Release Notes
Firmware Builds
| Build Target | Board / Hardware | Display | OTA Update File | Full Flash File |
|---|---|---|---|---|
esp32s3 |
ESP32-S3 Super Mini | ST7789 240x240 | BambuHelper-esp32s3-v2.8-ota.bin |
BambuHelper-esp32s3-v2.8-Full.bin |
cyd |
ESP32-2432S028 (CYD / Cheap Yellow Display) | ILI9341 240x320 | BambuHelper-cyd-v2.8-ota.bin |
BambuHelper-cyd-v2.8-Full.bin |
ws_lcd_154 |
Waveshare ESP32-S3-Touch-LCD-1.54 | ST7789 240x240 | - | BambuHelper-ws_lcd_154-v2.8-Full.bin |
ws_lcd_200 |
Waveshare ESP32-S3-Touch-LCD-2 | ST7789 240x320 | BambuHelper-ws_lcd_200-v2.8-ota.bin |
BambuHelper-ws_lcd_200-v2.8-Full.bin |
esp32c3 |
ESP32-C3 Super Mini | ST7789 240x240 | BambuHelper-esp32c3-v2.8-ota.bin |
BambuHelper-esp32c3-v2.8-Full.bin |
OTA is for updating an already working device from the BambuHelper web UI.
Full is for first-time flashing, recovery, or ESP Web Flasher use.
New Hardware
- Waveshare ESP32-S3-Touch-LCD-1.54 - new build target
ws_lcd_154for the Waveshare 1.54" all-in-one board (240x240 ST7789, ESP32-S3, CST816 touchscreen, battery holder, 3 built-in buttons, built-in ES8311 speaker). Supports up to 2 printers. Touchscreen and the left BOOT button both work as screen switcher. Battery power-off: hold the two outermost buttons (BOOT + right) for 1.5 seconds. Product page: waveshare.com/esp32-s3-touch-lcd-1.54.htm
Bug Fixes
-
Fix: Cloud MQTT display freeze during printing (H2C regression) - the display could freeze during cloud printing (especially H2C in PREPARE/RUNNING state) and never recover without a manual push from Bambu Handy. Root cause: AMS parsing was gated behind a tray-snapshot guard, so cloud partial updates silently dropped all AMS data while
lastUpdatestayed fresh and stale recovery never triggered. Fixed by restructuring AMS parsing into two passes and splitting freshness tracking into connection-alive vs core-data signals. -
Fix: Chamber temperature gauge always showing 0 on H2C / H2D - some H2 printers expose chamber temperature via
device.ctc.info.tempinstead of the legacychamber_temperfield. On H2D the value is also packed (chamber temp + heater state in one int) and needed unpacking. BambuHelper now accepts both paths and decodes the packed H2D value. -
Fix: Landscape layout on 240x320 screens (CYD) - various alignment and sizing issues on the rotated 320x240 layout have been corrected. (Some adjustments still needed, will be added to next release)
-
Fix: Dark AMS filament colors washed out on CYD (#68) - dark custom filament colors (e.g. r=g=b=10) were inflated to near-white by the brightness boost in color conversion. A threshold now keeps intentionally dark colors dark. A prior attempt to compensate via bitwise
~cwas reverted as it broke chromatic colors on inversion-corrected CYD variants. -
Fix: X1C/X1E door sensor always showing closed (#67) - X1C sends
statwith bit 0x00800000 permanently set; using it as a door indicator always read "door open" on X1C. Fixed to usehome_flagbit 23 for X1C (serial prefix00M) and X1E (prefix03W), andstat-based parsing is now gated to H2 printers only. -
Fix: Buzzer default pin conflict with backlight on C3 -
BUZZER_DEFAULT_PINwas hardcoded to GPIO 5 on all boards. On C3, GPIO 5 is the backlight pin, soinitBuzzer()turned the backlight off and the display went black after boot. Board-specific defaults are now used (S3=5, C3=3, CYD=26) and the buzzer pin is validated against the backlight at save time - conflicting pins are automatically disabled. (contributed by @theNailz, PR #69) -
Fix: Infinite pushall recovery loop in FINISH state on cloud - after print completion, recovery pushall cycled forever (stale detected → pushall → FINISH response refreshes data → flag reset → repeat), risking TLS alert 49 and cloud rate limiting. Recovery is now one-shot per FINISH state.
-
Fix: Silent MQTT publish / subscribe / setBufferSize failures - three silent failure modes patched: failed
publish()was still recorded as sent (blocking retries);setBufferSize(40KB)failure silently fell back to 256 bytes dropping large payloads;subscribe()failure left a connection that looked healthy but received nothing. All three now fail loudly and trigger appropriate reconnect handling. -
Fix: Stale
isConnectedsnapshot aftermqtt->loop()- connection state was captured once at the top ofhandleConn(), butmqtt->loop()could disconnect internally. All subsequent logic used the staletruevalue and attempted publishes on a dead socket. State is now re-evaluated afterloop()returns. -
Fix: LAN "no data after pushall" retry broken after first reconnect - retry condition used
messagesRx == 0, but that counter is cumulative since boot and never resets. Replaced with a per-connectiongotDataSinceConnectflag. -
Fix: Stale AMS drying state blocked screen sleep after printer disconnect -
clearLiveMetrics()did not resetanyDrying, so a printer disconnecting while drying keptanyPrinterDrying()returning true forever.clearLiveMetrics()now clears drying state. -
Fix: Cloud self-healing at boot for non-JWT tokens - some Bambu account tokens are not standard JWT, causing silent
cloudUserIdextraction failure at startup. Startup now mirrors the web UI: local JWT extraction first, then/v1/user-service/my/profileAPI fallback. -
Fix:
ensureClients()failure now increments backoff counter - on persistent low-heap / allocation failures,consecutiveFailswas not incremented, so retries hammered at the base 10s interval instead of entering exponential backoff. -
Fix: "Keep print status screen" checkbox reset on every Apply - the
kpscheckbox was missing from theapplyDisplay()form POST. Clicking "Apply Display Settings" while the option was enabled silently reset it to off, switching the display back to the idle screen. -
Fix: AMS drying screen cosmetic issues - AMS HT units now show "AMS HT 1" label instead of "AMS 1". Temperature displays as a whole number. Degree symbol corrected from
'CtoC.
Improvements
-
Branch-specific stale recovery - printing and FINISH states use
lastPrintDataMs(120s cloud / 60s LAN). Idle cloud useslastUpdate(5 min). If connection is alive but core data is stale: send a rate-limited recovery pushall and keep the PRINTING screen - never drop to idle during an active print. Drop to IDLE only when the connection itself is dead. -
Cloud keepalive raised from 5s to 30s - the 5s keepalive was too aggressive for internet connections; any network jitter triggered full disconnect + TLS re-handshake cycles. Transient hiccups no longer cause unnecessary reconnects.
-
Cloud recovery pushall rate limiting + cooldown - recovery pushalls on cloud are capped at one per 2 minutes (avoids TLS alert 49). After recovery resolves, a 5-minute cooldown prevents re-entering recovery for the same connection slot. LAN mode is unaffected.
-
Cloud UNKNOWN bootstrap pushall - when a printer powers on after the initial pushall got no response (printer was off), data starting to flow in UNKNOWN state now automatically triggers a bootstrap pushall. First attempt bypasses the 2-minute cloud throttle; retries respect it.
-
Per-reason recovery counters in diagnostics - the single
pushallRecoverycounter is split into four: Print (P), ConnDead (D), Finish (F), Idle/Unknown (I), shown asP:D:F:Iin the diagnostics page. -
mqtt_test.py fallback to profile API - the diagnostic tool now mirrors firmware behavior: if the cloud token is not a JWT, it falls back to
/v1/user-service/my/profileto resolve the userId instead of erroring out.
Technical Details
Stale timeout matrix
| State | Timestamp | Cloud timeout | LAN timeout |
|---|---|---|---|
| Printing | lastPrintDataMs |
120s | 60s |
| FINISH | lastPrintDataMs |
120s (or finishDisplayMins) | 60s |
| Idle cloud | lastUpdate |
5 min | 60s |
Recovery behavior during active print
| lastUpdate | lastPrintDataMs | Action |
|---|---|---|
| Fresh | Fresh | Normal - data flowing |
| Fresh | Stale | Recovery pushall (max 1/2min, 5min cooldown after resolve), keep PRINTING screen |
| Stale | Stale | Pushall -> 30s grace -> clear to IDLE (connection dead) |
v2.7
BambuHelper v2.7 - Release Notes
Firmware Builds
| Build Target | Board / Hardware | Display | OTA Update File | Full Flash File |
|---|---|---|---|---|
esp32s3 |
ESP32-S3 Super Mini | ST7789 240x240 | BambuHelper-esp32s3-v2.7-ota.bin |
BambuHelper-esp32s3-v2.7-Full.bin |
cyd |
ESP32-2432S028 (CYD / Cheap Yellow Display) | ILI9341 240x320 | BambuHelper-cyd-v2.7-ota.bin |
BambuHelper-cyd-v2.7-Full.bin |
ws_lcd_200 |
Waveshare ESP32-S3-Touch-LCD-2 | ST7789 240x320 | BambuHelper-ws_lcd_200-v2.7-ota.bin |
BambuHelper-ws_lcd_200-v2.7-Full.bin |
esp32c3 |
ESP32-C3 Super Mini | ST7789 240x240 | BambuHelper-esp32c3-v2.7-ota.bin |
BambuHelper-esp32c3-v2.7-Full.bin |
OTA is for updating an already working device from the BambuHelper web UI.
Full is for first-time flashing, recovery, or ESP Web Flasher use.
Note for older CYD and ESP32-C3 releases: OTA may not work correctly yet, and ESP32-C3 may report that the OTA file is too large. If OTA fails, export your settings first, then flash the matching
Fullbinary, and finally import your settings back.
Bug Fixes
- Fix: H2 cloud / H2C partial AMS updates no longer cause filament indicator and AMS active tray highlight to flicker back to WiFi during prepare/calibration - cached AMS state is now preserved until a real tray snapshot arrives
- Fix: Static network DNS parsing no longer fails silently - invalid custom DNS is now logged and falls back to the configured gateway; invalid static IP/gateway/subnet settings fall back to DHCP
- Fix: Tasmota power display flickering on Ready screen when "Alternate" mode was enabled - watts now always visible on Ready screen (alternation only applies during printing where layer count exists)
- Fix: OTA upload rejected firmware over 1.25MB - raised JS limit to match actual partition size (1.75MB)
- Fix: ETA date format inconsistent - day was missing leading zero and trailing dot (e.g. "7.04" instead of "07.04.") (closes #57)
- Fix: AMS drying screen not activating from "Print Complete" state - screen now transitions to drying view when AMS drying starts regardless of printer state
- Fix: AMS HT (id=128) tray data not displaying - raw unit id overflowed tray array, now uses sequential indexing
- Fix: AMS trays/units that disappear from MQTT payload no longer linger on screen - state is reset before each parse
- Fix: Dual-nozzle (H2D/H2C) active tray lost for external spool - snow sentinel 0xFEFF now correctly maps to external spool indicator
- Fix: Waveshare display showing incorrect colors (blue instead of yellow) - corrected RGB byte order (BGR) for ST7789V2 panel
- Fix: AMS label text overflowing screen edge when narrow groups (e.g. AMS HT with 1 slot) are near the right side
New Features
- Add: AMS drying status screen - when AMS drying is active, the idle screen automatically switches to a dedicated drying view showing temperature, remaining time, humidity (%), ETA, and a progress bar. Multiple drying AMS units rotate every 60 seconds. Display stays awake during drying. (closes #58)
- Add: Red triangle marker on active AMS tray slot for better visibility with light-colored filaments (closes #62)
- Add: New build target
ws_lcd_200- Waveshare ESP32-S3-Touch-LCD-2 (2.0" ST7789 240x320) with capacitive touch support (CST816D over I2C) - Add: New configurable gauges - AMS Humidity (1-4), AMS Temperature (1-4), and Layer Progress. Selectable per-slot in web UI. AMS humidity shows raw percentage with color-coded arc (green/yellow/red). Layer gauge auto-sizes font for large layer counts. (addresses #63)
- Add: "Keep printing screen" option - keeps the print status dashboard (gauges, temperatures, progress) visible after print completes instead of switching to idle/finish screen. AMS drying screen still takes priority. Configurable in "After Print Completes" section.
- Add: Filament remaining % - AMS tray bars now show fill level proportional to remaining filament (Bambu-branded spools only, third-party shows full bar)
- Add: AMS tray visualization on idle and finished screens (240x320 portrait mode) - shows loaded filament colors at a glance without needing to start a print
Improvements
- UI polish: cleaned up wording across the web panel for display, hardware, backup, and firmware update sections - labels are now more consistent and less ambiguous without changing behavior. Added basic ARIA metadata for collapsible sections and live status messages. Gauge Colors is now collapsed by default inside Display to reduce scrolling before applying display changes.
- Startup: reduced the optional "Show IP on startup" screen from 3.0s to 1.5s so boot feels snappier while still leaving enough time to read the address.
- OTA: auto-update asset selection now requires an exact board-variant filename match before installation starts, reducing the risk of pulling the wrong
.binfor another board. - OTA: update checks now understand patch-style versions like
v2.6.1instead of treating them like pre-release suffixes. - Web UI: improved validation and error messages for printer save, WiFi save, settings import, and manual OTA upload flows.
- Cleanup: removed dead
cydExtraModesetting path from display settings and web apply handler - the project now consistently uses AMS in that area without carrying unused config state - Refactor: critical printer
gcode_statehandling now uses an internal enum in state logic while preserving the raw MQTT text for UI and compatibility - reduces risk from string-based comparisons in screen transitions, refresh logic, and error buzzer handling - Refactor: split
main.cpploop()into smaller internal helpers without changing runtime behavior - startup, wake button handling, screen state selection, sleep timeouts, recovery, and buzzer transitions are now easier to follow and maintain - CYD: enabled auto-update (check + download from GitHub), previously only manual OTA upload was available
- Add: "Always show time remaining" option in display settings - shows remaining time (h:mm) instead of calculated ETA (contributed by @noliran, PR #61)
- Improved AMS HT support - single-slot AMS HT now renders correctly as 1 tray bar instead of 4 (portrait and landscape)
- Finished screen (240x320) - layout vertically centered, kWh and AMS strip positioned without overlap
- Renamed internal DISPLAY_CYD to DISPLAY_240x320 - reflects that CYD and Waveshare share the same layout profile
Upgrade Notes
- C3/CYD users on v2.6 or older: if OTA upload fails with "file too large", use the Full .bin via ESP Web Flasher (one-time). After that, OTA will work for future updates.
v2.6
BambuHelper v2.6 Release Notes
New features
Configurable gauge layout (per-printer)
- Choose which widget goes in each of the 6 gauge slots on the printing screen - any combination of Progress, Nozzle Temp, Bed Temp, Part Fan, Aux Fan, Chamber Fan, Chamber Temp, Heatbreak Fan, Clock, or Empty
- Layout is configured per printer, useful when running different models (e.g. A1 without chamber fan vs P1S with all fans)
- New gauge types: Chamber Temp, Heatbreak Fan, and Clock (HH:MM widget)
- Dedicated color settings for the new gauge types in the Display section
Inspired by @i-snake-z BambuHelper Fork.
Idle clock improvements
- Flicker-free updates - only changed digits are redrawn
- Blinking colon - 500ms on/off between hours and minutes
- Customizable clock colors - new "Time color" and "Date color" pickers, with per-theme defaults
Inspired by @i-snake-z BambuHelper Fork.
Button click sound (buzzer feedback)
- New optional "Click sound when button pressed" checkbox in buzzer settings - audible feedback for capacitive touch buttons (TTP223) that have no physical click
- Only appears when both button and buzzer are enabled
- Short 4kHz tick (8ms), ignores quiet hours since it's user-initiated
CYD / ESP32-C3: single printer limit
- CYD and ESP32-C3 boards are now limited to 1 printer - not enough RAM for two simultaneous TLS+MQTT connections
- Web UI hides "Printer 2" tab on these boards with an info banner
- ESP32-S3 is unaffected and continues to support 2 printers
Bug fixes
Cloud mode: stale "Ready" status for powered-off printers
- Display previously kept showing "Ready" with cached temperatures when a cloud printer was powered off
- After 5 minutes without updates, cached telemetry is cleared and display shows "Waiting..." instead
- Button press on "Waiting..." triggers a manual cloud refresh; "Press to refresh" hint appears after 60 seconds
Stale FINISH recovery for silent printers
- Fixed printers getting stuck on "Print Complete" with frozen data if MQTT updates stopped after finishing
- Recovery pushall is attempted first, then state is cleared to "Waiting..." if the printer stays silent
Slow screen wake-up on button press
- Waking the display from sleep/clock took 3-4 seconds because MQTT reconnect (TLS handshake / TCP test) blocked the main loop
- Reordered main loop: button handling and display update now run before MQTT
- Disconnected MQTT sessions skip reconnect on the wake iteration so the screen lights up instantly
- Reduced LAN TCP reachability timeout from 3s to 1s (on-network printers respond in <50ms)
Finish screen timeout reliability
- Fixed "display off / show clock after print complete" timeout failing on the FINISH screen
- Timeout now works at the screen-state level regardless of WiFi/MQTT connection status
Breakout clock (Pong) fixes
- Customizable time/date colors from Display Settings
- Respects selected date format (all 6 options)
- Fixed ball getting stuck in an infinite bounce loop between bricks
- 12h/24h toggle now properly resets the Breakout clock state
Print Complete: Tasmota power display
- Finish screen now shows live power draw in watts alongside the per-print kWh total
- Fixed Tasmota data not returning after temporary network interruption
Stability & internals
Security: credentials removed from HTML and API
contributed by @theNailz in #39
- WiFi password and access code no longer exposed in page source or DevTools
- Access code removed from
/configJSON API response
WiFi reconnection with exponential backoff
contributed by @theNailz in #40
- 3-phase backoff: 10s (5x) -> 30s (5x) -> 60s (indefinite), replaces "5 attempts then permanent AP mode"
- AP+STA coexistence - config portal stays accessible while STA probing continues
- Automatic STA recovery every 2 minutes from AP mode
Stuck connecting screen recovery
contributed by @theNailz in #41
- Display recovers to clock/idle after 60 seconds stuck on "Connecting" instead of hanging indefinitely
OTA firmware size validation
contributed by @theNailz in #42
- Validates firmware size against OTA partition boundary before writing
- Optional MD5 checksum verification via
X-MD5header
Web interface: streamed template rendering
contributed by @theNailz in #38
- Settings page streamed from flash instead of copied into a ~64KB heap buffer
- Peak heap usage drops from ~130KB to ~2KB, fixing silent failures on ESP32-C3
- Fixed empty timezone dropdown on low-RAM boards
Other
contributed by @theNailz in #38, #43
- Non-blocking web server restarts (no more watchdog resets during save/OTA)
- Buzzer quiet hour input validation
- NVS timezone migration consolidated into a single transaction with
tz_migratedflag
v2.5
BambuHelper v2.5 Release Notes
First time flashing a new device? Use the firmware file ending with -Full (e.g.
BambuHelper-esp32s3-v2.5-Full.bin). The regular (non-Full) firmware is for OTA updates on devices that already have BambuHelper installed.
Power Monitoring via Tasmota (BETA)
- Live watt display in the bottom status bar, alongside the layer counter
- Two display modes: alternate between layer count and watts every 4s, or always show watts
- Configurable poll interval - 10, 15, 20, or 30 seconds (Tasmota HTTP, no MQTT broker required)
- Print energy summary - total kWh shown on the "Print Complete" screen (e.g.
⚡ 0.234 kWh) - Graceful fallback when plug is offline; disabled by default, zero impact when not configured
- This feature is in beta - functionality may change in future releases
Screensaver brightness (NEW)
contributed by @theNailz in #16
- Separate brightness for clock/screensaver screen - auto-dim when idle without affecting printing brightness
- Respects night mode (lower value wins); included in settings export/import
ESP32-C3 Super Mini support (NEW)
contributed by @noliran in #13
- New build target for ESP32-C3 Super Mini with ST7789 1.69" 240x240 display (
pio run -e esp32c3) - Does not affect existing S3 or CYD builds
- Includes automatic patch for a TFT_eSPI SPI host bug on C3
Web UI improvements
contributed by @theNailz in #18, #19, #20
- XSS hardening - dynamic content is now HTML-escaped; status messages use
textContentwhere possible - Meaningful error messages - descriptive toasts ("Save failed", "Network error", etc.) replace generic "Error"
- Polling optimization - live stats and diagnostics timers stop when their sections are collapsed
Display settings redesign (NEW)
contributed by @theNailz in #24
- Logical sub-sections: Brightness, After Print Completes, Screen, Clock Settings, Gauge Colors
- Single "When print finishes" dropdown replaces the old timeout + checkbox combo - impossible to create broken combinations, fully backwards-compatible
Timezone and date format improvements (NEW)
contributed by @theNailz in #22
- Timezone dropdown in Windows-style format, sorted by UTC offset
- Timezone migrates safely across database reorders by matching POSIX TZ string
- Date format selection - 6 options (DD.MM.YYYY, MM/DD/YYYY, YYYY-MM-DD, etc.)
Brightness slider UX fix
contributed by @theNailz in #25
- Night mode and screensaver sliders no longer change live brightness while dragging
- All brightness sliders snap in increments of 5
Security hardening
contributed by @theNailz in #26
- Credentials cleared from RAM before factory reset; cloud token zeroed after MQTT connect
- TLS certificate verification enabled for cloud API calls (falls back to unverified if CA handshake fails)
A huge thank you to @theNailz for yet another round of quality contributions to this release. From security hardening to UX improvements to real bug fixes - the kind of thoughtful, well-tested work that makes this project better for everyone. It means a lot.
Stability and safety fixes
contributed by @theNailz in #32, #33
- HTTP client leak fixed in cloud API calls
- Unsigned underflow in AMS search loop guarded against out-of-bounds read
- Array bounds enforced in Pong screensaver with
static_assert - Null-pointer crash in gauge cache fixed (FIFO eviction instead of
nullptr) - DNS server leak fixed when transitioning from AP to STA mode
millis() == 0sentinel replaced with explicit flags (would misfire after ~49 days)- Bounds check added to
displayedPrinter()and stale fetch guard for printer tab switching
WiFi RSSI in /debug endpoint
contributed by @theNailz in #31
- WiFi signal strength (dBm) now included in
GET /debugJSON response
Fix: clock screen not appearing when finish timeout is 0
contributed by @theNailz in #23
finishDisplayMins == 0with clock enabled now correctly transitions to clock instead of staying on the finish screen
Fix: display going blank when applying settings in clock/screensaver mode
contributed by @theNailz in #29
- Applying display settings while clock/screensaver was active caused a black screen for up to 60s
- Fixed: timezone only reconfigured when changed; RTC fallback added; display throttle reset on apply
Fix: H2 series printers not working in LAN mode
- H2S/H2C/H2D in LAN mode showed "connected" but never received data
- MQTT buffer increased from 16KB to 40KB to handle H2's larger payloads (~33KB)
- H2 LAN mode requires both LAN-only mode and Developer Mode on the printer
Fix: false "Ready" screen during cloud printing
- Cloud printers could briefly show "Ready" mid-print when the broker stopped pushing updates for >5 minutes
- Recovery pushall is now sent when the stale timer fires during an active print; all MQTT messages (not just
printobjects) now reset the stale timer
v2.4
BambuHelper v2.4 Release Notes
OTA firmware update (NEW)
- Web-based OTA updates - upload new firmware directly from the web UI, no USB cable needed
- Upload a .bin file in the "WiFi & System" section, progress bar shows upload status
- All settings preserved after update (WiFi, printers, cloud tokens, display config)
- This will be useful for next releases.
Date format fix
- Locale-aware date format - clock screens (standard and Pong) now use DD.MM.YYYY in 24h mode and MM/DD/YYYY in 12h mode (previously always DD.MM.YYYY regardless of setting)
- ETA date format - print ETA on the dashboard now uses MM/DD format in 12h mode (was DD.MM)
Screen wakeup fix
- Wake from screen off on print end - when display auto-off was active and printer left FINISH state, the screen now properly wakes up to IDLE instead of staying off until button press
- SCREEN_CLOCK remains sticky (only button or new print exits it)
Night mode (NEW)
- Scheduled display dimming - automatically dim the screen during set hours (e.g. 22:00-07:00), with a separate brightness slider for the night period
- Supports wrap-around schedules (across midnight)
- Night brightness respects all wake-up paths (button press, print start, screen off exit)
- Requires NTP time sync to activate
- Configurable in the Display section of the web UI
H2 dual nozzle - right nozzle filament display (FIX)
- Right nozzle filament now shown - previously only the left nozzle's filament was displayed (tray_now only reports left nozzle). Now uses per-nozzle
snowfield fromextruder.info[]to determine the active tray for each nozzle independently - Filament color and name display correctly regardless of which nozzle is printing
- Works with any AMS configuration across both nozzles
Door open acknowledge after print (NEW)
- Wait for door open before screen timeout - on printers with a door sensor (H2 series), the finish screen stays active until the enclosure door is opened, treating it as acknowledgment that the print was removed
- After door opens, the normal display timeout starts (configurable minutes to clock/off)
- "Open door to dismiss" indicator shown in orange on the finish screen while waiting
- Optional - enable via checkbox in Display settings ("Wait for door open after print")
- Printers without a door sensor ignore this setting and use normal timeout behavior
- Door sensor state parsed from MQTT
statfield (hex, bit 0x00800000)
Smoother gauge animations
- Adaptive frame rate for arc gauges - gauge arcs now animate at ~12 FPS during value transitions (up from 4 FPS), then drop back to the normal refresh rate once settled. Interpolation step size adjusted to match, producing visibly smoother temperature and fan gauge sweeps with no extra CPU cost at idle
WiFi connection retry
- Retry on boot - WiFi connection now retries up to 3 times (15s each) before falling back to AP mode, improving reliability on networks that are slow to respond or temporarily busy
Bug fixes
- MQTT parser buffer overread -
deserializeJson()for extruder and vt_tray sections was called without a length limit, allowing reads past the MQTT payload buffer. Now bounded by payload size. - Timezone migration never persisted - NVS Preferences were opened read-only during
loadSettings(), so the old-to-new timezone format migration wrote correctly to RAM but silently failed to save to flash. Migration re-ran on every boot. Now properly reopens in write mode for migration. - Cloud printer userId self-heal broken -
isPrinterConfigured()requiredcloudUserIdfor cloud slots, butinitBambuMqtt()only tried userId extraction whenisPrinterConfigured()was true ANDcloudUserIdwas empty - a logical contradiction. Cloud slots with token+serial but missing userId could never recover without manual re-save. - Stale cloud data showing wrong screen - when cloud printer (H2C) stopped sending MQTT data for 5+ minutes, the display fell back to 2-gauge idle screen with "RUNNING" text instead of the 6-gauge printing dashboard. Stale timeout now properly resets both the printing flag and gcode state.
- Idle/blank screen never triggered with offline printers - when both printers were off or unreachable at startup, the display stayed on the "Connecting to Printer" screen forever and never transitioned to clock or blank screen. Idle timeout now also applies to the connecting screen.
- No path from idle to screen off - when "Show clock after finish" was disabled, the idle screen had no timeout path to screen off (only idle-to-clock existed). Both clock and off transitions now work from idle and connecting screens.
ESP32-2432S028 (CYD) support
- New build target - ESP32-2432S028 ("Cheap Yellow Display") with ILI9341 2.8" 320x240 in portrait mode (240x320)
- Separate PlatformIO environment (
pio run -e cyd), does not affect the existing S3+ST7789 build - Layout system with per-display profile constants - adding future displays requires only a new
layout_*.hfile - XPT2046 touchscreen as button replacement - tap anywhere to wake display or cycle printers
- New button type "Touchscreen (XPT2046)" in web UI, auto-enabled on CYD builds
merge_bins.pysupports--board cydfor CYD firmware packaging (bootloader offset 0x1000)- Full landscape support - rotation 90/270 now works correctly on CYD (320x240 actual). Idle, finished, and printing screens use runtime dimensions instead of compile-time portrait constants. No more off-screen elements.
- AMS in both orientations - AMS filament visualization renders in portrait (horizontal strip) and landscape (vertical sidebar). Previously landscape was blocked by a
!landguard despite the renderer being complete. - CYD Extra Area Mode (NEW) - new setting in Display section of web UI: choose between "AMS Filament" or "Extra Gauges (Chamber + Heatbreak Fan)" for the extra CYD screen space. In portrait, extra gauges appear between the gauge rows and ETA. In landscape, they appear in the right sidebar. Setting has no effect on 240x240 displays.
v2.3
BambuHelper v2.3 Release Notes
AMS filament indicator (NEW)
- Active filament on screen - colored dot + filament type (e.g. "PLA Matte") shown on the bottom bar during PRINTING and IDLE screens
- Works with all AMS units (up to 4 units, 16 trays) and external spool (vt_tray)
- Black filament visibility - gray outline around the color dot so it's visible on dark backgrounds
- Falls back to WiFi signal display when no AMS is present or no tray is active
- Data parsed from MQTT pushall using memmem() raw scan (same proven pattern as H2C dual nozzle)
Smooth gauge animations (NEW)
- Smooth arc transitions - gauge arcs interpolate smoothly to new values instead of jumping instantly
- Text values update immediately (no delay), only the arc animates
- Exponential smoothing at 4Hz with ~1s settle time
Gauge flicker elimination
- Text cache system - gauge center is only cleared and redrawn when the displayed text actually changes (e.g. "220" to "221"), not on every MQTT update
- Transparent text rendering - text inside gauges uses transparent background to avoid rectangular artifacts overlapping the arc
- Bottom bar WiFi filter - WiFi RSSI noise no longer triggers bottom bar redraws when AMS filament indicator is shown instead
Buzzer improvements
- Test buzzer button - cycle through all sounds (Print Finished, Error, Connected) directly from the web UI
- Section renamed - "Multi-Printer" section renamed to "Hardware & Multi-Printer" for discoverability
Display improvements
- Larger gauge labels - gauge labels ("Nozzle", "Part", etc.) upgraded from Font 1 (8px) to Font 2 (16px), positioned closer to the gauge arc
- Smaller labels option - checkbox in Display settings to revert to the original smaller labels
- Animated progress bar default - shimmer effect now enabled by default
- Bottom bar font upgrade - bottom status bar changed from Font 1 (8px) to Font 2 (16px) for better readability
- Default background color - changed from dark navy (0x0861) to black (0x0000)
- Multi-printer no longer beta - removed BETA tag from multi-printer support
Cloud MQTT stability fix (IMPORTANT)
- Fixed cloud reconnect loop - cloud printers (H2C, H2D, H2S, P2S) could enter a disconnect/reconnect cycle every 5-100 seconds with TLS error 49 (access_denied). Root cause: static MQTT client ID caused session collisions on the Bambu Cloud broker when the previous TLS session hadn't fully closed server-side
- Random client ID for cloud - each cloud connection now uses a unique random client ID (like pybambu/Home Assistant), preventing broker session conflicts
- Clean TLS on cloud reconnect - TLS and MQTT objects are fully destroyed and recreated before each cloud reconnect, eliminating stale session state
- Initial-only pushall for cloud - cloud sends one pushall request after connecting (for immediate full status), but no periodic pushall - cloud broker pushes updates automatically and repeated publishing could trigger access_denied
- Instant first connection - removed unnecessary 30s delay before the first cloud reconnect attempt, reducing initial connection time from ~23s to ~3s
- Smart backoff - connections lasting less than 30s no longer reset the backoff counter, preventing aggressive reconnect spam when the broker is rejecting connections
- Cloud reconnect interval 30s - increased from 10s to reduce broker rate limit risk
- CA certificate bundle for cloud - cloud TLS now uses proper certificate verification instead of setInsecure()
- Disconnect diagnostics - logs PubSubClient rc code, TLS error, connection duration, and message count on every disconnect for easier debugging
Connecting screen improvements
- Slide bar animation - replaced the rotating arc spinner with a smooth sliding progress bar on both WiFi and MQTT connecting screens (fixes visual glitch where the arc would briefly show as a full circle during wrap-around)
Display fixes
- Pong clock text size bug - switching from Pong clock to printer dashboard no longer shows garbled oversized text (tft.setTextSize was not reset)
- ETA fallback fix - ETA display no longer intermittently falls back to "Remaining: Xh XXm" after DST implementation (race condition in getLocalTime with timeout 0)
- Finish buzzer repeating on rotation - buzzer no longer replays the "print finished" sound every time the display rotates back to a finished printer (per-printer flag, reset on next print start)
- Gauge text cache overflow - increased cache from 8 to 12 slots to cover all screen layouts (printing: 6, idle: 2, finished: 2), preventing occasional gauge flicker on screen transitions
- Gauge text cache null-terminator - fixed missing null-terminator in force-redraw path that could cause stale text comparison reads past buffer
- Smooth animation float comparison - replaced exact float != with epsilon-based comparison to prevent edge-case animation jitter
Code quality improvements
- MQTT parser bounds checks - added payload boundary validation to whitespace-skip loops after memmem() raw scans (extruder, ams, vt_tray parsing)
- Safe string copies - replaced strcpy/strncpy with strlcpy for gcodeState initialization and gauge text cache
- Goto removal - refactored goto wifi_fallback in bottom status bar to a helper function
v2.2
BambuHelper v2.2 Release Notes
Settings backup & restore (NEW)
- Export settings - download all configuration as a JSON file from the web UI
- Import settings - upload a previously exported JSON file to restore configuration after reflashing
- Cloud token is excluded from export for security - re-login required after import
- Partial imports supported (missing fields keep current values)
Buzzer notifications (NEW, optional)
- Optional passive buzzer support on any GPIO pin
- Print finished - cheerful ascending melody (C-E-G-C)
- Print failed - triple warning beep
- Quiet hours - configurable time window to mute buzzer (e.g. 22:00-07:00)
- Disabled by default - enable in Multi-Printer section
Animated progress bar (NEW)
- Shimmer effect - a bright highlight sweeps across the progress bar during printing
- Runs at ~40fps independently of the main display refresh
- Optional - enable via checkbox in Display settings
Pong clock (NEW, optional)
- Breakout-style animated clock - classic Arcanoid game plays on the clock screen
- Colored bricks, bouncing ball, auto-tracking paddle
- On minute change, digits break apart with fragment explosion effects and bounce back
- Runs at ~50fps independently of the main display refresh
- Optional - enable via checkbox in Display settings
Automatic DST (NEW)
- Timezone regions replace the old UTC offset dropdown - select your region (e.g. "Central European (Poland, Germany)") and DST switches automatically
- No more manual DST checkbox - POSIX timezone rules handle transitions
- Existing settings migrate automatically on first boot after update
- 48 regions covering Europe, Americas, Asia-Pacific, Middle East & Africa
Display improvements
- 12h/24h time format - toggle between 24-hour and 12-hour (AM/PM) clock display
Web UI improvements
- Timezone and clock format moved from WiFi section to Display section - changing these no longer requires a device restart
- Show WiFi password - checkbox to reveal password when entering WiFi credentials
- Diagnostics moved to the bottom of the page
- Section order: Printer > Display > Multi-Printer > WiFi & System > Diagnostics
Bug fixes & reliability
- Connecting screen text alignment - connection info (mode, serial/IP, elapsed time) was rendered off-center due to a text datum bug; now properly centered with larger font
- Gauge Colors card styling - Gauge Colors section in web UI was missing card border/padding due to a premature closing
</div>; now renders inside the Display card correctly - Background color fix - custom background colors (e.g. pure black) now apply consistently across all UI elements; previously some areas used the default dark navy color creating visible gray bands
- Firmware version in boot log - serial output now shows
BambuHelper v2.x Startingfor easier troubleshooting - Serial number validation - empty serial number is now caught before MQTT connection attempt, preventing silent subscription to wrong topic (
device//report) - Printer configuration validation - web UI warns when required fields (serial, IP, access code) are missing
- MQTT diagnostic tool (
tools/mqtt_test.py) - standalone Python script for testing printer MQTT connectivity outside of BambuHelper
v2.1BETA2
v2.1BETA
BETA, Skip this version if you use 1 printer :)
Multi-Printer support and button functionality
BUGS:
- After configuring 2nd printer, 1st one will disconnect. Workaround: just reboot device and it will work.
- When idle, device will show white screen after some time and toggle with clock every minute. I forgot to add idle clock for 2nd printer
Final version most probably around next weekend: 22.03 :)
v2.0
BambuHelper v2.0 Release Notes
Bambu Cloud support (NEW)
- Cloud mode for all printers - connect any Bambu printer (H2C, H2D, H2S, P2S, P1, X1, A1...) via Bambu Cloud MQTT, no LAN mode required
- Token-based authentication - paste your access token from bambulab.com cookies, no email/password stored on device
- Region support - Americas (US), Europe (EU), China (CN) server selection
- Python helper script (
tools/get_token.py) - get your token and printer serial via command line
MQTT improvements
- Proper memory cleanup - TLS + MQTT clients (~40KB) are freed on disconnect, preventing heap exhaustion across reconnects
- Cloud pushall backoff - reduces polling when printer is idle, goes fully passive after 10 minutes (relies on broker's delta stream)
- Longer stale timeout for cloud - cloud sends less frequently, timeout adjusted to avoid false disconnects
- Heap check before connect - skips TLS allocation if free heap is below 40KB
Web interface
- Simplified cloud setup - token paste + serial number entry, inline instructions for extracting token from browser
- Server region dropdown - select US/EU/CN to match your Bambu account
- Collapsible sections - Printer, Display, Diagnostics, WiFi & System
- Diagnostics panel - MQTT connection status, attempt count, messages received, free heap, uptime
- Verbose debug logging toggle - enable/disable detailed serial output from web UI
Display
- Clock mode - after a print finishes, the display shows a digital clock with date instead of turning off (configurable in Display settings, enabled by default)
- Removed redundant "Enable Monitoring" checkbox - monitoring is always active when a printer is configured