Металл2024 Реклама
Метобр2024 Реклама

Вариант авто-рестарта Klipper при включении принтера

Zealot01
Идет загрузка
Загрузка
18.02.2021
1987
6
Личные дневники

Подпишитесь на автора

Подпишитесь на автора, если вам нравятся его публикации. Тогда вы будете получать уведомления о его новых статьях.

Отписаться от уведомлений вы всегда сможете в профиле автора.

4

Принтер у меня после печати выключен, а малина постоянно в боевой готовности, поэтому озадачился перезапуском klipper после включения принтера.

Сначала сделал через планировщик, как описано тут, но работало как то не стабильно, может перезапустить, а может и нет. Пробовал варианты в тырнете перезапуска без задержки, но заметил что перезапускается служба по нескольку раз подряд и как то раз сервис вообще вылетел. В общем решил сделать свой вариант.

Линукс я не знаю, но методом двухчасового гугления и эмпирики созрело решение. Можно поставить хук на модификацию файла в определенной папке. Файл в папке будем менять с помощью того же правила в udev.  

Выясняем PRODUCT нашего принтера при подключении через usb, как это сделать написано в вышеназванной статье.

Создаем правило для устройства. 

sudo nano /etc/udev/rules.d/99-klipper.rules

Добавляем строку

ACTION=="add", SUBSYSTEM=="usb", ENV{PRODUCT}=="<Ваш PRODUCT>", RUN+="/bin/sh -c 'echo > /dev/3dprinter/klipper_restart'"

Теперь при включении устройства будет меняться файл /dev/3dprinter/klipper_restart

Теперь создаем в  /home/pi/scripts/ простенькую програмку на питоне, которая будет ловить события изменения файлов в папке /dev/3dprinter и перезапускать klipper.

import time

import fcntl

import os

import signal

from threading import Event

FNAME = "/dev/3dprinter"

#file change event callback

def handler(signum, frame):

    #wait 3 seconds

    time.sleep(3)

    #restart klipper

    dev = os.open("/tmp/printer", os.O_RDWR)

    os.write(dev,"RESTART\n".encode())

    #return one shot event hook

    fcntl.fcntl(fd, fcntl.F_NOTIFY,fcntl.DN_MODIFY)

#set one shot event hook

signal.signal(signal.SIGIO, handler)

fd = os.open(FNAME, os.O_RDONLY)

fcntl.fcntl(fd, fcntl.F_SETSIG, 0)

fcntl.fcntl(fd, fcntl.F_NOTIFY,fcntl.DN_MODIFY)

#infinity delay

Event().wait()

Создаем стартовый скрипт, в нем также необходимо  создавать папку /dev/3dprinter, так как она будет удалена системой после перезагрузки. 

sudo mkdir /dev/3dprinter

cd /home/pi/scripts/

sudo python3 ./klipper_restart.py &

Скрипт кидаем в rc.local.

Теперь при включении принтера klipper автоматически перезагрузится один раз спустя 3 секунды. 

Подпишитесь на автора

Подпишитесь на автора, если вам нравятся его публикации. Тогда вы будете получать уведомления о его новых статьях.

Отписаться от уведомлений вы всегда сможете в профиле автора.

4
Комментарии к статье
Кремень КБ Реклама
Кремень КМ Реклама