diff --git a/fhem/FHEM/57_Calendar.pm b/fhem/FHEM/57_Calendar.pm index c8ab767e9..43545029d 100644 --- a/fhem/FHEM/57_Calendar.pm +++ b/fhem/FHEM/57_Calendar.pm @@ -3256,7 +3256,8 @@ sub CalendarEventsAsHtml($;$) {
The optional parameter interval is the time between subsequent updates
- in seconds. It defaults to 3600 (1 hour).
+ in seconds. It defaults to 3600 (1 hour).
+ An interval = 0 will not be allowed and replaced by 3600 automatically. A corresponding log entry will be created.
Examples:
@@ -3868,5 +3869,577 @@ sub CalendarEventsAsHtml($;$) {
=end html
+=begin html_DE
+
+Calendar
+define <name> Calendar ical url <URL> [<interval>]define <name> Calendar ical file <FILENAME> [<interval>]https://, muß das Perl-Modul IO::Socket::ßL installiert sein
+ (use cpan -i IO::Socket::ßL).<URL> kann %-wildcards der POSIX
+ strftime-Funktion des darunterliegenden OS enthalten (siehe auch strftime
+ Beschreibung).
+ Allgemein gebräuchliche Wildcards sind:
+ %d Tag des Monats (01..31)%m Monat (01..12)%Y Jahr (1970...)%w Wochentag (0..6); beginnend mit Sonntag (0)%j Tag des Jahres (001..366)%U Wochennummer des Jahres, wobei Wochenbeginn = Sonntag (00..53)%W Wochennummer des Jahres, wobei Wochenbeginn = Montag (00..53)https:// beginnen und das Perl-Modul IO::Socket::ßL ist nicht auf deinem System installiert,
+ kannst Du in der URL https:// durch http:// ersetzen, falls keine automatische Umleitung auf die https:// URL erfolgt.
+ Solltest Du unsicher sein, ob dies der Fall ist, überprüfe es bitte zuerst mit deinem Browser.https://admin:admin@demo.nextcloud.com/wid0ohgh/remote.php/dav/calendars/admin/personal/?export.
+
+ Der optionale Parameter interval bestimmt die Zeit in Sekunden zwischen den Updates. Default-Wert ist 3600 (1 Stunde).
+ Eine Intervallangabe von 0 ist nicht erlaubt. Diese wird automatisch durch den Standardwert 3600 ersetzt und im Log protokolliert.
+
+ Beispiele:
+
+ define MeinKalender Calendar ical url https://www.google.com/calendar/ical/john.doe%40example.com/private-foo4711/basic.ics + define DeinKalender Calendar ical url http://www.google.com/calendar/ical/jane.doe%40example.com/private-bar0815/basic.ics 86400 + define IrgendeinKalender Calendar ical file /home/johndoe/calendar.ics ++ + + + Set
set <name> updateinterval Sekunden später.set <name> reloadupdate, jedoch werden zuerst alle Termine entfernt.get <name> updateset <name> updateget <name> reloadset <name> reloadget <name> events [format:<formatSpec>] [timeFormat:<timeFormatSpec>] [filter:<filterSpecs>] [series:next[=<max>]] [limit:<limitSpecs>]format,
+ timeFormat, filter, series und limit
+ können angegeben werden, weiterhin ist es sinnvoll, den Parameter filter mehrere Male anzugeben.
+ format legt den zurückgegeben Inhalt fest.| <formatSpec> | Beschreibung |
|---|---|
default | Standardformat (siehe unten) |
full | entspricht custom="$U $M $A $T1-$T2 $S $CA $L" |
text | entspricht custom="$T1 $S" |
custom="<formatString>" | ein spezifisches Format (siehe unten) |
custom="{ <perl-code> }" | ein spezifisches Format (siehe unten) |
') können anstelle von doppelten Anführungszeichen (") innerhalb
+ eines spezifischen Formats benutzt werden.
+
+ Folgende Variablen können in <formatString> und in
+ <perl-code> verwendet werden:
+ | variable | Bedeutung |
|---|---|
$t1 | Startzeit in Sekunden |
$T1 | Startzeit entsprechend Zeitformat |
$t2 | Endzeit in Sekunden |
$T2 | Endzeit entsprechend Zeitformat |
$a | Alarmzeit in Sekunden |
$A | Alarmzeit entsprechend Zeitformat |
$d | Dauer in Sekunden |
$D | Dauer in menschenlesbarer Form |
$S | Zusammenfaßung |
$L | Ortsangabe |
$CA | Kategorien |
$CL | Klaßifizierung |
$DS | Beschreibung |
$U | UID |
$M | Modus |
format ausgelaßen, dann wird die Formatierung
+ aus defaultFormat benutzt. Ist dieses Attribut nicht gesetzt, wird "$T1 $D $S"
+ als Formatierung benutzt.
+
+ Das letzte Auftreten von format gewinnt bei mehrfacher Angabe.
+ get MyCalendar events format:fullget MyCalendar events format:custom="$T1-$T2 $S \@ $L"get MyCalendar events format:custom={ sprintf("%20s %8s", $S, $D) }timeFormat legt das Format für die Start-,
+ End- und Alarmzeiten fest.<timeFormatSpec> kann die POSIX-Spezifikation verwendet werden.
+ Auf strftime.net gibt es ein Tool zum Erstellen von
+ <timeFormatSpec>.timeFormat ausgelaßen, dann wird die Formatierung
+ aus defaultTimeFormat benutzt. Ist dieses Attribut nicht gesetzt, dann
+ wird "%d.%m.%Y %H:%M" als Formatierung benutzt.
+ Zum Umschließen der Formatangabe können einfache (') oder
+ doppelte (") Anführungszeichen verwendet werden.timeFormat gewinnt bei mehrfacher Angabe.
+ get MyCalendar events timeFormat:"%e-%b-%Y" format:fullfilter schränkt die Anzeige der Termine ein.
+ <filterSpecs> ist eine kommaseparierte Liste von
+ <filterSpec>-Angaben.
+ Alle Filterangaben müßen zutreffen, damit ein Termin angezeigt wird.
+ Die Angabe ist kumulativ: jeder angegebene Filter wird zur Filterliste hinzugef&uum;gt
+ und ber&uum;cksichtigt.<filterSpec> | Beschreibung |
|---|---|
uid=="<uid>" | UID ist <uid>+ entspricht field(uid)=="<uid>" |
uid=~"<regex>" | Der reguläre Ausdruck <regex> entspricht der UID+ entspricht field(uid)=~"<regex>" |
mode=="<mode>" | Modus ist <mode>+ entspricht field(mode)=="<mode>" |
mode=~"<regex>" | Der reguläre Ausdruck <regex> entspricht mode+ entspricht field(mode)=~"<regex>" |
field(<field>)=="<value>" | Inhalt von <field> ist <value>+ <field> ist eines von uid, mode, summary, location,
+ description, categories, claßification
+ |
field(<field>)=~"<regex>" | Inhalt von <field> entspricht dem regulären Ausdruck <regex>+ <field> ist eines von uid, mode, summary, location,
+ description, categories, claßification+ |
<filterSpec> sind nicht
+ Teil des regulären Ausdrucks. Es können stattdeßen einfache Anführungszeichen verwendet werden.
+ get MyCalendar events filter:uid=="432dsafweq64yehdbwqhkd"get MyCalendar events filter:uid=~"^7"get MyCalendar events filter:mode=="alarm"get MyCalendar events filter:mode=~"alarm|upcoming"get MyCalendar events filter:field(summary)=~"Mama"get MyCalendar events filter:field(claßification)=="PUBLIC"get MyCalendar events filter:field(summary)=~"Gelber Sack",mode=~"upcoming|start"get MyCalendar events filter:field(summary)=~"Gelber Sack" filter:mode=~"upcoming|start"
+ series bestimmt die Anzeige von wiederkehrenden
+ Terminen. series:next begrenzt die Anzeige auf den nächsten Termin
+ der noch nicht beendeten Termine innerhalb der Serie. series:next=<max>
+ zeigt die nächsten <max> Termine der Serie. Dies gilt pro Serie.
+ Zur Begrenzung der Anzeige siehe den limit-Parameter.limit begrenzt die Anzeige der Termine.
+ <limitSpecs> ist eine kommaseparierte Liste von <limitSpec> Angaben.
+ <limitSpec> | Beschreibung |
|---|---|
count=<n> | zeigt <n> Termine, wobei <n> eine positive Ganzzahl (integer) ist |
from=[+|-]<timespec> | zeigt nur Termine die nach einer Zeitspanne <timespec> ab jetzt enden; + Minuszeichen für Termine in der Vergangenheit benutzen; <timespec> wird weiter unten im Attribut-Abschnitt beschrieben. |
to=[+|-]<timespec> | + zeigt nur Termine die vor einer Zeitspanne <timespec> ab jetzt starten; + Minuszeichen für Termine in der Vergangenheit benutzen; <timespec> wird weiter unten im Attribut-Abschnitt beschrieben. |
when=today|tomorrow | zeigt anstehende Termin für heute oder morgen an |
get MyCalendar events limit:count=10get MyCalendar events limit:from=-2dget MyCalendar events limit:when=todayget MyCalendar events limit:count=10,from=0,to=+10dget <name> find <regexp>get <name> vcalendarget <name> veventsdefaultFormat <formatSpec>get <name> events.
+ Der Aufbau wird dort erklät. <formatSpec> muß in doppelte
+ Anführungszeichen (") gesetzt werden, wie z.B. attr myCalendar defaultFormat "$T1 $D $S".defaultTimeFormat <timeFormatSpec>get <name> events.
+ Der Aufbau wird dort erklät. <timeFormatSpec> nicht in Anführungszeichen setzten. synchronousUpdate 0|1+ +
update none|onUrlChangednone gesetzt ist, wird der Kalender überhaupt nicht aktualisiert.onUrlChanged gesetzt ist, wird der Kalender nur dann aktualisiert, wenn sich die
+ URL seit dem letzten Aufruf verändert hat, insbesondere nach der Auswertung von wildcards im define.+ +
removevcalendar 0|1get <name> vcalendar ist dann nicht mehr möglich.
+ + +
hideOlderThan <timespec>hideLaterThan <timespec>
+
+ Dieses Attribut grenzt die Liste der durch get <name> full|debug|text|summary|location|alarm|start|end ... gezeigten Termine ein.
+
+ Die Zeit wird relativ zur aktuellen Zeit t angegeben.
+ Wenn <hideOlderThan> gesetzt ist, werden Termine, die vor <t-hideOlderThan> enden, ingnoriert.
+ Wenn <hideLaterThan> gesetzt ist, werden Termine, die nach <t+hideLaterThan> anfangen, ignoriert.
+
+ Bitte beachte, daß eine Aktion, die durch einen Wechsel in den Modus "end" ausgelöst wird, nicht auf den Termin
+ zugreifen kann, wenn hideOlderThan 0 ist, denn der Termin ist dann schon versteckt. Setze hideOlderThan beßer auf 10.
+
+
+ <timespec> muß einem der folgenden Formate entsprechen:
+
| Format | Beschreibung | Beispiel |
|---|---|---|
| ßS | Sekunden | 3600 |
| ßß | Sekunden | 3600s |
| HH:MM | Stunden:Minuten | 02:30 |
| HH:MM:ß | Stunden:Minuten:Sekunden | 00:01:30 |
| D:HH:MM:ß | Tage:Stunden:Minuten:Sekunden | 122:10:00:00 |
| DDDd | Tage | 100d |
+ +
cutoffOlderThan <timespec>cutoffOlderThan
+ vor der letzten Aktualisierung des Kalenders endeten. Der Zweck dieses Attributs ist es Speicher zu
+ sparen. Auf solche Termine kann gar nicht mehr aus FHEM heraus zugegriffen
+ werden. Serientermine ohne Ende (UNTIL) und
+ Termine ohne Endezeitpunkt (DTEND) werden nicht weggeschnitten.
+ + +
onCreateEvent <perl-code>+ +
ßLVerify+ +
ignoreCancelled+ +
quirks <values><values> ist
+ eine kommaseparierte Liste der folgenden Schlüßelwörter:
+ ignoreDtStamp: wenn gesetzt, dann zeigt
+ ein verändertes DTSTAMP Attribut eines Termins nicht an, daß
+ der Termin verändert wurde.+ + +
+
+ Termine werden erzeugt, wenn FHEM gestartet wird oder der betreffende Eintrag im Quell-Kalender verändert
+ wurde oder der Kalender mit get <name> reload neu geladen wird. Es werden nur Termine
+ innerhalb ±400 Tage um die Erzeugungs des Termins herum erzeugt. Ziehe in Betracht, den Kalender von Zeit zu Zeit
+ neu zu laden, um zu vermeiden, daß FHEM die künftigen Termine ausgehen. Du kann so etwas wie define reloadCalendar at +*240:00:00 set MyCalendar reload dafür verwenden.
+ + Manche dumme Kalender benutzen LAST-MODIFIED nicht. Das kann dazu führen, daß Veränderungen im + Quell-Kalender unbemerkt bleiben. Lade den Kalender neu, wenn Du dieses Problem hast.
+ + Ein Termin wird durch seine UID identifiziert. Die UID wird vom Quellkalender bezogen. Um das Leben leichter zu machen, werden alle nicht-alphanumerischen Zeichen automatisch aus der UID entfernt.
+ + Ein Termin kann sich in einem der folgenden Modi befinden: +
| upcoming | Weder die Alarmzeit noch die Startzeit des Kalendereintrags ist erreicht. |
| alarm | Die Alarmzeit ist überschritten, aber die Startzeit des Kalender-Ereignißes ist noch nicht erreicht. |
| start | Die Startzeit ist überschritten, aber die Ende-Zeit des Kalender-Ereignißes ist noch nicht erreicht. |
| end | Die Endzeit des Kalender-Ereignißes wurde überschritten. |
+
+ Ein Kalender-Device hat verschiedene Readings. Mit Ausnahme von calname stellt jedes Reading eine semikolonseparierte Liste aus UID von Kalender-Ereigniße dar, welche bestimmte Zustände haben:
+
| calname | Name des Kalenders |
| modeAlarm | Ereigniße im Alarm-Modus |
| modeAlarmOrStart | Ereigniße im Alarm- oder Startmodus |
| modeAlarmed | Ereigniße, welche gerade in den Alarmmodus gewechselt haben |
| modeChanged | Ereigniße, welche gerade in irgendeiner Form ihren Modus gewechselt haben |
| modeEnd | Ereigniße im Endmodus |
| modeEnded | Ereigniße, welche gerade vom Start- in den Endmodus gewechselt haben |
| modeStart | Ereigniße im Startmodus |
| modeStarted | Ereigniße, welche gerade in den Startmodus gewechselt haben |
| modeUpcoming | Ereigniße im zukünftigen Modus |
+ + Für Serientermine werden mehrere Termine mit identischer UID erzeugt. In diesem Fall + wird die UID nur im intereßantesten gelesenen Modus-Reading angezeigt. + Der intereßanteste Modus ist der erste zutreffende Modus aus der Liste der Modi start, alarm, upcoming, end.
+ + Die UID eines Serientermins wird nicht angezeigt, solange sich der Termin im Modus: modeEnd oder modeEnded befindet + und die Serie nicht beendet ist. Die UID befindet sich in einem der anderen mode... Readings. + Hieraus ergibts sich, das FHEM-Events nicht auf einem mode... Reading basieren sollten. + Weiter unten im Text gibt es hierzu eine Empfehlung.
+
+
+ triggered
+
+ Man kann sich darauf verlaßen, daß alle Readings des Kalenders in einem konsistenten und aktuellen
+ Zustand befinden, wenn dieses Event empfangen wird.
+ + Wenn ein Termin geändert wurde, werden zwei FHEM-Events erzeugt:
+
+ changed: UID <mode>
+ <mode>: UID
+
+ <mode> ist der aktuelle Modus des Termins nach der änderung. Bitte beachten: Im FHEM-Event befindet sich ein Doppelpunkt gefolgt von einem Leerzeichen.
+ + FHEM-Events sollten nur auf den vorgenannten Events basieren und nicht auf FHEM-Events, die durch ändern eines mode... Readings ausgelöst werden. +
+
+
+ Ein Plug-In ist ein kleines Perl-Programm, das Termine nebenher verändern kann.
+ Das Perl-Programm arbeitet mit der Hash-Referenz $e.
+ Die wichtigsten Elemente sind:
+
+
| code | Beschreibung |
|---|---|
| $e->{start} | Startzeit des Termins, in Sekunden seit 1.1.1970 |
| $e->{end} | Endezeit des Termins, in Sekunden seit 1.1.1970 |
| $e->{alarm} | Alarmzeit des Termins, in Sekunden seit 1.1.1970 |
| $e->{summary} | die Zusammenfaßung (Betreff, Titel) des Termins |
| $e->{location} | Der Ort des Termins |
attr MyCalendar onCreateEvent { $e->{alarm}= $e->{start}-86400 if($e->{summary} =~ /Tonne/);; }attr MyCalendar onCreateEvent { $e->{end}= $e->{start}+86400 unleß(defined($e->{end})) }
+ get MyCalendar events format:full
+ 2767324dsfretfvds7dsfn3e4dsa234r234sdfds6bh874googlecom alarm 31.05.2012 17:00:00 07.06.2012 16:30:00-07.06.2012 18:00:00 Erna for coffee
+ 992hydf4y44awer5466lhfdsrgl7tin6b6mckf8glmhui4googlecom upcoming 08.06.2012 00:00:00-09.06.2012 00:00:00 Vacation
+ text 20 60 { fhem("get MyCalendar events timeFormat:'%d.%m.%Y %H:%M' format:custom='$T1 $S' filter:mode=~'alarm|start') }
+ 07.06.12 16:30 Erna zum Kaffee
+ 08.06.12 00:00 Urlaub
+
+ get MyCalendar find .*Erna.*
+ 2767324dsfretfvds7dsfn3e4dsa234r234sdfds6bh874googlecom
+
+ define ErnaComes notify MyCalendar:start:.2767324dsfretfvds7dsfn3e4dsa234r234sdfds6bh874googlecom.* set MyLight on
+
+ define LogErna notify MyCalendar:alarm:.2767324dsfretfvds7dsfn3e4dsa234r234sdfds6bh874googlecom.* { Log3 $NAME, 1, "ALARM name=$NAME event=$EVENT part1=$EVTPART0 part2=$EVTPART1" }
+
+ define SwitchActorOn notify MyCalendar:start:.* { \
+ my $reading="$EVTPART0";; \
+ my $uid= "$EVTPART1";; \
+ my $actor= fhem('get MyCalendar filter:uid=="'.$uid.'" format:custom="$S"');; \
+ if(defined $actor) {
+ fhem("set $actor on")
+ } \
+ }
+ define SwitchActorOff notify MyCalendar:end:.* { \
+ my $reading="$EVTPART0";; \
+ my $uid= "$EVTPART1";; \
+ my $actor= fhem('get MyCalendar filter:uid=="'.$uid.'" format:custom="$S"');; \
+ if(defined $actor) {
+ fhem("set $actor off")
+ } \
+ }
+
+ define LogActors notify MyCalendar:(start|end):.*
+ { my $reading= "$EVTPART0";; my $uid= "$EVTPART1";; \
+ my $actor= fhem('get MyCalendar filter:uid=="'.$uid.'" format:custom="$S"');; \
+ Log3 $NAME, 1, "Actor: $actor, Reading $reading" }
+ GarbageCalendar beinhaltet alle Termine der
+ Müllabholung mit der Art des Mülls innerhalb der Zusammenfaßung (summary).
+ Das folgende notify kann zur Benachrichtigung über die Müllabholung
+ benutzt werden:
+ define GarbageCollectionNotifier notify GarbageCalendar:alarm:.* { \
+ my $uid= "$EVTPART1";; \
+ my $summary= fhem('get GarbageCalendar events filter:uid=="'.$uid.'" format:custom="$S"');; \
+ # e.g. mail $summary to someone \
+ }
+ attr GarbageCalendar onCreateEvent { $e->{alarm}= $e->{start}-86400 }
+ { CalendarEventsAsHtml('GarbageCalendar','format:text filter:mode=~"alarm|start"') }
+ CalendarAsHtml(<name>,<parameter>) liefert eine Liste von Kalendereinträgen als
+ HTML zurück. <name> ist der Name des Kalender-Devices; <parameter>
+ würdest Du nach get <name> text ... schreiben. Diese Funktion ist veraltert
+ und sollte nicht mehr genutzt werden!.
+ define MyCalendarWeblink weblink htmlCode { CalendarAsHtml("MyCalendar","next 3") }
+ CalendarEventsAsHtml(<name>,<parameter>) liefert eine Liste von Kalender-Events
+ zurück; zu name und parameters siehe oben.
+ define MyCalendarWeblink weblink htmlCode
+ { CalendarEventsAsHtml('F','format:custom="$T1 $D $S" timeFormat:"%d.%m" series:next=3') }
+ +