FritzBox Offset-Uhrzeit aus Weckzeit berechnen

Aus FHEMWiki
Version vom 10. Mai 2013, 21:29 Uhr von Generix (Diskussion | Beiträge) (Die Seite wurde neu angelegt: „Die Funktion übernimmt die Weckzeiten von einer FritzBox, ermittelt die nächste relevante Weckzeit und berechnet dann eine um x Minuten versetzte Offset-Uhrz…“)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)

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.

Links

FritzBox: Weckzeit einstellen