FHEM Forum

FHEM => Sonstiges => Thema gestartet von: betateilchen am 15 November 2018, 22:37:56

Titel: 95_holiday.pm - Erweiterung um eigene Berechnungen
Beitrag von: betateilchen am 15 November 2018, 22:37:56
Ich weiß noch nicht, wie man das am besten dokumentieren könnte, damit es verstanden wird, aber ich will hier einfach mal meine heutigen Basteleien festhalten.


Index: 95_holiday.pm
===================================================================
--- 95_holiday.pm       (revision 17751)
+++ 95_holiday.pm       (working copy)
@@ -199,6 +199,19 @@
         Log 1, "Wrong distance spec: $l";
         next;
       }
+    } elsif($l =~ m/^6/) { # own calculation
+        my @args = split(" +", $l, 4);
+        my $res = "?";
+        no strict "refs";
+        eval { $res = &{$args[1]}($args[2]); };
+        use strict "refs";
+        if($@) {
+           Log 1, "holiday: Error in own function: $@";
+           next;
+        }
+        if($res eq $fordate) {
+           $found = $args[3];
+        }
     }
     push @foundList, $found if($found);



in der 99_myUtils.pm steht


sub calcAdvent {
  my ($aNum) = shift;
  $aNum //= 21; # 1. Advent als default berechnen
  my $jahr = (localtime(time))[5]+1900;
  my $time = str2time("$jahr-12-25");
  my $wday = (localtime($time))[6];
  $wday = $wday ? $wday : 7;
  $time -= ($wday+$aNum)*86400;
  my $m = (localtime($time))[4]+1;
  my $d = (localtime($time))[3];
  return sprintf("%02d-%02d",$m,$d);
}


in der .holiday Datei steht


6 calcAdvent 21 1.Advent
6 calcAdvent 14 2.Advent
6 calcAdvent  7 3.Advent
6 calcAdvent  0 4.Advent


Erklärung:

6 = neuer Typ in der Datei
calcAdvent = Name einer Funktion, die aufgerufen werden soll, um ein Datum zu berechnen
21 / 14 / 7 / 0 = Parameter, die an die Funktion übergeben werden
1./2./3./4. Advent = Feiertagstext, der im reading auftaucht

Titel: Antw:95_holiday.pm - Erweiterung um eigene Berechnungen
Beitrag von: rudolfkoenig am 16 November 2018, 10:10:12
Wenn Du auch noch fuer die Dokus einen Abschnitt hinzufuegst, dann checke ich das ein :)
Titel: Antw:95_holiday.pm - Erweiterung um eigene Berechnungen
Beitrag von: betateilchen am 16 November 2018, 11:36:15
Am Wochenende will ich Lebkuchen und Weihnachtsplätzchen backen, mal schauen ob ich auch noch zum Dokuschreiben komme :)
Titel: Antw:95_holiday.pm - Erweiterung um eigene Berechnungen
Beitrag von: betateilchen am 16 November 2018, 12:34:05
was man heute kann besorgen, das verschiebe nicht... (ach, das erzähle ich dann morgen zu Ende)


Index: 95_holiday.pm
===================================================================
--- 95_holiday.pm       (revision 17751)
+++ 95_holiday.pm       (working copy)
@@ -199,6 +199,19 @@
         Log 1, "Wrong distance spec: $l";
         next;
       }
+    } elsif($l =~ m/^6/) { # own calculation
+        my @args = split(" +", $l, 4);
+        my $res = "?";
+        no strict "refs";
+        eval { $res = &{$args[1]}($args[2]); };
+        use strict "refs";
+        if($@) {
+           Log 1, "holiday: Error in own function: $@";
+           next;
+        }
+        if($res eq $fordate) {
+           $found = $args[3];
+        }
     }
     push @foundList, $found if($found);

@@ -430,6 +443,28 @@
             5 1 Mon 01 31 First Monday after Jan, 31st (1st Monday in February)<br>
           </ul>
           </li>
