← nacyot / artifacts

Bambu Lab P1S — UI 없이 프로토콜로 어디까지 되나

Asahi Linux (ARM) ↔ Bambu P1S · LAN 직결 · 실측 기반 정리

핵심 한 줄: 프린터는 "UI 기기"가 아니라 "네트워크 API를 노출하는 IoT 장치"다.

Bambu Studio·Handy·OrcaSlicer 같은 앱은 전부 그 API 위에 얹힌 껍데기(GUI)일 뿐이다. 그래서 앱 없이 MQTT + FTPS 프로토콜만 직접 말하면 상태 읽기·인쇄·제어가 모두 된다. "완료되면 알림" 같은 자동화가 되는 이유가 바로 이것 — UI 의존이 아니라 프로토콜 기반이기 때문이다.

그림 1. 왜 스크립트로 다 되는가. 앱(GUI)은 맨 위 얇은 껍데기일 뿐이고, 그 밑에 프린터가 노출하는 프로토콜 API가 있다. 내 스크립트는 GUI·플러그인을 건너뛰고 이 API에 직접 말하므로, 앱이 없어도(그리고 OS가 무엇이든) 그대로 작동한다.

1. 어떻게 통신하나 — 프로토콜 4종

채널포트용도인증
MQTT (TLS)8883상태 구독(report) + 명령 발행(request) — 실시간 텔레메트리·인쇄 제어bblp / 액세스코드, 자체서명 TLS
FTPS (implicit)990파일 업/다운/삭제 — gcode·3mf·타임랩스·카메라 캡처·로그bblp / 액세스코드
RTSP (카메라)6000내장 카메라 라이브 스트림(rtsps://…/streaming/live/1)액세스코드
SSDP (발견)2021 UDP멀티캐스트로 프린터 자동 탐지(시리얼·모델·IP)없음
그림 2. 스크립트 ↔ 프린터 통신. MQTT만 양방향이다: request 토픽으로 명령을 쏘고 report 토픽으로 상태 JSON을 계속 돌려받는다. 이 구독→조건→행동 루프가 "완료 알림" 같은 자동화의 뼈대다.

MQTT 토픽: device/<시리얼>/request(명령) · device/<시리얼>/report(상태). 시리얼은 SSDP 응답에 담겨 자동 획득된다(프린터별 고유값이라 여기선 생략).

2. 읽을 수 있는 정보 — print 객체만 63개 필드

pushall 한 번으로 프린터가 뱉는 상태. 앱 화면에 안 보이는 내부값까지 전부 노출된다. 아래는 그 63개 필드를 성격별로 묶은 것.

그림 3. pushall 응답 63필드의 구성(성격별 묶음, 크기 = 필드 수). 진행 상태와 AMS·필라멘트 정보가 가장 두껍고, 온도·팬·오류·카메라·하드웨어·펌웨어까지 프린터 내부가 통째로 보인다.

📊 진행·상태

  • 상태(gcode_state: IDLE/PREPARE/RUNNING/PAUSE/FINISH/FAILED)
  • 진행 %, 레이어 n/총, 남은 시간
  • 인쇄 단계(mc_print_stage·stg_cur), 현재 gcode 라인, 파일명·task/project ID

🎨 AMS·필라멘트

  • 슬롯별 종류·색(hex)·잔량%·건조도(humidity)
  • RFID 상태, K-factor(압력 보정), 권장 노즐 온도 범위
  • 외부 스풀(vt_tray), 로드된 트레이(tray_now)

🌡️ 온도

  • 노즐 현재/목표 (nozzle_temper/_target)
  • 베드 현재/목표, 챔버 온도(chamber_temper)

🌀 팬 (4종)

  • 파트 쿨링(cooling_fan_speed), 보조/챔버 팬(big_fan1/2)
  • 히트브레이크 팬 · 팬 기어

⚠️ 오류·헬스

  • HMS 배열 — 경고·에러 코드 + 심각도(스파게티·필라멘트 런아웃·도어 열림 등)
  • print_error 코드, lifecycle

📷 카메라·네트워크

  • 카메라 상태·해상도·타임랩스·녹화(ipcam)
  • WiFi 신호(wifi_signal), 온라인 여부, SD카드 상태, 업로드 진행

🔩 하드웨어

  • 노즐 지름·타입(nozzle_diameter/_type)
  • 홈 플래그, 하드웨어 스위치, 조명(lights_report), 속도 레벨(spd_lvl), 캘리브레이션 버전

🛠️ 펌웨어·모듈 (get_version)

  • ota · esp32(AP) · mc(모션) · th(툴헤드) · ams/0
  • 각 모듈의 sn·sw·hw (구체 버전은 생략)

예를 들어 AMS는 슬롯마다 필라멘트 종류·색·잔량%·건조도가 그대로 나오고, WiFi 신호 세기·노즐 지름 같은 하드웨어 값까지 실시간으로 읽힌다.

3. 스크립팅으로 제어 가능한 것

5실제 실행·검증
9프로토콜상 가능(문서화)
63읽히는 상태 필드
4통신 채널

실행함 = 실제로 돌려서 확인 · 문서화 = 프로토콜상 가능(라이브 인쇄 방해하지 않으려 미실행)

동작방법 (MQTT request 페이로드 / 프로토콜)상태
전체 상태 읽기{"pushing":{"command":"pushall"}}실행함
펌웨어/모듈 조회{"info":{"command":"get_version"}}실행함
인쇄 시작(파일){"print":{"command":"project_file","url":"file:///sdcard/…","param":"Metadata/plate_1.gcode","use_ams":true,"ams_mapping":[슬롯]}}실행함
일시정지 / 재개 / 정지{"print":{"command":"pause"}} · resume · stop문서화
인쇄 속도 변경{"print":{"command":"print_speed","param":"2"}} (1느림~4최속)문서화
임의 G-code 주입{"print":{"command":"gcode_line","param":"M104 S220\n"}} → 노즐/베드 온도(M104/M140)·팬(M106)·이동(G0/G1)·홈(G28)·압출(G1 E) 등 무엇이든문서화
챔버 조명 on/off{"system":{"command":"ledctrl","led_node":"chamber_light","led_mode":"on"}}문서화
AMS 필라멘트 교체/설정{"print":{"command":"ams_change_filament",…}} / ams_filament_setting / unload_filament문서화
캘리브레이션(베드 레벨·공진·플로우){"print":{"command":"calibration",…}}문서화
AI 모니터링(스파게티 감지) on/off{"xcam":{"command":"xcam_control_set",…}}문서화
파일 업로드/목록/다운/삭제FTPS 990 (curl -T / ftplib) — gcode·3mf실행함
타임랩스·카메라 캡처·로그 다운로드FTPS /timelapse /image /logger문서화
카메라 라이브 보기/녹화RTSP 6000 → ffmpeg/mpv rtsps://bblp:<코드>@<프린터-ip>:6000/streaming/live/1문서화
프린터 자동 발견SSDP 멀티캐스트 → 시리얼·모델·IP실행함

앱이 하는 거의 모든 것(인쇄·모니터·온도/팬/조명 제어·AMS·캘리브·카메라)이 스크립트로 된다. 앱은 이 명령들을 버튼에 매핑한 UI일 뿐이다.

4. 맥에서도 되나? — 된다. OS 무관.

이 모든 게 되는 이유는 특정 OS라서가 아니라, 표준 네트워크 프로토콜 + 순수 파이썬이기 때문이다.

구성요소정체macOSWindowsLinux
MQTT(paho-mqtt)순수 파이썬 라이브러리
FTPS(ftplib/curl)표준 라이브러리 / curl
RTSP 카메라(ffmpeg)크로스플랫폼 툴
SSDP 발견UDP 소켓

같은 스크립트를 그대로 복사해 돌리면 어느 OS에서든 똑같이 작동한다. 같은 WiFi(또는 VPN으로 원격)에 프린터만 있으면 된다. 실제로 Bambu 공식 Handy(폰)·Studio(맥/윈)도 내부적으로는 이 MQTT/FTPS를 그대로 쓴다.

차이가 났던 딱 한 가지OrcaSlicer의 "GUI 인쇄 버튼"이었다: 그건 Bambu의 x86 전용 바이너리 플러그인을 GUI가 로드해야 해서 ARM에서 막혔고, 오픈소스 aarch64 플러그인으로 교체해 풀었다. 하지만 그건 "GUI 경로" 얘기고, 스크립팅은 애초에 그 플러그인을 거치지 않는다.

정리: "완료되면 알림" 같은 자동화가 UI 앱에선 어려운 건, 앱이 사람 클릭을 전제한 UI 루프라서다. 프린터 자체는 UI 기기가 아니라 상태를 계속 방송하고 명령을 받는 서버라, 스크립트로 구독→조건→행동(알림·재인쇄·로깅)을 자유롭게 짤 수 있다. OS가 아니라 "UI냐 프로토콜이냐"의 문제다.

5. 만든 도구

파일역할
bambu_print.pylist / upload <파일> / print <파일> <AMS슬롯> — FTPS(curl) + MQTT(paho)
watch_print.py완료 감시 → 데스크톱 팝업(notify-send) + 채팅 알림. 실패는 critical
print.sh원커맨드: STL → 슬라이스(Orca CLI) → 업로드 → 인쇄
.env (600, git 밖)접속 정보: 호스트·액세스코드·시리얼 (비밀값이라 저장소 밖 · 여기 미포함)

6. 한계 · 주의