Hallo,
ich möchte den letzten Termin für heute aus dem Calendar ausgeben. Habe einen Stundenplan und will den Schulschluss ausgeben.
Und im zweiten Schritt bei einer Änderung des Stundenplans über den Tag einen Alarm bei Änderung der letzten Schulstunde ausgeben.
Wie bekomme ich den letzten heutigen Termin?
Weder im Modul Calendar noch im Modul CALVIEW finde ich es...
Hallo Otto,
ich habe die Lösung nicht parat, aber mein Gedanke dazu:
Frag die upcoming Events von heute ab, nimm den letzten und das ist es.
In Perl -> $element=$array[-1];
get <Kalender> events filter:mode=="upcoming" limit:from=0d,to=0d
Das mit der Änderung wird schwieriger, Du musst Dir also zum Zeitpunkt X den Status merken und zum Zeitpunkt Y abfragen ob es eine Änderung gibt. Die Module selbst werden das nicht leisten.
Edit
Erster Ansatz für den Test in der FHEM Kommandozeile (Kalender Name ersetzen):
{my $rcal = fhem ('get Kalender events filter:mode=="upcoming" limit:from=0d,to=0d');; my @events = split ("\n", $rcal);;$events[-1]}
Gruß Otto
ZitatUnd im zweiten Schritt bei einer Änderung des Stundenplans über den Tag einen Alarm bei Änderung der letzten Schulstunde ausgeben.
Dann müsstest Du die Info haben wann es die letzte Änderung an einem Eintrag gab, incl. der Löschung. Ich weiß nicht ob das vorhanden ist, da ich GCALVIEW verwende.
Idee:
2 Instanzen mit versetztem Update und dem Inhaltsvergleich zwischen beiden.
Hallo Otto ;)
danke für deine Hilfe, ich bekomme mit limit:to=1d
{my $rcal = fhem ('get UntisCal events filter:mode=="upcoming" limit:to=1d');; my @events = split ("\n", $rcal);;$events[-1]}
Das 'fast' gewünschte Ergebnis 31.01.2019 14:15 0:45 Mensa
Schön wäre nicht die Startzeit sondern die Endzeit: 15:00
Der Eintrag der ical ist:
55: VEVENT @382 [new]
DESCRIPTION: Test
DTEND: 20190131T140000Z
DTSTAMP: 20190131T094904Z
DTSTART: 20190131T131500Z
LOCATION: 0.1.11
SUMMARY: Mensa
UID: 226965-1843-
>>> Events:
2269651843 upcoming 31.01.2019 14:15-31.01.2019 15:00 Mensa 0.1.11
>>> Skipped events:
Wie bau ich es um?
... in der Commandref steht dazu ja nix, oder bin ich blind
Zitat von: Otto am 31 Januar 2019, 11:27:02
... in der Commandref steht dazu ja nix, oder bin ich blind
ZitatThe format parameter determines the overall formatting of the calendar event. The following format specifications are available:
Müßte also in etwa so gehen
format:custom="Ende: $T2 $S" timeFormat:"%H:%M"
Moin,
danke perfekt.
So sieht es dann aus:
{my $rcal = fhem ('get UntisCal events filter:mode=="upcoming" limit:to=1d format:custom="Ende: $T2 $S" timeFormat:"%H:%M"');; my @events = split ("\n", $rcal);;$events[-1]}
Zitat von: Otto am 31 Januar 2019, 11:27:02
... in der Commandref steht dazu ja nix, oder bin ich blind
momentan ist nur die englische auf die neue Syntax angepasst !!
Zitat von: nils_ am 31 Januar 2019, 13:08:15
momentan ist nur die englische auf die neue Syntax angepasst !!
:) .
Deswegen war ich so frei, aus der _im Zweifel allein maßgeblichen Fassung_ (englisch!) zu zitieren...
Im Ernst: Gut, dass ihr euch da dran gemacht habt, die cref zu übersetzen!
Es wäre evtl. auch eine gute Idee, neben der dt. commandref noch ein paar (ähnliche) Beispiele (wie das hier und bei der ASC-Diskussion) ins Wiki zu packen und deutliche Warnhinweise anzubringen, dass die diversen verstreuten Beispiele nach alter Syntax halt nicht mehr funktionieren....
Zitat von: Otto am 31 Januar 2019, 11:27:02
... in der Commandref steht dazu ja nix, oder bin ich blind
Ich lege mal noch - erklärend und nicht anklagend - nach :D
Steht in der deutschen Doku ganz am Anfang:
ZitatDiese deutsche Übersetzung ist nicht mehr aktuell (siehe bitte Forumsbeitrag). Bitte hilf bei FHEM mit und aktualisiere diese Übersetzung. Die englischsprachige Dokumentation ist immer aktuell.
Was mich wundert ist der Filter limit:from=
Ich bekomme mit
filter:mode=="upcoming" limit:to=1d
den nächsten Termin von Morgen mit angezeigt.
Die Frage ist, warum Dir der Termin von heute bei to=0d nicht angezeigt wird. Bei mir funktioniert das.
Das from brauchst Du bei upcoming nicht, dass stimmt. Das braucht man wenn man den Filter mode nicht angibt. Aber ohne "mode" bekomme ich bei limit:from=0d,to=0d exakt die von heute angezeigt.
@Beta-User
ZitatEs wäre evtl. auch eine gute Idee, neben der dt. commandref noch ein paar (ähnliche) Beispiele (wie das hier und bei der ASC-Diskussion) ins Wiki zu packen und deutliche Warnhinweise anzubringen, dass die diversen verstreuten Beispiele nach alter Syntax halt nicht mehr funktionieren....
Ja das wollte ich eh auch machen. Wobei ich zunächst auch alle Beispiele der englischen Doku nochmal durchspielen wollte, es könnten sich ja Fehler eingeschlichen haben. Mit meinem Schnellschuss von gestern bin ich nicht glücklich.
Gruß Otto
Zitat von: Otto123 am 31 Januar 2019, 15:26:40
@Beta-User
Ja das wollte ich eh auch machen. Wobei ich zunächst auch alle Beispiele der englischen Doku nochmal durchspielen wollte, es könnten sich ja Fehler eingeschlichen haben.
Das ist sicher eine gute Idee, wobei ich im Moment den Eindruck habe, dass das ganz gut paßt. Meine aktuellen Codings zum Thema kennst du ja vermutlich, die sind den cref-Beispielen (und einigen sehr hilfreichen Beiträgen in einem endlos-Thread, der nach der Umstellung des Modul entstanden ist, den ich aber leider grade nicht mehr wiederfinde und diesem hier (https://forum.fhem.de/index.php/topic,87895.0.html)) nachgebildet.
Vielleicht sollte man im Wiki eine Art "Praxisbeispiele" einfügen; die cref hat zwar eigentlich alles drin, was man so braucht (eventbasiertes Arbeiten und Abfrage von Listen usw. zur Vorausschau), aber das ist cref-üblich recht kurz gefaßt und daher vermutlich für manche zu abstrakt.
Perl ist nicht mein Freund:
2019.02.02 08:13:56.093 1: PERL WARNING: Use of uninitialized value $rcal in string ne at (eval 536604) line 3.
2019.02.02 08:13:56.093 3: eval: my $EVTPART0='On';my $NAME='du_test2';my $TYPE='dummy';my $EVENT='On';my $SELF='n_dummy_cal';{
my $rcal = fhem ('get UntisCal events filter:mode=="upcoming" limit:to=1d format:custom="$T2" timeFormat:"%H:%M"');;
my @events = split ("\n", $rcal) if ($rcal ne "");;
##fhem("set dummy_cal $events[-1];");;
}
Wie fange ich das ab, $rcal ist leer. Keine Termine heute
notify:
du_test2 {
my $rcal = fhem ('get UntisCal events filter:mode=="upcoming" limit:to=1d format:custom="$T2" timeFormat:"%H:%M"');;
my @events = split ("\n", $rcal) if ($rcal ne "");;
##fhem("set dummy_cal $events[-1];");;
}
my @events = split ("\n", $rcal) if ($rcal);;
Moin Otto,
Was mich wundert ist der Filter limit:from=
Ich bekomme mit
Code: [Auswählen]
filter:mode=="upcoming" limit:to=1d
den nächsten Termin von Morgen mit angezeigt.
du hast Recht, ich bekomme einige Termine für Morgen angezeigt.
Aber mit get UntisCal events limit:to=0d
bekomme ich keine "upcoming" Termine
Diese beiden Termin werden mit limt:to=0d angezeigt:
155: VEVENT @5 [known]
DESCRIPTION: ε 3 Jür
DTEND: 20190204T074500Z
DTSTAMP: 20190204T063003Z
DTSTART: 20190204T070000Z
LOCATION: 0.1.11
SUMMARY: LB-MA
UID: 204371-1601-
>>> Events:
2043711601 * end 04.02.2019 08:00-04.02.2019 08:45 LB-MA 0.1.11
>>> Skipped events:
158: VEVENT @32 [known]
DESCRIPTION: ε 3 Jür
DTEND: 20190204T083000Z
DTSTAMP: 20190204T063003Z
DTSTART: 20190204T074500Z
LOCATION: 0.1.11
SUMMARY: LB-MA
UID: 204372-1601-
>>> Events:
2043721601 * start 04.02.2019 08:45-04.02.2019 09:30 LB-MA 0.1.11
>>> Skipped events:
Und z.B. dieser nicht
161: VEVENT @59 [known]
DESCRIPTION: ε 3 Wof
DTEND: 20190204T093500Z
DTSTAMP: 20190204T063003Z
DTSTART: 20190204T085000Z
LOCATION: 0.1.11
SUMMARY: EN
UID: 202191-1448-
>>> Events:
2021911448 upcoming 04.02.2019 09:50-04.02.2019 10:35 EN 0.1.11
>>> Skipped events:
Versteht ich nicht
Moin,
ehrlich gesagt, ich auch nicht.
Wie hast Du diese Ansicht der Termine erzeugt?
Kannst Du den Thread bitte nach Kalendermodule (https://forum.fhem.de/index.php/board,85.0.html)verschieben, da kann vielleicht Boris was zu sagen.
Die Termine werden ja richtig erkannt, der erste ist zu Ende, der zweite am Start der dritte hat noch nicht begonnen.
Die Inhalte sehen für mich auch in Ordnung aus.
Gruß Otto
Hi Otto,
ZitatWie hast Du diese Ansicht der Termine erzeugt?
mit get UntisCal vevents
ZitatKannst Du den Thread bitte nach Kalendermodule verschieben, da kann vielleicht Boris was zu sagen.
Done
Zitat von: Otto am 04 Februar 2019, 10:01:10
mit get UntisCal vevents
Da unten war ich noch nicht - danke. ;D
Meine Einträge (Google Kalender) sehen etwas anders aus. Aber ich kann da irgendwie nichts ableiten. Mal sehen ob Boris eine Idee hat.
Der wird wohl ein Stückchen Kalender haben wollen, vielleicht kannst Du schon mal einen Teil (oder alles, ich weiß nicht was da alles drin steht) Deiner ics Datei als Anhang liefern.
Hallo,
das wäre sehr nett, hier die ics Datei.
ich wünsche mir insgeheim auch schon lange ein limit=today
Dabei könnte das Schlüsselwort today dafür sorgen, dass zum Ausführungszeitpunkt der Abfrage mit einer Funktion secondsSinceMidnight() der Filter limit:from und mit 86400-secondsSinceMidnight() der Filter limit:to (jeweils in Sekunden) bestückt werden.
Klar, kann man sich das auch selbst bauen...
ich hab da mal was vorbereitet...
--- aktualisierter patch im weiteren Verlauf des Threads ---
Hi,
Ich bin begeistert !
Das Ergebnis sieht gut aus.
Vielen Dank.
Hallo,
das ist schön.
Ich würde lediglich die Syntax auf limit:when=today verändern, um im Rhythmus zu bleiben.
Ich würde den Patch einspielen zusammen mit der aktualisierten deutschen Commandref. Bin derzeit nur eingeschränkt in der Lage, an FHEM zu entwickeln.
Viele Grüße
Boris
Man könnte auf gleiche Weise auch when=tomorrow einbauen...
$from = 86400 - Calendar_GetSecondsFromMidnight();
$to = $from + 86400;
Zitat von: Dr. Boris Neubert am 04 Februar 2019, 18:50:01
Ich würde lediglich die Syntax auf limit:when=today verändern, um im Rhythmus zu bleiben.
Zitat von: betateilchen am 04 Februar 2019, 19:00:03
Man könnte auf gleiche Weise auch when=tomorrow einbauen...
Here we go...
--- aktualisierter patch im weiteren Verlauf des Threads ---
Auf zwei FHEM Installationen erfolgreich getestet.
get calName events limit:when=today
get calName events limit:when=tomorrow
Nur die commandref für today/tomorrow sollte noch jemand
ergänzen und möglichst auch gleich übersetzen.
Edit: die commandref mit ihren 5 Mio HTML-tags ist echt gruslig. Aber ich habe zumindest den englischen Teil entsprechend ergänzt.
Und als nächstes werde ich Rudi bitten, in der fhem.pl global eine Variable $daySeconds mit dem Wert 86400 zu definieren, weil man diesen Wert beim Rechnen mit Zeiten immer wieder braucht.
Neben der lobenswerten Weiterentwicklung des Moduls ;D - habe ich jetzt richtig verstanden:
Damit ist Ottos ursprüngliches Problem auch behoben?
D.h. es ist ein Unterschied ob man bei der Abfrage to=0d oder to="die Sekunden bis Mitternacht" angibt? ::)
Gruß Otto
Zitat von: Otto123 am 04 Februar 2019, 22:58:58
D.h. es ist ein Unterschied ob man bei der Abfrage to=0d oder to="die Sekunden bis Mitternacht" angibt? ::)
Natürlich ist das ein Unterschied. Der Filter bei limit:to=0d wird berechnet aus
jetzt + 0 * 86400
und da kommt eben kein späterer Zeitpunkt als "jetzt" raus.
Zeitangaben in der Form 0d 7h 5m 3s werden immer in Sekunden umgerechnet, die dann zum Zeipunkt "jetzt" aufaddiert werden.
d*86400 + h*3600 + m*60 + s
Danke Udo, Deine Erklärung ist völlig logisch und verständlich. Jetzt wo ich drüber nachdenke, frage ich mich warum ich mit try&error zu einer anderen Erkenntnis gekommen bin (ich habe nicht in den Code geschaut sondern einfach mit dem Filter gespielt)
Und ich habe immer Ganztagestermine abgefragt! Ich habe irgendwie gedacht: wenn ich Tage angebe dann denke ich in Tagen
jetzt=heute also from=0d, to=0d immer noch heute (von 00:00-24:00) ;D
das war ein Trugschluss: jetzt ist diese Sekunde!
Zitat von: betateilchen am 04 Februar 2019, 21:29:21
Und als nächstes werde ich Rudi bitten, in der fhem.pl global eine Variable $daySeconds mit dem Wert 86400 zu definieren, weil man diesen Wert beim Rechnen mit Zeiten immer wieder braucht.
Rudi hat die vorgeschlagenen Konstanten inzwischen schon in fhem.pl bereitgestellt.
Daraufhin habe ich meinen patch nochmal entsprechend überarbeitet und diese Konstanten verwendet.
Index: 57_Calendar.pm
===================================================================
--- 57_Calendar.pm (revision 18497)
+++ 57_Calendar.pm (working copy)
@@ -1995,6 +1995,18 @@
for my $limit (@limits) {
if($limit =~ /count=([1-9]+\d*)/) {
$count= $1;
+ } elsif($limit =~ /when=(today|tomorrow)/i) {
+ my ($from,$to);
+ if (lc($1) eq 'today') {
+ $from = Calendar_GetSecondsFromMidnight();
+ $to = DAYSECONDS - $from;
+ $from *= -1;
+ } else {
+ $from = DAYSECONDS - Calendar_GetSecondsFromMidnight();
+ $to = $from + DAYSECONDS;
+ }
+ push @filters, { ref => \&filter_endafter, param => $t+$from };
+ push @filters, { ref => \&filter_startbefore, param => $t+$to };
} elsif($limit =~ /from=([+-]?)(.+)/ ) {
my $sign= $1 eq "-" ? -1 : 1;
my ($error, $from)= Calendar_GetSecondsFromTimeSpec($2);
@@ -2227,6 +2239,12 @@
#
###################################
+sub Calendar_GetSecondsFromMidnight(){
+ my @time = localtime();
+ return (($time[2] * HOURSECONDS) + ($time[1] * MINUTESECONDS) + $time[0]);
+}
+
+###################################
sub Calendar_GetSecondsFromTimeSpec($) {
my ($tspec) = @_;
@@ -3370,11 +3388,13 @@
<tr><td><code>to=[+|-]<timespec></code></td><td>shows only events that start before
a timespan <timespec> from now; use a minus sign for events in the
past; <timespec> is described below in the Attributes section</td></tr>
+ <tr><td><code>when=today|tomorrow</code></td><td>shows events for today or tomorrow</td></tr>
</table><br>
Examples:<br>
<code>get MyCalendar events limit:count=10</code><br>
<code>get MyCalendar events limit:from=-2d</code><br>
+ <code>get MyCalendar events limit:when=today</code><br>
<code>get MyCalendar events limit:count=10,from=0,to=+10d</code><br>
<br><br>
Zitat von: Dr. Boris Neubert am 04 Februar 2019, 18:50:01
Bin derzeit nur eingeschränkt in der Lage, an FHEM zu entwickeln.
Hallo Boris,
wenn es Dir hilft, kann ich meinen patch gerne vorab einchecken, damit die neue Funktion kurzfristig verfügbar wird.
Zitat von: betateilchen am 07 Februar 2019, 23:20:10
wenn es Dir hilft, kann ich meinen patch gerne vorab einchecken, damit die neue Funktion kurzfristig verfügbar wird.
Danke Udo, gerne.
Erledigt. Der neue Filter für "today" und "tomorrow" kommt morgen per update.