Monitor zeitgesteuert aus und wieder einschalten

Nach zehn Minuten ohne Tastatur- und Mausaktivität aktiviert sich unter Raspbian automatisch ein Bildschirmschoner. Damit wird der Bildschirminhalt zwar schwarz, der Monitor läuft aber weiter. Der Raspberry Pi ist leider nicht in der Lage, das richtige DPMS-Signal (Display Power Management Signaling) an den Monitor zu senden, damit sich dieser abschaltet. Das Problem ist u.a. hier dokumentiert:

https://github.com/raspberrypi/linux/issues/487

Zum Glück gibt es eine Möglichkeit, das Display manuell durch ein Script aus- und wieder ein zu schalten. Das gibt Ihnen die Möglichkeit, den Monitor zeitgesteuert ein- und aus zu schalten, z.b. um 6:00 ein und um 22:00 aus. Das ist Thema dieses Blog-Beitrags.

Update 20.11.2015: Es geht noch einfacher, siehe HDMI-Ausgang unkompliziert ein- und ausschalten.

Das tvservice-Kommando

Mit dem wenig bekannten tvservice-Kommando können Sie Informationen über den HDMI-Status ermitteln und das HDMI-Signal aus- und wieder einschalten. Zuerst der Hilfetext:

tvservice
  Usage: tvservice [OPTION]...
  -p, --preferred                   Power on HDMI with 
                                      preferred settings
  -e, --explicit="GROUP MODE DRIVE" Power on HDMI with explicit
                                      GROUP (CEA, DMT, CEA_3D_SBS, 
                                      CEA_3D_TB, CEA_3D_FP) 
                                      MODE (see --modes) and 
                                      DRIVE (HDMI, DVI)
  -t, --ntsc                  Use NTSC frequency for HDMI mode 
                                (e.g. 59.94Hz  rather than 60Hz)
  -c, --sdtvon="MODE ASPECT"  Power on SDTV with MODE (PAL or NTSC) 
                                and ASPECT (4:3 14:9 or 16:9)
  -o, --off                  Power off the display
  -m, --modes=GROUP          Get supported modes for GROUP (CEA, DMT)
  -M, --monitor              Monitor HDMI events
  -s, --status               Get HDMI status
  -a, --audio                Get supported audio information
  -d, --dumpedid <filename>  Dump EDID information to file
  -j, --json                 Use JSON format for --modes output
  -n, --name                 Print the device ID from EDID
  -h, --help                 Print this information

Hier das Ergebnis von tvservice --status:

tvservice --status
  state 0x12001a [HDMI DMT (68) RGB full 16:10], 
  1920x1200 @ 60.00Hz, progressive

Mit dem Kommando tvservice --off können Sie den Monitor ausschalten. Die meisten Monitore aktivieren dann in einen Energiesparmodus:

tvservice --off
  Powering off HDMI

Und so sollte sich der Montitor wieder einschalten lassen:

tvservice --preferred
  Powering on HDMI with preferred settings

Auf dem Raspberry Pi funktioniert letzteres Kommando aber nur bedingt: Der Monitor schaltet sich zwar ein, das Bild bleibt aber schwarz.

Abhilfe schafft nun ein Umschalten der virtuellen Konsole mit dem Kommando chvt. Raspbian verwendet für den Grafikmodus normalerweise die Konsole 7. Die kurzzeitige Aktivierung von Konsole 1 (Textmodus) und danach die Re-Aktivierung von Konsole 7 (Grafikmodus) führt dazu, dass am Monitor wieder der Inhalt des Grafiksystems zu sehen ist.

sudo chvt 1
sudo chvt 7

Das neue Init-Script hdmi

Andrew Ayer hat die oben beschriebenen Schritte dankenswerterweise in ein komfortables Script verpackt. Im Vergleich zur oben skizzierten Vorgehensweise verwendet das Script noch das Kommando fgconsole, um festzustellen, welche virtuelle Konsole gerade aktiv ist. Anschließend aktiviert das Script zuerst eine andere Konsole (1 oder 2) und danach wieder die ursprüngliche Konsole. Damit funktioniert das Script auch dann, wenn das Grafiksystem nicht die Konsole 7 nutzt.

Ich habe das Script ein wenig modifiziert, so dass es kompatibel zu anderen Init-V-Scripts ist:

#!/bin/sh
# Script /etc/init.d/hdmi

### BEGIN INIT INFO
# Provides:          hdmi
# Required-Start:    $syslog 
# Required-Stop:     $syslog 
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Enable and disable HDMI output on the Raspberry Pi
### END INIT INFO

is_off ()
{
    tvservice -s | grep "TV is off" >/dev/null
}

case $1 in
    stop)
        tvservice -o
    ;;
    start)
        if is_off
        then
            tvservice -p
            curr_vt=`fgconsole`
            if [ "$curr_vt" = "1" ]
            then
                chvt 2
                chvt 1
            else
                chvt 1
                chvt "$curr_vt"
            fi
        fi
    ;;
    status)
        if is_off
        then
            echo off
        else
            echo on
        fi
    ;;
    *)
        echo "Usage: $0 start|stop|status" >&2
        exit 2
    ;;
esac

exit 0

Kopieren Sie das Script in die Zwischenablage und führen Sie dann die folgenden Kommandos aus, um den Code in /etc/init.d/hdmi zu speichern.

sudo cat > /etc/init.d/hdmi
   <Strg>+<V>
   <Strg>+<D>
sudo chmod a+x /etc/init.d/hdmi

Jetzt können Sie den Monitor wie folgt in den Energiesparmodus versetzen bzw. wieder aktivieren:

sudo service hdmi stop     # Monitor ausschalten
sudo service hdmi start    # Monitor einschalten

Monitor zeitgesteuert ein und aus schalten

Nehmen wir an, Sie verwenden den Raspberry Pi in einem Museum, um dort Informationen zu einem Exponat anzuzeigen. Die Öffnungszeiten des Museums sind täglich von 9:00 bis 19:00 Uhr. Also wollen Sie, dass der Monitor täglich um 8:45 ein und um 19:15 ausgeschaltet wird. Das erreichen Sie durch die zwei folgenden Zeilen in /etc/crontab:

# Datei /etc/crontab um die folgenden
# zwei Zeilen erweitern
45  8 * * * root service hdmi start
15 19 * * * root service hdmi stop

Wenn Sie sich ein wenig in die crontab-Syntax einarbeiten, können Sie auch Regeln für unterschiedliche Wochentage definieren, so dass das Display z.B. an einem Ruhetag gar nicht eingeschaltet wird.

Bildschirmschoner deaktivieren

In einem Museum und bei der Verwendung des Raspberry Pi zur Ansteuerung eines ständig angezeigten Displays ist der unter Raspbian standardmäßig aktive Bildschirmschoner natürlich nicht zweckmäßig. Um ihn zu deaktivieren, laden Sie die Datei /etc/lightdm/lightdm.conf in einen Editor, suchen nach dem Abschnitt, der mit [SeatDefaults] eingeleitet wird, und fügen dort die Zeile xserver-command=... ein:

# in der Datei /etc/lightdm/lightdm.conf
...
[SeatDefaults]
xserver-command=X -s 0 -dpms
...

Quellen