2024-06-02 23:03:18 +03:00
---
title: Niimbot D110 - печатаем этикетки с компьютера
date: 2024-05-31T19:54:14+03:00
2024-06-03 12:34:31 +03:00
draft: false
2024-06-02 23:03:18 +03:00
categories:
- misc
featured_image: miniature.jpg
2024-09-04 11:29:25 +03:00
lastmod: 2024-09-04T11:28:55+03:00
2024-06-02 23:03:18 +03:00
tags:
- bluetooth
- python
- windows
2024-06-04 21:49:50 +03:00
- niimbot
- термопечать
2024-06-02 23:03:18 +03:00
telegram_entry_id: mmotium/10
description: Пробуем печать на Bluetooth принтере этикеток с помощью компьютера, Bluetooth адаптера и Python
---
Захотелось мне компактный принтер этикеток приобрести. Чтобы там коробочки и бутылочки всякие маркировать.
Выбор пал на нынче популярный Bluetooth принтер Niimbot D110.
Приложение для него существует только для телефона. Это удобно в тех условиях, когда нет компьютера под рукой.
И в случае, если приложение сделано хорошо.
<!-- more -->
2024-09-09 16:35:42 +03:00
> Попробуйте проект [NiimBlue](https://niim.mmote.ru/)!
>
> ![niimblue](niimblue.png)
>
> Проект был создан спустя некоторое время после написания данной статьи
> и предоставляет собой полноценный веб-интерфейс для создания этикеток и их печати.
>
> [пост на сайте](/niimblue)
2024-09-04 11:29:25 +03:00
2024-06-02 23:03:18 +03:00
А пока мы имеем:
* при каждом входе в приложение нужно посмотреть рекламу;
* в приложении для сохранения шаблонов требуется регистрация;
* шрифты при пикселизации выглядят жутковато, непонятно как будет выглядеть этикетка до печати;
* дизайнить этикетки с помощью пальца - то ещё удовольствие;
* для просмотра заготовок, иконок требуется включать 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 устройства, а это как раз нам и надо.
2024-06-04 21:49:50 +03:00
![BluetoothView ](BluetoothView.png )
2024-06-02 23:03:18 +03:00
## Настройка 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
```
2024-06-04 21:49:50 +03:00
![cmd_venv ](cmd_venv.png )
2024-06-02 23:03:18 +03:00
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` — изображение для печати
2024-06-04 21:49:50 +03:00
![cmd_print ](cmd_print.png )
2024-06-02 23:03:18 +03:00
- Через 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` пикс. Также нужно отступить немного от краёв, так как позиционирование не совсем точное.
**Картинки лучше сразу преобразовывать в чёрно-белые, без оттенков с е р о г о **. Так можно сразу понять как будет выглядеть этикетка.
Вот, например, как будет выглядеть шрифт, у которого остались оттенки с е р о г о :
2024-06-04 21:49:50 +03:00
![aa1in ](aa1in.png )
2024-06-02 23:03:18 +03:00
2024-06-04 21:49:50 +03:00
![aa1out ](aa1out.jpg )
2024-06-02 23:03:18 +03:00
Шрифт стал страшным и зубастым (как и происходит при печати с телефона). А теперь изначально сделаем картинку чёрно-белой:
2024-06-04 21:49:50 +03:00
![aa2in ](aa2in.png )
2024-06-02 23:03:18 +03:00
2024-06-04 21:49:50 +03:00
![aa2out ](aa2out.jpg )
2024-06-02 23:03:18 +03:00
Так уже лучше. Поэтому нужно сразу использовать шрифты, которые нормально будут выглядеть без сглаживания.
2024-06-03 12:34:31 +03:00
Как выглядит градиент и пиксельная сетка без постобработки (слева артефакт от прошлой печати, повторно использовал этикетку):
2024-06-02 23:03:18 +03:00
2024-06-04 21:49:50 +03:00
![gridin ](gridin.png )
2024-06-02 23:03:18 +03:00
2024-06-04 21:49:50 +03:00
![gridout ](gridout.jpg )
2024-06-02 23:03:18 +03:00
### Мои шаблоны для этикеток
![Шаблон 15x30мм (240x96) ](template_15x30.png "15x30мм (240x96 )")
2024-06-04 21:49:50 +03:00
![label15x30 ](label15x30.jpg )
2024-06-02 23:03:18 +03:00
2024-06-03 12:34:31 +03:00
[Шаблон 15x30мм (240x96) - проект для Krita ](template_15x30.kra ).
В проекте есть фильтрующие слои для растрирования изображения в псевдополутоновое.
{{< video src = "krita_template_15x30.webm" > }}
2024-06-02 23:03:18 +03:00
## Прочее полезное
### Как печатать с телефона на любой термобумаге
Может пригодиться для проверки что получится при печати, а этикетки тратить не хочется.
1. Вставить замену бумаги лицевой стороной вниз
![fakepaper ](fakepaper.jpg )
2. Приложить оригинальную ленту этикеткой к корпусу
![paperontop ](paperontop.jpg )
3. Закрыть крышку.
После закрытия крышки принтер прочитает через корпус RFID метку на бобине и поймёт, что в него вставлена оригинальная лента.
После этого ленту можно убрать.
> ⚠ Нужно понимать, что принтер каким-то образом понимает, сколько он отпечатал этикеток с конкретного картриджа
> (записывает в RFID метку или в собственную память).
> И, скорее всего, не станет печатать с телефона, когда посчитает, что исчерпал количество этикеток.
>
> Печати через niimprint это не касается, проверка картриджа происходит на стороне клиента.
> Сам принтер проверяет только есть ли лента рядом с головкой (оптический датчик).
2024-06-05 20:53:44 +03:00
### Дампы NFC меток оригинальных катушек
2024-06-02 23:03:18 +03:00
2024-06-05 20:53:44 +03:00
Найдены [тут ](https://github.com/ywaf/niimbot_tag_dumps/ ).
2024-06-04 21:49:50 +03:00
### Альтернативы оригинальным наклейкам
Что плохо в данном принтере - этикетки стоят каких-то дурных денег.
Например, в данный момент за этикетки 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 )
Понятно, что наклейки будут не такие долговечные, но по стоимости это ничто в сравнении с оригинальными картриджами.
#### От других производителей
2024-06-05 10:20:30 +03:00
Принтеры с похожими лентами:
* Marklife P15, P12, P11, DELI Q2, PRT, M11
* Phomemo Q30