RaspberryPi als VDR-Client

Der RaspberryPi erfreut sich immer größerer Beliebtheit. Auch ich darf seit einigen Monaten den Rechner im Kreditkartenformat mein Eigen nennen. Die kleine Embedded-Box dient mir als netzwerkbasierter VDR-Client auf OpenELEC-Basis und leistet mir hierfür hervorragende Dienste. Der folgende Artikel soll Ergänzungen aufzeigen, die das Zusammenspiel zwischen OpenELEC (VDR-Client) und dem VDR-Server verbessern sollen.

VDR-Setup

Zunächst eine kurze Beschreibung meines VDR-Setups.
VDR-Server/SAT-Empfänger:

VDR-Client/RaspberryPi:

Da mein VDR-Server aus Gründen des Stromsparens nicht 24 Stunden 7 Tage die Woche laufen sollte, musste eine Möglichkeit geschaffen werden, den Server zusammen mit dem RaspberryPi herunterfahren zu können. Weiterhin muss gewährleistet sein, dass VDR nicht beendet wird, falls gerade eine Aufnahme läuft, beziehungsweise in Kürze gestartet wird. Außerdem muss der VDR so beendet und die Maschine ausgeschaltet werden, dass der nächste Aufwachzeitpunkt für eine anstehende Aufnahme im BIOS korrekt gesetzt wird. Alles in allem soll die Funktionalität eines alleinstehenden VDR-SAT-Empfängers durch das Hinzufügen eines Netzwerkclients nicht beeinträchtigt werden.

Bei den folgenden Beschreibungen gehe ich davon aus, dass ein lauffähiger VDR vorhanden ist. Weiterhin gilt als Voraussetzung, dass eine funktionierende OpenELEC Build-Chain vorhanden ist – sprich OpenELEC in einer selbstgebauten Version auf dem RaspberryPi läuft. Dies ist notwendig, da die hier gezeigten Änderungen teilweise in Dateien im OpenELEC-Dateisystem außerhalb des Home-Verzeichnises eingefügt werden müssen.

Shell Scripts

Um die gewünschten Funktionen zu realisieren, greife ich auf einige eingebaute VDR-Funktionen zurück und rufe diese über Wrapper Shell Scripts auf. Die Skripten selbst liegen zum einen Teil auf dem RaspberryPi, zum Anderen auf dem VDR-Server.

Zunächst einmal ein kleines Shell Script, das sich mittels SSH auf den VDR-Server verbindet und ein weiteres Script aufruft. Zu beachten ist, dass das Programm die SSH-Authentifizierung mittels Public Key voraussetzt. Das Script selbst ist unter /storage/bin/shutdown.sh gespeichert.

#!/bin/bash
#
# /storage/bin/shutdown.sh
# Copyright (C) 2012 Manuel Grob
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

USER=root
HOST=hostname

logger -t shutdown 'Trying to connect to dvb-sat and exec "/usr/local/sbin/pi-shutdown.sh".'
/usr/bin/ssh -o StrictHostKeyChecking=no -o ConnectTimeout=3 $USER@$HOST '/usr/local/sbin/pi-shutdown.sh' >/dev/null 2>&1 && logger -t shutdown 'Successfully connected to dvb-sat.'
exit 0
  • -o StrictHostKeyChecking=no: Verhindert, dass bei der ersten Authentifizierung mittels Public Key eine Bestätigung seitens des Benutzers verlangt wird.
  • -o ConnectTimeout=3: Definiert den Timeout in Sekunden, nachdem der Versuch einer Verbindung abgebrochen wird.

Das Skript beendet mit dem Exit-Status 0, welcher verhindern soll, dass das Herunterfahren des RaspberryPi aufgrund eines Fehlers bei der SSH-Verbindung unterbrochen wird.

