Important
https://wiki.bambulab.com/en/p1/manual/p1p-firmware-release-history
Bambulab decided to block printing via MQTT unless you enable lanmode only.
Consider downgrading firmware Reference !142
OR
Check the Cloud Section about enabling cloud mode
Web based application to monitor multiple bambu printers using mqtt / ftp / rtsp (no custom firmware required)
Technologies used:
- Java 21 https://www.azul.com/
- Quarkus https://quarkus.io/
- Vaadin https://vaadin.com/
Feature | A1 | A1 Mini | P1P | P1S | X1C |
---|---|---|---|---|---|
Remote View |
|
||||
Upload to SD card |
|
||||
Print .3mf from SD card1 |
|
||||
Print .gcode from SD card | ? | ? | ? | ? | ? |
Batch Printing4 | ? | ? | ? |
|
|
AMS | ? | ? | ? | ||
Send Custom GCode |
- Currently only .3mf sliced projects are supported.
In Bambu Studio/Orca slicer, make sure to slice the place and then use the "File -> Export -> Export plate sliced file". This creates a
.3mf
project with embedded.gcode
plate.
- FTPS Connections needs SSL Session Reuse via Bouncy Castle
Without enabling bouncy castle, you will see
552 SSL connection failed: session resuse required
- Getting the LiveView to work requires additional software. For more details check the docker/bambu-liveview README.
- Batch Priting allows you to upload a single/multi sliced .3mf and select which plate to send to multiple printers, each with their own filament mapping.
More screenshots in docs
- Make sure you have Java 21 installed, verify with
java -version
[user@build:~]# java -version
openjdk version "21.0.1" 2023-10-17 LTS
OpenJDK Runtime Environment Zulu21.30+15-CA (build 21.0.1+12-LTS)
OpenJDK 64-Bit Server VM Zulu21.30+15-CA (build 21.0.1+12-LTS, mixed mode, sharing)
- Download the latest
bambu-web-*-runner.jar
from releases into a new folder (or use the 1 liner below):
curl -s https://api.github.com/repos/tfyre/bambu-farm/releases/latest \
| grep browser_download_url | cut -d'"' -f4 | xargs curl -LO
- Create a
.env
config file from Minimal Config- Check out the Full Config Options section if you want to tweak some settings
- Run with
java -jar bambu-web-x.x.x-runner.jar
[user@build:~]# java -jar bambu-web-1.0.1-runner.jar
__ ____ __ _____ ___ __ ____ ______
--/ __ \/ / / / _ | / _ \/ //_/ / / / __/
-/ /_/ / /_/ / __ |/ , _/ ,< / /_/ /\ \
--\___\_\____/_/ |_/_/|_/_/|_|\____/___/
2024-01-23 08:49:05,586 INFO [io.und.servlet] (main) Initializing AtmosphereFramework
...
...
2024-01-23 08:49:05,666 INFO [com.vaa.flo.ser.DefaultDeploymentConfiguration] (main) Vaadin is running in production mode.
2024-01-23 08:49:05,912 INFO [org.apa.cam.qua.cor.CamelBootstrapRecorder] (main) Bootstrap runtime: org.apache.camel.quarkus.main.CamelMainRuntime
2024-01-23 08:49:05,913 INFO [org.apa.cam.mai.MainSupport] (main) Apache Camel (Main) 4.2.0 is starting
...
...
2024-01-23 08:49:06,029 INFO [com.tfy.bam.cam.CamelController] (main) configured
2024-01-23 08:49:06,074 INFO [org.apa.cam.imp.eng.AbstractCamelContext] (main) Apache Camel 4.2.0 (camel-1) is starting
2024-01-23 08:49:06,081 INFO [org.apa.cam.imp.eng.AbstractCamelContext] (main) Routes startup (total:10 started:0 disabled:10)
...
...
2024-01-23 08:49:06,085 INFO [org.apa.cam.imp.eng.AbstractCamelContext] (main) Apache Camel 4.2.0 (camel-1) started in 10ms (build:0ms init:0ms start:10ms)
2024-01-23 08:49:06,193 INFO [io.quarkus] (main) bambu-web 1.0.1 on JVM (powered by Quarkus 3.6.6) started in 1.421s. Listening on: http://0.0.0.0:8084
2024-01-23 08:49:06,194 INFO [io.quarkus] (main) Profile prod activated.
2024-01-23 08:49:06,194 INFO [io.quarkus] (main) Installed features: [camel-core, camel-direct, camel-paho, cdi, resteasy-reactive, resteasy-reactive-jackson,
scheduler, security, servlet, smallrye-context-propagation, vaadin-quarkus, vertx, websockets, websockets-client]
- If starting correctly, it will show
Routes startup (total:10 started:0 disabled:10)
with a number that is 2x your printer count - Head over to http://127.0.0.1:8080 and log in with
admin
/admin
Building:
mvn clean install -Pproduction
Create a new directory and copy bambu/target/bambu-web-1.0.0-runner.jar
into it, example:
tfyre@fsteyn-pc:/mnt/c/bambu-farm$ ls -al
total 64264
drwxrwxrwx 1 tfyre tfyre 4096 Jan 17 16:47 .
drwxrwxrwx 1 tfyre tfyre 4096 Jan 18 20:42 ..
-rw-rw-rw- 1 tfyre tfyre 4557 Jan 18 14:01 .env
-rw-rw-rw- 1 tfyre tfyre 65796193 Jan 18 20:38 bambu-web-1.0.0-runner.jar
Running
java -jar bambu-web-1.0.0-runner.jar
You can now access it via http://127.0.0.1:8080 (username: admin / password: admin)
Refer to README.service.md
!!Remeber to replace REPLACE_*
fields!!
Create an .env
file with the following config:
quarkus.http.host=0.0.0.0
quarkus.http.port=8080
bambu.printers.myprinter1.device-id=REPLACE_WITH_DEVICE_SERIAL
bambu.printers.myprinter1.access-code=REPLACE_WITH_DEVICE_ACCESSCODE
bambu.printers.myprinter1.ip=REPLACE_WITH_DEVICE_IP
bambu.users.admin.password=admin
bambu.users.admin.role=admin
All default options are displayed (only add to the config if you want to change)
# Gobal
bambu.dark-mode=false
# Per user (will default to global if omitted)
bambu.users.myUserName.dark-mode=false
bambu.printers.myprinter1.enabled=true
bambu.printers.myprinter1.name=Name With Spaces
bambu.printers.myprinter1.device-id=REPLACE_WITH_DEVICE_SERIAL
bambu.printers.myprinter1.username=bblp
bambu.printers.myprinter1.access-code=REPLACE_WITH_DEVICE_ACCESSCODE
bambu.printers.myprinter1.ip=REPLACE_WITH_DEVICE_IP
bambu.printers.myprinter1.use-ams=true
bambu.printers.myprinter1.timelapse=true
bambu.printers.myprinter1.bed-levelling=true
bambu.printers.myprinter1.flow-calibration=true
bambu.printers.myprinter1.vibration-calibration=true
bambu.printers.myprinter1.model=unknown / a1 / a1mini / p1p / p1s / x1c
bambu.printers.myprinter1.mqtt.port=8883
bambu.printers.myprinter1.mqtt.url=ssl://${bambu.printers.myprinter1.ip}:${bambu.printers.myprinter1.mqtt.port}
bambu.printers.myprinter1.mqtt.report-topic=device/${bambu.printers.myprinter1.device-id}/report
bambu.printers.myprinter1.mqtt.request-topic=device/${bambu.printers.myprinter1.device-id}/request
#Requesting full status interval
bambu.printers.myprinter1.mqtt.full-status=10m
bambu.printers.myprinter1.ftp.port=990
bambu.printers.myprinter1.ftp.url=ftps://${bambu.printers.myprinter1.ip}:${bambu.printers.myprinter1.ftp.port}
bambu.printers.myprinter1.ftp.log-commands=false
bambu.printers.myprinter1.stream.port=6000
bambu.printers.myprinter1.stream.live-view=false
bambu.printers.myprinter1.stream.url=ssl://${bambu.printers.myprinter1.ip}:${bambu.printers.myprinter1.stream.port}
#Restart stream if no images received interval
bambu.printers.myprinter1.stream.watch-dog=5m
Enable MQTT connection via cloud instead of directly to printer. You can either provide the username/password or a access token.
- Option 1 - username/password
Provide the username and password for https://bambulab.com/ in the format below
- Option 2 - access token
The access token can be fetched from your browser cookies or a 1 liner curl
curl -v -X POST -H 'Content-Type: application/json' -d '{"account":"YOUR_USER_NAME","password":"YOUR_PASSWORD"}' https://bambulab.com/api/sign-in/form 2>&1 | grep token= | awk '{print$3}'
Configuration:
bambu.cloud.enabled=true
# Option1: Let bambufarm login and fetch token
bambu.cloud.login.username=YOUR_LOGIN_USER
bambu.cloud.login.password=YOUR_LOGIN_PASSWORD
# Option2: fetch token via curl and paste here
bambu.cloud.token=FULL_JWT_TOKEN_FROM_COOKIES
Remember to encrypt your passwords with bcrypt (eg https://bcrypt-generator.com/)
Current roles supported:
admin
- full accessnormal
- only dashboard with readonly access
# https://bcrypt-generator.com/
#bambu.users.REPLACE_WITH_USERNAME.password=REPLACE_WITH_PASSWORD
# Insecure version:
#bambu.users.myUserName.password=myPassword
# Secure version:
bambu.users.myUserName.password=$2a$12$GtP15HEGIhqNdeKh2tFguOAg92B3cPdCh91rj7hklM7aSOuTMh1DC
bambu.users.myUserName.role=admin
bambu.users.myUserName.dark-mode=false
#Guest account with readonly role
bambu.users.guest.password=guest
bambu.users.guest.role=normal
# Skip users and automatically login as admin (default: false)
bambu.auto-login=true
Default preheat configuration is below:
bambu.preheat[0].name=Off 0/0
bambu.preheat[0].bed=0
bambu.preheat[0].nozzle=0
bambu.preheat[1].name=PLA 55/220
bambu.preheat[1].bed=55
bambu.preheat[1].nozzle=220
bambu.preheat[2].name=ABS 90/270
bambu.preheat[2].bed=90
bambu.preheat[2].nozzle=270
Remote View is the ability to remotely view or stream the printer's camera.
# defaults to true, when false, disables remote view globally
bambu.remote-view=true
# defaults to true, when false, disables remote view for dashboard, but will still be available in detail view
bambu.dashboard.remote-view=true
# defaults to true, when false, disables per printer
bambu.printers.myprinter1.stream.enable=true
Live View is the ability to remotely stream the X1C camera (or any other webcam) and requires Remote View to be enabled.
Note
Getting the LiveView to work requires additional software. For more details check the docker/bambu-liveview README.
bambu.live-view-url=/_camerastream/
# For each printer:
bambu.printers.PRINTER_ID.stream.live-view=true
# Default LiveView URL
bambu.printers.PRINTER_ID.stream.url=${bambu.live-view-url}${PRINTER_ID}
# Custom LiveView URL
bambu.printers.PRINTER_ID.stream.url=https://my_stream_domain.com/mystream
#
X1C
needs SSL Session Reuse so that SD Card functionality can work. Reference: https://stackoverflow.com/a/77587106/23289205
Without this you will see 552 SSL connection failed: session resuse required
.
Add to .env
:
bambu.use-bouncy-castle=true
Add JVM startup flag:
bash / cmd:
java -Djdk.tls.useExtendedMasterSecret=false -jar bambu-web-x.x.x-runner.jar
powershell:
java "-Djdk.tls.useExtendedMasterSecret=false" -jar bambu-web-x.x.x-runner.jar
Add to .env
:
quarkus.http.limits.max-body-size=30M
Add to .env
:
# values are in mm/minute
bambu.move-xy=5000
bambu.move-z=3000
Add to .env
:
bambu.menu-left-click=false
If you want to modify the CSS, create a file next to the .jar
file called styles.css
- Changing the display columns
Display columns is a ratio and scale based on screen width
Refer to bambu.css
Example | value for XXX |
---|---|
always 1 column | 1 |
2 columns with 1080p | 3 |
4 columns with 1080p | 5 |
:root {
--bambu-default-columns: XXX;
}
For debugging the application, add the following to .env and uncomment DEBUG or TRACE logging sections
### Log To File
quarkus.log.file.enable=true
quarkus.log.file.path=application.log
### DEBUG logging
#quarkus.log.category."com.tfyre".level=DEBUG
### TRACE logging
#quarkus.log.min-level=TRACE
#quarkus.log.category."com.tfyre".min-level=TRACE
#quarkus.log.category."com.tfyre".level=TRACE