+      <li>6<br>
+          Use a perl function to calculate a date. Function must return the result as
+          an exact date in format "mm-dd", e.g. "12-02" <br/>
+          <br/>
+          Example:<br>
+          <ul><code>
+            6 calcAdvent 21 1.Advent<br>
+            6 calcAdvent 14 2.Advent<br>
+            6 calcAdvent  7 3.Advent<br>
+            6 calcAdvent  0 4.Advent<br>
+          </code></ul>
+          <br/>
+          Explanation:<br/>
+          <ul><code>
+          calcAdvent = name of function, e.g. included in 99_myUtils.pm<br/>
+          21 = parameter given to function<br/>
+          1.Advent = text to be shown in readings<br/>
+          </code></ul>
+          <br/>
+          this will call "calcAdvent(21)" to calculate a date.<br/>
+          Errors will be logged in Loglevel 1.<br/>
+      </li>
     </ul>
   </ul>
   <br>
@@ -560,6 +595,28 @@
             5 1 Mon 01 31 Erster Montag in Februar<br>
           </ul>
           </li>
+      <li>6<br>
+          Datum mit einer perl Funktion berechnen. Das Ergebnis muss ein exaktes
+          Datum im Format "mm-dd" sein, z.B."12-02" <br/>
+          <br/>
+          Beispiel:<br>
+          <ul><code>
+            6 calcAdvent 21 1.Advent<br>
+            6 calcAdvent 14 2.Advent<br>
+            6 calcAdvent  7 3.Advent<br>
+            6 calcAdvent  0 4.Advent<br>
+          </code></ul>
+          <br/>
+          Erkl&auml;rung:<br/>
+          <ul><code>
+          calcAdvent = Name der Funktion, z.B. enthalten in 99_myUtils.pm<br/>
+          21 = Parameter zum Funktionsaufruf<br/>
+          1.Advent = Text f&uuml;r die Anzeige in readings<br/>
+          </code></ul>
+          <br/>
+          erzeugt einen Funktionsaufruf "calcAdvent(21)" zur Berechnung eines Datums.<br/>
+          Fehler werden im Loglevel 1 protokolliert.<br/>
+      </li>
     </ul>
   </ul>
   <br>
Titel: Antw:95_holiday.pm - Erweiterung um eigene Berechnungen
Beitrag von: rudolfkoenig am 16 November 2018, 13:37:57
Eingecheckt.
Titel: Antw:95_holiday.pm - Erweiterung um eigene Berechnungen
Beitrag von: betateilchen am 16 November 2018, 14:36:08
Das ging ja erstaunlich widerspruchsfrei :) Danke!
Titel: Antw:95_holiday.pm - Erweiterung um eigene Berechnungen
Beitrag von: Christoph Morrison am 16 November 2018, 15:25:41
Ich würde dann folgendes beisteuern:

de_christmas.holiday


6   calcAdvent 21   1.Advent
6   calcAdvent 14   2.Advent
6   calcAdvent  7   3.Advent
6   calcAdvent  0   4.Advent
1   12-24           Heiliger Abend
1   12-25           1. Weihnachtstag
1   12-26           2. Weihnachtstag


Recht so?
Titel: Antw:95_holiday.pm - Erweiterung um eigene Berechnungen
Beitrag von: betateilchen am 16 November 2018, 15:35:12
Nein, lass das bitte. Einträge vom Typ = 6 müssen vom Anwender selbst in seine lokale .holiday Datei eingefügt werden, wenn er sie für irgendwas benötigt.

