Autor Thema: 57_Calendar.pm - Probem mit Termin alle x-Wochen  (Gelesen 885 mal)

Offline Virsacer

  • Full Member
  • ***
  • Beiträge: 214
57_Calendar.pm - Probem mit Termin alle x-Wochen
« 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.
« Letzte Änderung: 05 März 2018, 20:21:44 von Virsacer »

Offline Virsacer

  • Full Member
  • ***
  • Beiträge: 214
Antw:57_Calendar.pm - Probem mit Termin alle x-Wochen
« Antwort #1 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

Offline nils_

  • Developer
  • Sr. Member
  • ****
  • Beiträge: 924
Antw:57_Calendar.pm - Probem mit Termin alle x-Wochen
« Antwort #2 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  ??? )
viele Wege in FHEM es gibt!

Offline Dr. Boris Neubert

  • Global Moderator
  • Hero Member
  • ****
  • Beiträge: 4250
Antw:57_Calendar.pm - Probem mit Termin alle x-Wochen
« Antwort #3 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
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

Offline Virsacer

  • Full Member
  • ***
  • Beiträge: 214
Antw:57_Calendar.pm - Probem mit Termin alle x-Wochen
« Antwort #4 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

Offline Dr. Boris Neubert

  • Global Moderator
  • Hero Member
  • ****
  • Beiträge: 4250
Antw:57_Calendar.pm - Probem mit Termin alle x-Wochen
« Antwort #5 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
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

Offline Virsacer

  • Full Member
  • ***
  • Beiträge: 214
Antw:57_Calendar.pm - Probem mit Termin alle x-Wochen
« Antwort #6 am: 28 März 2018, 19:59:25 »
Ah, sehr gut :)

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