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.py — separate_saved_config() делит файл по маркеру, save_user_config_options() пересобирает файл как «пользовательская часть + перегенерированный авто-хвост».
Имя принтера для секций
Секции вида [displayed_macros <имя>] и [graph <имя>] привязаны к имени принтера. Без секций [printer ...] в конфиге имя по умолчанию — буквально Printer (в screen.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 — гайд.