Autor Thema: [gelöst] (kein) Bedarf für 57_Calendar2holiday.pm  (Gelesen 7584 mal)

Offline Beta-User

  • Developer
  • Hero Member
  • ****
  • Beiträge: 15568
Antw:[gelöst] (kein) Bedarf für 57_Calendar2holiday.pm
« Antwort #15 am: 25 Januar 2021, 13:50:37 »
Hmm, da Ferien hier meistens an Freitagen enden, ist mir das noch gar nicht aufgefallen. Aber klar, der Einwand ist berechtigt...

Werde mir das nochmal ansehen, vermutlich wäre es sinnvoll, einfach auch die Uhrzeiten mit anzufordern und dann damit eine insgesamt etwas andere Auswertung zu machen. Sollte nicht zu schwierig sein; evtl. hat ja auch jemand (anderes) Lust?
Server: HP-T620@Debian 10, aktuelles FHEM + ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn:MySensors, Weekday-&RandomTimer, Twilight,  AttrTemplate {u.a. mqtt2, mysensors, zwave}

Offline Beta-User

  • Developer
  • Hero Member
  • ****
  • Beiträge: 15568
Antw:[gelöst] (kein) Bedarf für 57_Calendar2holiday.pm
« Antwort #16 am: 26 Januar 2021, 16:17:17 »
So, hab's etwas umgestellt. Jetzt wird einfach die Endezeit in Sekunden angefordert, davon eine Sekunde abgezogen und dann erst nachformatiert.

Erste Tests sehen gut aus, bin mal gespannt, wer den nächsten bug findet ::) :

sub myCalendar2Holiday {
  my $calname    = shift // return;
  my $regexp     = shift // return;
  my $targetname = shift // $calname;
  my $field      = shift // "summary";
  my $limit      = shift // 10;
  my $yearEndRe  = shift;
 
  my ($sec,$min,$hour,$mday,$month,$year,$wday,$yday,$isdst) =  localtime(gettimeofday());
  my $getstring = $calname . ' events format:custom="4 $T1 $t2 $S ($D)" timeFormat:"%m-%d" limit:count=' . $limit." filter:field($field)=~\"$regexp\"";
  my @holidaysraw = split( /\n/, CommandGet( undef, "$getstring" ));
 
  my @holidays;
  my @singledays;
 
  for my $holiday (@holidaysraw) {
    my @tokens = split (" ",$holiday);

    my $endsecond = $tokens[2]-1;
    my @end_arr = localtime($endsecond);
   
    my $overYE = $end_arr[5] > $year || $yearEndRe && $tokens[3] =~ m/$yearEndRe/ ? 1 : 0;
   
    $tokens[2] = strftime "%m-%d", localtime($endsecond);

    my $severalDays = $tokens[2] eq $tokens[1] ? 0 : 1;
    $holiday = join(' ', @tokens);
    if (!$severalDays) {
      $tokens[0] = 1;
      splice @tokens, 2, 1;
      $holiday = join(' ', @tokens);
      push (@singledays, $holiday);
    } elsif ( !$overYE ) {
      push (@holidays, $holiday);
    } else {
      $holiday = "4 $tokens[1] 12-31 $tokens[3] $tokens[4] (part 1)";
      push (@holidays,$holiday) if $month > 9;
      $holiday = "4 01-01 $tokens[2] $tokens[3] $tokens[4] (part 2)";
      unshift (@holidays,$holiday);
    }
  }
  push @holidays, @singledays;
  unshift (@holidays, "# get $getstring");
  my $today = strftime "%d.%m.%y, %H:%M", localtime(time);;\
  unshift (@holidays, "# Created by myCalendar2Holiday on $today");
  FileWrite("./FHEM/${targetname}.holiday",@holidays);
}
Server: HP-T620@Debian 10, aktuelles FHEM + ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn:MySensors, Weekday-&RandomTimer, Twilight,  AttrTemplate {u.a. mqtt2, mysensors, zwave}

Offline dancatt

  • Sr. Member
  • ****
  • Beiträge: 508
Antw:[gelöst] (kein) Bedarf für 57_Calendar2holiday.pm
« Antwort #17 am: 26 Juli 2021, 09:43:32 »
So, hab's etwas umgestellt. Jetzt wird einfach die Endezeit in Sekunden angefordert, davon eine Sekunde abgezogen und dann erst nachformatiert.

Hi,
habe das hier gefunden und konnte damit einiges umstellen. Vielen Dank für das Codeschnipsel.

Hab nun aber mal eine Verständnisfrage:
Ich rufe folgendes auf myCalendar2Holiday('calendar_Familienkalender','.*(Homeoffice Daniel)','holiday_Homeoffice_Daniel','summary',4,'')In die holiday-Datei wird dann folgender Eintrag geschrieben:
# Created by myCalendar2Holiday on 25.07.21, 23:30
# get calendar_Familienkalender events format:custom="4 $T1 $t2 $S ($D)" timeFormat:"%m-%d" limit:count=4 filter:field(summary)=~".*(Homeoffice Daniel)"
1 06-15 Homeoffice Daniel (24h)
1 06-16 Homeoffice Daniel (24h)
1 06-17 Homeoffice Daniel (24h)
1 06-18 Homeoffice Daniel (24h)
In Google handelt es sich um einen ganztägigen Termin (Wöchentlich an Werktagen, bis 30. Sept. 2021).

Warum startet das am 15.06.?

Vielen Dank.

Gruß Daniel
Cubietruck: FHEM-Server 6.0

Homematic: HM-USB-CFG2, HM-CFG-LAN, HM-LC-SW1-FM, HM-LC-Sw1-Pl-DN-R1, HM-CC-RT-DN, HM-TC-IT-WM-W-EU, HM-SEC-SC-2, HM-SEC-SD, HM-PB-6-WM55

Offline Beta-User

  • Developer
  • Hero Member
  • ****
  • Beiträge: 15568
Antw:[gelöst] (kein) Bedarf für 57_Calendar2holiday.pm
« Antwort #18 am: 26 Juli 2021, 10:29:53 »
Ist von hier aus schwierig zu beantworten ohne die Rückgabe aus dem "calendar-get" im Detail zu kennen bzw. rausfinden zu können, wie die Einstellungen am Calendar sind.

Meine Vermutung wäre, dass die Daten-Limits am Calendar-Device so gesetzt sind, dass auch (zu viele) alte Termine mitkommen
Dessen Attribute "hideOlderThan" und "hideLaterThan" sind großzügig gesetzt (010d/0100d).

Wenn du das Beispiel mit den 10 Tagen "rückwärts" übernimmst, wäre hier aber auch der limit-Parameter noch zu kurz gegriffen, denn die ersten 4 Tage liegen bei der Vorgabe "alle Werktage" (Mo-Sa?) immer in der Vergangenheit (8-9 Werktage/10 Kalendertage). Würde da also eher 30 statt 4 als "limit" festlegen und dann mal schauen, ob das paßt.

PS: Danke für die nette Rückmeldung!
« Letzte Änderung: 26 Juli 2021, 10:32:07 von Beta-User »
Server: HP-T620@Debian 10, aktuelles FHEM + ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn:MySensors, Weekday-&RandomTimer, Twilight,  AttrTemplate {u.a. mqtt2, mysensors, zwave}

Offline dancatt

  • Sr. Member
  • ****
  • Beiträge: 508
Antw:[gelöst] (kein) Bedarf für 57_Calendar2holiday.pm
« Antwort #19 am: 26 Juli 2021, 10:56:32 »
Ist von hier aus schwierig zu beantworten ohne die Rückgabe aus dem "calendar-get" im Detail zu kennen bzw. rausfinden zu können, wie die Einstellungen am Calendar sind.

Meine Vermutung wäre, dass die Daten-Limits am Calendar-Device so gesetzt sind, dass auch (zu viele) alte Termine mitkommen
Wenn du das Beispiel mit den 10 Tagen "rückwärts" übernimmst, wäre hier aber auch der limit-Parameter noch zu kurz gegriffen, denn die ersten 4 Tage liegen bei der Vorgabe "alle Werktage" (Mo-Sa?) immer in der Vergangenheit (8-9 Werktage/10 Kalendertage). Würde da also eher 30 statt 4 als "limit" festlegen und dann mal schauen, ob das paßt.

PS: Danke für die nette Rückmeldung!

Hi, ja klar. Lag an "hideOlderThan". Hätte ich selbst drauf kommen können.
Viele  Dank.
Cubietruck: FHEM-Server 6.0

Homematic: HM-USB-CFG2, HM-CFG-LAN, HM-LC-SW1-FM, HM-LC-Sw1-Pl-DN-R1, HM-CC-RT-DN, HM-TC-IT-WM-W-EU, HM-SEC-SC-2, HM-SEC-SD, HM-PB-6-WM55

Offline dancatt

  • Sr. Member
  • ****
  • Beiträge: 508
Antw:[gelöst] (kein) Bedarf für 57_Calendar2holiday.pm
« Antwort #20 am: 26 Juli 2021, 11:58:16 »
Eine Sache habe ich nun doch noch. Im Falle von Ferien bin ich noch nicht so glücklich.

Folgende Abfrage:
myCalendar2Holiday('calendar_Familienkalender','.*[fF]erie.*','holiday_Ferien','summary',5,'[Ww]eihnacht');
Folgendes wird generiert:
# Created by myCalendar2Holiday on 26.07.21, 11:49
# get calendar_Familienkalender events format:custom="4 $T1 $t2 $S ($D)" timeFormat:"%m-%d" limit:count=5 filter:field(summary)=~".*erie.*"
4 01-01 04-22 Osterferien (10d) (part 2)
4 01-01 02-25 Winterferien (5d) (part 2)
4 01-01 12-31 Weihnachtsferien (9d) (part 2)
4 07-19 08-27 Sommerferien (40d)
4 10-11 10-22 Herbstferien (12d)

Das hat nun zur Folge dass im Holiday Device im Reading state "Weihnachtsferien (9d) (part 2), Sommerferien (40d)" drin steht.
Wenn nun die Sommerferien vorbei sind bleiben da leider noch die Weihnachtsferien drin stehen, obwohl ja eigentlich garkeine sind.
Wenn ich '[Ww]eihnacht' als Parameter weglasse werden die Weihnachtsferien  korrekt generiert. Aber dann funktioniert das vermutlich nicht mit dem Jahreswechsel wenn mal sein sollte. Die Weihnachtsferien gehen dieses Jahr nicht über das Jahr hinaus.
Ich könnte Limit auch heruntersetzen um nicht zuviele Einträge zu generieren oder oder...

Was wäre hier die vernünftigste Lösung? Mich stört so ein bisschen das "01-01". Das Anfgangsdatum ist ja eigentlich bekannt.

Erneut vielen Dank.
Cubietruck: FHEM-Server 6.0

Homematic: HM-USB-CFG2, HM-CFG-LAN, HM-LC-SW1-FM, HM-LC-Sw1-Pl-DN-R1, HM-CC-RT-DN, HM-TC-IT-WM-W-EU, HM-SEC-SC-2, HM-SEC-SD, HM-PB-6-WM55

Offline Beta-User

  • Developer
  • Hero Member
  • ****
  • Beiträge: 15568
Antw:[gelöst] (kein) Bedarf für 57_Calendar2holiday.pm
« Antwort #21 am: 26 Juli 2021, 12:32:35 »
Wie sind denn jetzt die Grenzen gesetzt?

Was das mit der YE-Regex angeht, meine ich mich zu erinnern, dass das eigentlich zwischenzeitlich obsolet geworden ist, weil der Code erkennen müßte, dass das Endedatum vor dem Anfangsdatum (bzw. uU. auch vor heute) liegt. Wir sowas erkannt, passiert genau das, was hier zu beobachten ist: da der (vermeintlich) in diesem Jahr liegende Teil bereits "um" ist, wird nur das angezeigt, was scheinbar im neuen Jahr ist (Teil 2). (War mir aber neu, dass das die ganze Logik auch für andere Termine über den Haufen wirft

Du kannst auch sehen, was jeweils abgerufen wird, der get-Befehl wird ja mit in der .holiday hinterlegt (wenn man es geringfügig ändert, bekommt man auch die Jahresangabe).

Habe mal in die Doku zu Calendar gesehen. Da gibt es die Option, nicht nur "count" zu limitieren, sondern auch die Zeitgrenzen nach vorne und hinten. Evtl. wäre es hilfreich(er), diese Parameter noch mit angeben zu können bzw. sinnvoll (10d/100d sind m.E. ganz ok) vorzubelegen?
Server: HP-T620@Debian 10, aktuelles FHEM + ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn:MySensors, Weekday-&RandomTimer, Twilight,  AttrTemplate {u.a. mqtt2, mysensors, zwave}

Offline dancatt

  • Sr. Member
  • ****
  • Beiträge: 508
Antw:[gelöst] (kein) Bedarf für 57_Calendar2holiday.pm
« Antwort #22 am: 26 Juli 2021, 14:11:54 »
Ok. Im Calendar habe ich keine Grenzen mehr drin.
Hab den Code nun mal etwas angepasst.

sub myCalendar2Holiday {
  my $calname    = shift // return;
  my $regexp     = shift // return;
  my $targetname = shift // $calname;
  my $field      = shift // "summary";
  my $limit      = shift // 10;
  my $from      = shift // "-10d";
  my $to      = shift // "+100d";
 
  Log 3, "myCalendar2Holiday calname: '".$calname."' regexp: '".$regexp."' targetname: '".$targetname."' field: '".$field."' limit: '".$limit."' from: '".$from."' to: '".$to."'";
 
  my ($sec,$min,$hour,$mday,$month,$year,$wday,$yday,$isdst) =  localtime(gettimeofday());
  my $getstring = $calname . ' events format:custom="4 $T1 $t2 $S ($D)" timeFormat:"%Y-%m-%d" limit:count='.$limit.",from=".$from.",to=".$to." filter:field($field)=~\"$regexp\"";
  my @holidaysraw = split( /\n/, CommandGet( undef, "$getstring" ));
 
  my @holidays;
  my @singledays;
 
  for my $holiday (@holidaysraw) {
    my @tokens = split (" ",$holiday);

    my $endsecond = $tokens[2]-1;
    my @end_arr = localtime($endsecond);

my $overYE = $end_arr[5] > $year ? 1 : 0;
   
    $tokens[2] = strftime "%Y-%m-%d", localtime($endsecond);

    my $severalDays = $tokens[2] eq $tokens[1] ? 0 : 1;
    $holiday = join(' ', @tokens);
    if (!$severalDays) {
      $tokens[0] = 1;
      splice @tokens, 2, 1;
      $holiday = join(' ', @tokens);
      push (@singledays, $holiday);
    } elsif ( !$overYE ) {
      push (@holidays, $holiday);
    } else {
  my $Y = strftime "%Y", localtime(time);
      $holiday = "4 $tokens[1] $Y-12-31 $tokens[3] $tokens[4] (part 1)";
      push (@holidays,$holiday) if $month > 9;
      $holiday = "4 ".($Y+1)."-01-01 $tokens[2] $tokens[3] $tokens[4] (part 2)";
      unshift (@holidays,$holiday);
    }
  }
 
  push @holidays, @singledays;
  unshift (@holidays, "# get $getstring");
  my $today = strftime "%d.%m.%y, %H:%M", localtime(time);
  unshift (@holidays, "# Created by myCalendar2Holiday on $today");
  FileWrite("./FHEM/${targetname}.holiday",@holidays);
}

Folgendes wird nun generiert:
# Created by myCalendar2Holiday on 26.07.21, 13:53
# get calendar_Familienkalender events format:custom="4 $T1 $t2 $S ($D)" timeFormat:"%Y-%m-%d" limit:count=5,from=-10d,to=+400d filter:field(summary)=~".*erie.*"
4 2022-01-01 2022-04-22 Osterferien (10d) (part 2)
4 2022-01-01 2022-02-25 Winterferien (5d) (part 2)
4 2021-07-19 2021-08-27 Sommerferien (40d)
4 2021-10-11 2021-10-22 Herbstferien (12d)
4 2021-12-23 2021-12-31 Weihnachtsferien (9d)

Für die Osterferien und die Winterferien wird anscheinend in den else-Fall gesprungen der für den Jahreswechsel verantwortlich ist. Das sollte eigentlich nur der Fall sein wenn Begin und Ende in unterschiedlichen Jahren liegen vermute ich.

Folgende Codestelle erkennt den Jahreswechsel und geht dann in den else Fall:
my $endsecond = $tokens[2]-1;
my @end_arr = localtime($endsecond);

my $overYE = $end_arr[5] > $year ? 1 : 0;
$overYE ist somit true und für die Ferien wird 2022-01-01 statt dem echten Beginn gesetzt.

Sofern ich richtig liege würde doch ausreichen in den else-Fall zu springen wenn "Begin-Jahr == Ende-Jahr-1". Dann liegen die Ferien über dem Jahreswechsel.
Da muss ich wohl meine Perlkenntisse mal auffrischen :-(
Cubietruck: FHEM-Server 6.0

Homematic: HM-USB-CFG2, HM-CFG-LAN, HM-LC-SW1-FM, HM-LC-Sw1-Pl-DN-R1, HM-CC-RT-DN, HM-TC-IT-WM-W-EU, HM-SEC-SC-2, HM-SEC-SD, HM-PB-6-WM55

Offline Beta-User

  • Developer
  • Hero Member
  • ****
  • Beiträge: 15568
Antw:[gelöst] (kein) Bedarf für 57_Calendar2holiday.pm
« Antwort #23 am: 26 Juli 2021, 14:38:45 »
Hmm, da muss ich mich auch erst eindenken.

Grundsätzlich darf in .holiday das Jahr nicht drinstehen, und dass da fälschlich ein YE erkannt wurde, sagt eigentlich schon das (part 2).

Du solltest das mit engeren Zeitgrenzen versuchen,
get calendar_Familienkalender events format:custom="4 $T1 $t2 $S ($D)" timeFormat:"%Y-%m-%d" limit:count=5,from=-10d,to=+400d filter:field(summary)=~".*erie.*"+400d ist nicht gut zur Fehlersuche.

Was liefert (FHEM-Kommandofeld):
get calendar_Familienkalender events timeFormat:"%Y-%m-%d" limit:count=5,from=-10d,to=+100d filter:field(summary)=~".*erie.*"
Server: HP-T620@Debian 10, aktuelles FHEM + ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn:MySensors, Weekday-&RandomTimer, Twilight,  AttrTemplate {u.a. mqtt2, mysensors, zwave}

Offline dancatt

  • Sr. Member
  • ****
  • Beiträge: 508
Antw:[gelöst] (kein) Bedarf für 57_Calendar2holiday.pm
« Antwort #24 am: 26 Juli 2021, 14:50:41 »
Grundsätzlich darf in .holiday das Jahr nicht drinstehen, und dass da fälschlich ein YE erkannt wurde, sagt eigentlich schon das (part 2).
In der Beschreibung von holiday steht aber folgendes:
MM-TT kann auch als JJJJ-MM-TT geschrieben werden.

Du solltest das mit engeren Zeitgrenzen versuchen,
get calendar_Familienkalender events format:custom="4 $T1 $t2 $S ($D)" timeFormat:"%Y-%m-%d" limit:count=5,from=-10d,to=+400d filter:field(summary)=~".*erie.*"+400d ist nicht gut zur Fehlersuche.
+400d mache ich aktuell mit Absicht damit ich da mehrere Ferien bekommen und das testen kann.

Was liefert (FHEM-Kommandofeld):
get calendar_Familienkalender events timeFormat:"%Y-%m-%d" limit:count=5,from=-10d,to=+100d filter:field(summary)=~".*erie.*"
4 2021-07-19 1630101600 Sommerferien (40d)
4 2021-10-11 1634940000 Herbstferien (12d)
4 2021-12-23 1641337200 Weihnachtsferien (13d)
4 2022-02-21 1645830000 Winterferien (5d)
4 2022-04-13 1650664800 Osterferien (10d)

Habe die Weihnachtsferien mal in den Januar gehen lassen. Dann wird aktuell folgendes generiert:
# Created by myCalendar2Holiday on 26.07.21, 14:41
# get calendar_Familienkalender events format:custom="4 $T1 $t2 $S ($D)" timeFormat:"%Y-%m-%d" limit:count=5,from=-10d,to=+400d filter:field(summary)=~".*erie.*"
4 2021-07-19 2021-08-27 Sommerferien (40d)
4 2021-10-11 2021-10-22 Herbstferien (12d)
4 2021-12-23 2022-01-04 Weihnachtsferien (13d)
4 2022-02-21 2022-02-25 Winterferien (5d)
4 2022-04-13 2022-04-22 Osterferien (10d)
Für mich sieht das so aus als benötigt man den else-Fall für den Jahreswechsel garnicht.
Cubietruck: FHEM-Server 6.0

Homematic: HM-USB-CFG2, HM-CFG-LAN, HM-LC-SW1-FM, HM-LC-Sw1-Pl-DN-R1, HM-CC-RT-DN, HM-TC-IT-WM-W-EU, HM-SEC-SC-2, HM-SEC-SD, HM-PB-6-WM55

Offline Beta-User

  • Developer
  • Hero Member
  • ****
  • Beiträge: 15568
Antw:[gelöst] (kein) Bedarf für 57_Calendar2holiday.pm
« Antwort #25 am: 26 Juli 2021, 15:03:03 »
In der Beschreibung von holiday steht aber folgendes:
MM-TT kann auch als JJJJ-MM-TT geschrieben werden.
...https://svn.fhem.de/trac/changeset/21878/trunk/fhem/FHEM/95_holiday.pm (06.05.2020) war mir bisher entgangen...

Damit kann man sich den ganzen Zinnober weitgehend schenken :) , der Code sollte daher mal grundlegend renoviert werden ::) ... Damit könnte man gleich passend abrufen, und Probleme mit "zu langen Zeiträumen" gibt es auch nicht mehr. Vermutlich muss man nur noch darauf achten, dass das Endedatum passt (also Sekunde -1, wenn genau 00:00 Uhr).
Server: HP-T620@Debian 10, aktuelles FHEM + ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn:MySensors, Weekday-&RandomTimer, Twilight,  AttrTemplate {u.a. mqtt2, mysensors, zwave}

Offline Beta-User

  • Developer
  • Hero Member
  • ****
  • Beiträge: 15568
Antw:[gelöst] (kein) Bedarf für 57_Calendar2holiday.pm
« Antwort #26 am: 27 Juli 2021, 07:50:05 »
Hier dann mal die renovierte und aktualisierte Fassung, die YE-regex entfällt, dafür gibt es jetzt die Option, die Zeitgrenzen mitzugeben:
sub myCalendar2Holiday {
  my $calname    = shift // return;
  my $regexp     = shift // return;
  my $targetname = shift // $calname;
  my $field      = shift // "summary";
  my $limit      = shift // 10;
  my $from       = shift // q{-10d};
  my $to         = shift // q{100d};

  my ($sec,$min,$hour,$mday,$month,$year,$wday,$yday,$isdst) =  localtime(gettimeofday());
  my $getstring = $calname . ' events format:custom="4 $T1 $t2 $S ($D)" timeFormat:"%Y-%m-%d" limit:count=' . "${limit},from=${from},to=$to filter:field($field)=~\"$regexp\"";
  my @holidaysraw = split m{\n}xms, CommandGet( undef, $getstring );

  my @holidays;
  my @singledays;

  for my $holiday (@holidaysraw) {
    my @tokens = split (" ",$holiday);

    my $endsecond = $tokens[2]-1;
    my @end_arr = localtime($endsecond);


    $tokens[2] = strftime "%Y-%m-%d", localtime($endsecond);

    my $severalDays = $tokens[2] eq $tokens[1] ? 0 : 1;
    $holiday = join(' ', @tokens);
    if (!$severalDays) {
      $tokens[0] = 1;
      splice @tokens, 2, 1;
      $holiday = join(' ', @tokens);
      push (@singledays, $holiday);
    } else {
      push (@holidays, $holiday);
    }
  }
  push @holidays, @singledays;
  unshift (@holidays, "# get $getstring");
  my $today = strftime "%d.%m.%y, %H:%M", localtime(time);
  unshift (@holidays, "# Created by myCalendar2Holiday on $today");
  FileWrite("./FHEM/${targetname}.holiday",@holidays);
}
Hab's kurz getestet, scheint in meinem Umfeld zu funktionieren.
Server: HP-T620@Debian 10, aktuelles FHEM + ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn:MySensors, Weekday-&RandomTimer, Twilight,  AttrTemplate {u.a. mqtt2, mysensors, zwave}

 

decade-submarginal