Convirtiendo una Impresora USB en una Solución de Red “smart”

Una práctica muy común qué hacemos los programadores es dividir un problema en partes e ir atacando cada uno de esos problemitas hasta tener una solución completa. El famoso “divide y conquistarás”.

Nota del editor: Este artículo lo trae Victor Rosset a quien convencimos en La Comunidad para que lo escribiera y nos ilustrara en cómo cuernos se hace para hackear una impresora junto con una Raspberri y hacer algo más inteligente. Contenido de alto nivel nardogeek, para linuxeros y DIY.

La necesidad que tenía era poder usar mi impresora en cualquier parte del dpto con cualquier dispositivo (mi compu, la de mi novia, los celus, etc). No es que imprimamos mucho, de hecho imprimimos muy poco, hay meses que la única hoja que se imprime es el recibo de pago del seguro del auto por las dudas algún inspector no me acepte verlo en la app del celu (o no tenga datos). 

El problema era que tengo una vieja impresora Laser USB, sin wifi, y por el volumen de uso no hay ninguna chance de justificar el cambio, es una HP LaserJet 1022 con más de 15 años al hombro y que funciona perfecto. Igual ahora que escribo y pongo en números la antigüedad del cacharro capaz se merece un descansito je. 

La solución: como buen programador partí de un problema grande y empecé a dividirlo, inicialmente en dos partes: 

  • servidor de impresión en red
  • encendido remoto de la impresora

Para encarar el primer problema, “poder imprimir desde cualquier lado con cualquier dispositivo” quedaba implícito no tener que andar enchufando y desenchufando el USB en cada compu, así que agarré 1 de las raspberry pi que tengo y la pude ubicar junto a la impresora y conectarlas. La raspberry pi es una Zero 2 W a la que le configuré que se conecte automáticamente a la wifi de mi LAN.

Después instalé CUPS (gestor de impresiones), le configuré el driver y listo. Desde la LAN podía imprimir si sabía la IP de la rpi. Funcionaba en windows descubriendo impresoras en red pero era más complicado ubicarla en mac-os o en los celus. Si están interesados en saber como instalar CUPS en la rpi hay cientos de artículos en internet que enseñan como hacerlo, busquen uno de esos. 

Tip: No instalen Samba para compartir la impresora, algunos posts lo hacen pero ese paso no es necesario para nosotros. 

Ya tenía solucionado el 1er problema pero no del todo, me generó uno nuevo: podía cambiar la IP cada vez que se corte la luz o se reinicie el router. Por suerte la LAN de casa la administro yo, en el servidor DHCP del router pude asociar la Mac-Address de la rpi a una IP fija conocida.

Eso me dejó avanzar y configurar en cada pc/celu una impresora de red y no tener que estar descubriéndola en cada uso. Acá tampoco voy a detallar como se hace, cada router es distinto (aunque mas o menos parecidos), googleen. Si su router es el que les deja el ISP probablemente no puedan acceder y configurarlo, raramente dejan que toquemos la config.

Pasando al segundo gran problema, para no tener que pararme e ir a prender la impresora manualmente cada vez que tenía que imprimir me compré 1 sonoff con api rest (con modo DIY, eso habilita la API). ¿Qué es Sonoff? es un relé 220v con wifi. En criollo: un enchufe inteligente. 

Sonoff es una de las marcas comerciales más conocidas que brinda una solución out-of-the-box muy simple con una app, pero también existen otras marcas más económicas o genéricas, principalmente son una placa ESP32 con capacidad de conexión WiFi (el santo grial de los makers) apilada a otra placa con 1 o varios relés. Lo importante es que el firmware tenga API para el endgame de mi solución.

Una solución rápida es configurarlo en una app en el celu y lo prenden/apagan desde cualquier lugar, ya con eso tenemos un quick-win, Sonoff tiene la app eWeLink para vincular el enchufe y manejarlo desde ahí.

Cómo cablear el sonoff? Básicamente tiene 2 bornes de entrada, van el positivo y negativo de 220, y 2 bornes de salida que conecté un enchufe hembra (que se compra en cualquier ferretería/casa de electricidad) donde enchufé la impresora. Busquen en YouTube. Y por el amor de dios no usen cable de velador, no queremos prender fuego la casa de nadie. 

A la impresora le dejé la tecla de encendido en “on” y lo que hacemos con el sonoff es darle electricidad o cortarsela.

En este punto ya tenía una solución funcional que satisfacía todas mis necesidades pero seguía siendo un perno tener que agarrar el celu para prender la impresora, además si mi novia necesitaba usarla me tenía que pedir que la prenda yo. Así que me puse a investigar si le podía decir a CUPS que me prenda la impresora cuando recibía 1 nuevo trabajo. 

