Einleitung:
Ich habe einen Laserdrucker (HP), den ich bisher für einen Ausdruck manuell eingeschaltet habe. Natürlich habe ich dann auch gerne vergessen ihn wieder auszuschalten (Standby 7 Watt).
Problemstellung:
So habe ich überlegt wie ich mit einer smarten Steckdose und der Firmware Tasmota es umsetzen kann, dass der Drucker automatisch bei einem Druckauftrag ein und nach dem Druck wieder ausgeschaltet wird.
Der Druckertreiber von HP unterstützt bei einem Druckjob den Aufruf einer URL (Tasmota-Steckdose) leider nicht (warum können das Treiber heutzutage nicht?).
Nach etwas hin und her bin ich zu einer Lösung gekommen, die ich hier gerne vorstellen möchte:
Lösung:
Ich habe CUPS (Druckersoftware für Linux) auf einem Raspberry installiert, der mit ioBroker sowieso immer an und im Netzwerk ist. Vom PC drucke ich nun nicht mehr direkt zum Drucker, sondern zu CUPS. CUPS wiederum schickt das Dokument an den Drucker, der es wiederum ausdruckt. Das klappt reibungslos und ohne spürbare Zeitverzögerung.
CUPS unterstützt leider auch keinen Aufruf einer URL, wenn ein Druckauftrag vorliegt.
Dafür gibt es aber das kleine Tool "inotifywait" (apt-get inotify-tools). Ein Script überwacht mittels inotifywait nun das Spoolverzeichnis von CUPS. Sobald dort ein Druckjob auftaucht, ruft das Script die URL der Steckdose auf und schaltet sie ein. In der Steckdose ist eine Pulstime von 900 Sekunden (Wert 1000) eingestellt und die Steckdose schaltet den Drucker nach 15 Minuten wieder aus.
Das Script pausiert 870 Sekunden um bei mehreren Druckaufträgen mehrfache Einschaltungen zu verhindern. Danach überwacht es wieder das Verzeichnis und wartet auf den nächsten Druckauftrag.
Vorgehensweise:
CUPS installieren
Drucker in CUPS auswählen
Druckertreiber installieren und Pfad vom Drucker hinterlegen
Das folgende Script irgendwo nach Wahl abspeichern (und anpassen) und als Systemdienst (/etc/systemd/system/abcdefg.service) laufen lassen.
Script:
#!/bin/bash
while true; do inotifywait -e create --exclude c0 --format '%w%f' "/var/spool/cups/" && echo "";
sleep 1
for file in /var/spool/cups/d0*; do
if [ -f $file ]; then
curl --silent 'http://IPderSteckdose/cm?user=admin&password=12345678&cmnd=Power%201'
sleep 870
fi
done
done
Alles anzeigen
Verbesserungen:
Ich habe noch zusätzlich eine Zeitschaltung (von 8 bis 20 Uhr) eingefügt, sowie eine Logfunktion eingebaut. Wer an dem Codeschnipsel Interesse hat, bitte melden.