README.md

VK-бот для управления 3D-принтером (Klipper/Moonraker)

Полноценный бот для сообщества ВКонтакте, который позволяет управлять 3D-принтером под управлением Klipper + Moonraker: смотреть статус, температуры, управлять питанием (принтер, свет, хост), запускать печать из списка файлов, делать фото и видео (с управлением светом), получать автоматические уведомления о состоянии печати.


Оглавление

  1. Требования
  2. Установка пакетов и зависимостей
  3. Настройка сообщества ВКонтакте и получение токена
  4. Получение API-ключа Moonraker (опционально)
  5. Настройка Яндекс.Диска для видео (опционально)
  6. Настройка переменных окружения (.env)
  7. Настройка автоматических уведомлений
  8. Создание виртуального окружения и установка зависимостей
  9. Запуск бота вручную
  10. Проверка работоспособности
  11. Команды бота
  12. Автозапуск при старте системы (systemd)
  13. Устранение неполадок
  14. Дополнительные замечания

Требования

  • Сервер с установленным Klipper + Moonraker (например, Orange Pi, Raspberry Pi).
  • Камера, поддерживающая MJPEG-поток (например, через crowsnest или mjpg‑streamer).
  • Python 3.9+, pip, git, ffmpeg.
  • Сообщество ВКонтакте (тип «Группа» или «Публичная страница»).
  • Яндекс.Диск (опционально, для отправки видео).
  • Доступ к Moonraker API (обычно через localhost:7125).

Установка пакетов и зависимостей

Подключитесь к вашему серверу (например, через SSH) и выполните команды:

# Обновление системы и установка базовых пакетов
sudo apt update && sudo apt upgrade -y
sudo apt install -y python3 python3-pip python3-venv git ffmpeg

# Проверка версии Python (должна быть 3.9+)
python3 --version

Настройка сообщества ВКонтакте и получение токена

  1. Создайте сообщество (если ещё нет):

    • Перейдите на vk.com/groups → «Создать сообщество».
    • Задайте название, тип (группа или публичная страница).
  2. Включите сообщения бота:

    • Управление → Настройки для бота → «Возможности ботов» → Включить.
    • Также включите «Сообщения сообщества».
  3. Получите ключ доступа (токен):

    • Управление → Работа с API → «Ключи доступа».
    • Нажмите «Создать ключ».
    • Отметьте галочки:
      • Разрешить приложению доступ к управлению сообществом
      • Разрешить приложению доступ к сообщениям сообщества
      • Разрешить приложению доступ к документам сообщества (для отправки видео)
    • Скопируйте полученный токен (начинается с vk1.a.).

Примечание: ID сообщества (GROUP_ID) не требуется вводить в .env – бот определяет его автоматически из токена. Однако вы можете указать его для дополнительных целей, но это не обязательно.


Получение API-ключа Moonraker (опционально)

Если в вашем moonraker.conf не настроен api_key, можно оставить поле пустым. Если нужен ключ:

# В файле конфигурации Moonraker (обычно ~/printer_data/config/moonraker.conf)
# Добавьте или раскомментируйте строку:
api_key: ваш_сложный_ключ

# После изменения перезапустите Moonraker:
sudo systemctl restart moonraker

Настройка Яндекс.Диска для видео (опционально)

Если вы хотите, чтобы бот отправлял видео (через команду «видео»), нужно настроить загрузку на Яндекс.Диск.

  1. Создайте приложение на oauth.yandex.ru:

    • Название: любое (например, 3D Printer Bot).
    • Платформа: «Веб‑сервисы».
    • Redirect URI: https://oauth.yandex.ru/verification_code (подойдёт любой).
    • Права:
      • Яндекс.Диск REST APIЗапись в любом месте на Диске
      • Яндекс.Диск REST APIДоступ к информации о публичных ресурсах
    • Сохраните Client ID.
  2. Получите токен:

    • Перейдите по ссылке:

      https://oauth.yandex.ru/authorize?response_type=token&client_id=ВАШ_CLIENT_ID
      
    • Подтвердите доступ, скопируйте полученный токен (выглядит как y0_AgAAAA...).
  3. Опционально: создайте папку на Яндекс.Диске для видео и запишите её ID (по умолчанию бот загружает в корень).


Настройка переменных окружения (.env)

Создайте файл .env в корне проекта:

nano .env

Содержимое (замените на свои значения):

VK_TOKEN=vk1.a.XXXX...
MOONRAKER_URL=http://localhost:7125
MOONRAKER_API_KEY=
YANDEX_DISK_TOKEN=y0_AgAAAA...
NOTIFY_CONFIG=1,5,15

Параметры:

