[gelöst] (kein) Bedarf für 57_Calendar2holiday.pm

Begonnen von Beta-User, 15 März 2018, 10:48:23

Vorheriges Thema - Nächstes Thema

ThiloG

Zitat von: Beta-User am 07 Juli 2023, 05:58:37Wenn du den aktuellen code verwendet,  solltest du auch die zugehörige Syntax wählen... Die Yearend-regex braucht man nicht mehr!

Stimmt auffällig. Danke dafür.

TomLee

Hallo Beta-User,

bin die Tage erst auf diese Funktion gestossen, spiele mit dem Gedanken die zu nutzen.

Hätte einen Vorschlag für den Fall, das man für Name des zu erstellenden .holiday-Devices ($targetname) den  Name eines bereits existierenden holiday-File angeben möchte, um die Daten zu ergänzen (falls man das so nutzen möchte).
So würde auch verhindert werden das eine holiday-Datei überschrieben wird, falls man aus versehen den Namen eines bereits existierenden File angibt.

Wie auch immer man sowas umsetzt, so klappt es nach wenigem testen wie ich es mir vorgestellt hatte:

Zitatsub 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");
 
 
  my @hfn = glob("/opt/fhem/FHEM/holiday/*.holiday");
  my @mhfn = map { substr($_, 23) } @hfn;
  my ($error, @content) = FileRead({FileName => "./FHEM/$targetname.holiday"});
  if (!$error) {
  push @holidays, @content;
  FileWrite("./FHEM/${targetname}.holiday",@holidays);}
  else {
  FileWrite("./FHEM/${targetname}.holiday",@holidays);

  }
  }

Gruß

Thomas

Beta-User

Hallo zurück,

habe noch ein Verständnisproblem zu deinem Vorschlag: Warum sollte man eine bestehende holiday-Datei NICHT überschreiben wollen? Das Ganze ist bei mir als rollierender update angelegt (idR. 1x pro Woche per at aufgerufen), und das Beibehalten von Alt-Daten wäre ein Problem, weil z.B. die alten Ferientermine aus 2024 ja in 2025 nur stören würden. Daher schaut das auch mehr oder weniger gar nicht in die Vergangenheit.

Übersehe ich da was? Bin grade gedanklich aus dem Thema auch schon länger raus...
Server: HP-elitedesk@Debian 12, 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: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

betateilchen

Man sollte vor allen Dingen nicht mit festen Pfadangaben arbeiten, auch nicht bei relativen Angaben.

Und die hash-Angabe bei FileRead() kann man sich auch sparen.
Bei FileWrite() wird sie ja schließlich auch nicht verwendet.

Und warum man bestehende Dateien nicht überschreiben sollte, erschließt sich mir auch nicht.

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

TomLee

ZitatÜbersehe ich da was?

Nee, nur ich. Aber daran gedacht, die alten Zeilen zuvor zu löschen hab ich schon, das müsste man natürlich dann noch ergänzen, wie auch immer.

Mein Gedanke war, Daten, die in einem Kalender und einer holiday-Datei separat gepflegt werden, automatisiert zusammenzuführen.

(Ok, warum pflegt man die an zwei Stellen, ja. Kann ja aber vorkommen, warum auch immer)

Darum schrieb ich:
Zitat... für den Fall, das man für Name des zu erstellenden .holiday-Devices ($targetname) den  Name eines bereits existierenden holiday-File angeben möchte, um die Daten zu ergänzen (falls man das so nutzen möchte).

Wie auch immer, so wie jetzt überschreib ich mir bspw. meine rp.holiday (in ./FHEM) wenn ich die Funktion aus versehen mit rp aufrufe, muss man ja nicht machen, kann aber passieren.

Evt. hab ich auch nur ein Verständnisproblem, mag ich nicht ausschließen.