Weckzeit anzeigen und einstellen (FritzBox!Fon FHEM webpgm2 )

Begonnen von LaLeLu, 15 Januar 2012, 17:06:56

Vorheriges Thema - Nächstes Thema

Guest

Originally posted by: <email address deleted>

Hallo LaLeLu ,

ich bekomme noch folgende Fehlermeldung aus deiner Routine. Kannst du damit
was anfangen ? Danke

Argument "N " isn't numeric in subroutine entry at ./FHEM/99_Utils.pm line
255.

Argument "KE" isn't numeric in subroutine entry at ./FHEM/99_Utils.pm line 255.

--
To unsubscribe from this group, send email to
fhem-users+unsubscribe@googlegroups.com

UliM

                                                 

Hi,
Vorsicht: 99_Utils.pm wird über update verteilt, damit wird ggf Deine
Version überschrieben. (Auch wenn nur selten neue Versionen von 99_Utils.pm
kommen).
Würde das an Deiner Stelle nach 99_myUtils.pm schieben.
Gruß, Uli



Am Montag, 26. November 2012 19:45:16 UTC+1 schrieb Andreas Schaller:anke

>
> Argument "N " isn't numeric in subroutine entry at ./FHEM/99_Utils.pmline 255.
>

--
To unsubscribe from this group, send email to
fhem-users+unsubscribe@googlegroups.com
RPi4/Raspbian, CUL V3 (ca. 30 HomeMatic-devices), LAN (HarmonyHub, alexa etc.).  Fördermitglied des FHEM e.V.

Guest

Originally posted by: <email address deleted>

Hallo Andreas,

nein, leider kann ich dazu nichts sagen. Ich denke, da hast Du beim Ändern
irgendwas unpassend gemacht.

Allerdings entwickle und teste ich zur Zeit fleißig weiter. Wenn Du etwas
warten kannst? Die nächsten Tage werde ich eine neue Version hier posten.
Dann kommt auch eine separate Funktion zur Zeitberechnung.

Schönen Tag noch
LaLeLu

Am Montag, 26. November 2012 19:45:16 UTC+1 schrieb Andreas Schaller:
>
> Hallo LaLeLu ,
>
> ich bekomme noch folgende Fehlermeldung aus deiner Routine. Kannst du
> damit was anfangen ? Danke
>
> Argument "N " isn't numeric in subroutine entry at ./FHEM/99_Utils.pm line
> 255.
>
> Argument "KE" isn't numeric in subroutine entry at ./FHEM/99_Utils.pm line 255.
>
>

--
To unsubscribe from this group, send email to
fhem-users+unsubscribe@googlegroups.com

Guest

Originally posted by: <email address deleted>

Hallo an alle Interessierte,

hier die hoffentlich bugfreie Version zur Übernahme der Weckzeiten von
einer FritzBox 7390. Zu anderen kann ich nichts sagen. Ich denke, dass die
Kommentare genügende Erklärungen bieten. Hier mal die Ansicht in FHEMWEB:



Schalter
 FBWeckzeit
<http://fritz.box:8083/fhem?detail=FBWeckzeit>
22:05
FBWeckzeitNextFull
<http://fritz.box:8083/fhem?detail=FBWeckzeitNextFull>
HEUTE ist ein Wecktag, Weckzeit ist MI (22:06) Offset:-10 => 21:56,
Telefon: 61, Nr. 2: Aktiv: 1, Wecktage: MI
FBWeckzeitOffset
<http://fritz.box:8083/fhem?detail=FBWeckzeitOffset>
21:56


*In 99_myUtils.pm wird der Code eingetragen:*

########################################################################################################
## Ermittelt die nächste Weckzeit aus der FritzBox.                        
Erstellt: LaLeLu, 28.11.2012
##
## Eigentlich ist aber anstelle der Weckzeit die Offset-Uhrzeit die
relevante Zeit zur Steuerung
## von beliebigen 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 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
        $FritzAlarmClockWeekdays[$k] == 1) {
       $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;
}