Encontré que cups puede ejecutar filtros antes de imprimir pero solo aplican al “trabajo” de impresión, tipo cambiar fuentes, tamaños, imprimir primero páginas pares y luego impares, duplicar cada hoja, etc. Ninguno de estos filtros me servía. 

Investigando, googleando, redditeando, foreando, avanzando a la 3ra e incluso 4ta página de google donde las esperanzas de encontrar algo útil o incluso vida humana se desvanecen llegué a un software que me da la posibilidad de correr hooks antes y después de ejecutar el trabajo de impresión y podían ser scripts cualesquieras, se llama Tea4Cups .

Bien, hasta acá la parte fácil, ahora ajusten sus cinturones y peinense para la foto porque vamos a necesitar mas skills para completar la magia de poder prender la impresora automágicamente.

De nuevo, dividiremos el problema en partes: vamos a necesitar instalar Tea4Cups para ejecutar algún script cuando mandamos a imprimir, luego vamos a necesitar configurar Cups para integrar Tea4Cups, también vamos a tener que hacer algún script que encienda el sonoff, para eso necesitaremos que el sonoff exponga una api-rest, y también que tenga una IP fija conocida para que el script funcione siempre, luego configurar que Tea4Cups ejecute ese script, y por último un mecanismo para apagarla cuando finalice el trabajo de impresión.

