diff --git a/bundles/org.openhab.binding.icalendar/README.md b/bundles/org.openhab.binding.icalendar/README.md
index 217743531..b2c98b71a 100644
--- a/bundles/org.openhab.binding.icalendar/README.md
+++ b/bundles/org.openhab.binding.icalendar/README.md
@@ -59,6 +59,7 @@ They are all read-only.
| next_title | String | Title of the next event |
| next_start | DateTime | Start of the next event |
| next_end | DateTime | End of the next event |
+| last_update | DateTime | The time and date of the last successful update of the calendar |
### Channels for `eventfilter`
diff --git a/bundles/org.openhab.binding.icalendar/src/main/java/org/openhab/binding/icalendar/internal/ICalendarBindingConstants.java b/bundles/org.openhab.binding.icalendar/src/main/java/org/openhab/binding/icalendar/internal/ICalendarBindingConstants.java
index df0d0845c..ad1aa6428 100644
--- a/bundles/org.openhab.binding.icalendar/src/main/java/org/openhab/binding/icalendar/internal/ICalendarBindingConstants.java
+++ b/bundles/org.openhab.binding.icalendar/src/main/java/org/openhab/binding/icalendar/internal/ICalendarBindingConstants.java
@@ -40,6 +40,7 @@ public class ICalendarBindingConstants {
public static final String CHANNEL_NEXT_EVENT_TITLE = "next_title";
public static final String CHANNEL_NEXT_EVENT_START = "next_start";
public static final String CHANNEL_NEXT_EVENT_END = "next_end";
+ public static final String CHANNEL_LAST_UPDATE = "last_update";
// additional constants
public static final int HTTP_TIMEOUT_SECS = 60;
diff --git a/bundles/org.openhab.binding.icalendar/src/main/java/org/openhab/binding/icalendar/internal/handler/ICalendarHandler.java b/bundles/org.openhab.binding.icalendar/src/main/java/org/openhab/binding/icalendar/internal/handler/ICalendarHandler.java
index e913fc2ed..06c5c60d3 100644
--- a/bundles/org.openhab.binding.icalendar/src/main/java/org/openhab/binding/icalendar/internal/handler/ICalendarHandler.java
+++ b/bundles/org.openhab.binding.icalendar/src/main/java/org/openhab/binding/icalendar/internal/handler/ICalendarHandler.java
@@ -75,6 +75,7 @@ public class ICalendarHandler extends BaseBridgeHandler implements CalendarUpdat
private @Nullable AbstractPresentableCalendar runtimeCalendar;
private @Nullable ScheduledFuture> updateJobFuture;
private Instant updateStatesLastCalledTime;
+ private @Nullable Instant calendarDownloadedTime;
public ICalendarHandler(Bridge bridge, HttpClient httpClient, EventPublisher eventPublisher,
TimeZoneProvider tzProvider) {
@@ -278,6 +279,7 @@ public class ICalendarHandler extends BaseBridgeHandler implements CalendarUpdat
final AbstractPresentableCalendar calendar = AbstractPresentableCalendar.create(fileStream);
runtimeCalendar = calendar;
rescheduleCalendarStateUpdate();
+ calendarDownloadedTime = Instant.ofEpochMilli(calendarFile.lastModified());
} catch (IOException | CalendarException e) {
logger.warn("Loading calendar failed: {}", e.getMessage());
return false;
@@ -375,6 +377,11 @@ public class ICalendarHandler extends BaseBridgeHandler implements CalendarUpdat
updateState(CHANNEL_NEXT_EVENT_END, UnDefType.UNDEF);
}
+ final Instant lastUpdate = calendarDownloadedTime;
+ updateState(CHANNEL_LAST_UPDATE,
+ (lastUpdate != null ? new DateTimeType(lastUpdate.atZone(tzProvider.getTimeZone()))
+ : UnDefType.UNDEF));
+
// process all Command Tags in all Calendar Events which ENDED since updateStates was last called
// the END Event tags must be processed before the BEGIN ones
executeEventCommands(calendar.getJustEndedEvents(updateStatesLastCalledTime, now), CommandTagType.END);
diff --git a/bundles/org.openhab.binding.icalendar/src/main/resources/OH-INF/i18n/icalendar_de.properties b/bundles/org.openhab.binding.icalendar/src/main/resources/OH-INF/i18n/icalendar_de.properties
index e91507ebb..85fd74cd5 100644
--- a/bundles/org.openhab.binding.icalendar/src/main/resources/OH-INF/i18n/icalendar_de.properties
+++ b/bundles/org.openhab.binding.icalendar/src/main/resources/OH-INF/i18n/icalendar_de.properties
@@ -66,6 +66,8 @@ channel-type.icalendar.event_next_start.label = Start des n
channel-type.icalendar.event_next_start.description = Start des nächsten Eintrags
channel-type.icalendar.event_next_end.label = Ende des nächsten Eintrags
channel-type.icalendar.event_next_end.description = Ende des nächsten Eintrags
+channel-type.icalendar.last_update.label = Letztes Kalender-Update
+channel-type.icalendar.last_update.description = Datum und Zeit des letzten erfolgreichen Kalender-Downloads
channel-group-type.icalendar.result.label = Ergebnis
channel-group-type.icalendar.result.description = Ergebnis, gefunden durch den Filter
channel-type.icalendar.result_start.label = Ergebnisstart
diff --git a/bundles/org.openhab.binding.icalendar/src/main/resources/OH-INF/thing/thing-types.xml b/bundles/org.openhab.binding.icalendar/src/main/resources/OH-INF/thing/thing-types.xml
index bf8cda4fd..8aaccfde1 100644
--- a/bundles/org.openhab.binding.icalendar/src/main/resources/OH-INF/thing/thing-types.xml
+++ b/bundles/org.openhab.binding.icalendar/src/main/resources/OH-INF/thing/thing-types.xml
@@ -16,6 +16,7 @@
+
@@ -118,6 +119,12 @@
Title of the found result in calendar
+
+ DateTime
+
+ The time the calendar was updated successfully last time
+
+ A resulting event found by filter