########################################################################################################
## Ermittelt die nächste Weckzeit aus der FritzBox.                        
Erstellt: LaLeLu, 26.11.2012
## Berechnet die Offset-Zeit einer Uhrzeit
## Parameter 1: Uhrzeit
## Parameter 2: Offset in Minuten
## Return:      Die Offset-Uhrzeit
## Beispiel: {TimeOffset("09:05",-10)}  oder auch
TimeOffset(Value("FBWeckzeitOffset"),-10)
########################################################################################################

 sub TimeOffset($$)
 
  {
    my $PtimeOrg = shift;
my $Poffset = shift;

    my ($sec,$min,$hour,$mday,$month,$year,$wday,$yday,$isdst) = localtime;

    my $TimeP     =
mktime(0,substr($PtimeOrg,3,2),substr($PtimeOrg,0,2),$mday,$month,$year,$wday,$yday,$isdst);
my $TimePM    = $TimeP + $Poffset * 60;
    my ($Psec,$Pmin,$Phour,$Pmday,$Pmonth,$Pyear,$Pwday,$Pyday,$Pisdst) =
localtime($TimePM);
my $ReturnText = sprintf("%02d:%02d", $Phour, $Pmin);
  }

#Ende
1;


Die am Ende stehende Funktion kann auch für andere Berechnungen von Zeiten
genutzt werden.
Übrigens: Wer auch über Tage hinweg berechnen möchte, kann diese Funktion
leicht auch dazu nutzen. Alle Infos stehen dafür zur Verfügung.

Jetzt aber zurück zum eigentlichen Thema.

*In fhem.cfg habe ich folgendes stehen.* Es funktioniert wie gewünscht. Ich
kann damit je nach eingestelltem Telefon verschiedene Aktionen starten. Das
Telefon im Schlafzimmer schaltet andere Dinge, als das Telefon im
Wohnzimmer.


##############################################################################################
## Das Auswerten der Weckzeit der Fritzbox (7390) regelmäßig auslösen.
## Anstelle von +*01:00: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") }\
}
attr t_FBWeckzeitAktualisieren room SYSTEM
attr t_FBWeckzeitAktualisieren group AT

##############################################################################################
## 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") }\
}\
}
attr n_FBWeckzeitAuswerten room SYSTEM
attr n_FBWeckzeitAuswerten group NOTIFY


#########################################################################
## 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 ******')}\
}
attr n_Aufstehen group NOTIFY
attr n_Aufstehen room SCHLAFEN



So, ich hoffe genug erklärt zu haben und damit anderen etwas zu helfen.
Falls ihr es für sinnvoll erachtet, kann ich mich auch am Einstellen ins
fhemwiki versuchen.

LaLeLu

--
To unsubscribe from this group, send email to
fhem-users+unsubscribe@googlegroups.com

Guest

Originally posted by: <email address deleted>

Hi Uli,

ich glaube, Du hast mir nicht in Groups geschrieben, sondern als Email.
Deswegen auch die Mail zurück.
Ich habe die Funktion eigentlich exakt so wie Du.

Du bist doch der Schöpfer von floorplan? Super vielen Dank. So sieht
übrigens mein Floorplan aus:




Ich wünsche einen schönen Abend!
Peter Kansy (LaLeLu)

--
To unsubscribe from this group, send email to
fhem-users+unsubscribe@googlegroups.com

Guest

Originally posted by: <email address deleted>

Eine kleine, aber wesentliche Änderung muss man noch vornehmen:
   if (Value("FBWeckzeitOffset") =~ /NEIN/) {\
{Log 3, ('  n_FBWeckzeitAuswerten:  Kein aktiver Alarm => nichts machen.')
}\
}\

