En casa tenemos una impresora de etiquetas Phomemo D30. Es una impresora térmica, Bluetooth, que imprime etiquetas de 12x40mm (y algunos otros tamaños, pero ese es el que trae con la impresora y el más común). Funciona con una aplicación de celular, y la verdad es que funciona relativamente bien la impresora, excepto que la aplicación es una cagada.
La aplicación es lenta, engorrosa de usar, y demora para hacer cualquier cosa que no sea agregar texto. Particularmente, lo más molesto es la cantidad de tiempo que demora en cargar íconos. Los carga de internet cada vez, sin cachear, y cada ícono es una imagen, y son muchos, por lo que demora un montón.
Además, la verdad es que si bien para el uso más común que le damos (etiquetar cuadernos y útiles escolares) la aplicación más que sobra, yo quería jugar un poco más con las posibilidades que me daría hacer etiquetas con, por ejemplo, Inkscape.
Busqué entonces por ahí si había alguna opción, y lo mejor que encontré fue phomemo-tools (AUR), que agregaba soporte en CUPS para impresoras Phomemo, aunque no específicamente para la D30. Pero bueno, probar no costaba nada.
phomemo-tools tiene soporte para las impresoras M02, T02, y M110/120. Configuré la conexión usando M02, y parecía casi funcionar. Me escupía una etiqueta en blanco. No es ideal, pero por lo menos sabía que se estaba comunicando con la impresora y hablando un lenguaje en el que casi se entendían. Por comparación, el driver de la M110 no funcionaba, directamente: la impresora lo ignoraba.
El problema es que «casi» funciona no sirve de mucho. Para tener etiquetas en blanco no necesito la impresora, sólo despego una de la tira y listo. Así que seguí investigando y encontré un repositorio con un script tipo «proof of concept» que imprimía texto, pero no a través de CUPS sino a través de una conexión directa al Bluetooth.
Así que, armado con el ejemplo del driver para la M02, el script proof-of-concept, Wireshark, y un desconocimiento absoluto de cómo funciona CUPS o cómo leer una captura de tráfico Bluetooth, me dispuse al proyecto de fin de semana: lograr imprimir algo hecho en Inkscape con la Phomemo D30.
Lo que hice fue agarrar el filtro de la M02, que estaba «casi» cerca, y comparé lo que mandaba a la impresora con lo que mandaba el teléfono cuando imprimía desde ahí. Encontré varias diferencias:
- La D30 requiere unos bytes de inicialización que no sé aún qué hacen.
- La M02 manda un comando de alineación, que la D30 no.
- La D30 requiere que rotemos la imagen 90 grados antes de enviarla.
- El filtro de la M02 divide la imagen en bloques de 255 líneas. La D30 no requiere eso y podemos mandar todos los datos.
- El filtro de la M02 envía un comando de «imprimir y avanzar algunas líneas». Ese comando en la D30 hace que «imprima» una etiqueta extra (en blanco).
Copiando el driver y el filtro de la M02, y aplicando esas diferencias, y después de arrancarme los pelos de frustración un rato, logré finalmente imprimir.

Ahora hice un pull request con el nuevo filtro y driver para agregar soporte para la D30 a phomemo-tools. Mientras tanto, si necesitás imprimir, dejo acá los archivos necesarios.
Para usar eso, tenés que primero instalar phomemo-tools, siguiendo las instrucciones en ese repositorio (o usando AUR si estás en Arch). Después descomprimí el archivo, y compilá el archivo drv corriendo:
ppdc phomemo-d30.drv
gzip ppd/Phomemo-D30.ppd
Para poder usar eso, ahora tenés que copiar el ppd y el filtro a sus ubicaciones correspondientes. Corré (como root):
cp ppd/Phomemo-D30.ppd /usr/share/cups/model/Phomemo
cp rastertopd30 /usr/lib/cups/filter
Después de eso, reiniciando CUPS debería funcionar.