v1.1.0
Dragon-family shared-core split, plus two new Klipper/HA integration paths.
DragonBreath is now a thin product layer over the shared
dragon-core foundation (network,
control-source selector, Bambu client, the dashboard SPA, and the MQTT client),
keeping the board, sensors, heater, safety policy, and product UI local. Existing
NVS keys, API routes, and OTA/recovery behavior are unchanged. The MQTT-Klipper and
read-only-HA paths below are new in this release.
Added
- MQTT-only Klipper control source (RFC #66) — for locked/managed Klipper
installs that can't add thedragonbreath-klipperextra. The device is commanded
byprinter.cfgmacros over the printer's own Moonraker MQTT: a retained-aware
arming contract (heat engages only on a fresh coherentseqand a live
heartbeat; 3×5 s missed heartbeats force heat off + latchcomms_lost; never arms
from retained state), anM141shim (non-blockingM191alias), and a/setup
group.GET /km-configgenerates the exactmoonraker.conf+printer.cfg+
Mosquitto ACL from your settings. Mutually exclusive with the other control
sources. - Read-only Home Assistant telemetry alongside a control source. HA can now run
as a passive monitor concurrently with Bambu/Klipper — it auto-starts when an
HA broker is configured but HA isn't the selected source, publishing MQTT-Discovery
sensors (chamber/element temp, target, mode) without subscribing commands or taking
a control lease.
Fixed
- Release hygiene:
tools/package_release.shnow refuses to package when
main/dev_config.his present, preventing a developer's Wi-Fi/Moonraker credentials
from being compiled into a locally-built release image.
Docs
/setupnow notes that filament heating zones apply only in AUTO mode (Bambu,
during an active print).
Changed
- Shared core extracted to
dragon-core. The board-neutral event log,
control-source selector, Bambu client, Wi-Fi/provisioning service, and Moonraker
client now come from the pinneddragon-coredependency under the product-neutral
dc_*namespace. Existing NVS namespaces and keys are preserved across the move. - Dashboard UI extracted to
dragon-core(dc_ui). The STA-mode single-page
dashboard now comes from the pinneddc_uicomponent — a capability-aware, shared
Dragon-family SPA served as a reproducible embedded gzip — instead of a local
pb_portal/www/app.htmlgzipped at build time. The portal owns only the HTTP
response and routes;/setup,/fw, OTA/recovery, auth, and favicon stay
product-local. Adds an additiveGET /api/v2/info→uidescriptor
(schema/product/display_name) so the shared SPA adapts per product;
older firmware without it is handled by the SPA's compatibility fallback. - MQTT clients unified on a shared, hardened
dc_mqtt. The Bambu, Home
Assistant, and Klipper-MQTT clients now share one dragon-core MQTT client with
consistent locking and reconnect, replacing per-component esp-mqtt usage.
Install (no USB — recommended): on the stock Panda web UI ("Firmware Update"), upload dragonbreath-v1.1.0.bin. It installs as an app through the stock firmware's own OTA — the stock bootloader/partitions stay in place, so you can revert to Panda later over WiFi.
Update / revert (already on DragonBreath): upload dragonbreath-v1.1.0.bin via /fw; to return to Panda, upload your stock backup's app image via /fw.
Recovery only (USB): from a source checkout, python3 tools/flash.py (backs up stock first). The full/factory image is not published — build it locally if you need it.
Alpha/beta testers: if your unit was USB-flashed, restore your stock backup first, then install this via the stock updater — a stock-layout install can't be reached by OTA from a native-layout one.
| asset | purpose |
|---|---|
dragonbreath-v1.1.0.bin |
application image — install via stock's OTA, or update/revert via /fw |
manifest.json |
provenance (source SHA, ESP-IDF, vendored-core) + per-artifact SHA-256 |
SHA256SUMS.txt |
sha256sum -c SHA256SUMS.txt |