In meinem Fall wird root als Benutzer angegeben. Dies stellt selbstverständlich ein großes Sicherheitsrisiko dar! Daher die Empfehlung, einen unprivilegierten Benutzer auf dem VDR-System anzulegen und diesem beispielsweise mittels sudo die geeigneten Rechte für das Ausführen der notwendigen Programme zu erlauben. An dieser Stelle sei auf das Wiki von ubuntuusers.de verwiesen, die eine sehr ausführliche Beschreibung des sudo-Befehls bereitstellen.

Damit das Skript beim Ausschalten des Pi ausgeführt wird, muss es an geeigneter Stelle aufgerufen werden. Hierzu bietet sich das Init-Script von XBMC innerhalb des OpenELEC-Systems an. Zu finden ist es unter /pfad/zu/openelec/packages/mediacenter/xbmc/init.d/93_xbmc. Nachfolgend der Kontext, in dem der Aufruf (markiert) stattfindet.

...
case "$RET" in
  ...
  64)
    if [ ! $(pidof console-kit-daemon) ]; then
      touch "$LOCKDIR/$LOCKFILE"
      [ -x /storage/bin/shutdown.sh ] && /storage/bin/shutdown.sh
      _safe_shutdown
      poweroff -f
    fi
;;
...

Der Code in der hervorgehobenen Zeile prüft zunächst, ob shutdown.sh ausführbar ist und führt dann selbiges aus. Das case-Statement, in dem das Shutdown-Script aufgerufen wird, behandelt mehrere Exit-Status, mit denen XBMC beendet wird. Es ist also problemlos möglich, weitere Skripten für den Fall eines Reboots des Pi oder des Beendens von XBMC einzufügen. Der hier verwendete Exit-Status 64 wird von der XBMC-Applikation im Falle eines Shutdown-Befehls zurückgegeben. Eine Beschreibung der möglichen Exit-Codes von XBMC ist in diesem Quellcode ab Zeile 27 (Stand Januar 2013) zu finden.

Auf Seiten des VDR-Servers muss das Skript pi-shutdown.sh vorhanden sein und an der passenden Stelle im Verzeichnisbaum liegen, welches das Herunterfahren des SAT-Empfängers übernimmt:

#!/bin/sh
#
# /usr/local/sbin/pi-shutdown.sh
# Copyright (C) 2012 Manuel Grob
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

logger -t vdr-dvb-sat "vdr-dvb-sat connected. Now shutting down PC."
/usr/local/bin/svdrpsend hitk power >/dev/null && logger -t vdr-dvb-sat "Successfully executed svdrpsend command."
exit 0

Es kommt das VDR-Programm svdrpsend zum Einsatz, das eine Kommandozeilen-Schnittstelle zur Interaktion mit dem VDR ermöglicht. Die Argumente hitk power „emulieren“ hierbei das Drücken der Power-Taste an der Fernbedienung. Dadurch werden VDRs Mechanismen zum Herunterfahren in Gang gesetzt. Bei entsprechender Einrichtung kümmern sich diese um alles Weitere, wie zum Beispiel das Setzen der BIOS-Aufwachzeit, um den VDR-Rechner automatisiert bei einer bevorstehenden Aufnahme einzuschalten.

Fazit

Die hier beschriebenen Anpassungen ermöglichen einen Weg, bei bestehender OpenELEC-Anbindung an ein VDR-System, den SAT-Empfänger über die Ferne herunterfahren zu lassen, ohne auf die Annehmlichkeiten von VDRs Shutdown-Mechanismen verzichten zu müssen. Die vorgestellten Skripten sind keinesfalls perfekt, laufen in meiner Installation aber bereits seit mehreren Monaten problemlos. Ich freue mich über jeden Kommentar, der Verbesserungen vorschlägt. Und natürlich auch sonst freue ich mich über jede Reaktion.

Ein Gedanke zu „RaspberryPi als VDR-Client

  1. Pingback: Update für OpenELEC-Shutdown-Skript | Grobwiefein

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.