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) |