Hauptmenü

[FHZ] Feiertage?

Begonnen von Guest, 07 Mai 2009, 17:27:55

Vorheriges Thema - Nächstes Thema

Dr. Boris Neubert

Originally posted by: <email address deleted>

Hi,

Sven Mueller:
> 3 1 Mon 03 erster Montag im März
> wäre wohl einfacher.
>
Ah. Logisch. Danke.

--
Matthias Urlichs  |  {M:U} IT Design @ m-u-it.de  |   smurf@smurf.noris.de
Disclaimer: Das Zitat wurde zufällig ausgewählt.  |   http://smurf.noris.de
 - -
Wer Gulaschsuppe nachmacht oder fälscht oder nachgemachte oder gefälschte
in Umlauf setzt und zum Verzehr bringt, wird mit Zwiebelsuppe nicht unter
zwei Portionen bestraft. Der Oberkellner.

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups "FHEM users on Linux" group.
To post to this group, send email to fhem-users@googlegroups.com
To unsubscribe from this group, send email to fhem-users+unsubscribe@googlegroups.com
For more options, visit this group at http://groups.google.com/group/fhem-users?hl=en
-~----------~----~----~----~------~----~------~--~-
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

UliM

                                                   

Hallo Sven.

> relativ viel DateTime benutzt (ist ohnehin
> schon ein Requirement für das Modul, soweit ich gesehen habe,

require DateTime::Event::Easter ist nur im Abschnitt
"2" (Osterfeiertage) drin, es wird also nur dann ausgefuehrt, falls
ein Eintrag mit "2" ueberprueft wird. Aber das koennen wir fuer
Abschnitt 5 genauso machen. DateTime nervt mich, weil es 28 Module
laedt (nachgezaehlt), die auf kleinen Rechnern wie der Fritzbox schwer
zu installieren sind und uebermaessig viel Hauptspeicher benoetigen.

> Bei der Gelegenheit wurde auch die Berechnung der
> Schaltjahre an DateTime ausgelagert.

Ich preferiere die "schaltjahr" Funktion :-)

> Wer Fehler findet darf sie selbst fixen oder an mich melden ;-)

Ich melde es lieber, nach ca 10 Minuten herum-aergern mit DateTime:
"get by 11-18" meldet "none". Hinweis: tgtmin und tgtmax muessen
jeweils mit new angelegt werden, sonst verweisen sie auf dem gleichen
Objekt. Das alleine hat das Problem aber immer noch nicht geloest.

Gruss,
  Rudi
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups "FHEM users on Linux" group.
To post to this group, send email to fhem-users@googlegroups.com
To unsubscribe from this group, send email to fhem-users+unsubscribe@googlegroups.com
For more options, visit this group at http://groups.google.com/group/fhem-users?hl=en
-~----------~----~----~----~------~----~------~--~-
RPi4/Raspbian, CUL V3 (ca. 30 HomeMatic-devices), LAN (HarmonyHub, alexa etc.).  Fördermitglied des FHEM e.V.

UliM

Originally posted by: <email address deleted>

Rudolf Koenig schrieb:
> Hallo Sven.
>
>> relativ viel DateTime benutzt (ist ohnehin
>> schon ein Requirement für das Modul, soweit ich gesehen habe,
>
> require DateTime::Event::Easter ist nur im Abschnitt
> "2" (Osterfeiertage) drin, es wird also nur dann ausgefuehrt, falls
> ein Eintrag mit "2" ueberprueft wird. Aber das koennen wir fuer
> Abschnitt 5 genauso machen. DateTime nervt mich, weil es 28 Module
> laedt (nachgezaehlt), die auf kleinen Rechnern wie der Fritzbox schwer
> zu installieren sind und uebermaessig viel Hauptspeicher benoetigen.

Aha, OK, das nenne ich mal eine gute Begründung. Ich stelle die Funktion
mal um, damit sie mktime() benutzt, um die Referenzzeiten etc. zu erstellen.

>> Bei der Gelegenheit wurde auch die Berechnung der
>> Schaltjahre an DateTime ausgelagert.
>
> Ich preferiere die "schaltjahr" Funktion :-)