muss geändert werden in:
   if (Value("FBWeckzeitOffset") =~ /Nein/) {\
{Log 3, ('  n_FBWeckzeitAuswerten:  Kein aktiver Alarm => nichts machen.')
}\
}\
Sorry,
LaLeLu
Am Mittwoch, 28. November 2012 22:34:32 UTC+1 schrieb LaLeLu:
>
>
>
>
> Hallo an alle Interessierte,
>
> hier die hoffentlich bugfreie Version zur Übernahme der Weckzeiten von
> einer FritzBox 7390. Zu anderen kann ich nichts sagen. Ich denke, dass die
> Kommentare genügende Erklärungen bieten. Hier mal die Ansicht in FHEMWEB:
>
>
>
> Schalter
>  FBWeckzeit
> <http://fritz.box:8083/fhem?detail=FBWeckzeit>
> 22:05
> FBWeckzeitNextFull
> <http://fritz.box:8083/fhem?detail=FBWeckzeitNextFull>
> HEUTE ist ein Wecktag, Weckzeit ist MI (22:06) Offset:-10 => 21:56,
> Telefon: 61, Nr. 2: Aktiv: 1, Wecktage: MI
> FBWeckzeitOffset
> <http://fritz.box:8083/fhem?detail=FBWeckzeitOffset>
> 21:56
>
>
> *In 99_myUtils.pm wird der Code eingetragen:*
>
>
> ########################################################################################################
> ## Ermittelt die nächste Weckzeit aus der FritzBox.                      
>   Erstellt: LaLeLu, 28.11.2012
> ##
> ## Eigentlich ist aber anstelle der Weckzeit die Offset-Uhrzeit die
> relevante Zeit zur Steuerung
> ## von beliebigen 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 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
>         $FritzAlarmClockWeekdays[$k] == 1) {
>        $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;
> }
>
>
>
> ########################################################################################################
> ## Ermittelt die nächste Weckzeit aus der FritzBox.                      
>   Erstellt: LaLeLu, 26.11.2012
> ## Berechnet die Offset-Zeit einer Uhrzeit
> ## Parameter 1: Uhrzeit
> ## Parameter 2: Offset in Minuten
> ## Return:      Die Offset-Uhrzeit
> ## Beispiel: {TimeOffset("09:05",-10)}  oder auch
> TimeOffset(Value("FBWeckzeitOffset"),-10)
>
> ########################################################################################################
>
>  sub TimeOffset($$)
>  
>   {
>     my $PtimeOrg = shift;
> my $Poffset = shift;
>
>     my ($sec,$min,$hour,$mday,$month,$year,$wday,$yday,$isdst) = localtime;
>
>     my $TimeP     =
> mktime(0,substr($PtimeOrg,3,2),substr($PtimeOrg,0,2),$mday,$month,$year,$wday,$yday,$isdst);
> my $TimePM    = $TimeP + $Poffset * 60;
>     my ($Psec,$Pmin,$Phour,$Pmday,$Pmonth,$Pyear,$Pwday,$Pyday,$Pisdst) =
> localtime($TimePM);
> my $ReturnText = sprintf("%02d:%02d", $Phour, $Pmin);
>   }
>
> #Ende
> 1;
>
>
> Die am Ende stehende Funktion kann auch für andere Berechnungen von Zeiten
> genutzt werden.
> Übrigens: Wer auch über Tage hinweg berechnen möchte, kann diese Funktion
> leicht auch dazu nutzen. Alle Infos stehen dafür zur Verfügung.
>
> Jetzt aber zurück zum eigentlichen Thema.
>
> *In fhem.cfg habe ich folgendes stehen.* Es funktioniert wie gewünscht.
> Ich kann damit je nach eingestelltem Telefon verschiedene Aktionen starten.
> Das Telefon im Schlafzimmer schaltet andere Dinge, als das Telefon im
> Wohnzimmer.
>
>
>
> ##############################################################################################
> ## Das Auswerten der Weckzeit der Fritzbox (7390) regelmäßig auslösen.
> ## Anstelle von +*01:00: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") }\
> }
> attr t_FBWeckzeitAktualisieren room SYSTEM
> attr t_FBWeckzeitAktualisieren group AT
>
>
> ##############################################################################################
> ## 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") }\
> }\
> }
> attr n_FBWeckzeitAuswerten room SYSTEM
> attr n_FBWeckzeitAuswerten group NOTIFY
>
>
> #########################################################################
> ## 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 ******')}\
> }
> attr n_Aufstehen group NOTIFY
> attr n_Aufstehen room SCHLAFEN
>
>
>
> So, ich hoffe genug erklärt zu haben und damit anderen etwas zu helfen.
> Falls ihr es für sinnvoll erachtet, kann ich mich auch am Einstellen ins
> fhemwiki versuchen.
>
> LaLeLu
>

