macOS: Drucker automatisch per HomeKit steuern
Kennt ihr das Problem? Der Drucker steht im Arbeitszimmer, wird aber nur gelegentlich genutzt. Ständig läuft er im Standby-Modus und verbraucht unnötig Strom, oder ihr vergesst ihn einzuschalten und wundert euch, warum nichts passiert.
In diesem Artikel zeige ich euch, wie ihr mit macOS, Apple HomeKit und einem kleinen Script eine vollautomatische Drucker-Steuerung einrichtet. Das System erkennt Druckaufträge automatisch, schaltet den Drucker ein, wartet auf die Fertigstellung und schaltet ihn nach einer definierten Zeit wieder aus.
Das gewünschte Ergebnis
Nach der Einrichtung funktioniert euer System so:
Druckauftrag starten → Drucker wird automatisch eingeschaltet
Druckvorgang abwarten → Script überwacht den Status
Nach Fertigstellung → Drucker wird nach 90 Sekunden automatisch ausgeschaltet
Das Ganze läuft vollständig im Hintergrund und funktioniert mit jedem Drucker, der über eine smarte Steckdose angeschlossen ist.
Voraussetzungen
Hardware
Mac mit macOS
HomeKit-kompatible smarte Steckdose (z.B. Eve Energy, Meross, Kasa)
Drucker (beliebiges Modell, Laser oder Tinte)
Software
macOS Shortcuts-App (vorinstalliert)
Apple Home-App (vorinstalliert)
Terminal-Zugriff für die Script-Installation
Schritt 1: Shortcuts für Ein/Aus erstellen
Wir erstellen in der Shortcuts-App auf unserem Mac zwei Shortcuts, die den Drucker jeweils ein- bzw. ausschalten.
Shortcut "Drucker aktivieren"
Shortcuts-App öffnen → "+" für neuen Shortcut
"Zuhause steuern" hinzufügen
Eure Drucker-Steckdose auswählen → "Ein"
Shortcut als "Drucker aktivieren" speichern
Shortcut "Drucker deaktivieren"
Neuen Shortcut erstellen
"Zuhause steuern" hinzufügen
Eure Drucker-Steckdose auswählen → "Aus"
Als "Drucker deaktivieren" speichern
Wichtig: Die Namen müssen exakt so lauten, da diese in unserem Script verwendet werden.
Schritt 2: Drucker-Namen ermitteln
Öffnet das Terminal und findet euren Drucker-Namen heraus:
lpstat -p
Beispiel-Ausgabe:
Drucker „Brother_QL_800“ ist inaktiv; aktiviert seit Wed Jul 9 10:07:25 2025
Drucker „Label__B_Home“ ist inaktiv; aktiviert seit Tue Jul 1 13:46:38 2025
Drucker „Laserdrucker“ ist inaktiv; aktiviert seit Tue Jun 10 10:04:41 2025
Drucker „Laser___BC_ro“ ist inaktiv; aktiviert seit Mon Jul 28 10:18:00 2025
Notiert euch den Namen eures Druckers (z.B. "Laserdrucker").
Schritt 3: das Überwachungs-Script erstellen
Script-Verzeichnis erstellen & Script anlegen
mkdir -p ~/Library/Scripts
mkdir -p ~/Library/Logs
nano ~/Library/Scripts/printer_monitor.sh
Der Code
#!/bin/bash
# ===========================================
# KONFIGURATION - HIER ANPASSEN
# ===========================================
PRINTER_NAME="Laserdrucker" # ← EUER DRUCKER-NAME HIER
SHORTCUT_ON="Drucker aktivieren"
SHORTCUT_OFF="Drucker deaktivieren"
# Wartezeiten (in Sekunden)
PRINTER_STARTUP_TIME=30 # Zeit bis Drucker bereit ist
AUTO_SHUTDOWN_DELAY=90 # Zeit nach Druckende bis Ausschalten
QUEUE_CHECK_INTERVAL=3 # Wie oft Queue prüfen
# ===========================================
# SCRIPT LOGIK
# ===========================================
LOG_FILE="$HOME/Library/Logs/printer_monitor.log"
LOCK_FILE="/tmp/printer_monitor.lock"
log_message() {
echo "$(date '+%Y-%m-%d %H:%M:%S'): $1" >> "$LOG_FILE"
echo "$1"
}
# Prüfen ob Script bereits läuft
if [ -f "$LOCK_FILE" ]; then
log_message "Script läuft bereits"
exit 1
fi
echo $$ > "$LOCK_FILE"
# Cleanup-Funktion
cleanup() {
log_message "Script wird beendet"
rm -f "$LOCK_FILE"
exit 0
}
trap cleanup SIGTERM SIGINT
# Drucker-Jobs zählen
get_printer_jobs() {
lpstat -o "$PRINTER_NAME" 2>/dev/null | wc -l | tr -d ' '
}
# Prüfen ob Drucker druckt
is_printer_busy() {
local status=$(lpstat -p "$PRINTER_NAME" 2>/dev/null)
if echo "$status" | grep -q "printing\|processing"; then
return 0
else
return 1
fi
}
# Hauptfunktion
monitor_print_queue() {
log_message "Drucker-Überwachung gestartet für: $PRINTER_NAME"
last_queue_size=0
printer_was_activated=false
print_finished_time=0
currently_printing=false
# Prüfen ob Drucker existiert
if ! lpstat -p "$PRINTER_NAME" >/dev/null 2>&1; then
log_message "FEHLER: Drucker '$PRINTER_NAME' nicht gefunden!"
lpstat -p >> "$LOG_FILE"
cleanup
fi
while true; do
current_queue_size=$(get_printer_jobs)
current_time=$(date +%s)
# === DRUCKER EINSCHALTEN ===
if [ "$current_queue_size" -gt "$last_queue_size" ] && [ "$current_queue_size" -gt 0 ]; then
if [ "$printer_was_activated" = false ]; then
log_message "Neuer Druckauftrag erkannt ($current_queue_size Jobs)"
shortcuts run "$SHORTCUT_ON" &
log_message "Drucker wird eingeschaltet (warte ${PRINTER_STARTUP_TIME}s)"
printer_was_activated=true
currently_printing=false
print_finished_time=0
sleep $PRINTER_STARTUP_TIME
log_message "Drucker sollte jetzt bereit sein"
fi
fi
# === DRUCKER-STATUS ÜBERWACHEN ===
if [ "$printer_was_activated" = true ]; then
if is_printer_busy || [ "$current_queue_size" -gt 0 ]; then
if [ "$currently_printing" = false ]; then
log_message "Druckvorgang gestartet"
currently_printing=true
fi
print_finished_time=0
else
# Drucker ist idle und Queue ist leer
if [ "$currently_printing" = true ]; then
print_finished_time=$current_time
currently_printing=false
log_message "Druckvorgang beendet - warte ${AUTO_SHUTDOWN_DELAY}s bis Ausschalten"
elif [ "$print_finished_time" -gt 0 ]; then
local wait_time=$((current_time - print_finished_time))
if [ "$wait_time" -ge "$AUTO_SHUTDOWN_DELAY" ]; then
log_message "Wartezeit abgelaufen - schalte Drucker aus"
shortcuts run "$SHORTCUT_OFF" &
log_message "Drucker wurde ausgeschaltet"
printer_was_activated=false
print_finished_time=0
currently_printing=false
else
local remaining=$((AUTO_SHUTDOWN_DELAY - wait_time))
if [ $((wait_time % 15)) -eq 0 ]; then
log_message "Warte noch ${remaining}s bis Ausschalten..."
fi
fi
fi
fi
fi
# Debug-Info alle 30 Sekunden
if [ $((current_time % 30)) -eq 0 ]; then
local status_msg="Status: Queue=$current_queue_size, Aktiviert=$printer_was_activated, Druckt=$currently_printing"
if [ "$print_finished_time" -gt 0 ]; then
local elapsed=$((current_time - print_finished_time))
status_msg="$status_msg, Wartezeit=${elapsed}/${AUTO_SHUTDOWN_DELAY}s"
fi
log_message "$status_msg"
fi
last_queue_size=$current_queue_size
sleep $QUEUE_CHECK_INTERVAL
done
}
log_message "=== DRUCKER MONITOR START ==="
monitor_print_queue
Die markierten Zeilen müsst ihr eventuell anpassen, je nachdem, wie eure Umgebung aussieht.
Ihr müsst das Script außerdem noch ausführbar machen:
chmod +x ~/Library/Scripts/printer_monitor.sh
Schritt 4: Automatischer Start mit LaunchAgent
nano ~/Library/LaunchAgents/com.user.printer.monitor.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.user.printer.monitor</string>
<key>ProgramArguments</key>
<array>
<string>/bin/bash</string>
<string>/Users/YOUR_USERNAME/Library/Scripts/printer_monitor.sh</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/>
<key>StandardOutPath</key>
<string>/Users/YOUR_USERNAME/Library/Logs/printer_monitor_out.log</string>
<key>StandardErrorPath</key>
<string>/Users/YOUR_USERNAME/Library/Logs/printer_monitor_error.log</string>
<key>EnvironmentVariables</key>
<dict>
<key>PATH</key>
<string>/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin</string>
</dict>
</dict>
</plist>
In den markierten Zeilen müsst ihr YOUR_USERNAME mit eurem macOS-Benutzernamen ersetzen.
LaunchAgent aktivieren und starten
launchctl load ~/Library/LaunchAgents/com.user.printer.monitor.plist
launchctl start com.user.printer.monitor
Fazit
Mit diesem Setup habt ihr eine vollautomatische, intelligente Drucker-Steuerung geschaffen, die:
✅ Energie spart durch automatisches Ausschalten
✅ Komfort bietet durch automatisches Einschalten
✅ Zuverlässig funktioniert ohne manuelle Eingriffe
✅ Anpassbar ist für verschiedene Drucker und Nutzungsszenarien
Das System läuft vollständig im Hintergrund und fügt sich nahtlos in den macOS-Workflow ein.
Troubleshooting
Script startet nicht
# Berechtigungen prüfen:
ls -la ~/Library/Scripts/printer_monitor.sh
# Manuell testen:
~/Library/Scripts/printer_monitor.sh
Drucker wird nicht erkannt
# Verfügbare Drucker auflisten:
lpstat -p
# CUPS-Status prüfen:
lpstat -t
Script komplett entfernen
launchctl unload ~/Library/LaunchAgents/com.user.printer.monitor.plist
rm ~/Library/LaunchAgents/com.user.printer.monitor.plist
rm ~/Library/Scripts/printer_monitor.sh
rm ~/Library/Logs/printer_monitor*