Die Funktion calcAdvent() ist nur ein Beispiel. Die verwendete Funktion muss in der jeweiligen FHEM Installation vom Anwender manuell bereitgestellt werden, es ist keine Funktionalität des holiday Moduls selbst.
Titel: Antw:95_holiday.pm - Erweiterung um eigene Berechnungen
Beitrag von: Christoph Morrison am 16 November 2018, 16:03:15
Zitat von: betateilchen am 16 November 2018, 15:35:12
Nein, lass das bitte. Einträge vom Typ = 6 müssen vom Anwender selbst in seine lokale .holiday Datei eingefügt werden, wenn er sie für irgendwas benötigt.

Das finde ich ziemlich ungeschickt, auch wenn du es in die Doku aufnimmst, bzw. genau deswegen. Die Doku liest sich jetzt nämlich tatsächlich so, als würde calcAdvent() nun in 99_myUtils zu finden sein (und ja ich weiß für was e.g./z.B. steht, die myUtils gut ist und dass sie nicht aus dem Repository aktualisiert wird).

Ich fände es besser, wenn entweder die Daten einfach fest in der/einer holiday-Datei stehen (ich mache das auch gerne regelmäßig neu) oder aber dass die Beispielfunktion aus der Doku, egal wie sie heißt, dann auch regulär verfügbar ist oder aber die Doku noch mal klarstellt, dass die konkrete Beispielfunktion calcAdvent() vom User selbst angelegt werden muss. Die Funktion ist nun in der Doku ein loose end, da sie auch nicht dokumentiert ist.
Titel: Antw:95_holiday.pm - Erweiterung um eigene Berechnungen
Beitrag von: betateilchen am 16 November 2018, 16:09:04
Ich hätte die Funktion im Beispiel auch "Heinz" nennen können. Würden wir dann auch diskutieren?
Titel: Antw:95_holiday.pm - Erweiterung um eigene Berechnungen
Beitrag von: betateilchen am 16 November 2018, 16:13:22
Zitat von: Christoph Morrison am 16 November 2018, 16:03:15
Ich fände es besser, wenn entweder die Daten einfach fest in der/einer holiday-Datei stehen (ich mache das auch gerne regelmäßig neu)

Es geht doch hier überhaupt nicht darum, die Adventsdaten in den holiday Dateien zu haben.

Es geht darum, dass man nun mittels eigener Funktionen variable Feiertage/Ereignisse in den holiday devices berücksichtigen kann. Du kannst damit auch die Müllabfuhrtermine in einem holiday device anzeigen lassen, wenn Du die entsprechende Funktion baust und verwendest.

Es macht überhaupt keinen Sinn, solche variablen Daten in den holiday Dateien regelmäßig (jährlich) zu aktualisieren. Denn wenn ein Benutzer die .holiday Datei als "privateCopy" verwendet, bekommt er von den per update gelieferten .holiday Dateien überhaupt nichts mehr mit.

Mach Dich bitte mit der Funktionsweise des holiday Moduls vertraut, bevor Du jetzt mit gutgemeinten, aber wirkungslosen Änderungen an den holiday Dateien vermeidbare Verwirrung stiftest.
Titel: Antw:95_holiday.pm - Erweiterung um eigene Berechnungen
Beitrag von: Toto1973 am 15 Dezember 2019, 23:18:56
Ich blicke noch nicht ganz durch, wie das jetzt berechnet wird.
Aber könnte man damit auch den Totensonntag, der ja eine Woche vor dem 1. Advent liegt und den Volkstrauertag, der 2 Wochen vor dem 1. Advent liegt, berechnen?
Titel: Antw:95_holiday.pm - Erweiterung um eigene Berechnungen
Beitrag von: rudolfkoenig am 16 Dezember 2019, 09:32:27
Ja, man kann damit alles berechnen, weil perl eine Turing-Vollstaendige Sprache ist.
Den Algorithmus dafuer mitzuliefern war nicht Absicht des Autors, und der Beispiel offensichtlich ungluecklich gewaehlt :)

