My laser printer is placed far away from my desk and automatically connects to my WLAN router when it is switched on. I do not use the printer frequently, so that it is idle most of the time. Recently, I started some experiments controlling the light of my aquarium using a 433 MHz remote switch, which worked like a charm. I thought that it would be nice to save some power by letting the printer start as soon as a new print job arrives to the printer. So here is how it works:
Install CUPS on your Pi
There are several users at home printing from both Win7 or Linux machines. So far, they directly send their print jobs to the printer using the IPP protocol. In order to have a printer queue that can be monitored for new jobs, it is necessary to have a print server in between clients and printer. Therefore, I first installed the cups printer daemon on my RasPi home server. I googled several tutorials how to do that on the net: I followed this guide. To be able to check the printer queue with lpq, it is necessary to install the Debian cups-bsd package with:
$ sudo apt-get install cups-bsd
After configuring the printer, one can query the printer queue with ‘lpq’ and see the following output:
> printer is ready > no entries
On submission of a new job, it is displayed as the first entry of the queue and marked as “active”. The output of lpq can be parsed with a Python script for switching the printer on demand.
Python lpq watchdog
The Python script below checks if a new job has arrived to the printer queue. It parses the ‘lpq’ output at time intervals of 60 seconds. When a new (active) job is detected, a signal is sent to the rc-switch that connects to the printer. If the queue remains empty for more than 10 minutes, the printer is switched off.
import commands import time import os # Time to wait until job is done, 10 minutes WAIT = 600 def check(): global QUEUE QUEUE = commands.getoutput("lpq").split("\n")[1].split()[0] return def active(): global QUEUE QUEUE = commands.getoutput("lpq").split("\n")[2].split()[0] return def wait():# global QUEUE while (QUEUE != 'no'): check() time.sleep(WAIT) # wait for the given time in seconds return # Turn socket D on def start(): os.system("sudo /usr/local/bin/send 00110 00010 1") return # Turn socket D off def stop(): os.system("sudo /usr/local/bin/send 00110 00010 0") return def main(): global QUEUE try: while 1: time.sleep(60) # check the queue for active jobs every minute check() # if the queue is active, turn socket D on if (QUEUE != 'no'): active() if (QUEUE == 'active'): start() wait() check() if (QUEUE == 'no'): # when the queue is empty, turn socket D off stop() except KeyboardInterrupt: stop() if __name__ == '__main__': main()
You can download the script over here:
Great script. But something is wrong with the indentions. Could I ask you to mail me the original script?
Thank you
/rasmus
Hej Rasmus,
sorry for that, never tried to copy code from my own blog. I’ll send it as an attachment.
hilsen,
Martin
Hello Martin,
I will try your RC-Switch script on OMV, and I will try to switch 2 printers on with a solid state relay which i drive with a serial port (COM2 DTR-pin).
Is it possible for you to send me the original file also (as you did to Rasmus)
Thank you for your nice blog!!
Kind regards,
Bart Stegeman
Hi Bart,
sorry that I still haven’t fixed it. Now, I placed a link to the gzipped script below.
Cheers,
Martin