Der Letzte macht das Licht aus...

Nein, keine Betriebsschließung. Mir ist aber grad keine bessere Überschrift eingefallen. Es geht heute um einen 24/7 Linux Server mit 24/7 VDR Betrieb und daher auch (unnötiger) 24/7 Ausgabe des Fernsehbildes über die Grafikkarte.

Auch wenn man eine vdpau-fähige Grafikkarte zur Ausgabe von PAL und/oder HDTV benutzt, die das mehr oder weniger im Schlaf mitmacht, so muss diese nicht ständig in Aktion sein, wenn man gerade den Fernseher mal nicht in Betrieb hat. Aus Gründen des Komforts und des WAF eines VDR im Wohnzimmer war das aber bislang so. Mit Serverstart wurde auch vdr-sxfe gestartet. Eigentlich schwachsinnig, die meiste Zeit war der Fernseher ja doch aus und die Grafikkarte hatte trotzdem was zu tun.

Der neue LG Flat-TV hat als Zuckerl eine serielle Schnittstelle, über die sich der TV fernbedienen bzw. teilweise auch den aktuellen Status auslesen lässt. Da könnte man doch jetzt was basteln...

Also einen USB2Serial Adapter besorgt und angeschlossen, das nötige Tool lg-tv-command installiert und schon konnte man wunderbar Ein- und Ausschalten, den Eingang ändern und sonst noch ein paar Dinge verändern. Jetzt galt es nur noch, eine passende Mimik zu finden, bei der sich der VDR zusammen mit dem TV wie bisher verhält. Also mit dem Einschalten des TVs auch gleich das Bild parat zu haben, sprich, vdr-sxfe zu starten. Möglich wäre dies durch eine permanente Überwachung des Status des TV Gerätes, d.h. ob es eingeschalten und auf HDMI als Eingang steht. Das hätte aber ein Polling alle paar Sekunden (2-4s ungefähr) erfordert, das ist mir lästig während eigentlich alles aus sein sollte und die Auswirkungen auf den Energiesparmodus des TVs sind auch nicht bekannt. Also eine andere Lösung suchen.

Bedient wird der VDR, der TV und die Anlage ja über eine Logitech Harmony 300, eine programmierbare Universalfernbedienung. D.h. man kann alle Knöpfe ziemlich wahlfrei mit Funktionen quer durch das gesamte Sortiment belegen. Auch den Power-Knopf. Die Idee ist nun, den Power-Knopf einen im VDR nicht benutzten Befehl zu verpassen und diesen Befehl dann einge Dinge erledigen zu lassen:

  • Fernseher einschalten
  • Auf den korrekten Eingang (hier HDMI1) umschalten
  • vdr-sxfe starten

Sollte der TV schon an sein (mit lg-tv-command überprüfen), dann soll folgendes passieren:

  • Fernseher ausschalten
  • vdr-sxfe beenden

Das ist kein Problem und ein passendes Skript ist auch schnell geschrieben:

 {codecitation class="brush:bash"}

#!/bin/bash

#############################################################
#
# Script zum An-/Ausschalten der Bildausgabe über einen
# LG Flat TV mit serieller Schnittstelle und vdr-sxfe.
#
#############################################################

if [ -z ${1} ]
then
INPUT="HDMI1"
else
INPUT=${1}
fi

. /etc/lgtvcommand

if [ -z $(pidof vdr-sxfe) ] #Keine aktive Bildausgabe über vdr-sxfe
then
echo "Debug: vdr-sxfe starten, TV anschalten"
. /usr/local/bin/start-vdr-sxfe.sh &

# TV anschalten und HDMI wählen
lg-tv-command Power 1
lg-tv-command InputSelect ${INPUT}
/usr/local/bin/lgpowerstate &
else
echo "Debug: vdr-sxfe stoppen, TV ausschalten"
# vdr-sxfe watchdog stoppen
#kill $(pidof vdr-sxfe-watchdog.sh)
# vdr-sxfe stoppen
kill -9 $(pidof vdr-sxfe)
# TV Ausschalten, falls auf HDMI1
if [ $(lg-tv-command InputSelect | grep -c "(0xA0)") == 1 ]
then
lg-tv-command Power 0
fi
fi

{/codecitation}

Die verwendete include Datei /etc/lgtvcommand beinhaltet ein paar Umgebungsvariablen, die in mehreren Skripten benötigt werden. Damit ich Änderungen dann nur an einer Stelle machen muss, habe ich die ausgelagert:

{codecitation class="brush:bash"}

export LG_DEVICE=/dev/ttyUSB0
export LG_BAUDRATE=115200
export LG_ID=0{/codecitation}

Das Skript /usr/local/bin/lgpowerstate überwacht noch regelmäßig, ob der TV noch an ist und stoppt dann vdr-sxfe und beendet sich selbst. Das ist für den Fall, wenn man den Fernseher am Gerät selbst oder mit der Originalfernbedienung ausschaltet. Bei beiden Fällen bekommt dies das Skript ja nicht mit. Dieser Watchdog startet 10s nach Aufruf und prüft dann alle 30s ab, ob der TV noch an ist. Sobald eindeutig erkannt wurde, dass das Gerät abgeschalten ist, wird vdr-sxfe beendet.

{codecitation class="brush:bash"}

#!/bin/bash

 

. /etc/lgtvcommand

 

sleep 10

 

while [ $(lg-tv-command Power | grep -c "0x01") -eq 1 ]
do
sleep 30
done
killall vdr-sxfe

{/codecitation}

So, aber wie kann ich das jetzt über die Fernbedienung aufrufen? Mein erster Gedanke war, die user defined keys von VDR zu nutzen, aber dort konnte man nur Makros, die durch das OSD navigieren, definieren. Das war für den Zweck nicht geeignet. Also mal sehen, was sich noch so bietet. Klar, es gibt "irexec", das kann man doch wunderbar dazu verwenden. Also schnell mal eine ~/.lircrc (im Homeverzeichnes des Users, der dann auch "irexec" startet) mit folgendem Inhalt erstellt:

{codecitation class="brush:bash"}

begin
prog = irexec
button = USER1
repeat = 0
config = switchTV.sh HDMI1
end

begin
prog = irexec
button = USER5
repeat = 0
config = switchTV.sh HDMI1
end

begin
prog = irexec
button = USER2
repeat = 0
config = switchTV.sh HDMI2
end

begin
prog = irexec
button = USER3
repeat = 0
config = switchAudioTV.sh
end

begin
prog = irexec
button = USER4
repeat = 0
config = resetTV.sh
end

{/codecitation}

Die Harmony wurde dann noch entsprechend belegt, den 4 Nummerntasten oben wurden die Codes für USER1 bis USER4 gegeben, die Power-Taste erhielt den Code für USER5. Es ist dabei natürlich darauf zu achten, dass diese Tasten im VDR nicht einem Makro zugeordnet sind. "irexec -d" wird beim Start des gdm unter der Benutzerkennung gestartet, für die das automatische Login eingerichtet ist. 

Wie zu sehen ist, habe ich mir noch ein paar weitere Skripte geschrieben. Eines, um vdr-sxfe zu resetten und eines um zwischen HDMI1 (VDR direkt) und HDMI2 (VDR über die 5.1 Anlage) am Fernseher umschalten zu können.