configDB und holiday-Dateien

Begonnen von Morgennebel, 26 März 2018, 11:04:29

Vorheriges Thema - Nächstes Thema

Morgennebel

Danke für die bisherige Analyse und Arbeit...

Wenn ich ConfigDB nutze und später eine Holiday-Datei definiere

define xyz holiday

sollte diese dann nicht automatisch in die ConfigDB integriert werden? Die Commandref spricht davon, daß die ConfigDB Holidays unterstützt - oder ist es nur meine Erwartungshaltung?

In jedem Fall fände ich es sehr begrüßenswert, den Holiday-Teil der Commandref entsprechend um einen ConfigDB-Absatz zu ergänzen.

Danke, -MN
Einziger Spender an FHEM e.V. mit Dauerauftrag seit >= 24 Monaten

FHEM: MacMini/ESXi, 2-3 FHEM Instanzen produktiv
In-Use: STELLMOTOR, VALVES, PWM-PWMR, Xiaomi, Allergy, Proplanta, UWZ, MQTT,  Homematic, Luftsensor.info, ESP8266, ESERA

betateilchen

Zitat von: Morgennebel am 27 März 2018, 10:16:45
Wenn ich ConfigDB nutze und später eine Holiday-Datei definiere

define xyz holiday

Damit definierst Du keine .holiday Datei, sondern ein holiday device.

Zitat von: Morgennebel am 27 März 2018, 10:16:45
sollte diese dann nicht automatisch in die ConfigDB integriert werden?

Nein.

Zitat von: Morgennebel am 27 März 2018, 10:16:45
Die Commandref spricht davon, daß die ConfigDB Holidays unterstützt - oder ist es nur meine Erwartungshaltung?

Es ist Deine falsche Erwartungshaltung.

configDB unterstützt das Modul holiday zu 100%.

Aber holiday Dateien entstehen nicht automatisch durch die Definition eines holiday devices. Das ist auch bei Verwendung von fhem.cfg nicht anders.

Für das Bereitstellen der von einem Modul zusätzlich benötigten Datei ist in der Regel der Anwender verantwortlich.

  • bei der Arbeit mit fhem.cfg muss die Datei im Dateisystem erstellt werden
  • bei der Arbeit mit configDB muss die Datei in die Datenbank importiert werden

Dieses Vorgehen ist auch in anderen Modulen, die zusätzliche Dateien verwenden, nicht anders. Beispielsweise legt auch das Modul 02_RSS.pm keine layout Datei automatisch an, nur weil sie in einem RSS-device als Quelle namentlich angegeben wird.

Und das ist alles auch ausreichend dokumentiert und überhaupt nichts configDB-spezifisches. Deshalb gibt es für mich auch keine Notwendigkeit dafür, dass irgendein Modul eine configDB-spezifische commandref-Beschreibung bereitstellen muss. Die configDB verhält sich bezüglich der zusätzlichen Dateien exakt so wie die dateibasierte Konfiguration auch: Wenn eine zugehörige Datei nicht vorhanden ist, funktioniert das eben nicht.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Morgennebel

Einziger Spender an FHEM e.V. mit Dauerauftrag seit >= 24 Monaten

FHEM: MacMini/ESXi, 2-3 FHEM Instanzen produktiv
In-Use: STELLMOTOR, VALVES, PWM-PWMR, Xiaomi, Allergy, Proplanta, UWZ, MQTT,  Homematic, Luftsensor.info, ESP8266, ESERA

betateilchen

Du kannst Dir als configDB-Nutzer die Arbeit erleichtern, falls Du öfters eigene .holiday Dateien benötigst.


  • importiere eine beliebige holiday Datei in die Datenbank, falls dort noch gar keine solche Datei existiert
  • öffne die importierte (oder eine beliebige bereits vorhandene .holiday) Datei in "Edit files", schmeiss den kompletten Inhalt raus und speichere die Datei mit "Save as" als "template.holiday" ab
  • wenn Du eine neue (eigene) holiday-Datei erstellen möchtest, öffne die Datei template.holiday, bearbeite diese und speichere sie als "xyz.holiday" mit "Save as" ab

Die Schritte 1 + 2 sind nur einmalig auszuführen!
Da die Datei in Schritt 3 bereits aus der configDB gelesen wird, wird die neue Datei mit "Save as" auch automatisch wieder in die Datenbank zurückgeschrieben. Dieser Schritt kann beliebig oft ausgeführt werden.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

