VDR

Der neue VDR ist da. Der ghost durfte diese Aufgabe endlich abgeben. Das freut auch mich – der vdr-Teil war nie ein Quell absoluter Stabilität, immer mal wieder stürzte ghost beim Versuch in den suspend zu fahren ab.

Der VDR macht nur genau das – Aufzeichnen. Die Dateien landen auf dem NAS. Hierfür habe ich mir eine DS412 gegönnt, die kleinste Variante. Stromverbrauch 4Watt minimal plus ca 7 Watt pro Platte, also 18 Watt im Maximum.

Der vdr steckt im Silverstone Sugo – sehr schönes Gehäuse. Nicht unbedingt im ästhetischen Sinne, mehr im nützlichen: gut durchlüftet, den 3.5” Einschub kann man einfach ausbauen (ich habe eine kleine SSD im 2.5” Schacht liegen), Platz genug auch für grosse Karten (trotz mini-ITX). Mit einem Silverstone Strider 300W SFX, 2GB Ram, ASRock H61MV-ITX und einem kleinen Celeron kommt das Ganze so auf ca. 27 Watt. Ärgerlich für die Energiebilanz: da mir die Port an der FritzBox ausgingen, musste nun auch noch ein weiterer Switch her.

Der vdr hängt an einer schaltbaren Steckdosenleiste, für Aufnahmen wird er eingeschaltet. Nach der Aufnahme fährt er automatisch runter. Das erledigt der VDR selber, die Thematik ist nicht ganz trivial. Zumindest hier unter Ubuntu 14.04 muss in der /etc/default/vdr das ENABLE_SHUTDOWN=1 gesetzt sein, dazu habe ich in der setup.conf noch die Zeilen

MinEventTimeout = 15
MinUserInactivity = 1

gesetzt. Wann genau de r VDR runterfährt, ist von aussen nicht ganz klar. Manchmal direkt nach der Aufnahme, manchmal vergeht auch mal eine halbe Stunde. Prinzipiell funktioniert das aber. Beim Runterfahren wird noch ein shutdown-hook aufgerufen. Das hat den charmanten Vorteil, dass dieses Script beim Aufruf vom vdr mitgeteilt bekommt, in wieviel Minuten dieser wieder hochgefahren sein möchte. Diesen Wert schiebe ich auf das wandboard – von dort wird der vdr ja dann wieder gestartet. Auf dem wandboard läuft dann ein kleines Script, welches schaut, ob der vdr erreichbar ist – wenn nicht wird die Steckdose abgeschaltet, oder ob eine Aufnahme ansteht, dann wird die Steckdose wieder eingeschaltet.

Das Ganze läuft jetzt seit 2 Wochen stabil – und ich bin recht zufrieden damit.

Remote-Steckdose

Für meinen Server ghost brauche ich sowas wie die Fritz!Dect – bei dem muss ich ausser on/off ja auch noch suspend/running/crashed unterscheiden. Von diesem Sonderfall mal abgesehen, will ich nur an- und ausschalten bzw. wissen, ob ein Gerät an oder aus ist. Durch Zufall bin ich über die ultimative (und vor allem ultimativ einfache) Lösung gestolpert: eine Steckdosenleiste wie der EnerGenie EG-PMS2 zusammen mit sispmctl. Letzteres ist bei den meisten Distribution eh schon dabei. Eine schöne Beschreibung liefert die Seite “USB-Steckdosenleisten mit dem Raspberry Pi schalten”. Hat auch auf dem wandboard auf Anhieb völlig problemfrei geklappt.

Temperaturen

Das Thema hatte ich ja noch aus der wandboard-Aktion offen. Da der Server direkt an der Wand zum Wohnzimmer steht, habe ich einfach zwei USB-Sticks gekauft, einen davon mit Messfuehler an etwa 30cm Kabel, dazu noch einen passiven USB-Hub und das Ganze ans Wandboard gesteckt. Den Temperatur-Fuehler natuerlich durch die Wand ins Wohnzimmer.