Habe ich gesehen.
Kannst Du mir erklären, was die Zeile
        $md++ if(schaltjahr($fd[5]+1900) && $fd[4] == 1);
(zeile 111 in 95_holiday.pm) machen soll? $md für Februar wird ja schon
in Zeile 97 angepasst.

>> Wer Fehler findet darf sie selbst fixen oder an mich melden ;-)
>
> Ich melde es lieber, nach ca 10 Minuten herum-aergern mit DateTime:
> "get by 11-18" meldet "none". Hinweis: tgtmin und tgtmax muessen
> jeweils mit new angelegt werden, sonst verweisen sie auf dem gleichen
> Objekt. Das alleine hat das Problem aber immer noch nicht geloest.

Hmm, stimmt, das new() habe ich vergessen.
Ich habe gerade POSIX::mktime gefunden und die Funktion daran angepasst.
Auch die Logik habe ich nochmal durchgesehen und eigentlich keinen
Fehler entdeckt.
Das "get by 11-18" nichts findet wundert mich allerdings nicht, es sei
denn, Du hast die entsprechende holiday-Datei angepasst.

Gibt es einen Tipp, wie ich das sinnvoll debuggen kann?

(leider wieder nicht ausführlich getesteter) neuer Patch ohne
DateTime-Benutzung.

Ciao,
Sven

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups "FHEM users on Linux" group.
To post to this group, send email to fhem-users@googlegroups.com
To unsubscribe from this group, send email to fhem-users+unsubscribe@googlegroups.com
For more options, visit this group at http://groups.google.com/group/fhem-users?hl=en
-~----------~----~----~----~------~----~------~--~---


diff -u -r1.3 95_holiday.pm
--- FHEM/95_holiday.pm   21 May 2009 09:58:09 -0000   1.3
+++ FHEM/95_holiday.pm   22 May 2009 11:02:17 -0000
@@ -121,6 +121,44 @@
         $found = $args[3];
         last;
       }
+    } elsif($l =~ m/^5/) { # nth weekday since MM-DD / before MM-DD
+      my @a = split(" +", $l, 6);
+      # arguments: 5
+      my %wd = ("Sun"=>0, "Mon"=>1, "Tue"=>2, "Wed"=>3,
+                "Thu"=>4, "Fri"=>5, "Sat"=>6);
+      my $wd = $wd{$a[2]};
+      if(!defined($wd)) {
+        Log 1, "Wrong weekday spec: $l";
+        next;
+      }
+      next if $wd != $fd[6]; # check wether weekday matches today
+      my $yday=$fd[7];
+      # create time object of target date - mktime counts months and their
+      # days from 0 instead of 1, so subtract 1 from each
+      my $tgt=mktime(0,0,1,$a[3]-1,$a[4]-1,$fd[5],0,0,-1);
+      my $tgtmin=$tgt;
+      my $tgtmax=$tgt;
+      my $weeksecs=7*24*60*60; # 7 days, 24 hours, 60 minutes, 60seconds each
+      my $cd=mktime(0,0,1,$fd[3],$fd[4],$fd[5],0,0,-1);
+      if ( $a[1] =~ /^-([0-9])*$/ ) {
+        $tgtmin -= $1*$weeksecs; # Minimum: target date minus $1 weeks
+        $tgtmax = $tgtmin+$weeksecs; # Maximum: one week after minimum
+   # needs to be lower than max and greater than or equal to min
+        if ( ($cd ge $tgtmin) && ( $cd lt $tgtmax) ) {
+      $found=$a[5];
+      last;
+   }
+      } elsif ( $a[1] =~ /^\+?([0-9])*$/ ) {
+        $tgtmin += ($1-1)*$weeksecs; # Minimum: target date plus $1-1 weeks
+        $tgtmax = $tgtmin+$weeksecs; # Maximum: one week after minimum
+   # needs to be lower than or equal to max and greater min
+        if ( ($cd gt $tgtmin) && ( $cd le $tgtmax) ) {
+      $found=$a[5];
+      last;
+   }
+      } else {
+        Log 1, "Wrong distance spec: $l";
+        next;
+      }
     }
 
   }
