die die Weckzeiten der FritzBox ausliest (Danke für die Vorarbeiten! Das hätte ich nie geschafft.),
##############################################
# $Id: 99_myUtils.pm 1932 2012-10-07 20:15:33Z LaLeLu $
package main;
use strict;
use warnings;
use POSIX;
## Ermittelt die nächste Weckzeit aus der FritzBox.
## Es werden auch die Nr. des Alarms und die Nr. des Telefons ausgegeben.
## Damit können ggf. verschiedene Schaltaufgaben gesteuert werden.
## Modi für den 1. Parameter: all, sort, next full, next
## Der 2. Parameter gibt an, um wie viele Minuten der ursprüngliche Alarm verschoben werden soll.
sub FB_NextAlarmClockTime($$)
{
my $PreturnMode = shift;
my $Poffset = shift;
my @FritzAlarmClockTime;
my @FritzAlarmClockActive; my @FritzAlarmClockActiveJN;
my @FritzAlarmClockNumber;
my @FritzAlarmClockWeekdays; my @FritzAlarmClockWeekdaysMod;
my @FAArray; my @FAArraySort;
my $k; my $i;
my @Weekdays;
my $AlarmDay; my $AlarmTime; my $ToLate;
my $NextAlarmTime = "KEIN Alarm vorhanden";
my ($sec,$min,$hour,$mday,$month,$year,$wday,$yday,$isdst) = localtime;
my $we = (($wday==0 || $wday==6) ? 1 : 0);
my $myNow = $hour.':'.$min;
my $ReturnText;
foreach $k (0..2) {
# Die Weckerdaten aus der FritzBox lesen
my $AStr_Time = "ctlmgr_ctl r telcfg settings/AlarmClock".$k."/Time";
my $AStr_Active = "ctlmgr_ctl r telcfg settings/AlarmClock".$k."/Active";
my $AStr_Number = "ctlmgr_ctl r telcfg settings/AlarmClock".$k."/Number";
my $AStr_Weekdays = "ctlmgr_ctl r telcfg settings/AlarmClock".$k."/Weekdays";
$FritzAlarmClockTime[$k] = `$AStr_Time`;
$FritzAlarmClockActive[$k] = `$AStr_Active`;
$FritzAlarmClockNumber[$k] = `$AStr_Number`;
$FritzAlarmClockWeekdays[$k] = `$AStr_Weekdays`;
$FritzAlarmClockWeekdaysMod[$k] = $FritzAlarmClockWeekdays[$k];
$FritzAlarmClockActive[$k] =~ s/\s*$//g;
# Wecktage ermitteln
$Weekdays[$k] = "";
foreach $i (reverse 0..6) {
if ($FritzAlarmClockWeekdaysMod[$k] - 2**$i >= 0) {
if ($i == 6) {$Weekdays[$k] = "SO ".$Weekdays[$k]};
if ($i == 5) {$Weekdays[$k] = "SA ".$Weekdays[$k]};
if ($i == 4) {$Weekdays[$k] = "FR ".$Weekdays[$k]};
if ($i == 3) {$Weekdays[$k] = "DO ".$Weekdays[$k]};
if ($i == 2) {$Weekdays[$k] = "MI ".$Weekdays[$k]};
if ($i == 1) {$Weekdays[$k] = "DI ".$Weekdays[$k]};
if ($i == 0) {$Weekdays[$k] = "MO ".$Weekdays[$k]};
$FritzAlarmClockWeekdaysMod[$k] = $FritzAlarmClockWeekdaysMod[$k] - 2**$i;
};
};
# Falls keine Wiederholung eingerichtet ist = Einmal-Alarm
if ($FritzAlarmClockWeekdays[$k] == 0) {
$Weekdays[$k] = 'Einmal-Alarm';
};
my %Days = (0,"SO",1,"MO",2,"DI",3,"MI",4,"DO",5,"FR",6,"SA");
# Ist heute ein Wecktag?
if ($Weekdays[$k] =~ /$Days{$wday}/ or
$FritzAlarmClockWeekdays[$k] == 0) {
$AlarmDay = 'HEUTE ist ein Wecktag'
}
else {$AlarmDay = 'HEUTE ist kein Wecktag'};
# Ist die Weckzeit schon abgelaufen?
$AlarmTime = substr($FritzAlarmClockTime[$k],0,2).":".substr($FritzAlarmClockTime[$k],2,2);
if ($AlarmTime le $myNow) {$ToLate = ', Weckzeit ist abgelaufen'}
else {$ToLate = ', Weckzeit ist'};
# Info über eine Weckzeit
$FAArray[$k] = ($AlarmDay.$ToLate.' ('.$AlarmTime.') '.' Alarm-Nr. '.$k.', Telefon: '.$FritzAlarmClockNumber[$k].', Wecktage: '.$Weekdays[$k].' Offset:'.$Poffset);
if ($FritzAlarmClockActive[$k] != 1) {
$FAArray[$k] = ('Kein aktiver Alarm, Alarm-Nr. '.$k)
};
$FAArray[$k] =~ s/\n//; # Zeilenvorschub entfernen
# Welches ist die nächste Weckzeit?
if (($Weekdays[$k] =~ /$Days{$wday}/ or
$FritzAlarmClockWeekdays[$k] == 0 ) and
$AlarmTime ge $myNow and
$NextAlarmTime gt $AlarmTime and
$FritzAlarmClockActive[$k] == 1 )
{$NextAlarmTime = $AlarmTime};
};
# Rückgabe aller aktiven Weckzeiten
if ($PreturnMode =~ /all/) {
$ReturnText = join("\n", @FAArray)
}
# Nach Zeit sortierte Rückgabe aller aktiven Weckzeiten
elsif ($PreturnMode =~ /sort/) {
$ReturnText = join("\n", sort(@FAArray))
}
# Rückgabe der ersten aktiven Weckzeit als Uhrzeit
elsif ($PreturnMode =~ /next/) {
# Offset mit Parameter 2 berechnen (Rechnen mit Zeiten)
my $NextAlarmTimeP = mktime(0,substr($NextAlarmTime,3,2),substr($NextAlarmTime,0,2),$mday,$month,$year,$wday,$yday,$isdst);
my $NextAlarmTimePM = $NextAlarmTimeP + $Poffset * 60;
my ($Psec,$Pmin,$Phour,$Pmday,$Pmonth,$Pyear,$Pwday,$Pyday,$Pisdst) = localtime($NextAlarmTimePM);
my $NextAlarmTimePHM = $Phour.':'.$Pmin;
# Rückgabe der ersten aktiven Weckzeit als Text
if ($PreturnMode =~ /next full/) {
@FAArraySort = sort(@FAArray);
$ReturnText = $FAArraySort[0].' Min. => '.$NextAlarmTimePHM
}
else {$ReturnText = $NextAlarmTimePHM};
}
# ggf. Fehlermeldung
else {
$ReturnText = "\'Bsp.: FB_NextAlarmClockTime(\'next\',-10) Werte für den 1. Parameter sind: all, sort, next full, next; Der 2. Parameter muss eine positive oder negative Zahl sein."
};
return $ReturnText;
}
#Ende
1;
Viel Spaß beim Testen. Ich hoffe es funktioniert.