Перейти до змісту

Керування принтером (Printer Control)

Кожна картка принтера на дашборді відкриває in-app еквівалент кнопок на тачскрині фізичного принтера. Ця сторінка — каталог: що робить кожна кнопка, який BamDude-дозвіл її закриває, і яка MQTT-команда реально летить на принтер.


Що це

Картка принтера — тонкий клієнт перед PrinterManager (backend/app/services/printer_manager.py), який спілкується з принтером по MQTT через BambuMqttClient. Картка показує:

  • Статус (idle / printing / paused / error) і живу телеметрію (temps, fans, AMS)
  • Print actions (start / pause / resume / stop / clear plate / skip object)
  • Hardware controls (chamber light, bed jog, full home, print speed, airduct mode)
  • Smart-plug actions (power on / off через прив'язану розетку)
  • Debug helpers (force MQTT refresh)

Більшість дій закриті дозволом printers:control. Дві підмножини відрізують lower-privilege дії: printers:clear_plate (тільки post-print "next job ready" handshake) і printers:read (статус + object lists, без команд).


Старт друку з картки

Перетягніть sliced .gcode або .gcode.3mf файл на картку принтера або клікніть зелену Print. Файл заливається у бібліотеку, відкривається print-modal з вибраним саме цим принтером, і робота диспетчерізується через стандартну print queue.

Картка також показує червоний overlay "Printer busy", коли ви кидаєте файл на non-idle принтер — щоб не перебити running-job. Що відбувається після dispatch — у Print Queue.

Дозвіл

printers:control. Сам upload у бібліотеку також перевіряє library:upload.

Nozzle Offset Calibration (лише dual-nozzle)

На H2D, H2D Pro, H2C і X2D діалог друку показує тогл "Nozzle Offset Calibration" — увімкнений за замовчуванням, як у Bambu Studio. Він керує тим, чи запускає принтер свою nozzle-offset калібровку перед стартом друку.

Раніше ця калібровка завжди пропускалася, без можливості її увімкнути — і, що не менш важливо, без можливості свідомо тримати її вимкненою. А цей вимкнений кейс важливий для diamond-nozzle сетапів, які не мають її ганяти.

Тогл з'являється лише на dual-nozzle принтерах. Single-nozzle машини завжди пропускають калібровку незалежно від будь-якого налаштування. Твій вибір запам'ятовується per queue item і застосовується на кожному dispatch-шляху (queue, drag-and-drop, повторний друк).

Pause / Resume

Кнопка Коли видима Endpoint Що шле
Pause State = printing POST /api/v1/printers/{id}/print/pause MQTT pause
Resume State = paused POST /api/v1/printers/{id}/print/resume MQTT resume

Обидві дії показують підтвердження, щоб уникнути fat-finger.

Stop print

POST /api/v1/printers/{id}/print/stop — шле MQTT stop і також маркує принтер як user-stopped у dispatch tracking dict. Цей другий крок важливий: без нього HMS-евристика у _dispatch_archive_update пізніше неправильно класифікує cancel-sequence HMS-код (наприклад, H2D module-0x0C) як справжній "Layer shift" fail. Зупинка друку незворотна — друк рестартує з початку, якщо ви ставите його у чергу заново.

Skip object

Для multi-object plates: пропустити окремий об'єкт, що не вдався, поки решта додруковуються.

GET  /api/v1/printers/{id}/print/objects     → список об'єктів зі skip status
POST /api/v1/printers/{id}/print/skip-objects → скіпнути обрані ID

Список береться з активного 3MF (subtask_name) — із заголовка ; model label id: у самому G-code, де він є: це той перелік, яким користується прошивка, і він називає кожну копію на плиті. slice_info.config лишається останнім запасним варіантом: новіший OrcaSlicer записує туди лише оригінал, коли на плиті кілька копій однієї моделі. З 0.5.3 список також наповнюється, коли BamDude приєднується до вже запущеного друку — раніше рестарт посеред плити лишав його порожнім, а кнопку Skip неактивною, доки хтось не відкриє цей діалог. Якщо він усе ще порожній, передайте ?reload=true — і BamDude витягне 3MF з принтерного FTP та розпарсить його заново. Підтримує кілька варіантів імен ({name}.3mf, {name}.gcode.3mf, з пробілами і underscored).

Зачекайте до layer 2

Прошивка принтера відмовляє у skip-командах, поки не покладено перший шар. Skip-modal показує жовтий банер на layer 0/1.

Збігайте ID з принтером

ID у BamDude-modal збігаються з ID на тачскрині (plate visualisation) — саме так ви ідентифікуєте, яка фізична частина яка.

Те саме є в Telegram-боті

Та сама дія, з тією самою розкладкою позначок, доступна з бота — корисно якраз тоді, коли вас немає за компʼютером. Див. Telegram-бот.

Clear plate

Після завершення (або падіння) друку, коли є jobs у черзі, з'являється кнопка Clear Plate & Start Next. Клік викликає:

POST /api/v1/printers/{id}/clear-plate

Це не шле MQTT-команду на принтер — лише фліпає server-side флаг awaiting_plate_clear, який розблоковує queue scheduler, щоб наступна start-команда пішла. Принтер прийме новий друк і автоматично переб'є свій FINISH / FAILED стан.

Прийнятні стани принтера: FINISH, FAILED, IDLE. IDLE-кейс покриває Auto-Off цикли — коли принтер був вимкнений smart plug'ом після job, persisted awaiting_plate_clear флаг ще стоїть, коли той бутиться назад в IDLE, і оператору все одно треба ack'нути cleared plate.

Окремий дозвіл

Clear-plate юзає printers:clear_plate — більш гранульований дозвіл, ніж printers:control. Можна дати техніку можливість OK'ати наступний job без права на stop / pause / chamber-light.

Clear HMS errors

POST /api/v1/printers/{id}/hms/clear — шле clean_print_error через MQTT і одразу чистить HMS-список з картки. Корисно після cancel'у, що залишив stale print_error коди.


Діалог налаштувань принтера

Per-printer діалог, який віддзеркалює Bambu Studio → Print Options + Printer Parts. Відкрий його з kebab меню на картці принтера → Printer Settings.

Чотири вкладки:

  • Print Options — усі тогли, що BS показує для конкретної моделі: AI-детекції, сенсори, поведінка plate, звук, auto-recovery. Показуються рівно ті, що принтер реально підтримує (див. Видимість).
  • Safety (X2D / P2S) — Open Door Detection + Idle Heating Protection, віддзеркалює діалог Safety Options у BS. З'являється лише на моделях із safety-опціями.
  • Printer Parts — read-only вид встановлених сопел (тип, діаметр, тип потоку). Редагування parts на принтері залишене на наступну фазу; зараз API повертає 409 parts_not_editable на спроби запису.
  • Add-ons — сам принтер + усі під'єднані аксесуари (AMS, filament buffer, exhaust fan, …), віддзеркалює вид Update Device у BS.
Група Налаштування Значення MQTT
AI-детекції AI monitoring (legacy тогл) On/Off + Low/Medium/High xcam_control_set (printing_monitor)
Spaghetti detector On/Off + Low/Medium/High xcam_control_set (spaghetti_detector)
Pile-up at purge chute On/Off + Low/Medium/High xcam_control_set (pileup_detector)
Nozzle-clumping On/Off + Low/Medium/High xcam_control_set (clump_detector)
Air-printing On/Off + Low/Medium/High xcam_control_set (airprint_detector)
First-layer inspector On/Off xcam_control_set (first_layer_inspector)
Сенсори FOD check (foreign-object) On/Off xcam_control_set (fod_check)
Displacement detection On/Off xcam_control_set (model_movement_check)
Filament tangle detect On/Off print_option (filament_tangle_detect)
Nozzle-blob detect (legacy) On/Off print_option (nozzle_blob_detect)
Nozzle-clumping (smart, 3-mode) Auto / On / Off print_option (nozzle_blob_detect_v2)
Air-print detection (sensor) On/Off print_option (air_print_detect)
Plate Виявлення позиції платформи (legacy) On/Off xcam_control_set (buildplate_marker_detector)
Build-plate marker/type detect On/Off xcam_control_set (buildplate_marker_detector)
Plate alignment check On/Off xcam_control_set (plate_offset_switch)
Камера Purify air at print end Off / Inside / Outside print_option (air_purification)
Інше Auto recovery on step loss On/Off print_option (auto_recovery)
Prompt sound On/Off print_option (sound_enable)
Camera snapshot enable On/Off ipcam_cap_pic_set
Store sent files on external storage On/Off system (print_cache_set)

Кілька опцій взаємовиключні (як у BS), тож із кожної пари бачиш лише одну: legacy-тогл позиції платформи проти новішої групи marker + alignment; legacy nozzle-blob on/off проти smart 3-режимного nozzle-clumping; і legacy AI monitoring тогл проти новіших per-type AI-детекцій (spaghetti / pile-up / clumping / air-print). Module-імена в колонці xcam_control_set — це власні wire-імена прошивки; кілька відрізняються від внутрішніх ключів BamDude і мапляться на виході, щоб тогли реально застосовувались. Open Door Detection раніше був тут; тепер він у вкладці Safety на X2D / P2S (і лишається в Print Options для X1-родини) — див. нижче.

Видимість — що відображається залежно від принтера

Кожен рядок показується лише якщо принтер рапортує, що підтримує цю опцію — визначається так само, як у Bambu Studio, з живих capability-флагів у MQTT-push (бітфілди fun / fun2 / cfg / home_flag, повідомлення xcam, та support_*-булки), а не з хардкод-таблиці по моделях. Тож список збігається з принтером — і з BS — на кожній моделі, і лишається коректним із розвитком прошивок.

На практиці, наприклад:

  • AI-детекції (spaghetti, pile-up, nozzle-clumping, air-printing) з'являються на camera-AI машинах, що рапортують їх через fun-біти — X2D і H2-родина — і коректно відсутні на P1 / A1 серіях (вони не шлють xcam.cfg, тож AI в них немає взагалі).
  • Foreign-object і displacement йдуть за тими ж fun2-support-бітами.
  • Filament tangle, nozzle blob і notification sounds беруться з home_flag-бітів, тож показуються там, де моделі їх реально мають (напр. A1 mini рапортує tangle + blob; P1S — ні).
  • Store sent files on external storage показується лише де прошивка оголошує фічу (X2D), і сховане на принтерах, що мають сховище, але фічу не оголошують (P1S).
  • Purify air йде за своїм fun2-бітом; Open Door Detection — за fun біт 12 та конфігом support_safety_options (Print Options для X1-родини, вкладка Safety для X2D / P2S).

Якщо принтер ще не надіслав повний статус (перша мить після підключення) — BamDude падає на консервативний per-family здогад, поки не прийдуть реальні флаги.

Джерело правди — принтер

BamDude не зберігає "desired state" на своєму боці. Стан у діалозі читається з MQTT-push принтера. При тогл-у — BamDude публікує відповідну MQTT-команду і починає 3-секундний hold (printer_settings_hold per-key), щоб рядок не миготів між optimistic і підтвердженим значенням — той самий патерн, що й у AMS Settings dialog.

Оскільки цей MQTT round-trip займає мить, контрол, який ти торкнувся, замерзає і показує маленьку крутілочку «очікуємо підтвердження», доки принтер не підтвердить, а тоді значення оновлюється у відкритому діалозі — він не закривається й не відкривається заново. Повторно клацати той самий тогл, поки він застосовується, не можна.

Якщо принтер втратив налаштування (factory reset, firmware-update wipe) — BamDude це відобразить. Reconciliation немає. Відкрий діалог знову і перетогль.

Вкладка Safety (X2D / P2S)

Принтери, що оголошують support_safety_options (наразі X2D і P2S), отримують вкладку Safety поруч із Print Options, віддзеркалюючи діалог Safety Options у BS:

  • Open Door Detection — що робить принтер, коли дверцята корпусу відкривають під час друку: Off / Notification / Pause printing. Читається з cfg бітів 20-21, пишеться командою system set_door_stat. На цих моделях контрол тут, а не в Print Options.
  • Idle Heating Protection — автоматично припиняє нагрів після 5 хв простою. Читається з cfg бітів 32-33 (третій стан «недоступно» робить тогл сірим, поки активна функція обслуговування нагріву принтера), пишеться через set_against_continued_heating_mode.

Дозволи й аудит

Kebab-пункт з'являється тільки для користувачів з printers:update. Той самий дозвіл захищає endpoint POST /api/v1/printers/{id}/settings.

Кожна застосована зміна пише рядок у таблицю printer_setting_audit (m061) — (printer_id, user_id, tab, action, payload_json, sequence_id, result, error_message, created_at). UI-viewer-а поки немає; query напряму, якщо треба відповісти "хто вимкнув spaghetti-детекцію минулого четверга?"

Калібровка пристрою — окремо

Калібрування столу, резонансу, шуму моторів та інші самокалібровки машини — це не тогли print-опцій, а довгі on-device рутини у власному kebab-пункті Calibration, описані нижче.


Калібровка пристрою

Власні on-device самокалібровки принтера — калібрування столу, резонанс/вібрація, шум моторів, а на новішому залізі ще й зміщення сопел, високотемпературне калібрування столу, мікро-лідар і детекція налипання на сопло. Це той самий набір, що Bambu Studio показує в Device → Calibration: не підлаштування філаменту (це майстер нижче), а власні калібровочні кроки машини, що виконуються на принтері без жодного нарізаного g-code.

Відкривається через kebab на картці принтера → Calibration.

Що доступно — залежить від моделі

BamDude показує лише ті калібровки, які реально підтримує саме твоя модель принтера та прошивка — резолвиться точно як у Bambu Studio:

Калібровка Зазвичай доступна на
Калібрування столу (Auto Bed Leveling) майже кожна модель
Компенсація вібрацій кожна модель
Шумозаглушення моторів читається наживо з принтера (P1S, серія A1, X2D, …)
Зміщення сопел двосоплові / X2D / серія H2
Високотемпературне калібрування столу X2D / серія H2 / P2S / A2L
Мікро-лідар серія X1
Детекція налипання на сопло P2S / H2S

Доступність — не хардкодена таблиця. BamDude зливає два джерела — гібридне гейтування, як у Bambu Studio:

  1. Базові дефолти — байт-у-байт копії власних per-model конфіг-файлів Bambu Studio (resources/printers/<model>.json), що поставляються в backend/app/data/printers/. Ре-синк — це ре-копія папки + git diff проти свіжого чекауту Bambu Studio.
  2. Живі прапори можливостей — власні MQTT-статус-прапори принтера, що перекривають дефолти. Зокрема Шумозаглушення моторів — це живий сигнал, а не статичний per-model прапор: одні машини оголошують його в бітфілді home_flag (серії P1 / X1), інші — в бітфілді fun (серії H2 / X2), тож BamDude показує його там, де його рапортує принтер — точно як Bambu Studio.

Живий прогрес

Обери потрібні кроки й натисни Start Calibration. Діалог лишається відкритим і показує власний покроковий прогрес принтера наживо — той самий список стадій, що рендерить Bambu Studio — кожен крок тікає pending → running → done, доки рутина не завершиться.


Калібровка філаменту

Майстер, що відображає Bambu Studio → Calibrate → Pressure Advance / Flow Rate / Towers без виходу з BamDude. Відкривається через kebab на картці принтера → Filament Calibration. Перегляд історії — на сусідньому kebab-пункті → Calibration History.

Що калібруємо

Режим Шлях Результат
PA Line Manual: плаский одношаровий блок зі сходинковими K-рядками (у кожному slow / fast / slow витискання) + цифровий tab збоку — обери найчистіший рядок, K = мітка біля нього. Зовні як PA Pattern, лише замість V-стінок — прямі лінії pa_k_value per (filament, nozzle, extruder)
PA Tower Manual: вертикальна вежа зі сходинками PA — виміряй висоту (мм) де кути найчистіші, K = Start + (Step × height) pa_k_value per (filament, nozzle, extruder)
PA Pattern Manual: гребінь V-стінок зі сходинковими K + цифровий tab знизу — обери найчистішу колонку, прочитай K за цифрою pa_k_value per (filament, nozzle, extruder)
Auto PA X1 / X1E / H2D Pro: лідар сканує + рахує K/N те саме (наперед заповнений save-діалог)
Flow Rate Manual: 9-блочний coarse (−20…+20 %) → 7-блочний fine flow_ratio per combo
Auto Flow Rate Auto-варіант на лідарних X1 те саме
Temp / VolSpeed / VFA / Retraction Tower Тільки manual-друк; результат читаєш очима і вписуєш у slicer у БД нічого не пишеться

Per-model capability gating

Auto-шляхи потребують лідар + флаг підтримки у прошивці; manual-шляхи доступні універсально.

Шлях X1-серія P1 / P2 / X2D A1 / A1 Mini H2D / H2D Pro
Manual PA / Flow Rate / Towers yes yes yes yes
Auto PA (lidar) yes — — yes (Pro)
Auto Flow Rate (lidar) yes — — yes (Pro)
Dual-extruder (per-extruder cali) — — — yes

Гейтування за слайсер-сайдкаром (0.4.5)

Калібровочний майстер Bambu Studio завжди запускає повне slicing — навіть режими, що виглядають «pre-sliced» (PA Pattern, Flow Rate, Auto PA), вантажать геометрію з resources/calib/ як скаффолд, потім BS накладає активний printer / process / filament-пресет плюс per-mode g-code-інжект через Plater::calib_* / CalibUtils::*. BamDude дзеркалить ті ж 12 BS-файлів у backend/app/data/calib_assets/, але доходить до того ж slicing-кроку через серверне нарізання через сайдкар (OrcaSlicer / Bambu Studio API).

Тож кожен режим Filament Calibration потребує підключеного сайдкара. Щоб це було очевидно:

  • Kebab-пункти Filament Calibration і Calibration History на картці принтера сховані коли "Серверне нарізання" вимкнено в Налаштуваннях (Загальне → Загальне).
  • Якщо прямий API-виклик проскочить — POST /printers/{id}/calibration/sessions повертає 409 {detail: "slicer_sidecar_required"} для будь-якого manual-режиму.
  • Auto-режими (Auto PA / Auto Flow Rate на лідарних X1 / X1E / H2D Pro) — суто printer-side; ідуть через MQTT extrusion_cali_start / flow_rate_cali_start без локального slicing. Але оскільки решта майстра залежить від сайдкара — вхід гейтиться разом.

PA Tower (Phase 1), PA Pattern (Phase 2) і PA Line (Phase 9) зведені end-to-end станом на 0.4.5 — обираєш будь-який з них у майстрі, сайдкар-слайсер пече pattern, BamDude льотить gcode на принтер, друкує, і вибиває діалог збереження по завершенню. Решта manual-режимів (Temp / Retraction / VFA / Volumetric Speed Towers, Flow Rate) проходять стадію verification (завантажуєш сирий нарізаний 3MF для порівняння на десктопі) перед переходом у production — це послідовний rollout Wave 2 калібровочної дорожньої карти.

Опції друку + swap-макроси (0.4.5)

Сторінка пресетів майстра містить ті ж PrintOptionsPanel + SwapMacrosPanel що й звичайний діалог друку. Вона читає твої збережені преференції per-printer-model (PrintModal і калібровочний майстер ділять той самий storage-ключ), тож налаштування зроблені раз для моделі — наприклад завжди-увімкнені swap-макроси для зміни столу A1, чи layer inspection для X1E — автоматично застосовуються і до калібровочних друків. Збережене upsert-иться на кожен успішний start. Калібровочно-підлаштовані дефолти: bed_levelling=true, flow_cali=false (інакше pre-print flow-cali принтера перепише M900 K-sweep з gcode і замаскує тест), swap-макроси — opt-in. MQTT-action макроси (P1S світло on/off) автоматично спрацьовують через стандартні print_started / print_finished івент-хуки — без per-job-тогла.

Стан + персистентність

  • Рядок у BamDude пишеться в filament_calibration з ключем (printer_id, filament_id, nozzle_diameter, nozzle_volume_type, extruder_id) починаючи з m063 — per-printer-instance, не per-model. Два X1C в одній фермі тримають незалежні K-значення для того ж матеріалу.
  • Принтер — джерело істини. Таблиця BamDude — це кеш. Щоразу як BamDude читає extrusion_cali_get, він віддзеркалює кожен видимий профіль у кеш за стабільною ідентичністю (name + filament_id + pa_k_value) — нові рядки приходять неактивними; ти явно промотиш один рядок на combo з модалки історії.
  • Sync запускається автоматично на кожен (ре)коннект MQTT і коли список K-profile принтера реально змінюється (hash-diff фільтр, щоб не смикати БД на кожен push_status). Manage / History-діалоги все ще тригерять свіжі тяги по запиту.
  • Кожен рядок кешу несе printer-side nozzle_id (HS00-0.4, HH00-0.6, …) — видно, на якому фізичному соплі було знято калібровку. На P1S / A1 / A1 mini (де per-profile id не приходить) BamDude деривує його з device-level стану сопла.
  • is_active=True на combo гарантує partial unique-індекс. Промотиш рядок — siblings автоматично стають неактивними.
  • Spool ↔ K-profile-зв'язки (m064) тепер тонкі: рядок spool_k_profile несе лише (spool, printer, extruder, filament_calibration_id). Сотня PETG-котушок з однаковою калібровкою колапсує в один рядок кешу + багато link-рядків замість дублювати K-дані.
  • Калібровочні assets дзеркаляться з BS resources/calib/ (AGPL-3.0) у backend/app/data/calib_assets/ — 12 файлів (3MF / STL / STEP-скаффолди; див. Гейтування за слайсер-сайдкаром вище — усі режими все одно потребують сайдкар). PA Line range: 0.0–0.1 step 0.002 (50 ліній). Flow Rate coarse: [-20, -15, -10, -5, 0, 5, 10, 15, 20] %; fine: [-5, -2, 0, 2, 5, 10, 15] %.

Шлях застосування на реальному друку

background_dispatch викликає уніфікований хелпер apply_active_calibration_to_slot для кожного AMS-слоту, який буде задіяний завданням. Порядок резолву: явний spool→calibration link → активний filament_calibration рядок за combo. Далі хелпер пере-зіставляє кешований рядок з client.state.kprofiles за стабільною ідентичністю (name + filament_id + pa_k_value), щоб знайти ЖИВИЙ cali_idx — принтер переставляє слоти після видалення сусіда, тому збережений номер це лише підказка — і фаєрить extrusion_cali_sel(ams_id, slot_id, cali_idx) перед стартом друку.

Той самий хелпер тепер ганяє з post-RFID-refresh шляху, tray-tag drift detect, auto-spool-теггера, і обох slot-assign ендпоінтів (inventory + Spoolman) — шість call-сайтів злиті в один. Закриває діру з тихим дрейфом, коли прошивка відкочувалася на дефолтний профіль після RFID-перетеггань, перепризначень слотів або рестартів, навіть якщо SpoolAssignment рядок був на місці.

Друки із зовнішніх джерел (BS, екран принтера) теж отримують вигоду: bind зберігається на принтері до явної зміни, тож останній extrusion_cali_sel, що відправив BamDude, залишається в силі.

History modal

Дві секції поряд:

  • BamDude history — рядки filament_calibration згруповані за nozzle. Per-row дії: Set Active (flip siblings + emit extrusion_cali_sel), Delete. Активний рядок виділений зеленим колечком + чекмарком.
  • Printer-side history — 16-слотний вид, підтягнутий через extrusion_cali_get. Кнопка Refresh форсує re-pull для заданого nozzle diameter.

Resume banner

Якщо закрити майстер посеред потоку (друк закінчився, але збереження ще не пройшло), при повторному відкритті побачиш жовтий banner з Resume / Discard для цієї in-flight сесії.

Permissions та audit

printers:update гейтить вхід у майстер і всі mutation-роути. Кожна дія пише рядок у calibration_audit — (printer_id, session_id, action, payload_json, sequence_id, result, error_message, created_at). Actions: start_session / save_result / set_active / delete / cancel, плюс мутації зі старої сторінки K-profiles з 0.4.5: kprofile_add / kprofile_edit / kprofile_batch_add / kprofile_delete. UI-viewer-а поки немає; query напряму.

Edit-Save без printer-relevant зміни не торкає принтер

З 0.4.5 діалог редагування K-профіля порівнює name / k_value / filament_id / nozzle_id / nozzle_diameter з завантаженим рядком перед publish'ем. Усе збігається → зберігається лише нотатка (BamDude-local); extrusion_cali_set не йде. Тримає принтер від реґенерації setting_id на кожен клік Save, через що раніше плив cache-рядок.

Що навмисно НЕМАЄ в BamDude (поки що)

  • PA range customization — start/end/step зафіксовані під BS-defaults. Якщо потрібен інший діапазон — калібруй у самому BS і імпортуй значення.
  • External spool calibration — virtual tray tray_id >= 0x10000 вимкнено для auto-шляху; manual дозволяє, але прив'язка до tray може не пережити перезавантаження принтера.
  • Tower-mode result entry в BamDude — tower-режими лише запускають друк і закінчуються. Результат читаєш очима і вписуєш у профіль філаменту в slicer-і. (BS робить так само.)

Bed Jog (Z-вісь)

Рухати plate вгору/вниз на фіксований step.

POST /api/v1/printers/{id}/bed-jog?distance=N
Param Валідація
distance Non-zero, |distance| <= 200 мм

Параметр force прибрано в 0.4.7. Він обгортав рух у M211 S0 … M211 S1 — форму команди, якої в діалекті прошивки Bambu не існує (там голе M211 S означає push стану ендстопів, а M211 R — pop), і UI слав його на кожен jog, тож усі ручні рухи йшли без явно увімкнених soft endstops. Випадковий ?force=true від старого клієнта ігнорується.

Step-селектор у поповері: 1 / 10 / 50 мм. Активний лише коли принтер не друкує.

Ця ж вісь є і у вікні Керування рухом нижче — разом із X, Y та екструдером. Обидва йдуть через одну реалізацію, тож обробка напрямку й послідовність з ендстопами не можуть розійтись.

G-code, що шле

Те, що шле власний jog Bambu Studio тим самим MQTT-каналом gcode_line (DevAxis::Ctrl_Axis). До 0.5.2 послідовність збігалась, а подача — ні: BamDude гнав Z на 600, тоді як Studio жене на 900:

M211 S              ; запам'ятати поточний стан soft endstops
M211 X1 Y1 Z1       ; ЯВНО увімкнути всі три
M1002 push_ref_mode
G91
G1 ZN F900
M1002 pop_ref_mode
M211 R              ; відновити запам'ятований стан

Увімкнення ендстопів — це й є суть: власний нарізаний стартовий G-code Bambu їх вимикає (шаблон A1 закінчується M211 X0 Y0 Z0 і назад не вмикає; H2D вмикає лише M211 Z1), тож принтер, який стоїть після друку, зазвичай має їх вимкненими. Саме тому Bambu Studio вмикає їх перед кожним ручним рухом.

Not-homed warning

Після завершення друку Z-вісь зазвичай не reference'нута. Перший jog-клік у сесії показує модалку у стилі Bambu Studio:

Вибір Дія
Auto Home Запускає повну послідовність авто-відгомлення принтера і закриває діалог. Після успіху jog працює решту browser-сесії
Cancel Закриває діалог, нічого не шле

З 0.5.2 те, чи принтер запаркований, читається з принтера (home_flag), а не запам'ятовується на сесію браузера. Стара позначка помилялась в обидва боки: парковка з екрана самої машини все одно давала попередження, а принтер, що втратив дім після нашої команди, — ні.

Кнопку Move anyway прибрано в 0.4.7 — саме вона рухала стіл із обійденими soft endstops. BamDude тепер просить спершу homing, потім jog. Це свідомо суворіше за Bambu Studio, який рух надсилає, а вже потім пропонує рецентрування: у Studio це вікно перед машиною, а ця сторінка може бути відкрита на телефоні в іншій кімнаті.

Обмежувачі ходу не гарантовані

BamDude вмикає soft endstops перед кожним jog'ом, але прошивку Bambu спостерігали за тим, як вона все одно проходить повз ліміт, і позиції осі вона не повідомляє — тож обмежити рух на боці клієнта теж неможливо. Тримайте дистанції малими (≤10 мм), доки стіл не у відомо-безпечній позиції, і стежте за принтером.


Home Axes

POST /api/v1/printers/{id}/home-axes?axes={z|xy|all}

Параметр axes тримається лише для backward compat — кожен виклик шле bare G28, незалежно від того, що ви передали. Причина — upstream issue #1052: на H2C bed homes рухом вгору до top endstop'у, і bare G28 Z пропускає toolhead-park step, який повний G28 робить першим. Результат — bed врізався у toolhead. Тому BamDude безумовно шле G28 і дає прошивці виконати її safe park-XY-then-home-Z послідовність.

Невалідні значення axes все ще повертають 400, щоб typo'и спливали.


Керування рухом

Усе, що рухається, в одному вікні — відкривається з ряду температур на картці принтера.

Голова

Кругла панель, як у Bambu Studio: зовнішнє кільце — 10 мм, внутрішнє — 1 мм, Дім у центрі.

Чому фіксовані кроки, а не поле відстані

Новіші принтери приймають ці рухи командою (xyz_ctrl), яка несе напрямок і ознаку грубо/точно — і більше нічого. На таких машинах 3 мм і 9 мм — буквально той самий запит, як і 10 мм та 200 мм. Вільне поле обіцяло б точність, якої принтер не отримує. Старіші машини й далі отримують g-code із точною відстанню; BamDude обирає шлях під принтер, як це робить Studio.

Куди «вгору» — не залежить від вашої моделі. На A1 чи A1 Mini вісь Z несе голову, а не стіл, тож та сама команда означає протилежний рух — BamDude перевертає знак за вас, і кожна кнопка шле однакове число для будь-якої машини.

Зазор сопло-стіл

Ті самі чотири кроки, що й у jog вище, розкладені обабіч підпису.

Екструдер

Проштовхнути філамент крізь сопло або втягнути назад, по 10 мм. На двосоплових машинах спершу оберіть Основний чи Допоміжний — на картинці видно, який вибрано і чи є в ньому філамент.

Нижче 170 °C екструдер не рухається

Це власний поріг Bambu Studio, і він не формальність: холодна екструзія зістругує лиску на філаменті й забиває стружкою зуби шестерні. Кнопки лишаються вимкненими й кажуть, якої температури чекають. На двосоплових кожен екструдер перевіряється окремо — тепле сопло не ручається за холодного сусіда.

Відпустити мотори

Знімає струм зі степерів (M84), щоб голову можна було посунути рукою. Це відпускає й те, що тримала вісь Z — стіл на більшості машин, голову на bed-slinger'ах.

Що відхиляється

Ситуація Що буде
Йде або призупинено друк Усе вимкнено, і API теж відмовляє (409)
X або Y не запарковані Ці рухи відхиляються — це власне правило Studio, який перевіряє до руху
Z не запаркована Теж відхиляється, і це суворіше за Studio: він рух надсилає, а рецентрування пропонує вже потім
Сопло нижче 170 °C Екструдер відхиляється (409)
Хотенд не виявлено Цей екструдер відхиляється. Принтери, які взагалі не вміють це визначати (серії A та P), не зачеплені — «не можу сказати» трактується як «встановлено», так само як у Studio
POST /api/v1/printers/{id}/jog?axis=x|y|z|e&distance=N&extruder_index=0|1
POST /api/v1/printers/{id}/disable-steppers

Обидва під printers:control.


Таймлапс: що BamDude перевіряє, перш ніж його обіцяти

Галочка таймлапсу раніше йшла будь-якому принтеру — зокрема тому, у якому картки немає: запит летів у нікуди, а друк закінчувався без відео й без пояснень. Тепер стоять дві перевірки, там само, де їх ставить Bambu Studio.

Коли ви обираєте принтери, машина, яка не може записати, називається прямо в діалозі — і саме з тією з трьох причин, яка є: немає SD-картки, картка не читається або вона лише для читання. Це три різні ситуації: картка, що стоїть у слоті й не дає себе записати, — не те саме, що порожній слот.

Картка потрібна не завжди

Принтери з внутрішньою пам'яттю для таймлапсів або зі встановленим таймлапс-кітом пишуть без неї — тож у них про картку взагалі не питають. Які саме це машини, каже сам принтер, а не список назв моделей.

Коли з черги стартує друк, а місця на принтері не лишилось, черга цього принтера стає на паузу, а не тихо викидає запис. Видалити відео, яке ви замовили, — рішення, яке нікому було ухвалити.

І ніколи не паузить на числі, якого ніхто не повідомив

Принтер, що не опублікував свій вільний обсяг, нічого не зупиняє. Застопорити ферму через невиміряну цифру було б гірше за те відео, яке ця перевірка й береже.

Там, де принтер тримає таймлапси в себе, діалог друку ще й пропонує звільнити місце, прибравши найстаріший запис — той самий вихід, що дає Bambu Studio, і без цього кліку нічого не видаляється.


Керування температурою

Задати соплу, столу й камері, а не лише читати. Відкривається кнопкою-термометром у ряду температур.

Введіть значення, крокуйте стрілками або вимкніть нагрівач зовсім. Двосоплові машини отримують обидва сопла, кожне окремо.

Межі — вашого принтера

Кожне поле показує діапазон, який ця машина справді приймає, і він не однаковий:

Сопло 20–300 °C, або той діапазон, який повідомив принтер
Стіл до 120 °C — але див. нижче
Камера 60 °C на X1E, 65 °C на родині H2

X1 на 220 В приймає нижчу температуру стола

110 °C замість 120. Читається навпаки, доки не сприймеш це як факт про сам нагрівальний елемент, а не про доступну потужність. BamDude читає напругу мережі з принтера й підганяє межу, як робить Bambu Studio.

Усе, що вище максимуму, обрізається до нього, а не відхиляється — знову ж таки, поведінка Studio.

«Вимкнено» — це справжнє значення

Нуль свідомо винесений за межі діапазону. Стіл, чий мінімум 20 °C, усе одно можна вимкнути — у цьому й сенс кнопки.

Що відхиляється

  • Камеру, яку лише вимірюють, не можна задати. X1C і P2S повідомляють температуру камери, для якої не мають нагрівача; діалог каже це прямо, а не мовчки збоїть.
  • Екструдер без хотенда не отримає команду гріти — на машинах, які це вміють визначати.

Тут немає підтвердження під час друку

На відміну від керування вентиляторами, цей діалог нічого не питає під час друку. Підкрутити температуру посеред друку — звичайне налаштування, і Bambu Studio жодну з трьох на стан друку не гейтить.

POST /api/v1/printers/{id}/temperature?part=nozzle|bed|chamber&target=N&extruder_index=0|1

Під printers:control.


Chamber Light

POST /api/v1/printers/{id}/chamber-light?on={true|false}

Тогл chamber LED через MQTT. Optimistic UI update на клік, toast confirmation на round-trip success.

H2D dual lights

На H2D обидва chamber lights керуються разом — у прошивці немає per-light тогла.


Airduct Mode (P2S / X2D / H2 series)

Доступне лише на принтерах з активним airduct (P2S, X2D, H2D, H2C, H2S). Картка показує airduct-badge у controls row; принтери без airduct ховають його повністю.

Mode Іконка З чим
Cooling PLA / PETG / TPU — фільтрує і охолоджує chamber
Heating ABS / ASA / PC / PA — циркулює і гріє chamber, закриває top exhaust flap

Зміна mode виходить як MQTT set_airduct (BambuMqttClient.set_airduct_mode). Поточний mode reflect'иться через airduct.modeCur у status push принтера — badge оновлюється, тільки-но принтер підтвердить.


Змінюйте швидкість друку посеред job без виходу з картки.

POST /api/v1/printers/{id}/print-speed?mode=N
Mode Preset Швидкість Коли
1 Silent 50% Нічні друки, шумо-чутливі кімнати
2 Standard 100% Default slicer speed
3 Sport 124% Проста геометрія, time-pressure
4 Ludicrous 166% Maximum speed

Badge у controls row показує поточний % швидкості і dimmed коли друк не активний.


Вентилятори й повітровід

Живі бейджі вентиляторів у рядку контролів показують швидкості, які повідомляє принтер, — і, там де він це дозволяє, контрол на кожен.

З'являється кожен вентилятор, про який принтер повідомляє, на будь-якій моделі. Старіші машини (P1S, P1P, X1C, A1) повітроводу не описують узагалі, тож BamDude будує ту саму картину з тих швидкостей, які вони віддають, — рівно як робить Bambu Studio перед тим, як намалювати свою панель. Раніше ці принтери показували три числа без керування; тепер керування працює.

Вентилятор, якого немає, не з'являється. Чи має машина допоміжний і камерний вентилятори, відповідають прапори можливостей самого принтера, а не список назв моделей — A1 Mini має лише обдув деталі, і все одно віддає швидкість для двох інших, тож звітована швидкість доказом бути не може.

Що режим повітроводу робить з кожним вентилятором

На машинах із повітроводом (P2S, X2D, родина H2) активний режим вирішує для кожного вентилятора одне з трьох. Бейдж показує, яке саме:

Керований режим віддає цей вентилятор тобі
Вимкнено режим тримає його вимкненим — принтер прийме команду й проігнорує її
Авто ним керує прошивка

Різниця між двома останніми істотна: перше можна змінити, змінивши режим, друге — ні. Запит швидкості для будь-якого з них відхиляється (409) з повідомленням, яке з двох це.

Встановлення швидкості

Меню на бейджі пропонує ті кроки, які принтер справді має. Принтери Bambu Lab рахують десятьма передачами, тож швидкості йдуть через 10 % — усе проміжне на льоту звелося б до чогось іншого, ніж ти обрав. Вимкнути — окремий пункт, показується коли вентилятор працює.

POST /printers/{id}/fan-speed?part_id=<n>&percent=<0-100>, під дозволом printers:control. Id, про який принтер не повідомляв, відхиляється (400), а не надсилається.

Зміна вентилятора під час друку спершу питає, як і в Studio, і запит без цього підтвердження відхиляється — щоб автоматизація не робила тихо того, про що людину попереджають. Питається раз на принтер за сесію браузера.

Вікно повітроводу

Машини, які повідомляють режими повітроводу, отримують поруч із бейджами контрол, що відкриває все одразу: режим, фільтрацію і кожен вентилятор із регулятором − / +.

  • Пропонуються ті режими, які перелічив твій принтер. Не фіксований набір — машина, що повідомила два, отримає два.
  • Режим не можна змінювати під час друку. Кнопки про це кажуть, а не падають при натисканні: заряджений матеріал — це те, заради чого режим і обрано, і Studio відмовляє тут навідріз, а не попереджає.
  • Фільтрація з'являється там, де вона є в залізі, і лише в режимі охолодження. Вона перенаправляє вентилятор на фільтрацію повітря камери, що коштує охолодження, — тож увімкнення під час друку спершу питає. Вимкнення повертає охолодження і не питає нічого.

Назви вентиляторів беруться з принтера, а не з таблиці

Той самий part id — це різні вентилятори на різних моделях: part 10 — лівий допоміжний на P2S і правий на X2D, а на X2D він ще й називається по-різному в режимах охолодження та нагріву. Назви беруться з визначень принтерів Bambu Studio, які BamDude і так поставляє, — тож P2S каже Right Auxiliary Fan, а не просто «Auxiliary».


Power Controls (smart plug)

Якщо до принтера прив'язана smart plug:

Дія Що відбувається
Power On Розетка вмикається. Принтер бутиться і реконнектиться у MQTT через кілька секунд.
Power Off Розетка вимикається. BamDude не шле MQTT-команду shutdown — просто рубає живлення.

Auto-power-off конфігурується per printer: після завершення друку і коли bed/nozzle падають нижче configurable cooldown threshold на configurable wait time, прив'язана розетка вимикається. Поля threshold + wait-time і типи інтеграції (Tasmota / HA / REST / MQTT) — у Smart Plugs.

BamDude не має "soft shutdown" MQTT-команди

Немає MQTT-команди, яка чисто гасить Bambu-принтер. Power-off іде через smart plug. Якщо її немає, єдиний спосіб погасити — кнопка на корпусі.


Force Refresh (MQTT pushall)

POST /api/v1/printers/{id}/refresh-status

Просить принтер ре-броудкастити повний статус (MQTT pushall). Корисно, коли значення на картці виглядає stale, а ви не хочете повного реконнекту — full reconnect рве існуючу MQTT/FTP сесію і повільніший. Endpoint у three-dot меню картки.

Для важчого reset'у логіка printer_manager.ensure_fresh_connection_for_printer запускається автоматично перед будь-якою control-командою — це підіймає stalled MQTT-конект без втручання оператора.


Режим обслуговування (Maintenance Mode)

Виведи принтер з експлуатації без видалення — для заміни сопла, роботи з ременем чи паркування нестабільної машини. Перемкни з kebab-меню картки принтера або з діалогу Edit.

Поки в режимі обслуговування, принтер:

  • випадає з queue dispatch і scheduler — на нього не відправляється новий джоб, і його пропускає Auto-Queue Routing та model-based assignment;
  • пропускається auto-drying — drying scheduler його ігнорує;
  • виключений з метрик і запису sensor-history;
  • відключається від MQTT і лишається відключеним, поки не вимкнеш режим обслуговування (увімкнення назад реконнектить автоматично).

Картка міняє connection-бейдж на бурштиновий пілл Maintenance () з кнопкою Exit, тож одразу видно, які машини запарковані.

Увімкнення mid-print

Вхід у режим обслуговування на принтері, що друкує або на паузі, спершу питає підтвердження — MQTT-відключення зупиняє трекінг прогресу і completion-нотифікації для активного джоба.

Дозвіл

Maintenance Mode їде на прапорці is_active принтера (без окремої колонки), тож потребує printers:update — того самого дозволу, що й редагування принтера.

Це не Maintenance Tracker

Це сервісний стан усього принтера. Він не пов'язаний із трекером Maintenance, що логує роботи по rod / nozzle / belt проти годин напрацювання: один паркує машину, інший нагадує, коли деталь на черзі.

Виводиш назавжди? Краще архівуй

Режим обслуговування лише тимчасово паркує принтер і лишає його картку видимою. Щоб вивести принтер у відставку — продано, списано — Архівуй його: картка ховається всюди, а історія друку зберігається.


Bulk Actions

Виберіть кілька карток (Select-mode toolbar зверху сторінки принтерів) і застосуйте ту саму дію до всіх одразу. Smart-enabled кнопки — активні лише коли хоча б один обраний принтер у відповідному стані для дії.

Bulk action Потрібен стан Дозвіл
Stop Хоча б один printing або paused printers:control
Pause Хоча б один printing printers:control
Resume Хоча б один paused printers:control
Clear Notifications Завжди printers:control
Clear Bed Хоча б один у FINISH / FAILED / IDLE з awaiting_plate_clear printers:clear_plate

Selection helpers у floating toolbar:

  • Select All — кожна видима картка
  • Select by State — виберіть стан (Printing / Paused / Finished / Idle / Error / Offline) і оберіть усі картки в ньому
  • Select by Location — видно лише коли хоча б у одного принтера є location

Вийти з selection mode — Esc або X на floating toolbar.


Status Badges

Три невеликих icon-only badge у top status row кожної картки:

Badge Зелений Червоний / жовтий Нотатки
SD Card inserted red коли missing Усі принтери
Door closed yellow коли відчинено X1 / P1S / P2S / X2D / H2 series only

Door state декодується з відповідного MQTT-поля per family (X1: home_flag bit 23; інші: stat bit 23) і пушиться live по WebSocket — без чекання на наступний status poll.


Permission Matrix

Дія Дозвіл
Читати статус, AMS, object list printers:read
Start / pause / resume / stop print printers:control
Bed jog, home, chamber light, print speed, airduct, skip-object, clear-HMS printers:control
Clear plate (ack наступного job) printers:clear_plate
Прив'язати/відв'язати smart plug smart_plugs:update (прив'язка — поле самої розетки, ставиться через PATCH /smart-plugs/{id})
Додати принтер printers:create
Заархівувати / відновити / видалити принтер printers:delete
Firmware push firmware:update

Дивіться також

  • Monitoring — live status display, на якому ці контроли сидять
  • Print Queue — clear-plate handshake, dispatch flow
  • Smart Plugs — power on/off, auto-power-off thresholds, plug bindings
  • Macros — multi-step custom actions, які можна запалити з меню картки
  • AMS — load / unload / calibrate
  • Notifications — маршрутизація pause / stop / fail подій

Поради

Підтверджуйте перед bulk stop

Bulk Stop незворотний. Toolbar показує одне підтвердження на весь batch — перечитайте count перед клік-через.

Skip кращий за stop

Якщо один з восьми об'єктів на plate відвалився, але решта ОК — Skip Object дотягує друк. Stop втрачає все.

Спершу force MQTT refresh

Коли картка виглядає застряглою на stale-значенні, Force Refresh (pushall) — найдешевший фікс. Restart коннекту — лише якщо pushall не допоміг.

Auto-power-off потребує thermal cool-down

Не виставляйте cooldown threshold надто агресивно — ріжучи живлення гарячого chamber, ви стресите ABS-друки і можете лишити toolhead теплою без fan'у.