Hallo Leute.
Jetzt, nach einiger Zeit stabilen Betriebs meines VDR bin ich soweit zufrieden,
nur eine Sache bekomme ich nicht in den Griff. Ich musste meine Poweroff.pl
etwas modifizieren, damit das "aufwachen" via Suspend to Ram funktioniert, nur
schaltet sich mein VDR nun nur noch auf "Sleep", auch nach dem letzten Timer,
oder wenn ich normal ausschalten will. An sich ist das nicht schlimm, nur verbrät es
unnötig Energie. Anbei habe ich meine geänderte Poweroff.pl und ein selbst-
geschriebenes Script, für das ich den Code hier im Forum irgendwo fand. Ich hoffe, dass jemand mir nen Tipp geben kann.
In der poweroff.pl habe ich die Prozedur "PowerOffZero" eingefügt.
Ich weiß nicht genau, wie ich es hinbekomme, dass der VDR nach der letzten Aufzeichnung ganz ausschaltet, brauche nen guten Tipp (Codebeispiel).
#!/usr/bin/perl
##
# by Thomas Koch <tom@linvdr.org>
#
# PoweroffZero() added by SFZ <webmaster@twilight.de.vu>
##
use POSIX qw(strftime sprintf);
use Time::Local;
my $PROC_ALARM = "/proc/acpi/alarm";
my $SETTIME = "/usr/bin/settime.sh";
my $DEBUG = 0;
my $WAKEUP_MARGIN = 5;
my $TWOOCLOCK = 0;
my $METHOD = 0; # 0 = ACPI-Wakeup, 1 = settime
sub true() { 1; }
sub false() { 0; }
sub dprint {
$_ = join("", @_);
chomp;
print "$_\n" if($DEBUG);
}
sub setTime {
#system("hwclock -w");
system("hwclock -w --directisa");
}
sub setAlarm {
my $Next = shift;
my $TwoOclock = NextTwoOclock();
my $NextStart;
my $ShouldStart;
setTime();
if($Next) {
if($Next > $TwoOclock) {
$ShouldStart = true;
}
$NextStart = $Next - ($WAKEUP_MARGIN * 60);
dprint("Next event at ", strftime("%d.%m.%Y %H:%M", localtime($Next)));
} else {
$ShouldStart = true;
}
if($TWOOCLOCK && $ShouldStart) {
$NextStart = $TwoOclock;
}
if($NextStart) {
dprint("Programming wakeup at ", strftime("%d.%m.%Y %H:%M:%S", localtime($NextStart)));
if($METHOD == 0) {
if(-e $PROC_ALARM) {
system(sprintf("echo \"%s\" > %s", strftime("%Y-%m-%d %H:%M", localtime($NextStart)), $PROC_ALARM));
system(sprintf("echo \"%s\" > %s", strftime("%Y-%m-%d %H:%M", localtime($NextStart)), $PROC_ALARM));
} else {
dprint("$PROC_ALARM does not exist");
}
} else {
if(-e $SETTIME) {
system(sprintf("%s \"%s\"", $SETTIME, strftime("%Y-%m-%d %H:%M:00", localtime($NextStart))));
} else {
dprint("$SETTIME does not exist");
}
}
}
}
sub PowerOffZero {
# -------------> von mir angefügt <--------------------
open (FH, "</acpi/proc/alarm");
my @Dateizeilen = <FH>;
close(FH);
open (FH, ">/usr/whatsin");
print FH @Dateizeilen;
close (FH);
# finally, power off
system("/bin/busybox poweroff") if(!$DEBUG);
}
sub PowerOff {
#write wakeup date in another file, too
open (FH, "</acpi/proc/alarm");
my @Dateizeilen = <FH>;
close(FH);
open (FH, ">/usr/whatsin");
print FH @Dateizeilen;
close (FH);
# finally, go sleep
#system("/bin/busybox poweroff") if(!$DEBUG);
system("/sbin/mypoweroff") if(!$DEBUG);
}
sub NextTwoOclock {
my $now = time();
# Array-Format: ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)
my @today = localtime($now);
@today[0..2] = (0, 0, 2);
# get today 2:00 in seconds since epoc
my $TwoOclock = timelocal(@today);
# Check: Is today 2:00 in future or past?
if($now < $TwoOclock) {
# Today two oclock is in future
return $TwoOclock;
} else {
# We're past two oclock, next two oclock is tomorrow (+86400s)
return $TwoOclock+86400;
}
}
if(scalar(@ARGV)) {
# called from vdr
die "Wrong parameter count\n" if(scalar(@ARGV) != 5);
die "$PROC_ALARM missing" if(!-e $PROC_ALARM);
my($Next, $Delta, $Channel, $Recording, $UserShutdown) = @ARGV;
setAlarm($Next);
PowerOff(); #PowerOffZero();
} else {
# called from cmdline
$next = `svdrpsend.pl next abs`;
if($next =~ /550 No active timers/) {
setAlarm(0);
PowerOffZero();
} elsif($next =~ /250 \d+ (\d+)/) {
setAlarm($1);
PowerOff();
} else {
PowerOffZero();
}
}
Alles anzeigen
meine mypoweroff: