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.
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
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 ??? )
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
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
Hallo Virsacer,
habe noch den Fall abgefangen, dass eine Terminserie mitten in der Woche endet.
Neue Version im Thema nebenan.
Grüße
Boris
Ah, sehr gut :)
Ja, an den Fall hatte ich jetzt nicht gedacht...