%s | %s | %s |
define <name> Calendar ical url <URL> [<interval>]
define <name> Calendar ical file <FILENAME> [<interval>]
https://
, the perl module IO::Socket::SSL must be installed
(use cpan -i IO::Socket::SSL
).https://
and the perl module IO::Socket::SSL is not installed on your system, you can
replace it by http://
if and only if there is no redirection to the https://
URL.
Check with your browser first if unsure.interval
is the time between subsequent updates
in seconds. It defaults to 3600 (1 hour).define MyCalendar Calendar ical url https://www.google.com/calendar/ical/john.doe%40example.com/private-foo4711/basic.ics define YourCalendar Calendar ical url http://www.google.com/calendar/ical/jane.doe%40example.com/private-bar0815/basic.ics 86400 define SomeCalendar Calendar ical file /home/johndoe/calendar.ics
set <name> update
interval
seconds later.set <name> reload
update
but all calendar events are removed first.get <name> update
set <name> update
get <name> reload
set <name> update
get <name> <format> <filter> [<max>]
<format> | content |
---|---|
uid | the UID of the event |
text | a user-friendly textual representation, best suited for display |
summary | the content of the summary field (subject, title) |
location | the content of the location field |
categories | the content of the categories field |
alarm | alarm time in human-readable format |
start | start time in human-readable format |
end | end time in human-readable format |
categories | the content of the categories field |
full | the full state |
debug | like full with additional information for debugging purposes |
<filter> | selection |
---|---|
mode=<regex> | all calendar events with mode matching the regular expression <regex> |
<mode> | all calendar events in the mode <mode> |
uid=<regex> | all calendar events identified by UIDs that match the regular expression <regex>. |
<uid> | all calendar events identified by the UID <uid> |
<reading> | all calendar events listed in the reading <reading> (modeAlarm, modeAlarmed, modeStart, etc.) - this is deprecated and will be removed in a future version, use mode=<regex> instead. |
all | all calendar events (past, current and future) |
next | only calendar events that have not yet ended and among these only the first in a series, best suited for display |
mode=<regex>
and uid=<regex>
filters should be preferred over the
<mode>
and <uid>
filters.<max>
limits
the number of returned lines.hideOlderThan
and
hideLaterThan
for how to return events within a certain time window.
Please remember that the global ±400 days limits apply.get MyCalendar text next
get MyCalendar summary uid:435kjhk435googlecom 1
get MyCalendar summary 435kjhk435googlecom 1
get MyCalendar full all
get MyCalendar text mode=alarm|start
get MyCalendar text uid=.*6286.*
get <name> find <regexp>
get <name> vcalendar
get <name> vevents
update sync|async|none
sync
, the processing of
the calendar is done in the foreground. Large calendars will block FHEM on slow
systems. If this attribute is set to async
, the processing is done in the
background and FHEM will not block during updates. If this attribute is set to
none
, the calendar will not be updated at all.
removevcalendar 0|1
get <name> vcalendar
is then no longer possible.
hideOlderThan <timespec>
hideLaterThan <timespec>
These attributes limit the list of events shown by
get <name> full|debug|text|summary|location|alarm|start|end ...
.
The time is specified relative to the current time t. If hideOlderThan is set, calendar events that ended before t-hideOlderThan are not shown. If hideLaterThan is set, calendar events that will start after t+hideLaterThan are not shown.
Please note that an action triggered by a change to mode "end" cannot access the calendar event if you set hideOlderThan to 0 because the calendar event will already be hidden at that time. Better set hideOlderThan to 10.
<timespec>
must have one of the following formats:
format | description | example |
---|---|---|
SSS | seconds | 3600 |
SSSs | seconds | 3600s |
HH:MM | hours:minutes | 02:30 |
HH:MM:SS | hours:minutes:seconds | 00:01:30 |
D:HH:MM:SS | days:hours:minutes:seconds | 122:10:00:00 |
DDDd | days | 100d |
cutoffOlderThan <timespec>
onCreateEvent <perl-code>
SSLVerify
A calendar event has a summary (usually the title shown in a visual representation of the source calendar), a start time, an end time, and zero, one or more alarm times. In case of multiple alarm times for a calendar event, only the earliest alarm time is kept.
Recurring calendar events (series) are currently supported to an extent: FREQ INTERVAL UNTIL COUNT are interpreted, BYMONTHDAY BYMONTH WKST are recognized but not interpreted. BYDAY is correctly interpreted for weekly and monthly events. The module will get it most likely wrong if you have recurring calendar events with unrecognized or uninterpreted keywords. Out-of-order events and events excluded from a series (EXDATE) are handled.
Calendar events are created when FHEM is started or when the respective entry in the source
calendar has changed and the calendar is updated or when the calendar is reloaded with
get <name> reload
.
Only calendar events within ±400 days around the event creation time are created. Consider
reloading the calendar from time to time to avoid running out of upcoming events. You can use something like define reloadCalendar at +*240:00:00 set MyCalendar reload
for that purpose.
Some dumb calendars do not use LAST-MODIFIED. This may result in modifications in the source calendar go unnoticed. Reload the calendar if you experience this issue.
A calendar event is identified by its UID. The UID is taken from the source calendar. All events in a series including out-of-order events habe the same UID. All non-alphanumerical characters are stripped off the original UID to make your life easier.
A calendar event can be in one of the following modes:
upcoming | Neither the alarm time nor the start time of the calendar event is reached. |
alarm | The alarm time has passed but the start time of the calendar event is not yet reached. |
start | The start time has passed but the end time of the calendar event is not yet reached. |
end | The end time of the calendar event has passed. |
A calendar device has several readings. Except for calname
, each reading is a semicolon-separated list of UIDs of
calendar events that satisfy certain conditions:
calname | name of the calendar |
modeAlarm | events in alarm mode |
modeAlarmOrStart | events in alarm or start mode |
modeAlarmed | events that have just transitioned from upcoming to alarm mode |
modeChanged | events that have just changed their mode somehow |
modeEnd | events in end mode |
modeEnded | events that have just transitioned from start to end mode |
modeStart | events in start mode |
modeStarted | events that have just transitioned to start mode |
modeUpcoming | events in upcoming mode |
For recurring events, usually several calendar events exists with the same UID. In such a case, the UID is only shown in the mode reading for the most interesting mode. The most interesting mode is the first applicable of start, alarm, upcoming, end.
In particular, you will never see the UID of a series in modeEnd or modeEnded as long as the series has not yet ended - the UID will be in one of the other mode... readings. This means that you better do not trigger FHEM events for series based on mode... readings. See below for a recommendation.
Events
triggered
When you receive this event, you can rely on the calendar's readings being in a consistent and
most recent state.
When a calendar event has changed, two FHEM events are created:
changed: UID <mode>
<mode>: UID
<mode> is the current mode of the calendar event after the change. Note: there is a
colon followed by a single space in the FHEM event specification.
The recommended way of reacting on mode changes of calendar events is to get notified on the aforementioned FHEM events and do not check for the FHEM events triggered by a change of a mode reading.
A plug-in is a piece of Perl code that modifies a calendar event on the fly. The Perl code operates on the
hash reference $e
. The most important elements are as follows:
code | description |
---|---|
$e->{start} | the start time of the calendar event, in seconds since the epoch |
$e->{end} | the end time of the calendar event, in seconds since the epoch |
$e->{alarm} | the alarm time of the calendar event, in seconds since the epoch |
$e->{summary} | the summary (caption, title) of the calendar event |
$e->{location} | the location of the calendar event |
attr MyCalendar onCreateEvent { $e->{alarm}= $e->{start}-86400 if($e->{summary} =~ /Tonne/);; }
get MyCalendar full all
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 text next 2") }
07.06.12 16:30 Erna for coffee
08.06.12 00:00 Vacation
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 summary $uid");;
if(defined $actor) {
fhem("set $actor on")
}
}
define SwitchActorOff notify MyCalendar:end:.* {
my $reading="$EVTPART0";;
my $uid= "$EVTPART1";;
my $actor= fhem("get MyCalendar summary $uid");;
if(defined $actor) {
fhem("set $actor off")
}
}
define LogActors notify MyCalendar:(start|end):.* { my $reading= "$EVTPART0";; my $uid= "$EVTPART1";; my $actor= fhem("get MyCalendar summary $uid");; Log 3 $NAME, 1, "Actor: $actor, Reading $reading" }
CalendarAsHtml(<name>,<options>)
. It
returns the HTML code for a list of calendar events. <name>
is the name of the
Calendar device and <options>
is what you would write after get <name> text ...
.
define MyCalendarWeblink weblink htmlCode { CalendarAsHtml("MyCalendar","next 3") }
define <name> Calendar ical url <URL> [<interval>]
define <name> Calendar ical file <FILENAME> [<interval>]
https://
, muss das Perl-Modul IO::Socket::SSL installiert sein
(use cpan -i IO::Socket::SSL
).https://
beginnen und das Perl-Modul IO::Socket::SSL ist nicht auf Deinem Systeme 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.interval
bestimmt die Zeit in Sekunden zwischen den Updates. Default-Wert ist 3600 (1 Stunde).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 <name> update
interval
Sekunden später.set <name> reload
update
, jedoch werden zuerst alle Termine entfernt.get <name> update
set <name> update
get <name> reload
set <name> reload
get <name> <format> <filter> [<max>]
<format> | Inhalt |
---|---|
uid | UID des Termins |
text | Benutzer-/Monitorfreundliche Textausgabe. |
summary | Übersicht (Betreff, Titel) |
location | Ort |
categories | Kategorien |
alarm | Alarmzeit |
start | Startzeit |
end | Endezeit |
full | Vollständiger Status |
debug | wie <full> mit zusätzlichen Informationen zur Fehlersuche |
<filter> | Inhalt |
---|---|
mode=<regex> | alle Termine, deren Modus durch den regulären Ausdruck <regex> beschrieben werden. |
<mode> | alle Termine mit Modus <mode>. |
uid=<regex> | Alle Termine, deren UIDs durch den regulären Ausdruck <regex> beschrieben werden. |
<uid> | Alle Termine mit der UID <uid> |
<reading> | Alle Termine die im Reading <reading> aufgelistet werden (modeAlarm, modeAlarmed, modeStart, etc.) - dieser Filter ist abgekündigt und steht in einer zukünftigen Version nicht mehr zur Verfügung, bitte mode=<regex> benutzen. |
all | Alle Termine (vergangene, aktuelle und zukünftige) |
next | Alle Termine, die noch nicht beendet sind. Bei Serienterminen der erste Termin. Benutzer-/Monitorfreundliche Textausgabe |
mode=<regex>
und uid=<regex>
sollten den Filtern
<mode>
und <uid>
vorgezogen werden.<max>
schränkt die Anzahl der zurückgegebenen Zeilen ein.hideOlderThan
und
hideLaterThan
für die Seletion von Terminen in einem bestimmten Zeitfenster.
Bitte berücksichtige, dass das globale ±400 Tageslimit gilt .get MyCalendar text next
get MyCalendar summary uid:435kjhk435googlecom 1
get MyCalendar summary 435kjhk435googlecom 1
get MyCalendar full all
get MyCalendar text mode=alarm|start
get MyCalendar text uid=.*6286.*
get <name> find <regexp>
get <name> vcalendar
get <name> vevents
update sync|async|none
sync
gesetzt ist,
findet die Verarbeitung des Kalenders im Vordergrund statt. Große Kalender werden FHEM
auf langsamen Systemen blockieren. Wenn das Attribut auf async
gesetzt ist,
findet die Verarbeitung im Hintergrund statt, und FHEM wird während der Verarbeitung
nicht blockieren. Wenn dieses Attribut auf none
gesetzt ist, wird der
Kalender überhaupt nicht aktualisiert.
removevcalendar 0|1
get <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 beachten, dass eine Aktion, die durch einen Wechsel in den Modus "end" ausgelöst wird, nicht auf den Termin zugreifen kann, wenn hideOlderThan 0 ist, weil der Termin dann schon versteckt ist. Besser hideOlderThan auf 10 setzen.
<timespec>
muss einem der folgenden Formate entsprechen:
Format | Beschreibung | Beispiel |
---|---|---|
SSS | Sekunden | 3600 |
SSSs | Sekunden | 3600s |
HH:MM | Stunden:Minuten | 02:30 |
HH:MM:SS | Stunden:Minuten:Sekunden | 00:01:30 |
D:HH:MM:SS | Tage:Stunden:Minuten:Sekunden | 122:10:00:00 |
DDDd | Tage | 100d |
cutoffOlderThan <timespec>
onCreateEvent <perl-code>
SSLVerify
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, dass die künftigen Termine ausgehen. Du kann so etwas wie define reloadCalendar at +*240:00:00 set MyCalendar reload
dafür verwenden.
Manche dummen Kalender benutzen LAST-MODIFIED nicht. Das kann dazu führen, dass 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-Ereignisses ist noch nicht erreicht. |
start | Die Startzeit ist überschritten, aber die Ende-Zeit des Kalender-Ereignisses ist noch nicht erreicht. |
end | Die Ende-Zeit des Kalender-Ereignisses wurde überschritten. |
Ein Kalender-Device hat verschiedene Readings. Mit Ausnahme von calname
stellt jedes Reading eine Semikolon-getrennte Liste von UIDs von Kalender-Ereignisse dar, welche bestimmte Zustände haben:
calname | Name des Kalenders |
modeAlarm | Ereignisse im Alarm-Modus |
modeAlarmOrStart | Ereignisse im Alarm- oder Startmodus |
modeAlarmed | Ereignisse, welche gerade in den Alarmmodus gewechselt haben |
modeChanged | Ereignisse, welche gerade in irgendeiner Form ihren Modus gewechselt haben |
modeEnd | Ereignisse im Endemodus |
modeEnded | Ereignisse, welche gerade vom Start- in den Endemodus gewechselt haben |
modeStart | Ereignisse im Startmodus |
modeStarted | Ereignisse, welche gerade in den Startmodus gewechselt haben |
modeUpcoming | Ereignisse im zukünftigen Modus |
Für Serientermine werden mehrere Termine mit der selben UID erzeugt. In diesem Fall wird die UID nur im interessantesten gelesenen Modus-Reading angezeigt. Der interessanteste 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 verlassen, dass 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, dass Termine nebenher verändern kann.
Das Perl-Programm arbeitet mit der Hash-Referenz $e
.
Die wichtigsten Elemente sind:
code | description |
---|---|
$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 Zusammenfassung (Betreff, Titel) des Termins |
$e->{location} | Der Ort des Termins |
attr MyCalendar onCreateEvent { $e->{alarm}= $e->{start}-86400 if($e->{summary} =~ /Tonne/);; }
get MyCalendar full all
2767324dsfretfvds7dsfn3e4dsa234r234sdfds6bh874googlecom known alarm 31.05.2012 17:00:00 07.06.2012 16:30:00-07.06.2012 18:00:00 Erna for coffee
992hydf4y44awer5466lhfdsrgl7tin6b6mckf8glmhui4googlecom known upcoming 08.06.2012 00:00:00-09.06.2012 00:00:00 Vacation
text 20 60 { fhem("get MyCalendar text next 2") }
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:.* {}
Dann auf DEF klicken und im DEF-Editor folgendes zwischen die beiden geschweiften Klammern {} eingeben:
my $reading="$EVTPART0";
my $uid= "$EVTPART1";
my $actor= fhem("get MyCalendar summary $uid");
if(defined $actor) {
fhem("set $actor on")
}
define SwitchActorOff notify MyCalendar:end:.* {}
Dann auf DEF klicken und im DEF-Editor folgendes zwischen die beiden geschweiften Klammern {} eingeben:
my $reading="$EVTPART0";
my $uid= "$EVTPART1";
my $actor= fhem("get MyCalendar summary $uid");
if(defined $actor) {
fhem("set $actor off")
}
define LogActors notify MyCalendar:(start|end).* {}
Dann auf DEF klicken und im DEF-Editor folgendes zwischen die beiden geschweiften Klammern {} eingeben:
my $reading= "$EVTPART0";
my $uid= "$EVTPART1";
my $actor= fhem("get MyCalendar summary $uid");
Log 3 $NAME, 1, "Actor: $actor, Reading $reading";
CalendarAsHtml(<name>,<options>)
bereit.
Diese gibt den HTML-Kode für eine Liste von Terminen zurück. <name>
ist der Name des
Kalendar-Device und <options>
ist das, was Du hinter get <name> text ...
schreiben würdest.
define MyCalendarWeblink weblink htmlCode { CalendarAsHtml("MyCalendar","next 3") }