diff -u -r1.63 commandref.html
--- docs/commandref.html   11 May 2009 16:23:38 -0000   1.63
+++ docs/commandref.html   22 May 2009 11:02:17 -0000
@@ -2964,6 +2964,17 @@
             4 01-06 31-06 Summer holiday

           [/list]
           
+      
  • 5

    +          Date relative, weekday fixed holiday. Arguments: <nth>
    +          <weekday> <month> <day> < holiday-name>

    +          Note that while +0 or -0 as offsets are not forbidden, their behaviour
    +          is undefined in the sense that it might change without notice.

    +          Examples:

    +          
      +            5 -1 Wed 11 23 Buss und Bettag (first Wednesday before Nov, 23rd)

      +            5 1 Mon 01 31 First Monday after Jan, 31st (1st Monday in February)

      +          
    +          

  •      [/list]
         See also he.holiday in the contrib directory for official holidays in the
         german country of Hessen.
    diff -u contrib/by.holiday
    --- contrib/by.holiday   2009-05-19 10:32:10.552085500 +0200
    +++ contrib/by.holiday   2009-05-19 10:39:52.000000000 +0200
    @@ -0,0 +1,19 @@
    +# Siehe auch
    +# http://de.wikipedia.org/wiki/Feiertage_in_Deutschland
    +
    +1 01-01 Neujahr
    +1 01-06 Heilige Drei Koenige
    +1 05-01 Tag der Arbeit
    +1 08-15 Mariae Himmelfahrt (nur bei ueberwiegend katholischer Bevoelkerung)
    +1 10-03 Tag der deutschen Einheit
    +1 11-01 Allerheiligen
    +1 12-25 1. Weihnachtstag
    +1 12-26 2. Weihnachtstag
    +
    +2 -2 Karfreitag
    +2  1 Ostermontag
    +2 39 Christi Himmelfahrt
    +2 50 Pfingsten
    +2 60 Fronleichnam
    +#5 -1 Wed 11 23 Buss und Bettag (first Wednesday before Nov, 23rd)

    +
    RPi4/Raspbian, CUL V3 (ca. 30 HomeMatic-devices), LAN (HarmonyHub, alexa etc.).  Fördermitglied des FHEM e.V.

    rudolfkoenig

                                                       

    > Kannst Du mir erklären, was die Zeile
    >         $md++ if(schaltjahr($fd[5]+1900) && $fd[4] == 1);
    > (zeile 111 in 95_holiday.pm) machen soll?

    Stimmt, ist ein Bug, habs geloescht.

    > Gibt es einen Tipp, wie ich das sinnvoll debuggen kann?

    Mit fhem, der laeuft prima mit einem "mobilen" CUL, da braucht man gar
    kein HW, um die meisten Module testetn zu koennen.

    > (leider wieder nicht ausführlich getesteter) neuer Patch ohne
    > DateTime-Benutzung.

    Ich habe es eingebaut (obwohl patch sich gewaehrt hat), getestet, und
    eingecheckt. Ab jetzt nehme ich nur getestete patches entgegen.
    --~--~---------~--~----~------------~-------~--~----~
    You received this message because you are subscribed to the Google Groups "FHEM users on Linux" group.
    To post to this group, send email to fhem-users@googlegroups.com
    To unsubscribe from this group, send email to fhem-users+unsubscribe@googlegroups.com
    For more options, visit this group at http://groups.google.com/group/fhem-users?hl=en
    -~----------~----~----~----~------~----~------~--~-