FritzBox Offset-Uhrzeit aus Weckzeit berechnen
Die Funktion übernimmt die Weckzeiten von einer FritzBox, ermittelt die nächste relevante Weckzeit und berechnet dann eine um x Minuten versetzte Offset-Uhrzeit dazu.
fhem.cfg
define at {FB_NextAlarmClockTime('next Offset',-10)} set lamp on
Beispiele
Sub (z.B. 99_myutils.pm)
########################################################################################################
## Übernimmt alle Weckzeiten der FritzBox, ermittelt die nächste Weckzeit
## und berechnet daraus eine Offset-Uhrzeit Erstellt: LaLeLu, 28.11.2012
##
## Eigentlich ist aber anstelle der Weckzeit die Offset-Uhrzeit die relevante Zeit zur Steuerung
## beliebiger Aufgaben in fhem. Deshalb ist die Steuerung auf die Offset-Uhrzeit ausgelegt.
## Möchte man über die Weckzeit steuern, muss der Offset auf 0 gesetzt werden.
##
## Der 1. Parameter bestimmt die Art der Rückgabe der Funktion. Mögliche Parameter sind:
## next Offset,next Alarm,next Alarm full,next Offset full,all,Alarms,Offsets
##
## Durch den 2. Parameter wird eine Offset-Uhrzeit ermittelt, die um x Minuten versetzt ist.
## Beispiel: Weckzeit 06:40 => {FB_NextAlarmClockTime('next Offset',-10)} => 06:30
##
## urspr. Version: http://wiki.fhem.de/wiki/FritzBox_Parameter_in_fhem_anzeigen. Danke an den Autor!
##
## Es wird auch die Nr. des Alarms und die Nr. des Telefons ausgegeben.
## Damit können verschiedene Schaltaufgaben gesteuert werden.
##
## Eingabe zum Testen in Kommandozeile fhem: reload 99_myUtils.pm
## Aktualisierung auslösen: trigger n_FBWeckzeitAuswerten
## {FB_AlarmClockTimes('next Offset',-10)}
## oder: {FB_AlarmClockTimes('all',-10)}
##
## Gebrauch z.B. über: define at {FB_NextAlarmClockTime('next',-10)} set lamp on
########################################################################################################
sub FB_AlarmClockTimes($$)
{
my $PreturnMode = shift;
my $Poffset = shift;
my @FritzAlarmClockTime;
my @FritzAlarmClockActive;
my @FritzAlarmClockActiveJN;
my @FritzAlarmClockNumber;
my @FritzAlarmClockWeekdays; my @FritzAlarmClockWeekdaysMod;
my @AlarmFull;
my $k; my $i;
my @Weekdays;
my $AlarmDay; my $AlarmTime; my $OffsetTime;
my @ToLate; my @AlarmTimeOrgHM; my @AlarmTimeHM; my @OffsetTimeHM;
my $ReturnText;
my %Days = (0,"SO",1,"MO",2,"DI",3,"MI",4,"DO",5,"FR",6,"SA");
my ($sec,$min,$hour,$mday,$month,$year,$wday,$yday,$isdst) = localtime;
my $myNow = sprintf("%02d:%02d", $hour, $min);
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';
};
$AlarmTime = substr($FritzAlarmClockTime[$k],0,2).":".substr($FritzAlarmClockTime[$k],2,2);
$OffsetTime = TimeOffset($AlarmTime,$Poffset);
# Check, ob Alarm relevant ist:
# - Ist der Alarm aktiv?
# - Ist heute ein Wecktag?
# - Ist die Weckzeit schon abgelaufen?
if ($FritzAlarmClockActive[$k] != 1) {
$ToLate[$k] = 'Weckzeit nicht aktiv ';
$AlarmTimeOrgHM[$k] = $AlarmTime;
$AlarmTimeHM[$k] = 'Nicht aktiv ';
$OffsetTimeHM[$k] = 'Nein ';
}
elsif ($Weekdays[$k] =~ /$Days{$wday}/ or
$Weekdays[$k] eq 'Einmal-Alarm') {
$AlarmDay = 'HEUTE ist ein Wecktag';
if ($AlarmTime le $myNow) {
$ToLate[$k] = 'Weckzeit abgelaufen ';
$AlarmTimeOrgHM[$k] = $AlarmTime;
$AlarmTimeHM[$k] = 'Nein ';
$OffsetTimeHM[$k] = 'Nein ';
}
elsif ($OffsetTime le $myNow) {
$ToLate[$k] = 'Offsetzeit abgelaufen';
$AlarmTimeOrgHM[$k] = $AlarmTime;
$AlarmTimeHM[$k] = $AlarmTime;
$OffsetTimeHM[$k] = 'Nein ';
}
else {
$ToLate[$k] = ' Weckzeit ist';
$AlarmTimeOrgHM[$k] = $AlarmTime;
$AlarmTimeHM[$k] = $AlarmTime;
$OffsetTimeHM[$k] = $OffsetTime;
};
}
else {
$AlarmDay = 'HEUTE ist kein Wecktag';
$ToLate[$k] = 'Weckzeit nicht aktiv';
$AlarmTimeOrgHM[$k] = $AlarmTime;
$AlarmTimeHM[$k] = 'Kein Wecktag';
$OffsetTimeHM[$k] = 'Nein ';
};
# Info über die Weckzeit
if ($FritzAlarmClockActive[$k] != 1) {
$AlarmFull[$k] = ('Nicht aktiver Alarm-Nr. '.$k);
}
else {
$AlarmFull[$k] = ($AlarmDay.', '.$ToLate[$k].' '.$Days{$wday}.' ('.$AlarmTimeOrgHM[$k].') Offset:'.$Poffset.' => '.$OffsetTimeHM[$k].', Telefon: '.$FritzAlarmClockNumber[$k].', Nr. '.$k.': '.' Aktiv: '.$FritzAlarmClockActive[$k].', Wecktage: '.$Weekdays[$k]);
$AlarmFull[$k] =~ s/\n//; # Zeilenvorschub entfernen
};
};
# Rückgabe aller aktiven Weckzeiten mit kompletter Info
if ($PreturnMode =~ /all/) {$ReturnText = join("\n", @AlarmFull)}
# Rückgabe aller Weckzeiten
elsif ($PreturnMode =~ /Alarms/) {@AlarmTimeOrgHM = sort(@AlarmTimeOrgHM);
$ReturnText = join("\n", @AlarmTimeOrgHM)}
# Rückgabe aller Offset-Uhrzeiten
elsif ($PreturnMode =~ /Offsets/) {@OffsetTimeHM = sort(@OffsetTimeHM);
$ReturnText = join("\n", @OffsetTimeHM)}
# Rückgabe der ersten aktiven Alarm-Zeit
elsif ($PreturnMode =~ /next Alarm/) {@AlarmTimeHM = sort(@AlarmTimeHM);
$ReturnText = $AlarmTimeHM[0]}
# Rückgabe der ersten aktiven Offset-Zeit
elsif ($PreturnMode =~ /next Offset/) {@OffsetTimeHM = sort(@OffsetTimeHM);
$ReturnText = $OffsetTimeHM[0]}
# Rückgabe der ersten aktiven Weckzeit als Text
elsif ($PreturnMode =~ /next full/) {@AlarmFull = sort(@AlarmFull);
$ReturnText = $AlarmFull[0]}
# Bei Fehleingabe
else {@OffsetTimeHM = sort(@OffsetTimeHM);
$ReturnText = $OffsetTimeHM[0]};
return $ReturnText;
}
.cfg
Dies ist ein Beispiel für diverse Schaltungen aufgrund der Offset-Uhrzeit. Hierbei wird sichergestellt, dass auch bei kurz aufeinander folgenden Weckzeiten, fhem sicher schaltet. Dazu dient der trigger n_FBWeckzeitAuswerten.
Es werden je nach eingestelltem Telefon verschiedene Aktionen gestartet.
################################################################################################
## Das Auswerten der Weckzeit der Fritzbox (7390) regelmäßig auslösen
## Anstelle von +*00:01:00 kann natürlich auch einfach nur eine Uhrzeit z.B. *{03:00:00} stehen.
################################################################################################
define t_FBWeckzeitAktRegel at +*01:00:00 {\
{Log 3, (' t_FBWeckzeitAktRegel: n_FBWeckzeitAuswerten regelmäßig auslösen.')}\
{fhem("trigger n_FBWeckzeitAuswerten") }\
}
################################################################################################################
## Makro wir gestartet durch: trigger t_FBWeckzeitAktualisieren
## Dies notify erstellt ein AT, das durch Trigger sich selbst wieder
## 1 Min. nach Ablauf der nächsten Offset-Zeit aufruft.
## Damit ist sichergestellt, dass unmittelbar folgende Offset-Zeiten sicher ausgeführt werden.
## Nicht abgefangen werden mehrere identische Weckzeiten. Dieser Fall kann über Telefon: 9 (Alle) gelöst werden.
################################################################################################################
define n_FBWeckzeitAuswerten notify n_FBWeckzeitAuswerten {\
{Log 3, (' n_FBWeckzeitAuswerten: Weckzeiten der FritzBox aktualisieren und auswerten.')}\
{fhem("set FBWeckzeit ".FB_AlarmClockTimes('next Alarm',-10)) }\
{fhem("set FBWeckzeitOffset ".FB_AlarmClockTimes('next Offset',-10)) }\
{fhem("set FBWeckzeitNextFull ".FB_AlarmClockTimes('next full',-10)) }\
if ($defs{"t_AufstehenMuster"}) {\
{Log 3, (' n_FBWeckzeitAuswerten: Das existierende t_AufstehenMuster löschen.') }\
{fhem("delete t_AufstehenMuster") }\
}\
if ($defs{"t_FBWeckzeitAktTrig"}) {\
{Log 3, (' n_FBWeckzeitAuswerten: Das existierende t_FBWeckzeitAktTrig löschen.') }\
{fhem("delete t_FBWeckzeitAktTrig") }\
}\
if (Value("FBWeckzeitOffset") =~ /Nein/) {\
{Log 3, (' n_FBWeckzeitAuswerten: Kein aktiver Alarm => nichts machen.') }\
}\
else {\
if (Value("FBWeckzeitNextFull") =~ /Telefon: 60/) {\
{Log 3, (' n_FBWeckzeitAuswerten: Telefon: 60 (Schlafzimmer) => n_AufstMakroSchlafZi starten.') }\
{fhem("Define t_AufstehenMuster at ".Value("FBWeckzeitOffset")." trigger n_AufstMakroSchlafZi") }\
}\
elsif (Value("FBWeckzeitNextFull") =~ /Telefon: 61/) {\
{Log 3, (' n_FBWeckzeitAuswerten: Telefon: 61 (Wohnzimmer) => n_AufstMakroWoZi starten.') }\
{fhem("Define t_AufstehenMuster at ".Value("FBWeckzeitOffset")." trigger n_AufstMakroWoZi") }\
}\
elsif (Value("FBWeckzeitNextFull") =~ /Telefon: 9/) {\
{Log 3, (' n_FBWeckzeitAuswerten: Telefon: 9 (Alle) => n_AufstMakroSchlafZi erstellen.') }\
{fhem("Define t_AufstehenMuster at ".Value("FBWeckzeitOffset")." trigger n_AufstMakroSchlafZi") }\
}\
else {\
{Log 3, (' n_FBWeckzeitAuswerten: Nichts machen.') }\
}\
{fhem("Define t_FBWeckzeitAktTrig at ".Value("FBWeckzeitOffset").":45 trigger n_FBWeckzeitAuswerten") }\
{fhem("attr t_FBWeckzeitAktTrig room SYSTEM") }\
{fhem("attr t_FBWeckzeitAktTrig group AT") }\
}\
}
#########################################################################
## AufstehenInDerWoche
#########################################################################
## Makro wird gestartet durch: trigger n_AufstehenMakro
define n_AufstMakroWoZi notify n_AufstMakroWoZi {\
{Log 3, (' n_AufstMakroWoZi NOTIFY: ****** Anfang ******')}\
if( Value("Flur_Wohnungstuer") ne "off") {\
{Log 3, (' n_AufstMakroWoZi Die Wohnungstuer ist offen.') }\
{fhem("set Kueche_Licht off") }\
{fhem("set Kueche_Radio off") }\
}\
elsif (Value("Flur_Wohnungstuer") eq "off") {\
{Log 3, (' n_AufstMakroWoZi Keine Aktion. Die WohnungsTuer ist abgeschlossen.') }\
}\
{Log 3, (' n_AufstMakroWoZi NOTIFY: ****** Ende ******')}\
}
## Makro wird gestartet durch: trigger n_AufstehenMakro
define n_AufstMakroSchlafZi notify n_AufstMakroSchlafZi {\
{Log 3, (' n_AufstMakroSchlafZi NOTIFY: ****** Anfang ******')}\
if( Value("Flur_Wohnungstuer") ne "off") {\
{Log 3, (' n_AufstMakroSchlafZi Die Wohnungstuer ist offen.') }\
{fhem("set Flur_Licht dim81% 20") }\
{fhem("set Kueche_Licht on") }\
{fhem("set Kueche_Arbeitslicht dim75% 15") }\
{fhem("set Kueche_Arbeitslicht on-till {sunrise(+1800)}") }\
{fhem("set Kueche_Radio on") }\
{fhem("setstate ImBett off") }\
{fhem("set Bad_Heizung desired-temp 20.5") }\
{fhem("set Kueche_Heizung desired-temp 20.5") }\
if (Value("KinderDa") ne "on") {\
{Log 3, (' n_AufstMakroSchlafZi NOTIFY: * Kinder sind nicht da *') }\
{fhem("set Schlafen_Bett_Licht on-till {sunrise(+1800)}") }\
{fhem("set Schlafen_Radio on") }\
} else {\
{Log 3, (' n_AufstMakroSchlafZi NOTIFY: * Kinder sind da *') }\
{fhem("set Wohnen_Schrank_Licht off") }\
}\
}\
elsif (Value("Flur_Wohnungstuer") eq "off") {\
{Log 3, (' n_AufstMakroSchlafZi Keine Aktion. Die WohnungsTuer ist abgeschlossen.') }\
}\
{Log 3, (' n_AufstMakroSchlafZi NOTIFY: ****** Ende ******')}\
}
Wichtig
Bitte auch die Anmerkungen unter Wichtig in "FritzBox Parameter in fhem anzeigen" beachten. Dort ist der Ursprung dieser Funktion.
Bemerkungen
Diese Funktion läuft auf einer FritzBox 7390.