Para pasar el Sonoff al modo DIY y exponer la api-rest lo enchufaremos a la electricidad (bornes input) para que se encienda, luego mantenemos presionado el botón de pairing unos 5 segundos hasta que el led parpadee repetidamente, sin usar la app eWeLink (si ya lo habían vinculado mediante bluetooth probablemente necesiten “olvidar el dispositivo&rdquoGuiño, en el celu/compu buscamos la red wifi que nos aparezca con el nombre ITEAD-XXXXXXXXXX, nos conectamos, la pass debería ser 12345678, sino la buscan para su modelo, una vez conectados a la wifi del ESP32 con el browser van a http://10.10.7.1, cargan el nombre de su red LAN a la que quieren que el enchufe se conecte y la password, guardan y listo, ya tienen el sonoff exponiendo la api-rest y conectado a su LAN. 

Luego, al igual que como hicimos con la raspberry pi tenemos que ir al router a la parte de DHCP y dejar fija una IP para la mac-address del enchufe, así más adelante cuando armemos las requests para encender y apagar el relé la IP nos queda fija.

Para instalar Tea4Cups descargamos el zip desde la web y hacemos lo que dice el readme, básicamente es copiar 1 archivo al backend de CUPS que será el encargado de correr los hooks, y copiar otro archivo de configuración donde se ponen los scripts hooks. 

Para integrar tea4cups a cups hay que editar el archivo de configuración de las impresoras que está en /etc/cups/printers.conf, en la cadena donde está la URI de la impresora que dice hp:/usb/{nombre-impresora} hay que agregar que antes de llegar al usb pase por tea4cups
tea4cups:hp:/usb/{nombre-impresora}

Esto lo que hace es pasar por los hooks de Tea4Cups y ejecutarlos. Obviamente luego hay que recargar el servicio de cups con sudo service cups restart, o stop y luego start, como les guste.

Como nota, a veces reiniciaba el servicio y veía que me pisaba la config recién guardada con la original de la impresora, lo que terminé haciendo para que no me la borre era ganar permiso root con sudo su, editar la config, guardarla, parar el servicio, iniciarlo de nuevo, y volver a mi usuario normal en la raspberry. No se, cosa rara…

Para crear un script que prenda el sonoff van a depender de su conocimiento, su maña, o preferencias, yo armé 1 script bash horrible, a puro copy-paste de google, si uds son fans de python o lo que quieran pueden hacerlo.

El script básicamente lo que necesita hacer es un api-call POST a una url y pasarle en el body los parámetros para que encienda el relé. 

La url de la api del sonoff va a ser http://{ip_sonoff}:8081/zeroconf/info, el body esperado es {“data”: {“switch”: “on”}} para prender el relé. Obviamente si le mandan “off” lo apaga. Y si mandan {“data”: {}} no cambia nada, solo devuelve el estado actual del interruptor. Esto les puede servir si le quieren meter algo más de inteligencia al script. 

Update: a partir de escribir este post agarré todos los bashs que tenía y se los pasé a Claude (Nde: Claude.ai)y le dije si me lo podía traducir a python, me compactó todo en 1 solo archivo .py y anda de maravilla. Lo pueden descargar de mi repositorio github .

Ahora nos queda configurar el hook en tea4cups, para esto tenemos que editar el archivo de configuración que copiamos al instalar tea4cups. Allí buscamos la parte de pre_hooks debajo de la sección [global] y cargamos el script que nosotros queremos ejecutar, hay ejemplos comentados, yo lo puse asi:

prehook_0: /usr/bin/python /home/pi/printer.py on

Mí script (perdón, el script de Claude), acepta como argumento “on” u “off”, así decide que ejecutar.

Este archivo de configuración se puede segmentar si tienen más de 1 impresora instalada en CUPS, en el caso de tener 1 sola, dentro de la sección [global] ya estamos, sino hay que crear la sección correspondiente con el nombre de la impresora y poner los hooks ahí en la que quieran que se prenda. 

Para apagar la impresora había hecho otro script bash que verificaba si el estado del sonoff está encendido, además miraba la cola de impresión con el comando lpstat. Después de la ayuda de Claude quedó todo en el mismo archivo. Puse el script con el argumento “off” que se ejecute en un cronjob cada 3 minutos. ¿Por qué no usé los post_hooks de Tea4Cups? porque estos se ejecutan luego de que CUPS envíe el trabajo a la impresora, no es cuando termina de imprimir. Podría apagar la impresora en la mitad de la hoja.

Y para ser honestos el cronjob también tiene un problema, podría pasar que en medio de una impresión se ejecute el cron y apagar la impresora, así que tenía que agregar algún mecanismo que verifique si además de estar prendida y no esté imprimiendo, esperar un tiempito cuando la cola ya terminó pero la impresora podría aún seguir. Para eso se me ocurrió modificar la función de encendido y que escriba un archivo temporal con la fecha y hora que se encendió.

Este timestamp lo piso con cada ejecución del prehook de tea4cups por si mando varios trabajos a imprimir. Y luego en la otra función, la que va a apagar que chequee que haya pasado más de 1 minuto del último trabajo a imprimir (definí solo 1 minuto porque no imprimo tantas hojas como para que demore tanto tiempo), si pasó más de 1 minuto hace otra llamada POST a la url del sonoff pero pasando en el body “off” para que apague la impresora. 

Este script como dije está en un cronjob que se lo cargué al usuario root porque el script de encendido que escribe el archivo con el timestamp lo ejecuta cups y es ejecutado por root, así que después mi user “pi” no tenía permisos para leer/borrar.

El cronjob me quedó así:

*/3 * * * * /usr/bin/python /home/pi/printer.py off

Y eso fue todo… Parece fácil, ¿no? Jajaja. Obvio que no salió todo de una, tuve que hacer varias pruebas de ejecuciones manuales del encendido y apagado, mandar a imprimir, debugear errores, etc hasta que funcionó todo integralmente.

Con este post quería mostrarles cómo se pueden ir uniendo diferentes partes, componentes, cosas, o ideas que jamás fueron pensadas juntas para lograr solucionar un problema, solo basta ir dividiendo en sub-problemas e ir pensando cómo, o con qué podría solucionar esa partecita y luego avanzar a la siguiente. 

Si llegaron hasta acá, muchas gracias por el tiempo, seguramente son personas curiosas o del palo técnico, espero que les sirva de inspiración. 

Si tienen mas preguntas o dudas, o necesitan esto en formato mas tutorial  dejenme el comentario acá, en en mi twitter, o abran 1 issue en github

Si te gustó esta nota podés...
Invitame un café en cafecito.app

Categoría: Informática Etiquetas:  diy hack hacking impresora pi raspberry

Otros posts que podrían llegar a gustarte...
Respondemos a

Comentarios

  • tucho235     12/02/2025 - 10:51:15

    Muchas gracias por el espacio para compartir!

    PD: tengo 2 usuarios? colgalo a este otro.

    • Fabio Baccaglioni     12/02/2025 - 10:55:32

      ja, si, tenés dos usuarios :D ya lo edito

    • TibuEze     12/02/2025 - 12:33:13

      Qué buen post! Bien de nerd el asunto pero hacía falta uno de estos que solo nos gusta a los que metemos mano y configuramos cosas que no son solamente plug&play. :D

      • tucho235     12/02/2025 - 13:56:48

        muchas gracias!

  • cesar     12/02/2025 - 12:02:40

    No salía mas barato comprar otra impresora?
    yo lo que hice fue anular las impresoras y regalarlas y cuando necesito imprimir voy a la librería a la vuelta. Igual lo tengo en cuenta para hacérselo a un cliente que tengo.

    • _Marcos_     12/02/2025 - 12:45:06

      La satisfacción de haber resuelto ese ´problema´ no tiene precio.

Deje su comentario:

Tranquilo, su email nunca será revelado.
La gente de bien tiene URL, no se olvide del http/https

Negrita Cursiva Imagen Enlace


Comentarios ofensivos o que no hagan al enriquecimiento del post serán borrados/editados por el administrador. Los comentarios son filtrados por ReCaptcha V3.