57_Calendar.pm - Probem mit Termin alle x-Wochen

Begonnen von Virsacer, 05 März 2018, 12:32:33

Vorheriges Thema - Nächstes Thema

Virsacer

Hi,

ich habe heute gemerkt, dass das Kalendermodul mit Terminen alle x-Wochen Probleme hat - Die Wiederholungen des Termins tauchen nicht in "modeStart" auf.

Konkret (Export aus google Kalender):
RRULE:FREQ=WEEKLY;WKST=MO;INTERVAL=5;BYDAY=MO,TU,WE,TH,FR

Habe auch getestet: Wöchentlich geht, aber sobald ich auf 2 Wochen stelle gehts nicht mehr...



EDIT:
Das Problem scheint auch nur dann aufzutreten, wenn sowohl mehrere Wochentage, als auch ein intervall>1 gewählt wird.

Virsacer

Problem behoben 8)

diff -r 1a88ae235c53 FHEM/57_Calendar.pm
--- a/FHEM/57_Calendar.pm Tue Mar 27 11:27:13 2018 +0000
+++ b/FHEM/57_Calendar.pm Tue Mar 27 22:42:06 2018 +0200
@@ -1453,23 +1453,38 @@
                     # BYDAY with prefix (e.g. -1SU or 2MO) is not recognized
                     my @bydays= split(',', $byday);
                     # we skip interval-1 weeks
-                    $nextstart = plusNSeconds($nextstart, 7*24*60*60, $interval-1);
+                    $nextstart = plusNSeconds($nextstart, 7*24*60*60, $interval-1) if ($n > 1);
                     my ($msec, $mmin, $mhour, $mday, $mmon, $myear, $mwday, $yday, $isdat);
-                    my $preventloop = 0;
+                    my $currentstart = 0;
+                    ($msec, $mmin, $mhour, $mday, $mmon, $myear, $mwday, $yday, $isdat) = localtime($nextstart);
+                    $nextstart = plusNSeconds($nextstart, 24*60*60, 7-$mwday) if ($n > 1 and $mwday > 0); # advance to next start of week
                     do {
                         $nextstart = plusNSeconds($nextstart, 24*60*60, 1); # forward day by day
                         ($msec, $mmin, $mhour, $mday, $mmon, $myear, $mwday, $yday, $isdat) =
                             localtime($nextstart);
                         #main::Debug "Skip to: start " . $event->ts($nextstart) . " = " . $weekdays[$mwday];
-                        $preventloop++;
-                        if($preventloop > 7) {
-                            main::Log3 undef, 2,
-                                "Calendar: something is wrong for RRULE $rrule in " .
-                                $self->asString();
-                            last;
+                        if($weekdays[$mwday] ~~ @bydays) {
+                            if ($currentstart > 0){
+                                $skip = 0;
+                                $event = $self->createSingleEvent($currentstart, $onCreateEvent);
+                                if($self->hasKey('EXDATE')) {
+                                    foreach my $exdate (@{$self->values("EXDATE")}) {
+                                        if($self->tm($exdate) == $event->start()) {
+                                            $event->setNote("EXDATE: $exdate");
+                                            $self->addSkippedEvent($event);
+                                            $skip++;
+                                            last;
+                                        }
+                                    }
+                                }
+                                $self->addEventLimited($t, $event) if ($skip == 0); # add current event
+                            }
+                            $currentstart = $nextstart;
                         }
                         #main::Debug "weekday= " . $weekdays[$mwday] . "($mwday), smartmatch " . join(" ",@bydays) ."= " . ($weekdays[$mwday] ~~ @bydays ? "yes" : "no");
-                    } until($weekdays[$mwday] ~~ @bydays);
+                    } until($weekdays[$mwday] eq "SU");
+                    #main::Debug $self->asString();
+                    $nextstart = $currentstart;
                 }
                 else {
                     # default WEEKLY handling

nils_

vielleicht erwähnst du es mal hier: https://forum.fhem.de/index.php/topic,86148.msg785933.html#msg785933

dann geht es auch nicht verloren (ich weiß nicht ob bei Boris die Benachrichtigungen für das Forum hier wieder funktionieren  ??? )
viele Wege in FHEM es gibt!

Dr. Boris Neubert

Hallo Virsacer,

vielen Dank für Deinen Patch.

Ich konnte ihn auf die aktuelle in Entwicklung befindliche Version anwenden. Jetzt muss ich den Code nur noch verstehen.

Welche Varianten hast Du denn getestet?

Viele Grüße
Boris
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

Virsacer

Ich hab auch erstmal ne Weile gebraucht, um zu verstehen, wie die Termine generiert werden :D
In der ursprüglichen Version wurde nur ein Termin der Woche erzeugt - also MO, 5 Wochen später DI, 5 Wochen später MI oder so ähnlich...

Mein Code ist jetzt etwas komplizierter geworden, weil die Termine ja eigentlich erst beim nächsten while-durchlauf gespeichert werden - so musste ich die ganze Woche durchgehen und alle Termine erzeugen, aber immer nur den vorherigen Termin abspeichern...
Und die excludes mussten halt nochmal innerhalb der Woche geprüft werden - aber sollte nachvollziehbar sein :)

Getestet habe ich einzelne und mehrere BYDAY (mal mit und mal ohne SU) mit den Intervallen 1, 2 und 5

Viele Grüße
Virsacer

Dr. Boris Neubert

Hallo Virsacer,

habe noch den Fall abgefangen, dass eine Terminserie mitten in der Woche endet.

Neue Version im Thema nebenan.

Grüße
Boris
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

Virsacer

Ah, sehr gut :)

Ja, an den Fall hatte ich jetzt nicht gedacht...