Wer Advent / Adventszeit anzeigen will, der kann es auch einfacher:5 -4 Sun 12 25 1. Advent
5 -4 Sun 12 25 Adventszeit
5 -3 Mon 12 25 Adventszeit
5 -3 Tue 12 25 Adventszeit
5 -3 Wed 12 25 Adventszeit
5 -3 Thu 12 25 Adventszeit
5 -3 Fri 12 25 Adventszeit
5 -3 Sat 12 25 Adventszeit
5 -3 Sun 12 25 2. Advent
5 -3 Sun 12 25 Adventszeit
5 -2 Mon 12 25 Adventszeit
5 -2 Tue 12 25 Adventszeit
5 -2 Wed 12 25 Adventszeit
5 -2 Thu 12 25 Adventszeit
5 -2 Fri 12 25 Adventszeit
5 -2 Sat 12 25 Adventszeit
5 -2 Sun 12 25 3. Advent
5 -2 Sun 12 25 Adventszeit
5 -1 Mon 12 25 Adventszeit
5 -1 Tue 12 25 Adventszeit
5 -1 Wed 12 25 Adventszeit
5 -1 Thu 12 25 Adventszeit
5 -1 Fri 12 25 Adventszeit
5 -1 Sat 12 25 Adventszeit
5 -1 Sun 12 25 4. Advent
5 -1 Sun 12 25 Adventszeit
1 12-19 Adventszeit
1 12-20 Adventszeit
1 12-21 Adventszeit
1 12-22 Adventszeit
1 12-23 Adventszeit
1 12-24 Adventszeit



Das liefert dann sowas wie:
Zitat2019-12-16 09:30:16   state           Adventszeit
     2019-12-16 09:30:16   tomorrow        Adventszeit
     2019-12-16 09:30:16   yesterday       3. Advent, Adventszeit
Titel: Antw:95_holiday.pm - Erweiterung um eigene Berechnungen
Beitrag von: betateilchen am 17 Dezember 2019, 12:48:03
Zitat von: rudolfkoenig am 16 Dezember 2019, 09:32:27
Den Algorithmus dafuer mitzuliefern war nicht Absicht des Autors, und der Beispiel offensichtlich ungluecklich gewaehlt


Zitat von: rudolfkoenig am 16 Dezember 2019, 09:32:27
Wer Advent / Adventszeit anzeigen will, der kann es auch einfacher:

Auch eine gute Idee. Zumindest die Einträge vom Typ 1 müssen dann aber jedes Jahr einmal manuell gepflegt werden.




Zitat von: Toto1973 am 15 Dezember 2019, 23:18:56
Aber könnte man damit auch den Totensonntag, der ja eine Woche vor dem 1. Advent liegt und den Volkstrauertag, der 2 Wochen vor dem 1. Advent liegt, berechnen?

Um beim unglücklich gewählten Beispiel zu bleiben - ja.


6 calcAdvent 35 Volkstrauertag
6 calcAdvent 28 Totensonntag
Titel: Antw:95_holiday.pm - Erweiterung um eigene Berechnungen
Beitrag von: Toto1973 am 18 Dezember 2019, 00:42:46
Vielen Dank für die Antwort!

Das erspart mir das Angleichen der Kalenderdatei. Von daher finde ich das Beispiel gut gewählt :-)

P.S.: Ich nutze es, um meine Adventsbeleuchtung zu steuern. Ist diese vor dem Totensonntag schon installiert, wird sie am Totensonntag ausgeschaltet und am Tag danach wieder an.
Titel: Antw:95_holiday.pm - Erweiterung um eigene Berechnungen
Beitrag von: jschmitt am 05 Mai 2020, 23:11:03
Hallo, ich hänge mich trotzdem nochmal an...
@betateilchen:
Ich habe die Funktion calcAdvent eingebaut und in meinem *.holiday die "6- er Tage" eingefügt.
Klappt soweit - bis:
Wenn ich im Holiday- Device anwähle: "get device YYYY-MM-DD" mit Datum in diesem Format,
bekomme ich als Ergebnis "none", wenn ich als Datum eines in der Zukunft angebe.
Mir scheint als ob vom Datum nur die ersten ZWEI Ziffern der JAHRESZAHL behandelt werden und nicht alle vier.
Wenn ich 2045-11-29 eingebe, kommt "1. Advent", obwohl 2043 2045 der erste Advent am 03.12.2045 ist.
Irgendwas macht sich nur an der "20" fest, nicht an der ganzen Jahreszahl.
Ich kann leider nicht beurteilen ob es an der Funktion calcAdvent oder am Modul holiday hängt.

