diff --git a/fhem/CHANGED b/fhem/CHANGED
index beb490e21..c62628e0c 100644
--- a/fhem/CHANGED
+++ b/fhem/CHANGED
@@ -1,5 +1,6 @@
# Add changes at the top of the list. Keep it in ASCII, and 80-char wide.
# Do not insert empty lines here, update check depends on it
+ - bugfix: 57_Calendar: right treatment of colons in SUMMARY (forum #140729)
- feature: 76_SolarForecast: Version 1.52.11
- change: 55_DWD_OpenData: set internal version to 1.017007
- bugfix: 93_DbRep: resolution of symbolic links in Optimize Tables for SQLite
diff --git a/fhem/FHEM/57_Calendar.pm b/fhem/FHEM/57_Calendar.pm
index 8a185d1c5..65f5036d5 100644
--- a/fhem/FHEM/57_Calendar.pm
+++ b/fhem/FHEM/57_Calendar.pm
@@ -1022,7 +1022,7 @@ sub addproperty($$) {
# DTSTART:20140211T212000Z
# DTSTART;VALUE=DATE:20130619
my ($key,$parts,$parameter);
- if($line =~ /^([\w\d\-]+)(;(.*))?:(.*)$/) {
+ if($line =~ /^([\w\d\-]+)(;((?:[^\:]+|\"[^\"]*\")*))?:(.*)$/) { # forum 140729
$key= $1;
$parts= $3 // "";
$parameter= $4 // "";
@@ -3476,7 +3476,7 @@ sub CalendarEventsAsHtml($;$) {
Note for users of Netxtcloud Calendar: you can use an URL of the form
https://admin:admin@demo.nextcloud.com/wid0ohgh/remote.php/dav/calendars/admin/personal/?export.
-
+
The optional parameter interval is the time between subsequent updates
in seconds. It defaults to 3600 (1 hour).
@@ -3795,12 +3795,12 @@ sub CalendarEventsAsHtml($;$) {
Sets the default format for the get <name> events
command. The specification is explained there. You must enclose
the <formatSpec> in double quotes (") like input
- in attr myCalendar defaultFormat "$T1 $D $S".
attr myCalendar defaultFormat "$T1 $D $S".defaultTimeFormat <timeFormatSpec>get <name>events
command. The specification is explained there. Do not enclose
- the <timeFormatSpec> in quotes.synchronousUpdate 0|1
+
update onUrlChanged|noneonUrlChanged, the processing is done only
if url to calendar has changed since last calendar update.none, the calendar will not be updated at all.
-
+
delay <time>
+
timeout <time>
+
removevcalendar 0|1get <name> vcalendar is then no longer possible.
-
+
hideOlderThan <timespec>hideLaterThan <timespec>
+ hideLaterThan <timespec>
These attributes limit the list of events shown by
- get <name> full|debug|text|summary|location|alarm|start|end ....
+ 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.
+ 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.
+ hideOlderThan to 10.
<timespec> must have one of the following formats:
| D:HH:MM:SS | days:hours:minutes:seconds | 122:10:00:00 |
| DDDd | days | 100d |
+
cutoffOlderThan <timespec>cutoffLaterThan <timespec>
+
onCreateEvent <perl-code>
+
SSLVerify
+
ignoreCancelled
+
hasModeReadings
+
quirks <values><values> is
@@ -3903,7 +3903,7 @@ sub CalendarEventsAsHtml($;$) {
noWildcards: if present, wildcards in the calendar's
URL will not be expanded.
+
+ fetched from the source calendar at the given URL on a regular basis.
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.
+ earliest alarm time is kept.
Recurring calendar events (series) are currently supported to an extent:
FREQ INTERVAL UNTIL COUNT are interpreted, BYMONTHDAY BYMONTH WKST
@@ -3928,21 +3928,21 @@ sub CalendarEventsAsHtml($;$) {
Out-of-order events and events excluded from a series (EXDATE) are handled.
Calendar events are only created within ±400 days around the time of the
last update.
-
+
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.
+ 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.
+ 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.
+ are stripped off the original UID to make your life easier.
A calendar event can be in one of the following modes:
| 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.
+ 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.
+ do not trigger FHEM events for series based on mode... readings. See below for a recommendation.
+ FHEM event is created:
triggered
When you receive this event, you can rely on the calendar's readings being in a consistent and
- most recent state.
+ most recent state.
- When a calendar event has changed, two FHEM events are created:
+ 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.
+ 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
@@ -4153,7 +4153,7 @@ sub CalendarEventsAsHtml($;$) {
Tip: use single quotes as outer quotes.
-
+
https://admin:admin@demo.nextcloud.com/wid0ohgh/remote.php/dav/calendars/admin/personal/?export.
+ 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.
@@ -4469,11 +4469,11 @@ sub CalendarEventsAsHtml($;$) {
defaultFormat <formatSpec>get <name> events.
Der Aufbau wird dort erklät. <formatSpec> muss in doppelte
- Anführungszeichen (") gesetzt werden, wie z.B. attr myCalendar defaultFormat "$T1 $D $S".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.
+
delay <time>
+
timeout <time>
+
removevcalendar 0|1get <name> vcalendar ist dann nicht mehr möglich.
-
+
hideOlderThan <timespec>hideLaterThan <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.
+ Wenn <hideLaterThan> gesetzt ist, werden Termine, die nach <t+hideLaterThan> anfangen, ignoriert.
Bitte beachte, dass 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 besser auf 10.
+ zugreifen kann, wenn hideOlderThan 0 ist, denn der Termin ist dann schon versteckt. Setze hideOlderThan besser auf 10.
<timespec> muss; einem der folgenden Formate entsprechen:
@@ -4533,7 +4533,7 @@ sub CalendarEventsAsHtml($;$) {
+
cutoffOlderThan <timespec>cutoffLaterThan <timespec>
+
onCreateEvent <perl-code>
+
SSLVerify
+
ignoreCancelled
+
hasModeReadings
+
quirks <values>noWildcards: wenn gesetzt, werden Wildcards in der
URL des Kalenders nicht ersetzt.
+
+ korrekt behandelt. Das Modul wird es sehr wahrscheinlich falsch machen, wenn Du wiederkehrende Termine mit unerkannten oder nicht ausgewerteten Schlüsselwörtern hast.
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; FHEM die künftigen Termine ausgehen. Du kann so etwas wie define reloadCalendar at +*240:00:00 set MyCalendar reload dafür verwenden.
+ neu zu laden, um zu vermeiden, dass; 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, dass Veränderungen im
- Quell-Kalender unbemerkt bleiben. Lade den Kalender neu, wenn Du dieses Problem hast.
+ 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 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:
| end | Die Endzeit des Kalender-Ereignisses wurde überschritten. |
+
Aus Gründen der Abwärtskompatibilität werden mode-Readings gefüllt, wenn das Attribut hasModeReadings gesetzt ist.
- Der Rest dieser Beschreibung bezieht sich auf diese veralteten mode-Readings.
+ Der Rest dieser Beschreibung bezieht sich auf diese veralteten mode-Readings.
Ein Kalender-Device hat verschiedene mode-Readings. Jedes mode-Reading stellt eine semikolonseparierte Liste aus UID von Kalender-Ereignisse dar, welche bestimmte Zustände haben:
| modeStarted | Ereignisse, welche gerade in den Startmodus gewechselt haben |
| modeUpcoming | Ereignisse im zukünftigen Modus |
+
Für Serientermine werden mehrere Termine mit identischer 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.
+ 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.
+ Weiter unten im Text gibt es hierzu eine Empfehlung.
Events
+ erreicht wurde, wird ein FHEM-Event erzeugt:
triggered
Man kann sich darauf verlassen, dass alle Readings des Kalenders in einem konsistenten und aktuellen
- Zustand befinden, wenn dieses Event empfangen wird.
+ Zustand befinden, wenn dieses Event empfangen wird.
- Wenn ein Termin geändert wurde, werden zwei FHEM-Events erzeugt:
+ 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.
+ <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.
-
+
+ Experimentell, bitte mit Vorsicht nutzen.
Ein Plug-In ist ein kleines Perl-Programm, das Termine nebenher verändern kann.
Das Perl-Programm arbeitet mit der Hash-Referenz $e.
@@ -4811,7 +4811,7 @@ sub CalendarEventsAsHtml($;$) {
{ CalendarEventsAsHtml('F','format:custom="$T1 $D $S" timeFormat:"%d.%m" series:next=3') }
Empfehlung: Benutze einfache Anführungszeichen als äußere Anführungszeichen.
-
+