macOS: Drucker automatisch per HomeKit steuern

Wie ihr euren Drucker intelligent über eine smarte Steckdose ein- und ausschaltet – vollautomatisch beim Drucken
     

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:

  1. Druckauftrag starten → Drucker wird automatisch eingeschaltet

  2. Druckvorgang abwarten → Script überwacht den Status

  3. 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"

  1. Shortcuts-App öffnen → "+" für neuen Shortcut

  2. "Zuhause steuern" hinzufügen

  3. Eure Drucker-Steckdose auswählen → "Ein"

  4. Shortcut als "Drucker aktivieren" speichern

Shortcut "Drucker deaktivieren"

  1. Neuen Shortcut erstellen

  2. "Zuhause steuern" hinzufügen

  3. Eure Drucker-Steckdose auswählen → "Aus"

  4. 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*