Сразу оговорюсь: речь пойдёт о программе, которую я написал сам. Она бесплатная, с открытым исходным кодом, без рекламы, подписок и облачных сервисов. Ставится на свой домашний сервер (малинки, NAS, практически куда угодно, где есть Linux). Если публикация покажется кому-то рекламной, панамку расчехлил.
Проблема, из-за которой всё началось, знакома, вероятно, многим. На стеллаже стоит десяток катушек, значительная часть из них початая, и определить остаток на глаз невозможно. Взвешивание помогает лишь отчасти: вес пустой катушки у разных производителей отличается и почти нигде не указан, а записывать результат каждого измерения в таблицу мне не хватило дисциплины. Таблица прожила около двух недель, после чего перестала соответствовать реальности.
Готовые решения я смотрел. Spoolman свою задачу выполняет, но расход в него нужно вносить руками после каждой печати. Мне хотелось, чтобы это происходило автоматически (как у «Бамбуков»), поскольку любая система учёта, зависящая от моей аккуратности, рано или поздно у меня разваливается. В итоге я написал собственный сервис.
Называется он Filament Inventory Tracker. Лично у меня он запускается в Docker на домашнем сервере, но варианты установки есть разные. Данные хранятся локально, никуда не отправляются и никаких внешних аккаунтов не требуют.
На главной странице собрана общая картина склада: количество катушек, суммарный остаток пластика в граммах, список того, что заканчивается, и график расхода по месяцам. Если к сервису подключён принтер, здесь же выводится его текущее состояние с прогрессом печати, температурами и оставшимся временем.
Основной раздел — список катушек. По каждой позиции хранятся материал, цвет, остаток и место физического хранения: полка, коробка, сушилка или конкретный слот принтера. Последнее оказалось для меня не менее полезным, чем сам остаток, потому что знать о наличии чёрного PETG и знать, где он лежит, — это разные вещи.
Основная функция, ради которой всё и затевалось, — связь с принтером и автосписание. Сервис работает через Moonraker, то есть с любым принтером на Klipper; у меня Anycubic Kobra S1 Combo с прошивкой Rinkhals — проблем не возникло. После завершения печати расход распарсивается из gcode. В настройках можно включить «Автосписание» или «Автоимпорт»: в первом случае всё спишется без вашего участия, во втором нужно будет нажать кнопку «Подтвердить». Главное, чтобы были правильно выбраны катушки, участвующие в печати: все нужные, если печать многоцветная, или одна-единственная, если одноцветная. Модель принтера при добавлении выбирается из каталога, в котором сейчас более пятидесяти вариантов: количество слотов, поддержка мультиподачи и наличие сушилки подставляются автоматически — у моего Anycubic Kobra S1 Combo сушилка есть, и она подхватилась сама.
Для принтеров без Moonraker предусмотрен ручной вариант: gcode-файл загружается в сервис, расход рассчитывается по каждому инструменту, после чего инструменты сопоставляются с катушками. Действий больше, но результат тот же.
Также есть печать этикеток. Для каждой катушки формируется наклейка с производителем, материалом, цветом и рекомендованными температурами, а также QR-код, ведущий на карточку этой катушки. Можно выбирать, что именно выводить на печать.
Помимо этого есть профили филамента с сохранёнными параметрами печати, журнал всех списаний, выгрузка склада в JSON и восстановление из резервной копии. Данные из Spoolman переносятся импортом. Плюс есть уведомления в Telegram и возможность добавить датчики температуры и влажности из Home Assistant.
Теперь об ограничениях, чтобы не создавать ложных ожиданий. Мультиматериальные системы поддерживаются, но проверялись мной ограниченно, только на собственном оборудовании. Отдельного мобильного приложения нет, есть адаптивная вёрстка в браузере. Интеграция реализована исключительно через Moonraker, поэтому к принтерам с закрытым облачным управлением сервис не подключится. И это проект одного человека, написанный прежде всего для себя, так что ошибки в нём встречаются и исправляются по мере обнаружения.
Замечания, найденные ошибки и пожелания удобнее оставлять в issues на GitHub, я их читаю. Комментарии здесь тоже