rudolfkoenig

Sorry, etwas spaet, und ihr habt schon Etliches herausgefunden, aber vielleicht hilft die Beschreibung hier trotzdem.

ZitatWieso kann FHEM ein holiday-device anlegen, wenn es keine zugehörige .holiday Datei gibt?
Weil DefFn waehrend FHEM-Start sich anders verhaelt, als danach. Aus welchem Grund auch immer wird die eigentliche Definition per InternalTimer auf die Zeit nach Einlesen von fhem.cfg verschoben.

ZitatDa steht im Internal HOLIDAYFILE die Datei ./FHEM/SH.holiday
Wieso wird aber hier:
...
versucht, ein ganz anderes HOLIDAYFILE zu lesen, nämlich aus ./FHEM/holiday/SH.holiday
Das Modul versucht zunaechst FHEM/SH.holiday zu oeffnen, und falls das nicht existiert, dann FHEM/holiday/SH.holiday, diese aber read-only. HOLIDAYFILE enthaelt den Namen der erfolgreich geoeffneten Datei. Da HOLIDAYFILE ein Internal ist, gehe ich davon aus, dass FHEM nach der Umstellung auf configDB nicht neu gestartet wurde. Eine Alternative laut Programmcode waere, dass die Datei nicht mehr lesbar ist.

ZitatDie zweite Zeile ist aus configDB Sicht auch korrekt, weil holiday.pm keine Dateiliste aus der Datenbank abruft, um diese anzuzeigen.

Doch: wenn die Datei weder in FHEM, noch in FHEM/holiday zu finden ist, und configDBUsed() wahr ist, dann wird         @ret = cfgDB_FW_fileList($dir,".*.holiday",@ret);
aufgerufen, mit $dir=$attr{global}{modpath}."/FHEM/holiday";

ZitatIn der Detailansicht des holiday device erscheint ein Link "Edit ns.holiday" der allerdings nicht funktioniert, weil eine falsche URL erzeugt wird.
Das habe ich gefixt, aber nicht getestet. Kannst du das bitte nachholen?

ZitatDie Meldung sollte doch dann eigentlich auch schon beim Starten von FHEM auftreten und im Log stehen?
Habs getestet, ja tut es.

ZitatEs müsste eine Fehlermeldung in motd ausgegeben werden, dass beim Starten von FHEM Fehler auftraten?
Das nicht, weil das Geraet wg. der InternalTimer-Definition strenggenommen nach FHEM-Start definiert wird.

betateilchen

#20
Hallo Rudi,

danke für Deine Antwort. Hattest Du den Thread auch weiter gelesen?

Das hier:

Zitat von: rudolfkoenig am 27 März 2018, 23:07:15
Doch: wenn die Datei weder in FHEM, noch in FHEM/holiday zu finden ist, und configDBUsed() wahr ist, dann wird         @ret = cfgDB_FW_fileList($dir,".*.holiday",@ret);
aufgerufen, mit $dir=$attr{global}{modpath}."/FHEM/holiday";

hatte ich schon richtiggestellt und beschrieben, warum die Liste meiner Meinung nach trotzdem nicht so funktioniert, wie man es erwarten würde.

https://forum.fhem.de/index.php/topic,86243.msg786857.html#msg786857




Zitat von: rudolfkoenig am 27 März 2018, 23:07:15
Das habe ich gefixt, aber nicht getestet. Kannst du das bitte nachholen?

Das scheint jetzt zu funktionieren, danke.




Bei diesem Test ist mir aber etwas anderes aufgefallen. Bis rev #15701 gab es eine Rückmeldung beim Speichern einer Datei, in der ein Hinweis enthalten war, wohin eine Datei gespeichert wurde.


    $ret = ($ret ? "<h3>ERROR:</h3><b>$ret</b>" :
                "Saved the file $fileName to $forceType");


Seit rev #15710 gibt es diese Meldung nicht mehr, jetzt steht da nur noch "Saved <fileName>".

Es wäre schön, wenn Du den Zusatz mit dem Speicherort wieder einbauen könntest, denn bei Anwendern von configDB gibt es immer Dateien im Dateisystem UND in der Datenbank. Manchmal sogar Dateien mit gleichem Namen an beiden Stellen. Und da ist der Hinweis auf den Speicherort sehr hilfreich.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

rudolfkoenig

Zitatdanke für Deine Antwort. Hattest Du den Thread auch weiter gelesen?
Ja, aber ich habe eure "Entdeckungen" erst gesehen, nachdem ich mein Text schon formuliert habe, und ich habe ihn dann nicht mehr entfernt.

ZitatEs wäre schön, wenn Du den Zusatz mit dem Speicherort wieder einbauen könntest
Im Fall von configDB wird ab sofort wieder "Saved XXX to configDB" gemeldet, bei Filesystem-Speicherung bleibt es beim "Save XXXX", da ich "to file" albern finde.

betateilchen

passt schon, danke :)

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

HeikoBayer

Hallo Zusammen,

sorry, wenn ich dieses alte Thema nochmal aufgreife.
Prinzipiell funktioniert bei mir alles sehr gut!
Nun habe ich eine Frage zu holiday-Datei und configDB:
Ich benutze seit kurzem SSCAL (Synology Calendar für meine Urlaube.
Wie in der FHEM Wiki beschrieben (https://wiki.fhem.de/wiki/SSCal_-_Integration_des_Synology_Calendar_Servers) gibt es die Möglichkeit, Abwesenheiten direkt in die holiday-Datei zu schreiben.
Dazu werden 2 Routinen in 99__myUtils.pm eingefügt:
###################################################################################################
###    Urlaubstermine auswerten mit 57_SSCal.pm
###    Aufruf der Funktion aus Notify
###   
###    $event = compositeBlockNumbers-$EVENT und enthält alle Blocknummern des Kalenders, z.B.
###    compositeBlockNumbers: 00 01 02 03 04 05 06 07 08 09 10 11 12 13
###
####################################################################################################
sub SSCalToHoliday($$$) {
   my ($name,$fName,$event) = @_;
   my $hash           = $defs{$name};
   my ($reading,$evt) = split(": ",$event,2);
   my (@bnr)          = split(" ",$evt);
   
   my @SigList        = qw/Urlaub Abwesend/;                             # Signalwörter im Kalender für "Abwesenheit"
   my @ul;   

   foreach my $bnr (@bnr) {
       last if($bnr eq "none");
       my $status  = ReadingsVal($name, $bnr."_17_Status",  "");         # Status
       my $summary = ReadingsVal($name, $bnr."_01_Summary", "");         # Summary
       my $begin   = ReadingsVal($name, $bnr."_05_Begin",   "");         # Starttermin
       my $end     = ReadingsVal($name, $bnr."_10_End",     "");         # Endtermin
   
       if($status =~ /upcoming|alarmed|started/) {                       # Termine beginnen in Zukunft, Signalwort aus
                                                                         # Liste enthalten ?               
           if (grep {$summary =~ /$_/} @SigList) {               
               my ($sy,$sm,$sd,$sh,$smin,$ss) = ($begin =~ /(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/);
               my ($ey,$em,$ed,$eh,$emin,$es) = ($end   =~ /(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/);
               
               if($sy != $ey) {                                          # wenn Jahreswechsel vorliegt zwei Sätze erzeugen
                   push(@ul, "4 $sm-$sd 12-31 $summary");                # 4 12-09 12-31 Urlaub Teil1
                   push(@ul, "4 01-01 $em-$ed $summary");                # 4 01-01 01-05 Urlaub Teil2
                   
               } else {
                   my $ue = "4 $sm-$sd $em-$ed $summary";
                   push(@ul, $ue);
               }
           }
       }
   }
   
   if (@ul) {
       Log3 ($name, 4, "$name - Argument list for SSCalWriteHoliday:");
       foreach my $i (@ul) {
           Log3 ($name, 4, "$name - $i");
       }
   } else {
       Log3 ($name, 4, "$name - No absence time detected. All absence will be deleted.");
   }
   
   SSCalWriteHoliday($name,$fName,@ul);
       
return;
}

############################################################################
###    Schreibroutine Urlaub in File (central.holiday)
############################################################################
sub SSCalWriteHoliday(@) {
  my ($name,$fName,@ul) = @_;
  $fName = $attr{global}{modpath}."/FHEM/".$fName;

  my $param = {
               FileName   => $fName,
               ForceType  => "file",
              };
 
  my ($err, @old) = FileRead($param);
  if($err) {
      Log3 ($name, 2, "$name - Couldn't read file: $err");
      return;
  }
 
  my @new;                                                             # neue Liste zum Schreiben
  my $del = 0;
 
  foreach my $l (@old) {
      if($l =~ m/^# Time of absence from Calendar $name/i) {
          $del = 1;
      }
 
      if($l =~ m/^# End Time of absence from Calendar $name/i) {
          $del = 0;
  next;
      }
     
      if ($del) {
          next;     
      } else {
          push (@new, $l);
          Log3 ($name, 4, "$name - add line: $l");
      } 
  }
 
  unshift (@ul, "# Time of absence from Calendar $name, updated: ".TimeNow());
  push    (@ul, "# End Time of absence from Calendar $name");
  push    (@new, @ul);

  Log3 ($name, 4, "$name - -> Start new list write into $fName <-");
  foreach my $i (@new) {
      Log3 ($name, 4, "$name - $i");
  }
  Log3 ($name, 4, "$name - -> End new list <-");

  $err = FileWrite($param, @new);
  if($err) {
      Log3 ($name, 2, "$name - Couldn't write holiday data into $fName: $err");
  }
 
return;
}


Wei hier bereits mehrfach erklärt, führt dieser Teil zum Fehler, da die Datei ja nun in der Datenbank liegt und nicht mehr im FHEM Verzeichnis:
sub SSCalWriteHoliday(@) {
  my ($name,$fName,@ul) = @_;
  $fName = $attr{global}{modpath}."/FHEM/".$fName;


Seht Ihr hier eine Möglichkeit, as automatische Beschreiben der holiday-Datei in der BD zu ermöglichen?

Ich würe mich über eine Rückmelung sehr freuen.

Grüße,
Heiko Bayer

betateilchen

Nimm in SSCalWriteHoliday() die Zeile

ForceType  => "file",

raus. Die ist kompletter Unfug.

Kann dieser komische Kalender auf der Synology eigentlich keine ics-Dateien liefern? Die könnte man einfach mit dem Calendar-Modul verarbeiten.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

HeikoBayer

ZitatNimm in SSCalWriteHoliday() die Zeile

Code: [Auswählen]
ForceType  => "file",

raus. Die ist kompletter Unfug.

Perfekt, das klappt. Vielen Dank für die schnelle Hilfe!

ZitatKann dieser komische Kalender auf der Synology eigentlich keine ics-Dateien liefern? Die könnte man einfach mit dem Calendar-Modul verarbeiten.

Das kann ich leider nicht sagen. Habe eben erst mit den Kalendern angefangen um verschiedene Dinge zu automatisieren.

betateilchen

Zitat von: HeikoBayer am 03 Dezember 2021, 13:44:54
Habe eben erst mit den Kalendern angefangen um verschiedene Dinge zu automatisieren.

Gut, aber warum fängst Du dann nicht mit dem Modul an, das genau dafür gedacht ist?
Der Umweg, aus einem Kalender Einträge in ein holiday-File zu schreiben ist doch ziemlich abstrus.
Dafür war das holiday Modul nie vorgesehen.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

HeikoBayer

ZitatGut, aber warum fängst Du dann nicht mit dem Modul an, das genau dafür gedacht ist?
Hm. OK. Bitte klär mich auf. Was wäre denn dafür gedacht?
Vielleicht denke ich hier ja zu kompliziert.

betateilchen

Zitat von: HeikoBayer am 05 Dezember 2021, 10:18:58
Bitte klär mich auf. Was wäre denn dafür gedacht?

:o Das habe ich doch schon geschrieben?

Zitat von: betateilchen am 03 Dezember 2021, 12:22:31
ics-Dateien ... Die könnte man einfach mit dem Calendar-Modul verarbeiten.

Gib mal "help calendar" in die Befehlszeile ein.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

HeikoBayer

#29
ZitatGib mal "help calendar" in die Befehlszeile ein.
Das habe ich alles schon gelesen, hilft mir aber bei meinem Thema so nicht weiter. Ich nutze ASC für die Rollosteuerung und brauche dafür ein Gerät für holiday2we das minimal today und tomorrow liefert.
Mit dem calendar device habe ich es bisher nur mittels div. dummies einigen notifies und einer sub in 99_myUtils geschafft.

Da erscheint mir die Lösung, die im SSCal beschrieben ist, deutlich charmanter.

Oder sehe ich den Wald vor lauter Bäumen nicht?!? Wie sollte ich sonst die verschiedenen Kalender (Feiertage, Ferien) in holiday2we verwenden?