- 🔥 Chamber Control - Target, mode (auto / manual / dry) and power directly from OctoPrint
- 📊 Dedicated Tab - Status / Chamber / Drying / Safety / Network / Debug subtabs with a Flot temperature chart (~30 min history)
- 🧪 Filament Drying - PLA / PETG-ABS / Custom presets, target + timer in one transaction, start/stop and a live countdown
- 🌬️ Auto Mode - Independent heater and filter-fan activation thresholds tied to the bound printer's hotbed
- 📡 MQTT Control Bridge (V1.0.4+) - Day-to-day control/status over the Panda's broker path, while WebSocket remains the safety/setup backbone
- 🔌 Native Protocol - Talks the Panda Breath WebSocket protocol — no Bambu emulation required
- 💓 Keepalive + Auto-Reconnect - Periodic query frames and a self-healing reconnect loop survive Panda Breath firmware pauses
- 🛡️ Observe-Only Mode - Safe default: connect, decode and display without sending any write frames
- 🚨 Emergency Stop - Sidebar + Safety-tab E-Stop, mirrors the device's own Work-Mode-off behaviour
- 🖨️ Print Integration - Optional auto-on at print start, auto-off at print end / cancel / fail
- 📜 GCODE Hooks -
M141/M191from your slicer re-target the chamber automatically - 🔐 Permission-Gated - Separate STATUS / CONTROL / ADMIN permissions for fine-grained access
- 🔍 Frame Debug + Disk Log - Live ring buffer and an optional persistent JSONL log for protocol troubleshooting
- 🔒 TLS Support - Optional
wss://with custom CA / client cert / key
-
Open OctoPrint web interface
-
Navigate to Settings → Plugin Manager
-
Click Get More...
-
Click Install from URL and enter:
https://github.com/Ajimaru/OctoPrint-PandaBreath/releases/latest/download/OctoPrint-PandaBreath-latest.zip -
Click Install
-
Restart OctoPrint
Manual pip install
pip install https://github.com/Ajimaru/OctoPrint-PandaBreath/releases/latest/download/OctoPrint-PandaBreath-latest.zip
The releases/latest URL always points to the newest stable release.
Access plugin settings via OctoPrint Settings → Plugins → PandaBreath.
⚠️ Start in Observe-Only mode. The plugin defaults to read-only and rejects every write command (HTTP API and MQTT-routed control). Only disable this once you have verified frame traffic in the debug panel and confirmed your device address.
| Setting | Default | Description |
|---|---|---|
| Transport | client |
client connects to the Panda Breath's own WS server. Use server only for Bambu-emulation setups. |
| Panda Breath IP / host | (empty) | IP or hostname of the device, e.g. 192.168.1.50. The ws:// (or wss:// when TLS is on) prefix and /ws path are added automatically. The adapter stays idle while this is blank. |
For server transport (Bambu-emulation), the Pairing section appears with Bind Host, Bind Port, Host IP, Serial Number and Access Code — fill these from your emulation config. In client mode against real hardware these are not needed.
- Save settings. The plugin restarts the adapter automatically.
- Open the PandaBreath sidebar widget — connection state should flip to connected.
- Enable Show debug panel in plugin tab under Plugin Settings → Debug, then open the plugin tab's Debug subtab to inspect live frames.
- Confirm you see periodic status frames carrying the current chamber temperature.
If you do not see frames within ~10 s, check the Panda Breath IP / host value and the OctoPrint log for adapter errors.
Once you trust the connection:
- Uncheck Observe-Only.
- Set Max Temperature to your chamber's safe ceiling (default
70 °C). - Adjust Timeout (default
15 s) if your network is flaky. - Use the Chamber subtab to turn power on, pick a mode and set a target.
| Setting | Default | Description |
|---|---|---|
| Observe-Only | ✅ enabled | Suppresses every write frame. Safe default — disable consciously. |
| Max Temperature | 70.0 °C |
Hard ceiling. Targets above this are rejected. |
| Timeout | 15.0 s |
Watchdog timeout — locks the controller if no status arrives in this window (auto-released on the next received frame). |
| Reconnect Delay | 5.0 s |
Base wait between reconnect attempts on WS drop (exponential backoff up to 60 s). |
Enable this if your Panda Breath is already bound to an MQTT broker (for example via the device's Bind a Broker menu).
| Setting | Default | Description |
|---|---|---|
| MQTT Enabled | ⬜ disabled | Routes operational control through MQTT when available. |
| Broker Host / Port | (empty) / 1883 |
Broker endpoint the plugin connects to. |
| Allow MQTT Control | ✅ enabled | Accepts inbound MQTT commands from the broker topic handler. |
When the MQTT bridge is active, chamber control writes are sent over MQTT; WebSocket remains active for setup/safety functions and status capture.
| Setting | Default | Description |
|---|---|---|
| GCODE Integration | ✅ enabled | Intercept M141 / M191 from the print stream and re-target the chamber. |
| Auto-On at Print Start | ⬜ disabled | Switch to AUTO mode and apply the start target when a print begins. |
| Print-Start Target | 40.0 °C |
Target temperature applied when auto-on triggers. |
| Auto-Off at Print End | ✅ enabled | Set target to 0 and turn the heater off on print done / cancel / fail. |
| Navbar E-Stop | ✅ enabled | Show the emergency-stop button in the OctoPrint navbar. |
Only relevant if your device or network policy requires wss://.
| Setting | Default | Description |
|---|---|---|
| TLS Enabled | ⬜ disabled | Switch the client to wss://. |
| CA File | (empty) | Path to a custom CA bundle. Admin-only. |
| Client Cert / Key | (empty) | Mutual-TLS material. Admin-only. |
| TLS Insecure | ⬜ disabled | Skip certificate verification — diagnostics only, do not leave on. |
PandaBreath registers three permissions, all assigned to the Admins group by default. Add them to other groups via OctoPrint's Access Control to delegate access:
PLUGIN_PANDABREATH_STATUS— read chamber state (sidebar, API GET)PLUGIN_PANDABREATH_CONTROL— change target, mode, heater on/offPLUGIN_PANDABREATH_ADMIN— lock / unlock the safety interlock, trigger E-Stop
Read-only status view: chamber temperature, power, mode, connection, bound printer, plus a mode-specific summary (manual setpoint / auto thresholds / dry preset and countdown). Lock / Unlock / E-STOP buttons sit at the bottom.
Subtabs:
- Status — live status table + temperature chart
- Chamber — power, mode, target, auto-mode thresholds
- Drying — filament presets, custom target+timer, start/stop, live countdown
- Safety — lock / unlock / E-Stop with safety banner
- Network — paired printer + reachability, Panda Breath LAN/AP, firmware, recent device responses
- Debug — frame ring buffer and persistent log management (visible when the debug panel is enabled)
Available in the sidebar, the Safety subtab and (optionally) the navbar. Sends a single work_on:false frame — matches the Panda Breath's own Work-Mode-off behaviour, which stops any running dry cycle on its own. Engages a local safety lock; an admin must Unlock to resume writes.
With GCODE Integration enabled, your slicer can drive the chamber via standard chamber-temp commands:
M141 S40 ; set chamber target to 40 °C (no wait)
M191 S40 ; set chamber target to 40 °C and waitThe commands are swallowed before they reach the printer firmware, so unsupported boards won't complain.
Contributions are welcome! Please see CONTRIBUTING.md for detailed guidelines and instructions.
Please also follow our Code of Conduct.
MIT - See LICENSE for details.
This plugin ports protocol details from BIQU-Panda-Breath-Mod and chamber_control — both MIT-licensed. Upstream license texts are reproduced under licenses/.
- 🐛 Bug Reports: GitHub Issues
- 💬 Discussion: GitHub Discussions
Note: For troubleshooting, enable Show debug panel and Persist WS frames to disk under Plugin Settings → Debug, then use the plugin tab's Debug subtab to inspect live frames and download the persistent log.
- Development: Built following OctoPrint Plugin Guidelines
- Protocol References: BIQU-Panda-Breath-Mod, chamber_control
- Contributors: See AUTHORS.md
Summary: this project exposes many status and quality badges (CI, linting, coverage, releases, maintenance, etc.). The full badge set is available below; click to expand for details.
Show all badges
Like this plugin? ⭐ Star the repo and share it with the OctoPrint community!
