--- title: Niimbot D110 - печатаем этикетки с компьютера date: 2024-05-31T19:54:14+03:00 draft: false categories: - misc featured_image: miniature.jpg lastmod: 2024-09-04T11:28:55+03:00 tags: - bluetooth - python - windows - niimbot - термопечать telegram_entry_id: mmotium/10 description: Пробуем печать на Bluetooth принтере этикеток с помощью компьютера, Bluetooth адаптера и Python --- Захотелось мне компактный принтер этикеток приобрести. Чтобы там коробочки и бутылочки всякие маркировать. Выбор пал на нынче популярный Bluetooth принтер Niimbot D110. Приложение для него существует только для телефона. Это удобно в тех условиях, когда нет компьютера под рукой. И в случае, если приложение сделано хорошо. > Попробуйте проект [Niimblue](/niimblue) А пока мы имеем: * при каждом входе в приложение нужно посмотреть рекламу; * в приложении для сохранения шаблонов требуется регистрация; * шрифты при пикселизации выглядят жутковато, непонятно как будет выглядеть этикетка до печати; * дизайнить этикетки с помощью пальца - то ещё удовольствие; * для просмотра заготовок, иконок требуется включать VPN; * оптимизация оставляет желать лучшего, всё тормозит. Поэтому попробуем напечатать этикетки при помощи компьютера. Существует проект [AndBondStyle/niimprint](https://github.com/AndBondStyle/niimprint) (доработанный форк [kjy00302/niimprint](https://github.com/kjy00302/niimprint)) на Python. Проект реализует протокол обмена принтера и позволяет печатать картинки с компьютера по Bluetooth. Если последнего на компьютере нет, то необходим адаптер. У меня такой: ![UB500.jpg](UB500.jpg "Tp-Link UB500") Ко всему прочему при печати этим способом игнорируется проверка оригинальности ленты, поэтому можно печатать на чём попало. Для тестов я вставлял куски чеков, чтобы не тратить этикетки. ## Определение mac адреса принтера Данные моего принтера: ``` Серийный номер: G326030306 Аппаратная версия: 13.10 Версия прошивки: 13.10 ``` У принтера два mac адреса. Один обычный, другой - BLE. В моём случае это: * `03:26:03:C3:F9:11` - нужный * `26:03:03:c3:f9:11` - BLE Нужный нужный адрес я нашёл с помощью [BluetoothView](https://www.nirsoft.net/utils/bluetooth_viewer.html). Утилита не показывает BLE устройства, а это как раз нам и надо. ![BluetoothView](BluetoothView.png) ## Настройка niimprint Теперь займёмся niimprint. Инструкция для Windows. 1. Устанавливаем Python 3.11+, если ещё это не сделали. Открываем окно команд. 2. Клонируем или скачиваем репозиторий ```cmd git clone https://github.com/AndBondStyle/niimprint ``` 3. Переходим в директорию репозитория ```cmd cd niimprint ``` 4. Создаем и активируем виртуальное окружение, чтобы не засорять глобальный список пакетов ```cmd python -m venv venv venv\Scripts\activate ``` ![cmd_venv](cmd_venv.png) 5. Теперь устанавливаем зависимости. Тут уже как больше хочется. - Напрямую ```cmd pip install -r requirements.txt ``` Далее из-за того, что проект выполнен в виде модуля, [чтобы всё работало](https://github.com/AndBondStyle/niimprint/issues/24), нужно выполнить ```cmd set PYTHONPATH=<текущий путь> ``` Например ```cmd set PYTHONPATH=D:\Apps\niimprint :: или set PYTHONPATH=%cd% ``` - Через Poetry как задумывалось автором ```cmd pip install poetry poetry install ``` 5. Запускаем печать - Напрямую ```cmd python niimprint --model d110 --conn bluetooth --addr 03:26:03:C3:F9:11 --rotate 90 --density 2 --image template_15x30.png ``` `--model d110` — модель принтера d110 `--conn bluetooth` — тип соединения bluetooth `--addr 03:26:03:C3:F9:11` — bluetooth адрес `--rotate 90` — использовать альбомную ориентацию картинки `--density 2` — плотность 3 (1-3 для d110) `--image template_15x30.png` — изображение для печати ![cmd_print](cmd_print.png) - Через Poetry ```cmd poetry run <команда выше> ``` В первый раз появится запрос сопряжения ![new_device](new_device.png) ![pairing](pairing.png) Если mac адрес указан верно, то сопряжение завершится успешно и сразу начнётся печать. ### Упрощение печати - добавление принтера в меню "Отправить" 1. В адресной строке проводника ввести `shell:sendto` и нажать Enter. 2. В открывшейся директории создать файл `niimprint.cmd` или с другим именем по желанию. 3. Содержимое файла отредактировать под себя: ```cmd @echo off set NIIMPRINT_DIR=D:\Apps\niimprint set PYTHONPATH=%NIIMPRINT_DIR% cd /d %NIIMPRINT_DIR% venv\Scripts\python.exe niimprint --model d110 --conn bluetooth --addr 03:26:03:C3:F9:11 --rotate 90 --density 2 --image "%1" if %errorlevel% neq 0 pause ``` Теперь кликаем правой кнопкой по картинке и выбираем `niimprint.cmd` ![sendto](sendto.png) При успешной печати окно команд закроется, при ошибке - останется открытым. ## Подготовка изображений [Разрешение печати](https://github.com/AndBondStyle/niimprint/tree/main?tab=readme-ov-file#image-resolution) у D110 - 8 пикселей на мм (~203 dpi). Максимальная высота печати - 15 мм. Максимальная высота картинки: `8 пикс. * 15 мм = 120 пикс.` Но на деле - немного меньше - 96 пикс. Это максимальное разрешение печатающей головки. Итак, для этикетки шириной 30 мм и высотой 15 мм разрешение картинки должно быть `240 x 96` пикс. Также нужно отступить немного от краёв, так как позиционирование не совсем точное. **Картинки лучше сразу преобразовывать в чёрно-белые, без оттенков серого**. Так можно сразу понять как будет выглядеть этикетка. Вот, например, как будет выглядеть шрифт, у которого остались оттенки серого: ![aa1in](aa1in.png) ![aa1out](aa1out.jpg) Шрифт стал страшным и зубастым (как и происходит при печати с телефона). А теперь изначально сделаем картинку чёрно-белой: ![aa2in](aa2in.png) ![aa2out](aa2out.jpg) Так уже лучше. Поэтому нужно сразу использовать шрифты, которые нормально будут выглядеть без сглаживания. Как выглядит градиент и пиксельная сетка без постобработки (слева артефакт от прошлой печати, повторно использовал этикетку): ![gridin](gridin.png) ![gridout](gridout.jpg) ### Мои шаблоны для этикеток ![Шаблон 15x30мм (240x96)](template_15x30.png "15x30мм (240x96)") ![label15x30](label15x30.jpg) [Шаблон 15x30мм (240x96) - проект для Krita](template_15x30.kra). В проекте есть фильтрующие слои для растрирования изображения в псевдополутоновое. {{< video src="krita_template_15x30.webm" >}} ## Прочее полезное ### Как печатать с телефона на любой термобумаге Может пригодиться для проверки что получится при печати, а этикетки тратить не хочется. 1. Вставить замену бумаги лицевой стороной вниз ![fakepaper](fakepaper.jpg) 2. Приложить оригинальную ленту этикеткой к корпусу ![paperontop](paperontop.jpg) 3. Закрыть крышку. После закрытия крышки принтер прочитает через корпус RFID метку на бобине и поймёт, что в него вставлена оригинальная лента. После этого ленту можно убрать. > ⚠ Нужно понимать, что принтер каким-то образом понимает, сколько он отпечатал этикеток с конкретного картриджа > (записывает в RFID метку или в собственную память). > И, скорее всего, не станет печатать с телефона, когда посчитает, что исчерпал количество этикеток. > > Печати через niimprint это не касается, проверка картриджа происходит на стороне клиента. > Сам принтер проверяет только есть ли лента рядом с головкой (оптический датчик). ### Дампы NFC меток оригинальных катушек Найдены [тут](https://github.com/ywaf/niimbot_tag_dumps/). ### Альтернативы оригинальным наклейкам Что плохо в данном принтере - этикетки стоят каких-то дурных денег. Например, в данный момент за этикетки 15x30 хотят около 450р за катушку (210 этикеток). Расходники по стоимости трети от принтера - не здорово. Поэтому неплохо бы поискать варианты замены. #### Своими руками Первым делом я провёл эксперимент. Купил я такую катушку с термоэтикетками ECO (можно и TOP). Размер 58x40, 400шт. Обошлось мне это в 60р. ![ecostrickers](ecostrickers.jpg) Далее я [смоделировал](spool.stp) и напечатал каркас для катушки, как в оригинале. Затем отмерил и разрезал ленту вдоль, чтобы получилась полоса 15 мм. ![cut](cut.jpg) Ленту намотал на катушку. ![spool](spool.jpg) В итоге получилась катушка с наклейками 15х40, на которых принтер вполне себе спокойно печатает, при этом датчик в принтере успешно обнаруживает промежуток между наклейками. Тест печати с разной плотностью. Последняя получилась после нажатия кнопки на принтере: ![spool](density_eco.jpg) Понятно, что наклейки будут не такие долговечные, но по стоимости это ничто в сравнении с оригинальными картриджами. #### От других производителей Принтеры с похожими лентами: * Marklife P15, P12, P11, DELI Q2, PRT, M11 * Phomemo Q30