KlipperScreen — конфиг, макросы, всплывашки

Гочи KlipperScreen, каждая из которых стоила мне отладочного цикла. База — KlipperScreen на слабом SBC, здесь — механика конфига и панели макросов.

Авто-зона #~#: всё ниже маркера стирается

В KlipperScreen.conf есть маркер #~# --- Do not edit below this line. This section is auto generated --- #~#. Ниже него KlipperScreen хранит СВОЮ сериализацию настроек (строки с префиксом #~#: тема, displayed_macros и т.д.) и перезаписывает эту зону при каждом сохранении настроек — в том числе сразу при старте сервиса.

Моя ошибка: дописал свои секции ([menu ...], [displayed_macros ...]) в конец файла — то есть НИЖЕ маркера. KlipperScreen их не прочитал (строки без префикса #~# в авто-зоне игнорируются) и стёр при первой же своей записи: файл вернулся к исходному размеру (7365 байт), мои 150 строк исчезли, а выглядело это как «секции добавлены, но ничего не изменилось».

Правило: свои секции — ТОЛЬКО выше маркера, в пользовательской зоне. Механика в исходниках: ks_includes/config.pyseparate_saved_config() делит файл по маркеру, save_user_config_options() пересобирает файл как «пользовательская часть + перегенерированный авто-хвост».

Имя принтера для секций

Секции вида [displayed_macros <имя>] и [graph <имя>] привязаны к имени принтера. Без секций [printer ...] в конфиге имя по умолчанию — буквально Printerscreen.py: pname = list(self.printers[0])[0]connect_printer(pname)). Панель макросов пишет настройки в f"displayed_macros {self._screen.state.printer_name}" (panels/gcode_macros.py).

Скрытие макросов из панели: [displayed_macros]

У вендорских прошивок панель Macros — свалка (у меня было 107 видимых стоковых макросов). Скрываются без удаления:

[displayed_macros Printer]
CLEAR_NOZZLE: False
MOVE_TO_TRASH: False
...по строке на макрос...
  • Макросы с именем на _ скрыты и так; не перечисленные в секции — видимы по умолчанию (новый макрос появится сам).
  • Вернуть видимость можно галками в Настройки → Macros прямо на экране (KlipperScreen перепишет секцию в своей авто-зоне).
  • Список всех макросов для генерации секции: GET /printer/objects/list → объекты gcode_macro *.

Параметры макросов в панели: только стиль {% set %}

KlipperScreen показывает редактируемые поля параметров у макроса ТОЛЬКО если параметры объявлены в теле так:

[gcode_macro CALIBRATE_PA]
gcode:
  {% set temp = params.TEMP|default(220)|int %}
  {% set full = params.FULL|default(0)|int %}
  QPA_CALIBRATE TEMP={temp} FULL={full}

Однострочная подстановка QPA_CALIBRATE TEMP={params.TEMP|default(220)} работает как макрос, но полей в панели НЕ даёт — я на это наступил: «у макросов бокса поля есть, у новых нет», разница была только в стиле объявления.

Важно для панели: она показывает только объекты gcode_macro — команды, зарегистрированные extra-модулями через register_command, в панель не попадают вовсе (для них нужны тонкие макросы-обёртки).

Всплывашки: action-prompts

Диалог на экране рисуется «командами действий» в консольном выводе — строками // action:prompt_.... Из макроса — {action_respond_info("action:prompt_begin Заголовок")}, из Python-extra — gcmd.respond_info('action:prompt_begin Заголовок') (respond_info сам добавляет // ):

action:prompt_begin Калибровка готова
action:prompt_text PA: K = 0.0320 — в слайсер. Сними спагетти со стола.
action:prompt_footer_button Закрыть|RESPOND TYPE=command MSG=action:prompt_end
action:prompt_show

Кнопка несёт свой G-code после |. Тот же механизм понимают Fluidd/Mainsail. Текст держать без кавычек и |.

Прочее по месту

  • Меню ([menu __main ...]) живут в пользовательской зоне и переживают рестарты; кнопка может нести confirm: с текстом подтверждения.
  • После правки конфига — systemctl restart KlipperScreen (сервис), затем проверить, что секции пережили рестарт: KlipperScreen мог переписать файл.
  • Иконки меню — из стокового набора (filament, settings, extrude, retract, refresh, fine-tune, …); несуществующая иконка не валит экран.

Живой пример полного применения (меню + скрытие 97 макросов + всплывашка результата) — Авто-калибровка PA и потока на QIDI Q2 — гайд.