Viele Grüße,

jschmitt
Titel: Antw:95_holiday.pm - Erweiterung um eigene Berechnungen
Beitrag von: jschmitt am 05 Mai 2020, 23:18:29
NACHTRAG:

eine Abfrage z.B. der Osterfeiertage in der Zukunft geht .

Viele Grüße,

jschmitt
Titel: Antw:95_holiday.pm - Erweiterung um eigene Berechnungen
Beitrag von: jschmitt am 07 Mai 2020, 22:46:19
Hallo allerseits,

ich bin (nach langem Suchen) so weit:

Der Beispielcode von betateilchen nutzt immer nur die aktuelle Zeit,
sollte derzeit (2020) also 29.11. für 1.Advent zurückgeben. Das macht er auch.

Im Jahr 2021 wird der Wert wohl ebenso stimmen (28.11.).
Das wollte ich nur vorher kontrollieren.
Das geht aber aus dem holiday- Modul so nicht...

Wie -Oh- wie bekomme ich das Datum aus dem holiday- Modul per "get YYYY-MM--DD" in
meine 99_myUtils.pm???

Wie "heißt" denn die Variable dort, damit sie weiterverarbeitet werden kann?
Der Code sollte dann entsprechend angepasst werden, sonst wäre die Option "get YYYY-MM--DD"
im holiday-Modul so nicht nutzbar.
So gesehen ist der Beispielcode von betateilchen unglücklich vorgeschlagen, da der Code
die Übergabeparameter vom holiday- Modul offensichtlich nicht verwendet.

Viele Grüße,

jschmitt


Titel: Antw:95_holiday.pm - Erweiterung um eigene Berechnungen
Beitrag von: rudolfkoenig am 08 Mai 2020, 00:03:02
ZitatWie -Oh- wie bekomme ich das Datum aus dem holiday- Modul per "get YYYY-MM--DD" in
meine 99_myUtils.pm???

Per
my $h = fhem("get he 2021-12-25");
Titel: Antw:95_holiday.pm - Erweiterung um eigene Berechnungen
Beitrag von: betateilchen am 08 Mai 2020, 11:27:43
Zitat von: jschmitt am 07 Mai 2020, 22:46:19
So gesehen ist der Beispielcode von betateilchen unglücklich vorgeschlagen, da der Code
die Übergabeparameter vom holiday- Modul offensichtlich nicht verwendet.

Es ist müßig, über den Funktionsumfang eines Code-Schnipsels zu diskutieren, dessen einziger Zweck es war, zu verdeutlichen, wie die vorgeschlagene Erweiterung für das Modul 95_holiday.pm verwendet werden kann.

Das Beispiel tut für mich genau das, was ich seinerzeit erwartet habe (und auch heute noch erwarte), nicht mehr und nicht weniger.

Das Modul selbst tut im Rahmen dieser Erweiterung nichts weiter, als eine Funktion mit einem Parameterstring aufzurufen und das Ergebnis der Funktion in Empfang zu nehmen. Auch das funktioniert einwandfrei. Es steht also jedem Anwender jederzeit frei, eine eigene Funktion zu schreiben, die das gewünschte Ergebnis an das aufrufende Modul zurückliefert.

Deshalb möchte ich die Diskussion über mein Anwendungsbeispiel an dieser Stelle beenden.