Die Temperatur-Fuehler finden sich unter den Stichwort “temper usb” und kosten so um die 10 EUR pro Stueck. Die noetige Software findet sich in diversen Varianten unter der Bezeichnung “pcsensor” auf github. Da ich ja mehrere Sticks habe, habe ich mir eine Variante gesucht, die das auch unterstuetzt: https://github.com/padelt/pcsensor-temper.git

Ein munin-plugin war auch wiedermal kein Problem und schon entstanden schöne Graphen. Ganz besondere Graphen: die Temperaturen in meiner Wohnung schwanken doch erheblich musste ich festellen, um gut 5 Grad innerhalb weniger Minuten. Vor allem wunderbar synchron: wurdes es im Arbeitszimmer kalt, so wurde es im Wohnzimmer warm. Und umgekehrt. (Man muss wissen, dass das ganze Rechner-Geraffel im Arbeitszimmer in einer Ecke steht, dort es natuergemaess immer schön warm, während im Wohnzimmer nur Abends geheizt wird). Anscheinend tauschen die beiden Sticks ab und an ihre Anzeigen. Das kann natuerlich nicht sein, also mal geforscht und folgende Nettigkeit gefunden:


Feb 13 15:10:01 wandboard CRON[6959]: (munin) CMD (if [ -x /usr/bin/munin-cron ]; then /usr/bin/munin-cron; fi)
Feb 13 15:10:20 wandboard kernel: [2244286.093234] usb 2-1.4: USB disconnect, device number 61
Feb 13 15:10:20 wandboard kernel: [2244286.465417] usb 2-1.4: new low speed USB device number 63 using fsl-ehci
Feb 13 15:10:20 wandboard kernel: [2244286.608508] input: RDing TEMPerV1.4 as /devices/platform/fsl-ehci.1/usb2/2-1/2-1.4/2-1.4:1.0/input/input58

Also munin läuft los und daraufhin verliert der temper-Stick den Kontakt und muss neu initialisiert werden. Offenbar verändert sich dabei auch die Reihenfolge, in der die Devices von der libusb gefunden werden. Dem pcsensor gebe ich aber nur eine Nummerierung mit.

Problem erkannt, aber wie lösen. Ich habe eine ganze Weile auf die Ausgabe von lsusb gestarrt, erst ein diff brachte die Lösung: im Feld iProduct unterscheiden sich beide Sticks durch ein char. Was ein Glück. Also pcsensor schnell gepatcht: https://github.com/valpo/pcsensor-temper: pcsensor -s findet jetzt den richtigen Stick.

Übrigends kann man in der libusb-1.0 schauen, an welchem Port ein device sitzt, laut doc soll sich dieser Wert nie ändern. pcsensor nutzt leider noch libusb-0.1, dort habe ich sowas nicht gefunden. Und portieren ging auch nicht – das Ubuntu auf dem wandboard hat zwar eine libusb-1.0, aber die ist entweder völlig veraltert oder kaputt. Da das Problem für mich gelöst ist, habe ich die Sache erstmal auf Eis gelegt, wer eine Portierung braucht kann sich ja melden.

Bleibt noch das Problem mit dem usb-reset – in solchen Fällen bekommt man natürlich statt eines Wertes nur eine Fehlermeldung vom device. Also noch schnell das munin-plugin angepasst (if in doubt use brute force):

#!/bin/bash
case $1 in
config)
cat <<'EOM'
graph_title External temperature (living room)
graph_vlabel temperature temperature.label C
temperature.warning 30
temperature.critical 35
EOM
exit 0;;
esac

printf "temperature.value "
tmp="xUSBx"
while [[ $tmp =~ .*(USB|not).* ]]; do
tmp="$(/usr/local/bin/pcsensor -sTEMPerV1.4 -cm 2>&1 | head -n1)"
done
echo $tmp

Das tut es erstmal.