FritzBox Offset-Uhrzeit aus Weckzeit berechnen: Unterschied zwischen den Versionen

Aus FHEMWiki
(→‎.cfg: %% => %)
Zeile 239: Zeile 239:
if( Value("Flur_Wohnungstuer") ne "off") {\
if( Value("Flur_Wohnungstuer") ne "off") {\
   {Log 3, (' n_AufstMakroSchlafZi Die Wohnungstuer ist offen.') }\
   {Log 3, (' n_AufstMakroSchlafZi Die Wohnungstuer ist offen.') }\
   {fhem("set Flur_Licht dim81%% 20") }\
   {fhem("set Flur_Licht dim81% 20") }\
   {fhem("set Kueche_Licht on") }\
   {fhem("set Kueche_Licht on") }\
   {fhem("set Kueche_Arbeitslicht dim75%% 15") }\
   {fhem("set Kueche_Arbeitslicht dim75% 15") }\
   {fhem("set Kueche_Arbeitslicht on-till {sunrise(+1800)}") }\
   {fhem("set Kueche_Arbeitslicht on-till {sunrise(+1800)}") }\
   {fhem("set Kueche_Radio on") }\
   {fhem("set Kueche_Radio on") }\
Zeile 261: Zeile 261:
  {Log 3, (' n_AufstMakroSchlafZi NOTIFY: ****** Ende ******')}\
  {Log 3, (' n_AufstMakroSchlafZi NOTIFY: ****** Ende ******')}\
}</nowiki>
}</nowiki>
== Wichtig ==
== Wichtig ==
Bitte auch die Anmerkungen unter Wichtig in "FritzBox Parameter in fhem anzeigen" beachten. Dort ist der Ursprung dieser Funktion.
Bitte auch die Anmerkungen unter Wichtig in "FritzBox Parameter in fhem anzeigen" beachten. Dort ist der Ursprung dieser Funktion.

Version vom 29. November 2015, 13:15 Uhr

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

FBWeckzeitMuster.png

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