Макроси¶
Макроси -- це невеликі переюзабельні автоматизації, які спрацьовують у конкретні моменти життєвого циклу друку. BamDude підтримує два види макросів: класичні G-code макроси (принтер виконує власний G-code) та MQTT-action макроси (BamDude каже принтеру щось зробити через його MQTT control-канал — наприклад, перемкнути світло корпусу).
Використовуйте їх для механізмів заміни пластин, освітлення корпусу, керування корпусом або будь-якої іншої per-event автоматизації, якій не місце у start/end G-code слайсера.
Типи дій¶
action_type макроса вирішує, що відбувається при спрацюванні події.
Надсилає G-code-фрагмент через MQTT (gcode_line), загорнутий
маркерами M1002 gcode_claim_action. Принтер ACK-ає фрагмент, а
BamDude чекає, поки stg_cur принтера повернеться в idle, перш
ніж рапортувати про завершення макроса.
Сценарії
- Леволінг столу, власні park-позиції, vibration calibration
- Операції swap mode (виштовхнути + home + підготувати наступну плиту)
- Будь-що, що ви б поклали у start/end G-code слайсера, але хочете, щоб оркестрував це BamDude
Обмеження
- G-code на
print_startedб'ється з самим друком — прошивка вже виконує власну стартову послідовність. Не робіть цього, якщо не розумієте точно, навіщо. - Довгий G-code на
swap_mode_change_table-- ок; він виконується, коли принтер у idle між плитами.
Викликає іменовану MQTT-команду з каталогу BamDude замість того, щоб надсилати G-code. Fire-and-forget -- принтер не ACK-ає, тож BamDude нічого не чекає.
Команди, що зараз постачаються
| ID | Значення | Ефект |
|---|---|---|
chamber_light |
on / off |
Увімкнути або вимкнути світло корпусу |
print_speed |
1–4 |
Виставити рівень швидкості: Тихий, Стандартний, Спортивний, Максимальний |
Дія називає команду; значення — окреме поле, яке з'являється в редакторі після вибору дії.
Сценарії
- Авто-світло-увімкнено на старті друку, авто-світло-вимкнено на завершенні
- Перейти на тиху швидкість посеред нічного друку
- Зовнішні автоматизації, яким не потрібен G-code-пайплайн
Макроси зі світлом, створені до 0.5.3
Раніше світло було двома окремими командами, chamber_light_on і
chamber_light_off. Тепер це одна команда зі значенням On/Off, а
наявні макроси конвертуються при першому запуску нової версії —
вони роблять рівно те саме, що й робили.
Швидкість друку діє лише під час друку
Принтер приймає зміну швидкості під час друку. Bambu Studio не дає
змінити її на простої, і картка принтера в BamDude теж — тож макрос
швидкості варто вішати на layer_reached або print_started, а не
на print_finished.
Каталог живе в core/mqtt_macro_actions.py і доступний фронтенду
через /macros/meta. Нові іменовані команди додаються туди в міру
появи сценаріїв.
Сумісність
G-code макроси з версій до 0.4.0 продовжують працювати без змін. Нові макроси за замовчуванням G-code, поки ви явно не виберете MQTT-action у редакторі.
Події¶
Кожен макрос прив'язаний рівно до однієї події. Підтримка action-type не симетрична між подіями — див. таблицю.
| Подія | Коли спрацьовує | Дозволені action-types |
|---|---|---|
print_started |
Коли gcode_state переходить у RUNNING (через on_print_start) |
Лише mqtt_action. G-code-макрос на цій події тихо пропускається на runtime (macro_trigger.py логує "Skipping gcode macro — only mqtt_action macros are supported for event-driven triggers"). G-code посеред друку конфліктував би із самим друком. |
print_finished |
Коли друк досягає термінального стану (FINISH, FAILED, або IDLE-aborted), через on_print_complete |
Лише mqtt_action, з тієї ж причини — gcode тут не вмонтовано (тригер спільний з print_started). |
swap_mode_start |
Перед стартом друку, коли диспатч знає, що йдеться зі swap-mode профілем | Лише G-code на практиці — swap-mode-диспатчер виконує макрос синхронно і чекає на stg_cur повернутись у idle. Беріть G-code, що готує swap-механізм. |
swap_mode_change_table |
Після завершення друку, перед тим як черга візьме наступний елемент | Лише G-code, з тієї ж причини. Макрос фізично змінює плити. Див. Swap Mode. |
layer_reached |
Під час друку, коли лічильник шарів перетинає вказаний Шар | Лише mqtt_action — G-code відхиляється ще при збереженні, з тієї ж причини, що й для print_started. |
Не вішайте G-code на print_started / print_finished
Макрос-UI дасть зберегти комбінацію, але вона не запуститься. Якщо хочете перемикати chamber-світло чи зовнішні реле на події друку, використовуйте MQTT-action макроси. G-code на цих подіях — заплановане розширення, не поточна фіча.
layer_reached детально¶
Один шар на макрос — для двох змін на двох шарах зробіть два макроси.
Тригер — це перетин, а не точний збіг: MQTT-звіти інколи губляться, тож друк, який стрибнув з шару 48 на 52, усе одно пройшов 50, і макрос для 50 спрацює.
Спрацьовує один раз за друк, і це переживає більше, ніж очевидні випадки:
- принтер, що втратив MQTT-звʼязок посеред друку, отримує новий клієнт, чий лічильник шарів починається з 0 — цей повтор повз ваш шар макрос не запустить;
- як і рестарт BamDude посеред друку, бо те, що вже відпрацювало, записується в запис архіву цього друку, а не лише в памʼять;
- а от скасований друк і наступний за ним починають з чистого аркуша, і це саме те, чого хочеться.
Крім того, тригер чекає на справжній початок друку. Деякі моделі — зокрема P1S — тікають лічильником шарів під час калібрування перед друком, аж за пів години до першого справжнього шару. Ці тіки не рахуються.
print_finished покриває всі термінальні стани
Незалежно від того, чи друк завершився чисто, впав, чи був перерваний
з екрана принтера, print_finished спрацьовує один раз. Використовуйте
його, коли поведінка має застосовуватися незалежно від результату
(вимкнути світло, повідомити зовнішні системи тощо).
Вибір макросів на кожен друк¶
Макроси вмикаються на кожен друк окремо. Діалог друку й діалог черги показують макроси, які підходять цільовому принтеру, і виконуються лише відмічені.
- Список фільтрується за моделлю принтера, увімкненістю та збігом swap-профілю. Якщо не підходить жоден — панелі просто нема.
- Вибір памʼятається на модель принтера, точно як у панелі swap-макросів. Відкрий діалог для іншого принтера тієї ж моделі — галки ті самі.
- Памʼятається саме те, що ти вимкнув, тож макрос, створений пізніше, приходить уже відміченим, а не тихо відсутнім.
- Редагування задачі в черзі показує те, що зберегла сама задача. Макрос, створений після постановки в чергу, буде там знятим — відміть, якщо треба.
Друк, запущений повз BamDude, не виконує макросів
У друку з екрана принтера, надісланого прямо зі слайсера, запущеного з телеграма чи прийнятого віртуальним принтером, діалогу не було — отже нічого не відмічено, і нічого не виконається. Те саме стосується задач, які вже стояли в черзі до цієї версії. Якщо макрос потрібен саме на таких друках — став їх у чергу через BamDude і відмічай.
Поля фільтрів¶
Обидва типи дій ділять той самий набір фільтрів. Макрос спрацьовує, лише коли усі фільтри збігаються.
| Поле | Поведінка |
|---|---|
enabled |
Глобальний перемикач. Вимкнені макроси пропускаються без подальшої оцінки. |
printer_models |
JSON-масив model-кодів (наприклад, ["A1 Mini", "X1 Carbon"]) або ["*"] для всіх моделей. |
swap_mode_only |
Спрацьовує тільки коли swap mode на принтері увімкнено. Прихований в UI для не-swap подій. |
swap_profile |
Спрацьовує тільки коли вибраний swap-профіль принтера збігається зі значенням (a1mini_kit, a1mini_stl або jobox-a1 — див. Swap Mode). Дозволяє кільком варіантам swap-mode G-code співіснувати. |
delay_seconds |
0–3600. Відкласти дію на N секунд після тригера. 0 = негайно. |
Чому delay_seconds важливий¶
Деякі події спрацьовують якраз перед тим, як принтер опиниться у видимому стані, на який ви очікуєте. Chamber-light-on на print_started виглядає передчасним на деяких моделях, бо firmware-side стартова послідовність (нагрів, purge) ще не закінчилась. Затримка 10–30 с уникає блимання без потреби писати власну state-машину.
Редагування макросів¶
- Перейдіть до Settings → Macros.
- Виберіть або створіть макрос. Виберіть Action Type (G-code або MQTT-action).
- Виберіть Event. Для
layer_reachedзʼявиться поле Шар — вкажіть шар, на якому макрос має спрацювати. - Виставте поля фільтрів (моделі принтерів, swap mode, профіль, delay).
- Для G-code макросів вбийте сніпет у редактор. Для MQTT-action виберіть команду з dropdown — а якщо вона приймає значення, під нею зʼявиться другий dropdown.
- Save.
Спочатку перевірте G-code на принтері
Поганий G-code може пошкодити ваш принтер. Запускайте нові сніпети вручну, перш ніж прив'язувати їх до події.
Як виконуються макроси¶
Макроси виконуються як fire-and-forget asyncio таски. Повільне відправлення G-code, довгий delay або навіть мережева заминка ніколи не блокують навколишню оркестрацію -- on_print_start повертає керування одразу, а макрос спрацьовує у фоні.
Для G-code макросів диспатчер додатково чекає на колбек on_macro_complete (stg_cur принтера повертається в idle) перш ніж переходити до наступного G-code макроса в тому ж event-ланцюзі. MQTT-action макроси повністю fire-and-forget; на них нічого не чекає.
Заміна старого прапора auto_light_off¶
До 0.4.0 у BamDude був boolean auto_light_off на кожному принтері. Його прибрано в міграції m021, бо макроси роблять ту саму роботу краще -- з контролем delay, симетрією on/off, націленням на конкретні моделі та фільтрами per-swap-profile.
Щоб відтворити стару поведінку:
| Поле | Значення |
|---|---|
| Action type | MQTT-action |
| Event | print_finished |
| Command | chamber_light |
| Значення | off |
delay_seconds |
0 |
| Поле | Значення |
|---|---|
| Action type | MQTT-action |
| Event | print_started |
| Command | chamber_light |
| Значення | on |
delay_seconds |
10 (нехай нагрів спершу пройде) |
Паруйте обидва для повних циклів автоматичного освітлення. Додайте swap_mode_only=true, якщо хочете, щоб світло цикл оподібнялося лише на swap-mode прогонах.
Інтеграція зі Swap Mode¶
Swap-mode друки спираються на G-code макроси, прив'язані до swap_mode_start та swap_mode_change_table. Див. Swap Mode для повного життєвого циклу, restart-стійкого відстеження подій та порядку диспатчу на multi-printer фермах.
Макроси vs G-code Injection¶
Макроси і G-code Injection виглядають схоже, але вирішують різні проблеми:
| Аспект | Макрос | G-code injection |
|---|---|---|
| Де виконується | На сервері: BamDude шле gcode_line через MQTT на lifecycle-події. |
Вшито у file gcode: вставляється в plate_*.gcode перед upload'ом, виконується точно в тому місці print-послідовності, де слайсер ставив би end-gcode. |
| Тригер | Lifecycle-подія (print_started, print_finished, swap mode, manual). |
Per-job тоглер на самому друку. |
| Переживає падіння серверу | Ні — серверу треба бути online, щоб надіслати. | Так — як файл уже на принтері, BamDude може зникнути. |
| Найкраще для | Світло, розетки, chamber-heater, status-пінги, swap-mode plate-changes. | Park у back-left, чистий рез purge-tower, mid-print паузи, post-cool-down park, які мають піти до того, як end-gcode принтера обнулить state. |
Спершу макрос — він простіший. Опускайся до G-code injection, коли потрібен сніпет, що має спрацювати всередині end-of-print послідовності принтера і пережити падіння BamDude мід-принт.
Поради¶
Паруйте print_started із print_finished
Використовуйте по одному MQTT-action макросу на кожну подію для чистої симетричної автоматизації (світло, вентилятори, зовнішні реле).
Використовуйте delay_seconds для chamber-light-on
Затримка 10–30 с приховує фазу нагріву від камери корпусу та уникає вигляду "передчасного увімкнення світла" на H2/X1.
Поєднуйте з розумними розетками
Для повних циклів виштовхування + охолодження + вимкнення живлення паруйте end-event макроси з авто-вимкненням розумних розеток.