Endlich habe ich mir den Wunsch erfüllt, meinen VDR auf einem Rechner laufen zu lassen, der mir bei Bedarf erlaubt meine täglichen Aufgaben am Rechner zu erledigen. Mit dem Asrock-Board G31M-GS ist das gut möglich und der Verbrauch ist auch gar nicht so schlecht.
Dabei bin den umgekehrten Weg, wie in der ct beschrieben gegangen, soll heißen: mein Kubuntu, basierend auf Ubuntu-Studio, ist altgedient und den VDR habe ich einfach über die Paketverwaltung installiert.
Das ist aber nicht das Thema, sondern ACPI-WAKEUP auf dem besagten Bord. Als ich mit dem Testscript acpi-script-test.sh aus dem WIKI (runterfahren und nach 3 Minuten neu starten) die Eignung getestet habe, blieb die Alarmzeit einfach leer (mit UTC oder ohne). Durch Zufall fiel mir dann allerdings auf, daß die allmorgendliche Aufwachzeit sehr wohl in die Alarmzeit eingetragen wurde - allerdings eine Stunde zu früh.
Meine Idee war daraufhin, die Stunde zum Testscript hinzuzufügen (in Zeile 7 +3780 statt +180 Sekunden)
#!/bin/bash
# Startet dem Rechner nach 3 Minuten über ACPI neu.
DEV=/sys/class/rtc/rtc0/wakealarm
#DEV=/proc/acpi/alarm # Fuer Kernel < 2.6.22
nextboot=`date --date "now +3780 seconds" "+%s"`
echo 0 > $DEV
echo $nextboot > $DEV # Einige Mainboards sind etwas begriffsstutzig,
#echo $nextboot > $DEV # sie kapieren erst nach zwei Aufrufen, was Sache ist.
echo "Aktuelle Zeit: "`date "+%Y-%m-%d %H:%M:%S"`
echo
cat /proc/driver/rtc
echo
echo "Fahre Rechner runter."
#busybox poweroff
#/usr/bin/poweroff.pl
poweroff
Alles anzeigen
und siehe da: 3 Minuten später springt mein Rechner wieder an.
Analog musste ich also irgendwie diese 60 Minuten im apci-wakeup-shutdown-hook unterbringen. (Zeile 167 hat hier geholfen)
#!/bin/sh
#
# VDR shutdown hook for ACPI - Tobias Grimm <vdr@e-tobi.net>
# --------------------------
#
# This shutdown hook sets the wakeup time for the next timer using
# ACPI.
#
if [ "`basename $0`" != "testwakeup" ] ; then
# read arguments for acpi-wakeup from conf-file
. /etc/vdr/vdr-addon-acpiwakeup.conf
WAKEUP_FILE="/var/cache/vdr/acpiwakeup.time"
# take care of UTC setting
if [ -f /etc/default/rcS ]; then
UTC=$(egrep "^[^#]*UTC=" /etc/default/rcS | tail -n1 | cut -d= -f2)
fi
LOG="logger -t vdr-addon-acpiwakeup "
else
UTC=$UTC
WAKEUP_FILE=$WAKEUP_FILE
LOG="nop"
fi
nop()
{
# No Operation
echo -n ""
}
if [ "$UTC" = "yes" ]; then
TIME_FUNCTION="gmtime"
else
TIME_FUNCTION="localtime"
fi
# Defaults:
[ -z "$ACPI_ENABLED" ] && export ACPI_ENABLED="yes"
[ -z "$ACPI_REGULAR_DAYS" ] && export ACPI_REGULAR_DAYS="0"
[ -z "$ACPI_REGULAR_TIME" ] && export ACPI_REGULAR_TIME="00:00"
[ -z "$ACPI_START_AHEAD" ] && export ACPI_START_AHEAD="5"
[ -z "$ACPI_ALARM" ] && export ACPI_ALARM="/proc/acpi/alarm"
[ -z "$WAKEALARM" ] && export WAKEALARM="/sys/class/rtc/rtc0/wakealarm"
TIMER=$1
TimeToString()
{
echo $(perl -e "(\$s,\$mi,\$h,\$d,\$mo,\$y,\$t,\$t,\$t)=\
$TIME_FUNCTION($1); printf(\"%04d-%02d-%02d %02d:%02d:%02d\",\
\$y+1900,\$mo+1,\$d,\$h,\$mi,\$s);")
}
AcpiError()
{
$LOG "No writeable $ACPI_ALARM or $WAKEALARM found. ACPI needed!!!"
echo "ABORT_MESSAGE=\"ACPI not installed, shutdown aborted!\""
exit 1
}
ResetWakeupTimeKernelLte2_6_22()
{
# I don't really now right now, how to disable
# the wakeup, so just set it to 00:00:01 !!!!
SetWakeupTimeKernelLte2_6_22 \
"`date -d '00:00:01' +'%s' | sed 's/_/ /'`"
return $?
}
SetWakeupTimeKernelLte2_6_22()
{
# convert time_t to YYYY-MM-DD HH:MM:SS
TIME_TO_SET=`TimeToString $1`
if [ -w $ACPI_ALARM ]; then
$LOG "Lte - schreibt die Aufwachzeit nach $ACPI_ALARM"
echo "$TIME_TO_SET" >$ACPI_ALARM
# Set it once more - some boards require this!
echo "$TIME_TO_SET" >$ACPI_ALARM
return $?
else
return 1
fi
}
ResetWakeupTimeKernelGte2_6_23()
{
if [ -w $WAKEALARM ]; then
$LOG "Gte - schreibt die Aufwachzeit nach $WAKEALARM"
echo 0 >$WAKEALARM
return $?
else
return 1
fi
}
SetWakeupTimeKernelGte2_6_23()
{
if [ -w $WAKEALARM ]; then
if ResetWakeupTimeKernelGte2_6_23 ; then
$LOG "Aufwachzeit wird nach $WAKEALARM geschrieben"
echo "$1" >$WAKEALARM
return $?
fi
fi
return 1
}
ResetWakeupTime()
{
$LOG "Resetting ACPI alarm time"
ResetWakeupTimeKernelLte2_6_22 || \
ResetWakeupTimeKernelGte2_6_23 || \
AcpiError
}
SetWakeupTime()
{
$LOG "Setze ACPI-Alarmzeit auf: `TimeToString $TIMER`"
SetWakeupTimeKernelLte2_6_22 "$1" || \
SetWakeupTimeKernelGte2_6_23 "$1" || \
AcpiError
# remember wakeup time for stop script
echo `TimeToString $1` >$WAKEUP_FILE
}
IsRegularDayOfWeek()
{
local day
for day in $ACPI_REGULAR_DAYS ; do
if [ "$day" = "`date -d \"@$1\" +%u`" ] ; then
return 0
fi
done
return 1
}
if [ $ACPI_ENABLED = "yes" ]; then
# check if we should wake up before the next timer:
if [ "$ACPI_REGULAR_DAYS" != "0" ]; then
REGULAR_TIMER=$(date -d "$ACPI_REGULAR_TIME" +%s)
if [ $REGULAR_TIMER -lt $(date +%s) ] ; then
REGULAR_TIMER=$(($REGULAR_TIMER + 24 * 60 * 60))
fi
while ! IsRegularDayOfWeek $REGULAR_TIMER ; do
REGULAR_TIMER=$(($REGULAR_TIMER + 24 * 60 * 60))
done
if [ $TIMER -eq 0 ] || [ $TIMER -gt 0 -a $REGULAR_TIMER -lt $TIMER ] ; then
TIMER=$REGULAR_TIMER
fi
fi
if [ $TIMER -gt 0 ]; then
MIN_START_AHEAD=$((`date +%s` + 60 * $ACPI_START_AHEAD))
if [ $MIN_START_AHEAD -gt $TIMER ]; then
$LOG "Die Aufwachzeit muß mehr als $ACPI_START_AHEAD Minuten in der Zukunft liegen."
echo "ABORT_MESSAGE=\"Aufwachen in weniger als $ACPI_START_AHEAD Minuten, abbrechen!\""
exit 1
fi
# adjust wakeup time by ACPI_START_AHEAD
TIMER=$(($TIMER + 3600 - 60 * $ACPI_START_AHEAD)) # +3600 als Workaround für Asrock rudi
fi
if [ $TIMER -eq 0 ]; then
ResetWakeupTime
else
SetWakeupTime "$TIMER"
$LOG Aufwachzeit auf $TIMER entspricht `TimeToString $TIMER` gesetzt
$LOG ...dient als Workaround für korrektes Aufwachen
else
$LOG "ACPIWakeup functionality is disabled"
fi
Alles anzeigen
Und so seltsam es klingt, der Alarmzeit wird tatsächlich die Zeit + 1 Stunde übergeben, wie ich nach dem Neustart in der Datei
/var/cache/vdr/acpiwakeup.time.old sehen kann. Ich hoffe das hilft auch anderen (oder jemand hat irgendeine Erklärung dafür)