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
Datei:/w/images/3/3f/FBWeckzeitMuster.png Datei:/w/images/f/fa/FBWeckzeitBeispiel2.png
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://www.fhemwiki.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.