github Keralots/BambuHelper v2.8

latest release: v2.9
12 days ago

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_154 for 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 lastUpdate stayed 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.temp instead of the legacy chamber_temper field. 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 ~c was reverted as it broke chromatic colors on inversion-corrected CYD variants.

  • Fix: X1C/X1E door sensor always showing closed (#67) - X1C sends stat with bit 0x00800000 permanently set; using it as a door indicator always read "door open" on X1C. Fixed to use home_flag bit 23 for X1C (serial prefix 00M) and X1E (prefix 03W), and stat-based parsing is now gated to H2 printers only.

  • Fix: Buzzer default pin conflict with backlight on C3 - BUZZER_DEFAULT_PIN was hardcoded to GPIO 5 on all boards. On C3, GPIO 5 is the backlight pin, so initBuzzer() 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 isConnected snapshot after mqtt->loop() - connection state was captured once at the top of handleConn(), but mqtt->loop() could disconnect internally. All subsequent logic used the stale true value and attempted publishes on a dead socket. State is now re-evaluated after loop() 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-connection gotDataSinceConnect flag.

  • Fix: Stale AMS drying state blocked screen sleep after printer disconnect - clearLiveMetrics() did not reset anyDrying, so a printer disconnecting while drying kept anyPrinterDrying() 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 cloudUserId extraction failure at startup. Startup now mirrors the web UI: local JWT extraction first, then /v1/user-service/my/profile API fallback.

  • Fix: ensureClients() failure now increments backoff counter - on persistent low-heap / allocation failures, consecutiveFails was 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 kps checkbox was missing from the applyDisplay() 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 'C to C.

Improvements

  • Branch-specific stale recovery - printing and FINISH states use lastPrintDataMs (120s cloud / 60s LAN). Idle cloud uses lastUpdate (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 pushallRecovery counter is split into four: Print (P), ConnDead (D), Finish (F), Idle/Unknown (I), shown as P:D:F:I in 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/profile to 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)

Don't miss a new BambuHelper release

NewReleases is sending notifications on new releases.