--
To unsubscribe from this group, send email to
fhem-users+unsubscribe@googlegroups.com

UliM

                                                 

Cool :)
Wiki ! ?
Gruß, Uli

--
To unsubscribe from this group, send email to
fhem-users+unsubscribe@googlegroups.com
RPi4/Raspbian, CUL V3 (ca. 30 HomeMatic-devices), LAN (HarmonyHub, alexa etc.).  Fördermitglied des FHEM e.V.

Guest

Originally posted by: <email address deleted>

Danke, ich habe noch keinen Wiki-Zugang erhalten. Sobald ich ihn habe,
stelle ich es ein.

Heute morgen musste ich noch mal eine Korrektur vornehmen:

      elsif ($Weekdays[$k] =~ /$Days{$wday}/ or
       $Weekdays[$k] eq 'Einmal-Alarm') {
      $AlarmDay = 'HEUTE ist ein  Wecktag';

Gruß
LaLeLu

Am Freitag, 30. November 2012 20:05:23 UTC+1 schrieb UliM:
>
> Cool :)
> Wiki ! ?
> Gruß, Uli
>

--
To unsubscribe from this group, send email to
fhem-users+unsubscribe@googlegroups.com

Guest

Originally posted by: <email address deleted>

Es gibt jetzt zwei Wiki-Einträge:

- http://www.fhemwiki.de/wiki/FritzBox_Offset-Uhrzeit_aus_Weckzeit_berechnen

- http://www.fhemwiki.de/wiki/Uhrzeit:_Offset_berechnen

Viel Spaß beim Nachbauen
LaLeLu

--
To unsubscribe from this group, send email to
fhem-users+unsubscribe@googlegroups.com

Guest

Originally posted by: <email address deleted>

super sache!

die Umrechnung sollte kein Problem sein. Meistens dürfte einen der
Zeitpunkt des NÄCHSTEN Weck-Events interessieren, man muss also prüfen, ob
der heute schon vorbei ist oder nicht:

($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) =localtime(time);
# also JETZT

$hh=6;
$mm=30;
# als Beispiel für Wecker um 6:30 (musst du entsprechend befüllen)

if($hour>$hh || ($hour==$hh && $min>$mm)){
  $offset=86400 # (24*60*60)
}
# war es heute schon, dann Offset dazu, also der Wecker "klingelt" erst
morgen wieder

$wecker=(mktime( $sec, $mm, $hh, $mday, $mon, $year))+$offset;
#Epoch-Zeit des nächsten Weckers ist nun in $wecker

--
To unsubscribe from this group, send email to
fhem-users+unsubscribe@googlegroups.com

Guest

Originally posted by: <email address deleted>

Ich komme einmal auf meine ursprüngliche Frage vom 15. Januar zurück.
Alle Punkte sind jetzt gelöst und auch im Wiki vorhanden:

Auf meiner FritzBox 7390 läuft ein FritzBox!Fon. Ich nutze den Wecker
> der FritzBox. Die Weckzeit kann ich am Telefon und im Browser
> einstellen. Soweit, sogut.
>
...

> Nun zu meiner Idee:
>
> Ich möchte gerne in fhem (webpgm2) die Weckzeit der FritzBox anzeigen
> und einstellen können. Dazu muss ich meiner Meinung nach:
>
> 1. Die in der FritzBox eingestellte Weckzeit auslesen können.  

2. Die ausgelesene Zeit in webpgm2 anzeigen können.

5. den Timer in fhem 10 Minuten früher starten lassen.  

 
gelöst:
http://www.fhemwiki.de/wiki/FritzBox_Offset-Uhrzeit_aus_Weckzeit_berechnen
 

> 3. Die angezeigte Uhrzeit editieren können.  

4. Die editierte Uhrzeit als neue Weckzeit in der FritzBox einstellen.

 
gelöst: http://www.fhemwiki.de/wiki/FritzBox:_Weckzeit_einstellen
Diesen Eintrag habe ich gerade neu erstellt.

LaLeLu





>

--
To unsubscribe from this group, send email to
fhem-users+unsubscribe@googlegroups.com