README.md

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

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

Оглавление

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

Требования

  • Сервер с установленным 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.).
  4. Узнайте ID сообщества:

    • Откройте страницу сообщества, в адресной строке vk.com/club123456789 — число после club и есть GROUP_ID.

Получение 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...
GROUP_ID=123456789
  • VK_TOKEN – токен сообщества.
  • MOONRAKER_URL – адрес Moonraker (обычно http://localhost:7125).
  • MOONRAKER_API_KEY – если не требуется, оставьте пустым.
  • YANDEX_DISK_TOKEN – если не используете видео, можно оставить пустым (но бот будет выдавать ошибку при команде «видео»).
  • GROUP_ID – числовой идентификатор сообщества (без club).

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


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

# В папке проекта
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.

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

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

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