Переменная Описание
VK_TOKEN Токен сообщества (обязательно).
MOONRAKER_URL Адрес Moonraker (обычно http://localhost:7125).
MOONRAKER_API_KEY API-ключ Moonraker (если не требуется, оставьте пустым).
YANDEX_DISK_TOKEN Токен Яндекс.Диска (нужен только для видео, можно оставить пустым).
NOTIFY_CONFIG Настройка автоуведомлений (подробно в следующем разделе).

Сохраните файл (Ctrl+O, Enter, Ctrl+X).


Настройка автоматических уведомлений

Параметр NOTIFY_CONFIG задаётся в формате включено,интервал_минут,шаг_прогресса:

  • Первое число (1 или 0): включить (1) или выключить (0) все автоуведомления (включая уведомления о запуске бота, включении/выключении принтера, начале/конце печати и периодические отчёты).
  • Второе число: интервал в минутах. Если 0 – отправка по времени отключена. Если больше 0 – бот будет каждые N минут присылать текущий статус печати.
  • Третье число: шаг прогресса в процентах. Если 0 – отправка по прогрессу отключена. Если больше 0 – бот будет присылать уведомления при достижении прогресса, кратного этому числу (например, 15, 30, 45…).

Примеры:

NOTIFY_CONFIG Описание
1,5,15 Уведомления включены, каждые 5 минут и при 15%, 30%, 45%… прогресса.
1,0,20 Только по прогрессу (20%, 40%, 60%, 80%, 100%).
1,10,0 Только каждые 10 минут (без привязки к прогрессу).
0,0,0 Все автоуведомления отключены.

Важно: бот автоматически определяет CHAT_ID (идентификатор чата для уведомлений) при первом обращении пользователя – вам не нужно указывать его вручную.


Создание виртуального окружения и установка зависимостей

# В папке проекта
python3 -m venv venv
source venv/bin/activate   # активируем окружение

# Устанавливаем необходимые библиотеки
pip install --upgrade pip
pip install vkbottle python-dotenv aiohttp yadisk
# yadisk нужен только для видео, можно не ставить, если видео не используется.

Если видео не планируется, достаточно:

pip install vkbottle python-dotenv aiohttp

Запуск бота вручную

# Убедитесь, что находитесь в папке проекта и активировали venv
source venv/bin/activate
python bot.py

В терминале появится:

INFO:__main__:Бот запущен
INFO:vkbottle:Loop will be run forever

Теперь бот работает и отвечает на команды в сообществе.


Проверка работоспособности

Напишите в сообщество «начать» – бот отправит приветствие и клавиатуру.

Проверьте основные команды:

  • «статус» – фото + информация о принтере (температуры, вентиляторы, прогресс печати).
  • «файлы» – список G-код файлов, кнопки для запуска печати.
  • «система» – подменю управления питанием принтера, света и выключения хоста.
  • «видео» (если настроен Яндекс.Диск) – записывает 5-секундное видео, загружает на Диск, возвращает ссылку.

Команды бота

Все команды отправляются текстом в чат с сообществом. Также доступны клавиатуры с кнопками.

Главное меню (кнопки)

Кнопка Действие
статус Отправить фото с камеры (с включением/выключением света) и подробный отчёт: состояние принтера, прогресс печати (если идёт), температуры экструдера и стола, температуру MCU и хоста, состояния вентиляторов (обдув модели, экструдера, драйверов, корпусный), состояние устройств питания (TronxyX5SA, Light), сообщение с дисплея (M117).
🔌 Перейти в подменю управления питанием (принтер, свет, хост).
файлы Показать список последних 10 G-код файлов с датами модификации. Для каждого файла формируется кнопка «печать <имя>».
видео (если настроен Яндекс.Диск) Записать 5-секундное видео с камеры (с включением света за 2 секунды до записи), загрузить на Яндекс.Диск (перезапись файла video.mp4) и отправить прямую ссылку на скачивание.

Системное подменю (кнопки)

Кнопка Действие
🔌 Принтер Включить/выключить питание принтера (устройство TronxyX5SA). Запрашивает подтверждение.
💡 Свет Включить/выключить свет (устройство Light). Запрашивает подтверждение.
⚡ Выключить хост Выключить хост (Orange Pi). Запрашивает подтверждение.
◀️ назад Вернуться в главное меню.

Кнопки управления печатью (появляются в главном меню, когда печать активна или на паузе)

Кнопка Действие
⏸ Пауза / ▶ Возобновить Приостановить или возобновить текущую печать. Запрашивает подтверждение.
🛑 Стоп Остановить печать. Запрашивает подтверждение.

Дополнительные команды (текстовые)

Команда Действие
начать, старт, привет, start, Начать Показать главное меню с полным приветствием.
назад Вернуться в главное меню из любого подменю.
печать <имя_файла> (Не вводится вручную) – кнопка, создаваемая для каждого файла. Запускает печать выбранного файла после подтверждения.

Автоматические уведомления (если включены)

  • При запуске бота – сообщение о готовности.
  • При включении/выключении принтера (если действие произошло не через бота).
  • При начале, успешном завершении, ошибке или отмене печати.
  • Периодически (по времени или прогрессу) – статус печати с прогрессом, временем, температурами.

Автозапуск при старте системы (systemd)

Чтобы бот запускался автоматически после перезагрузки хоста, создайте systemd-сервис.

  1. Создайте файл сервиса:

    sudo nano /etc/systemd/system/vk-moonraker-bot.service
    
  2. Вставьте содержимое (поправьте пути и пользователя, если нужно):

    [Unit]
    Description=VK Bot for Moonraker
    After=network.target moonraker.service
    Wants=moonraker.service
    
    [Service]
    Type=simple
    User=klipper
    Group=klipper
    WorkingDirectory=/home/klipper/vk_moonraker_bot
    Environment="PATH=/home/klipper/vk_moonraker_bot/venv/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
    ExecStart=/home/klipper/vk_moonraker_bot/venv/bin/python /home/klipper/vk_moonraker_bot/bot.py
    Restart=on-failure
    RestartSec=10
    
    [Install]
    WantedBy=multi-user.target
    
  3. Перезагрузите systemd и включите сервис:

    sudo systemctl daemon-reload
    sudo systemctl enable vk-moonraker-bot.service
    sudo systemctl start vk-moonraker-bot.service
    
  4. Проверьте статус:

    sudo systemctl status vk-moonraker-bot.service
    
  5. Просмотр логов:

    sudo journalctl -u vk-moonraker-bot -f
    

Управление сервисом

Бот будет запускаться автоматически после сети и Moonraker. При падении сервис будет перезапускаться через 10 секунд.

Для управления используйте стандартные команды systemctl:

  • Остановить:

    sudo systemctl stop vk-moonraker-bot
    
  • Запустить:

    sudo systemctl start vk-moonraker-bot
    
  • Перезапустить:

    sudo systemctl restart vk-moonraker-bot
    
  • Отключить автозапуск:

    sudo systemctl disable vk-moonraker-bot
    

Теперь бот будет стартовать вместе с хостом и автоматически восстанавливаться после сбоев.


Удаление сервиса автозапуска (при необходимости)

sudo systemctl stop vk-moonraker-bot
sudo systemctl disable vk-moonraker-bot
sudo rm /etc/systemd/system/vk-moonraker-bot.service
sudo systemctl daemon-reload

Устранение неполадок

Проблема Решение
Бот не отвечает на сообщения Проверьте, что в сообществе включены «Сообщения сообщества» и «Возможности ботов». Убедитесь, что токен имеет нужные права.
Ошибка импорта модулей Активируйте виртуальное окружение (source venv/bin/activate) и установите недостающие пакеты.
Фото не отправляется Убедитесь, что камера работает по адресу http://localhost:8080/?action=snapshot. Проверьте права токена на загрузку фото.
Видео не загружается Проверьте токен Яндекс.Диска и права приложения. Убедитесь, что ffmpeg установлен и путь к потоку камеры верный (http://localhost:8080/?action=stream).
Ошибка 403 при публикации на Яндекс.Диске Убедитесь, что у приложения есть право Доступ к информации о публичных ресурсах.
Принтер выключен, но бот пытается получить данные В коде уже есть проверка питания устройства TronxyX5SA – если питание отключено, бот не запрашивает данные Klipper.
Дублируются уведомления при включении/выключении принтера через бота Механизм подавления работает на основе временной задержки (15 секунд). Если дублирование всё же происходит, увеличьте это значение в коде (переменная last_power_action_time).

Дополнительные замечания

  • Имена устройств питания (TronxyX5SA, Light) должны совпадать с именами в moonraker.conf (секции [power ...]).
  • Камера: рекомендуется использовать crowsnest. В конфиге crowsnest задайте mode: mjpeg и port: 8080.
  • Безопасность: не публикуйте файл .env и не передавайте токены третьим лицам.
  • Автоуведомления: настройка NOTIFY_CONFIG позволяет гибко управлять уведомлениями без изменения кода.
  • Файл chat_id.txt создаётся автоматически при первом обращении пользователя – не удаляйте его, если хотите сохранить канал уведомлений.

Вклад и поддержка

Если вы нашли ошибку или хотите предложить улучшение, создайте Issue в репозитории проекта.


Приятного использования!

Описание
Вк бот для удалённого мониторинга и контроля 3д принтера на основе klipper
Конвейеры
0 успешных
0 с ошибкой
Разработчики