FHEM Forum

FHEM - Hausautomations-Systeme => Unterstützende Dienste => Kalendermodule => Thema gestartet von: Virsacer am 05 März 2018, 12:32:33

Titel: 57_Calendar.pm - Probem mit Termin alle x-Wochen
Beitrag von: Virsacer am 05 März 2018, 12:32:33
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.
Titel: Antw:57_Calendar.pm - Probem mit Termin alle x-Wochen
Beitrag von: Virsacer am 27 März 2018, 22:44:40
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
Titel: Antw:57_Calendar.pm - Probem mit Termin alle x-Wochen
Beitrag von: nils_ am 28 März 2018, 08:59:03
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  ??? )
Titel: Antw:57_Calendar.pm - Probem mit Termin alle x-Wochen
Beitrag von: Dr. Boris Neubert am 28 März 2018, 10:22:17
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
Titel: Antw:57_Calendar.pm - Probem mit Termin alle x-Wochen
Beitrag von: Virsacer am 28 März 2018, 10:50:24
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
Titel: Antw:57_Calendar.pm - Probem mit Termin alle x-Wochen
Beitrag von: Dr. Boris Neubert am 28 März 2018, 19:29:36
Hallo Virsacer,

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

Neue Version im Thema nebenan.

Grüße
Boris
Titel: Antw:57_Calendar.pm - Probem mit Termin alle x-Wochen
Beitrag von: Virsacer am 28 März 2018, 19:59:25
Ah, sehr gut :)

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