Подсветка принтера со своей логикой в виде макросов.
Klipper даёт несколько возможностей для организации подсветки принтера. Первый вариант самый простой и он же самый ущербный, он казалось бы прост, но ограничивает наш узкими рамками своей логики. Поэтому я рекомендую использовать макросы, в них всегда можно встроить свою логику.
И так в moontaker.cfg мы прописываем
[power led]
type: klipper_device
object_name: gcode_macro led
Где power led это указания устройства, то есть мы объявляем устройство power с именем led. Далее Мы указываем тип устройства, в моём случае это klipper_device. object_name: gcode_macro led имя вызываемого макроса в данном примере это led
Далее нам нужно создать макрос для взаимодействия с moonraker
Например мой макрос выглядит так (не копируйте бездумно)
[output_pin led_button]
pin:opi:gpiochip1/gpio111
value: 0
[gcode_macro led]
variable_value: 0
gcode:
{% if printer.save_variables.variables.night_time == 0 %}
{% if (params.VALUE is undefined) and (printer["gcode_macro led"].value == 1) %}
{% set VALUE = 0 %}
{% elif (params.VALUE is undefined) and (printer["gcode_macro led"].value == 0) %}
{% set VALUE = 1 %}
{% else %}
{% set VALUE = params.VALUE|default(1)|int %}
{% endif %}
{% if VALUE == 1 %}
SET_PIN PIN=led_button VALUE=1
voice S=28
{% else %}
SET_PIN PIN=led_button VALUE=0
voice S=29
{% endif %}
SET_GCODE_VARIABLE MACRO=led VARIABLE=value VALUE={VALUE}
{% endif %}
output_pin led_button указывает на пин которым мы будем управлять, где led_button имя этого пина для управления из макроса по команде SET_PIN PIN
pin Имя пина, в данном примере это gpio opi3lts.
value: 0 значение этого пина по умолчанию 0 выключен, 1 включен.
Макрос led может вызываться без переменных а именно просто led тогда он инвертирует текущее состояние.
Или же с перемененной VALUE , которая указывает включить или выключить свет.
led VALUE=1 включает свет
led VALUE=0 выключает свет
В самом начале макроса объявляется что макрос будет временно сохранять свои значения, указываются умолчания то есть ноль variable_VALUE: 0
Далее идёт логика {% if printer.save_variables.variables.night_time == 0 %}
это проверка из мануала https://telegra.ph/Planirovka-vklyucheniya-ili-vyklyucheniya-na-osnove-tekushchego-vremeni-dlya-zadanij-ili-zapreta-vypolneniya-makrosov-ili-logiki-04-08
Если вам не надо то опустите это. и исключите в конце {% endif %}
А далее идёт сама логика макроса, её можно менять под себя и свои нужды.
{% if (params.VALUE is undefined) and (printer["gcode_macro led"].value == 1) %}
{% set VALUE = 0 %}
Тем самым мы проверяем вызывался ли макрос без внешней переменной VALUE и же сохранённый параметр макроса led был один (об сохранении параметра макроса ниже) тогда присваиваем переменной VALUE значение ноль. Если же это не верно то проверяем
{% elif (params.VALUE is undefined) and (printer["gcode_macro led"].value == 0) %}
{% set VALUE = 1 %}
Проверяем вызывался ли макрос с без внешней переменной VALUE и сохранённый параметр макроса led был ноль (о сохранении параметра макроса ниже) тогда присваиваем переменной VALUE значение один. Иначе
{% set VALUE = params.VALUE|default(1)|int %}
Присваиваем значение переменной VALUE по умолчанию единицу, так как макрос вызывался без параметров.
{% if VALUE == 1 %}
SET_PIN PIN=led_button VALUE=1
voice S=28
{% else %}
SET_PIN PIN=led_button VALUE=0
voice S=29
{% endif %}
SET_GCODE_VARIABLE MACRO=led VARIABLE=value VALUE={VALUE}
{% endif %}
Логика такова {% if VALUE == 1 %} если переменная VALUE равна единице, то переключаем пина led_button в еденицу, SET_PIN PIN=led_button VALUE=1
voice S=28 для примера, это макрос вызывает звуковое уведомление "Свет включен!"
иначе ( {% else %} ) переключаем пина led_button в ноль, SET_PIN PIN=led_button VALUE=0
voice S=29 для примера, это макрос вызывает звуковое уведомление "Свет выключен!"
SET_GCODE_VARIABLE MACRO=led VARIABLE=value VALUE={VALUE}
Это самая важная часть, это сохранение переменной пина в память. Значение VALUE сохраняем в память, чтоб мунрейкер понял статус пина.