From 7b0a4790b34c13bf14ecf035a9306cf04c0e3a16 Mon Sep 17 00:00:00 2001
From: betateilchen
The optional parameter
+
+ Der optionale 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
+
+
define <name> Calendar ical url <URL> [<interval>]
+ define <name> Calendar ical file <FILENAME> [<interval>]
+
+ Definiert ein Kalender-Device.
+
+ Ein Kalender-Device ermittelt (Serien-)Termine aus einem Quell-Kalender. Dieser kann eine URL oder eine Datei sein.
+ Die Datei muß im iCal-Format vorliegen.
+
+ Beginnt die URL mit https://, muß das Perl-Modul IO::Socket::ßL installiert sein
+ (use cpan -i IO::Socket::ßL).
+
+ Die <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)
+ Die wildcards werden bei jedem Kalenderupdate ausgewertet.
+
+ Hinweis für Nutzer des Google-Kalenders: Du kannst direkt die private iCal-URL des Google-Kalenders nutzen.
+
+ Sollte deine Google-Kalender-URL mit 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.
+
+ Hinweis für Nutzer des Nextcloud-Kalenders: Du kannst eine URL der folgenden Form benutzen:
+ https://admin:admin@demo.nextcloud.com/wid0ohgh/remote.php/dav/calendars/admin/personal/?export.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> update
+
+ Erzwingt das Einlesen des Kalenders von der definierten URL. Das nächste automatische Einlesen erfolgt in
+ interval Sekunden später.
+
+ set <name> reload
+ Daßelbe wie update, jedoch werden zuerst alle Termine entfernt.
+
+
+
+
+
+ Get
+
+
+
+ get <name> update
+ Entspricht set <name> update
+
+ get <name> reload
+ Entspricht set <name> reload
+
+
+ get <name> events [format:<formatSpec>] [timeFormat:<timeFormatSpec>] [filter:<filterSpecs>] [series:next[=<max>]] [limit:<limitSpecs>]
+ Das Schweizer Taschenmeßer für die Anzeige von Terminen.
+ Die Termine des Kalenders <name> werden Zeile für Zeile entsprechend der Format- und Filterangaben ausgegeben.
+ Keiner, einer oder mehrere der Parameter format,
+ timeFormat, filter, series und limit
+ können angegeben werden, weiterhin ist es sinnvoll, den Parameter filter mehrere Male anzugeben.
+
+
+ Der Parameter format legt den zurückgegeben Inhalt fest.
+ Folgende Formatspezifikationen stehen zur Verfügung:
+
+
+
+ <formatSpec> Beschreibung
+ defaultStandardformat (siehe unten)
+ fullentspricht custom="$U $M $A $T1-$T2 $S $CA $L"
+ textentspricht custom="$T1 $S"
+ custom="<formatString>"ein spezifisches Format (siehe unten)
+ custom="{ <perl-code> }"ein spezifisches Format (siehe unten)
+ Einzelne Anführungszeichen (') 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
+ $t1Startzeit in Sekunden
+ $T1Startzeit entsprechend Zeitformat
+ $t2Endzeit in Sekunden
+ $T2Endzeit entsprechend Zeitformat
+ $aAlarmzeit in Sekunden
+ $AAlarmzeit entsprechend Zeitformat
+ $dDauer in Sekunden
+ $DDauer in menschenlesbarer Form
+ $SZusammenfaßung
+ $LOrtsangabe
+ $CAKategorien
+ $CLKlaßifizierung
+ $DSBeschreibung
+ $UUID
+ $MModus
+ \, (maskiertes Komma) in Zusammenfaßung, Ortsangabe und Beschreibung werden durch ein Komma ersetzt,
+ aber \n (kennzeichnet Absatz) bleibt unberührt.
+
+ Wird der Parameter 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.
+
+
+ Examples:
+ get MyCalendar events format:full
+ get MyCalendar events format:custom="$T1-$T2 $S \@ $L"
+ get MyCalendar events format:custom={ sprintf("%20s %8s", $S, $D) }
+
+ Der Parameter timeFormat legt das Format für die Start-,
+ End- und Alarmzeiten fest.
+
+ In <timeFormatSpec> kann die POSIX-Spezifikation verwendet werden.
+ Auf strftime.net gibt es ein Tool zum Erstellen von
+ <timeFormatSpec>.
+
+ Wenn der Parameter 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.
+
+ Das letzte Auftreten von timeFormat gewinnt bei mehrfacher Angabe.
+
+
+ Example:
+ get MyCalendar events timeFormat:"%e-%b-%Y" format:full
+
+
+ Der Parameter filter 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
+
+ Die doppelten Anführungszeichen auf der rechten Seite von <filterSpec> sind nicht
+ Teil des regulären Ausdrucks. Es können stattdeßen einfache Anführungszeichen verwendet werden.
+
+
+ Examples:
+ 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"
+
+
+ Der Parameter 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.
+
+ Der 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|tomorrowzeigt anstehende Termin für heute oder morgen an
+
+ Examples:
+ get MyCalendar events limit:count=10
+ get MyCalendar events limit:from=-2d
+ get MyCalendar events limit:when=today
+ get MyCalendar events limit:count=10,from=0,to=+10d
+
+
+ get <name> find <regexp>
+ Gibt zeilenweise die UID von allen Terminen aus, deren Zusammenfaßung dem regulären Ausdruck <regexp> entspricht.get <name> vcalendar
+ Gibt den Kalender im ICal-Format aus, so wie er von der Quelle abgerufen wurde.get <name> vevents
+ Gibt eine Liste aller VEVENT-Einträge mit weiteren Informationen für Debugzwecke zurück.
+ Nur Eigenschaften, die bei der Verarbeitung des Kalenders behalten wurden, werden gezeigt.
+ Die Liste, der aus jedem VEVENT-Eintrag erstellten Termine, wird, ebenso wie die ausgelaßenen Termine, gezeigt.
+
+
+
+ Attributes
+
+
+
defaultFormat <formatSpec>
+ Setzt das Standardformat für 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') }
+ +