Repository navigation
Releases: ivenos/ha_caldav
Releases · ivenos/ha_caldav
Release list
v1.4.2
Fixed
- Every edit and delete of an event or a to-do was refused with "This item changed on the server" behind a proxy that compresses responses, such as Caddy with
encodeor Apache with mod_deflate (#21). update_eventanddelete_eventwere refused after another client had changed the event. On an event outside the polled days they stayed refused until the entry was reloaded.
v1.4.1
Added
- CI runs the validation daily and checks that the tested caldav, icalendar and vobject versions cover what the Home Assistant beta pins.
Changed
- caldav, icalendar and vobject are required as minimum versions instead of exact pins, so the integration uses the versions Home Assistant ships.
- CI tests the oldest Home Assistant with the minimum versions from the manifest. The tested versions may be ahead of the Home Assistant under test.
Fixed
- Home Assistant 2026.10 ships caldav 3.3.0a1, and v1.4.0 made it install caldav 2.1.0 over it at startup. With the built-in CalDAV integration set up as well, that one failed to load after a restart. It loads again after the restart that follows this update.
Dependencies
- caldav 2.1.0 -> 3.3.0a1 in the tests, the minimum stays 2.1.0
- ruff 0.16.8 -> 0.16.9
- pytest-homeassistant-custom-component 0.13.366 -> 0.13.367 (Home Assistant 2026.9.4)
- hypothesis 6.168.1 -> 6.168.3
v1.4.0
Warning
- The account device is gone. Automations, scripts and labels that target it have to target the calendars and to-do lists instead. Its area carries over to them, its labels do not.
- Renaming a calendar or to-do list in Home Assistant renames the calendar on the server, for every other client too. A read-only calendar keeps the name to itself.
Added
ha_caldav.delete_eventdeletes an event, a single occurrence of a series, or an occurrence and everything after it.- Calendar names stay in sync both ways. A calendar renamed on the server is renamed in Home Assistant at the next poll, and renaming its calendar or to-do list in Home Assistant renames it on the server. A read-only calendar keeps a name given in Home Assistant to itself. A name given in Home Assistant before this release stays local and hides the server's until it is cleared in the entity settings.
- A calendar created on the server gets its entities at the next poll when every calendar is included.
ha_caldav.search_eventsreturns one entry per occurrence, with itsrecurrence_id, when given a start and an end.- Reconfigure takes a new password along with a new URL.
- Setup names an invalid URL, a missing certificate file and a failed TLS handshake instead of reporting an unexpected error.
- Calendar colors given as CSS color names are recognized.
- CI checks that the oldest test job runs the Home Assistant
hacs.jsonallows, and that the caldav, icalendar and vobject pins follow core.
Changed
- Calendars and to-do lists are named after the calendar alone, without the account in front, and Assist knows them by that name (#14). Voice commands that say the account name no longer match, and with several accounts, calendars of the same name look alike until one of them is renamed. Existing entity IDs stay, new ones are
calendar.<calendar>andtodo.<calendar>. - Every write goes over the version it read (
If-Match), and a new object only onto a free name (If-None-Match). - A window is read in one REPORT instead of two, and each series is expanded on its own.
- A rule denser than hourly is refused on write, as caldav expands the whole poll window in memory on every poll.
- An import is refused when icalendar cannot read one of its lines, when one UID holds two series, or when it holds both an event and a to-do, instead of storing what is left of it.
- Moving an event stored without a UID is refused.
- An empty text in an action clears its field instead of writing an empty line, and an empty rule creates an event without one.
- An event can be copied out of a read-only calendar.
- A series split off from an occurrence keeps its RELATED-TO.
- The calendar actions are registered at startup and exist while an account is retrying.
- Ticking every calendar in the options follows the server again.
- A selection stored by display name is keyed by URL at setup.
- Deleting a calendar drops its per-calendar options along with it.
- The options describe the calendar selection and everything read-only covers. The setup messages and refusals are translated in all five languages, the German translation addresses the user as "du", and the French and German wording follows Home Assistant's own.
- The README describes the polling and the read-only option as they work.
- The bug report form no longer claims that diagnostics redact calendar names.
- CI tests against Home Assistant 2026.3.1 as the oldest version and pins it before Python is set up, takes the ruff version from
requirements_test.txtand has job timeouts. The live run fails when the two newest Nextcloud majors cannot be resolved instead of falling back to older ones. Renovate updates the Playwright image. tests/live-test.shbinds its servers to localhost, removes their volumes, and its containers when interrupted, uses the venv's pytest and passes flags like-von without--.- The screenshot script names its Radicale image itself, no longer renames the entities and fails when the config flow does.
Removed
- The account device the calendars and to-do lists were grouped under. Its area carries over to them, and one disabled along with it stays disabled.
render_readmefromhacs.json, which HACS no longer reads.
Fixed
- Moving a series or changing its rule, extending its end among them, dropped its exceptions and canceled occurrences, including ones the new rule still produces.
- Moving a series to another weekday from one occurrence onwards was refused as a start the rule does not produce.
- "Does not repeat" did not end a series, and chosen at a moved occurrence it put the event back on its rule slot.
- An UNTIL the editor writes without a zone is stored in UTC, so servers keep the last occurrence, and a date-only UNTIL no longer ends a timed series a day early.
- A split took over the COUNT of the whole series instead of what remains, and carried a to-do sharing the resource and a stored METHOD into the series it wrote.
- "This and following" on a moved first occurrence or a moved split point shifted the series instead of applying the edit to it.
- A split or delete that leaves nothing before it stored an empty series instead of removing the head.
- An occurrence of an event that does not recur was accepted, and one of a series that started more than 10,000 occurrences ago could not be edited.
- A new organizer landed on one component instead of the series and every exception, and a split reset the organizer's own reply.
- SEQUENCE moved on events the account does not organize, restarted on a new exception and went up on an import or a move.
- One series caldav cannot expand (RSCALE, x-parts, INTERVAL=0) took the whole calendar down or hung the setup.
- A broken VTIMEZONE on one object shifted every later event with the same TZID, and a custom zone was lost in the expansion.
- Setting alarms dropped email alarms.
- The calendar state did not move on to the next event when one ended.
- Renaming a completed recurring to-do advanced it, completing one landed on excluded dates, and an edit moved the due time out of its zone.
- Renaming a to-do without STATUS cleared its progress, a lowercase STATUS read as open, and a to-do series listed behind its exception had the exception edited.
- Two edits of one to-do in a row undid each other.
- A to-do completed with a plain date, as SOGo writes it, disappeared from the list.
- Text like "COMPLETED:3 of 5" in a description was rewritten.
- A second edit of the same item was refused over a conflict the first edit had caused seconds earlier, and after a conflict the list kept the stale item until the next poll.
- A write answered with a redirect lost its method or its body, and a delete answered with a redirect or a 404 reported success.
- A move whose delete failed left the copy behind, with no way to retry it.
- A UID lookup that timed out fell back to reading the whole calendar.
- Deleting a calendar whose path ends in "-todo" removed the to-do list of the calendar beside it.
delete_calendaron the only included calendar brought back every other one and is refused now, andcreate_calendaranddelete_calendarignored read-only.- An empty
recurrence_idfrom a template was refused, and the alarm action and related fields accepted one case only. - A calendar deleted on the server stayed unavailable for good. Its entities now go after two polls without it. One a listing missed came back only after a restart.
- Renaming a calendar that was selected by name removed its entities.
- An empty selection from v1.1.0 blocked the options form, and calendars of the same name could not be told apart there.
- A calendar refusing the color property took the colors of the whole account with it, and words like "bad" were read as colors.
- Setup did not follow a redirect on the server URL and found no calendars. It follows now and keeps the new URL for a permanent redirect only.
- Setup gave up on a 401 from the entered URL without trying the one
/.well-known/caldavpoints at, which left re-authentication repeating itself. - A rejected password was not recognized when the server sent no reason phrase, and the color poll kept sending it instead of asking for a new one.
- A host spelled in another case or with its default port counted as another server.
- A bare host logged an error traceback on setup, and an unreachable host was waited for twice on setup and on every step of the options dialog.
- An account with more than ten calendars threw away a connection on every poll.
- An entry left behind by a newer version was migrated backwards.
- Diagnostics dropped calendars whose paths end alike.
- Wording in the French, Spanish and Italian translations.
Security
- Credentials no longer follow a calendar home set from https to plain http on another host.
- New events, to-dos and calendars get random identifiers instead of ones that embed the host's MAC address.
- The session cookies a server sets are redacted in caldav's debug log, which bug reports carry.
Dependencies
- ruff 0.16.7 -> 0.16.8
- pytest-homeassistant-custom-component 0.13.365 -> 0.13.366 (Home Assistant 2026.9.3)
- hypothesis 6.168.0 -> 6.168.1
v1.3.1
Added
- Brand images: Home Assistant 2026.3 and newer shows the integration's own icon and logo instead of a placeholder.
Changed
- The English UI spells the event status "Canceled", in the status options and in the descriptions of the event actions.
- The README has a logo and screenshots.
.github/scripts/screenshots.shrebuilds them from a throwaway Home Assistant with sample calendars. - The contributor license agreement lives in
.github/CLA.mdand lets the maintainer transfer the license. The pull request check also refuses commits and co-authors other than the author and the maintainer, and changes to the agreement itself, and posts a receipt when a pull request is merged. - The bug report asks for the integration and Home Assistant version in one field and points to debug logging in the integration's menu.
- Renovate merges updates to GitHub Actions, the test dependencies and ruff by itself once CI passes, except the release action. It proposes nothing younger than three days and no longer holds back releases without a timestamp.
- The HACS validation runs the brands check.
- The live test script moves to
tests/live-test.sh.
Dependencies
- ruff 0.16.6 -> 0.16.7
- pytest-homeassistant-custom-component 0.13.364 -> 0.13.365 (Home Assistant 2026.9.2)
- hypothesis 6.167.1 -> 6.168.0
v1.3.0
Added
- Request timeout as an account option, 30 seconds by default and up to 120, in place of the fixed 10 seconds that iCloud's month-range queries kept missing (#2).
- The certificate paths sit in a collapsed "Certificates" section of the setup and reconfigure forms.
- A new account is titled
username@host, so two accounts sharing a username no longer collide in device names and entity ids. Reconfiguring to another host follows along unless the title was changed by hand. ha_caldav.search_eventsreturns the extra event properties:url,status,transparency,classification,priority,categories,attendees,organizerandalarms.- Diagnostics report how far behind each calendar and to-do list is: the last full read, the polls served from a kept result, and whether a half of the collection is dead.
Changed
- A calendar or to-do list whose poll failed keeps serving its last result for up to three polls before going unavailable, on collections holding one component type too.
- A rejected password reaches reauthentication only when nothing else explains the 401: no part of the collection read, and none is still inside its keep budget.
- Servers without the sync-collection report are no longer sent it on every poll.
- CI runs the unit tests against the oldest Home Assistant
hacs.jsonallows (2026.3) as well as the pinned one, and the live tests only when code, tests or their script changed. - Renovate leaves caldav, icalendar and vobject alone in
manifest.jsonas well; they follow Home Assistant core.
Fixed
- A trailing space in the server url or the username no longer fails the connection.
Dependencies
- ruff 0.15.21 -> 0.16.6
- pytest-homeassistant-custom-component 0.13.346 -> 0.13.364 (Home Assistant 2026.9.1)
- hypothesis 6.165.2 -> 6.167.1
- actions/setup-python v6 -> v7
v1.2.0
Added
- Edit and delete a single occurrence of a series, an occurrence and everything after it, or the whole series.
- Read the RFC 5545 properties Home Assistant has no field for as entity attributes: alarms, attendees, organizer, url, categories, status, transparency, classification and priority.
- Services
create_eventandupdate_event, which can set every one of those properties. - Services
search_eventsandget_free_busy, answered by the server rather than by filtering a poll. - Services
move_event,import_icsandexport_ics. - Services
create_calendaranddelete_calendar. - Service
set_calendar_color. - Service
respond_to_invitation, setting the account's own participation status. - Reorder to-do items by dragging, stored in
X-APPLE-SORT-ORDER. - Completing a recurring to-do advances it to its next occurrence instead of closing the series.
- Per-calendar options for the polling window, all-day events and read-only, alongside the account-wide ones.
- A reconfigure step for moving an account to another address without losing its entities.
- TLS client certificate, client key and CA bundle in the account settings.
- Server discovery through
/.well-known/caldav, so a bare host name is enough to set an account up. - Per-calendar capability detection: a calendar reports which component types it holds and whether the account may write to it.
- A repair issue when the server does not support the sync-collection report, and another when the same account is also set up in the built-in CalDAV integration.
Changed
- Account keys and entity unique ids are normalized, so one account reached under two spellings of its address is no longer set up twice. Existing entries migrate at startup and keep their entity ids.
- Every edit is checked against the revision the last poll recorded and refused if the object changed on the server in between.
- A calendar that reports it holds no events, or no to-dos, no longer keeps an entity for the half it does not have.
- Diagnostics report the capabilities, colour and read state of each calendar.
Fixed
- Ticking off a to-do could delete an event stored in the same object under the same UID, without reporting anything.
- Text containing
COMPLETED:followed by digits was rewritten on its way to the server, in summaries, descriptions and locations alike. - Every edit advanced
SEQUENCEtwice, announcing a revision that was never issued. - A to-do whose recurrence rule was stored twice could be renamed and re-dated but never completed.
- Events could not be found at all on servers that refuse to filter a search by UID, iCloud among them.
- Deleting an event that listed attendees but no organizer failed on sabre/dav servers such as Baikal, leaving it impossible to remove from any client.
- A series bounded by
UNTILgained or lost its last occurrence depending on the time zone Home Assistant runs in. - A single stored object could fail the whole poll and leave the calendar unavailable: a date beyond what Python can hold, a start that is not a date, a property written twice, or a body that does not parse.
- A recurrence rule that never terminates was expanded instead of refused.
- A time zone reference was written without the definition it needs, which strict servers reject and lenient ones store as a floating time.
- Exporting a single object returned line endings that strict importers refuse.
- An attendee name containing a quotation mark was published with its escape sequence intact.
Security
- Discovery no longer follows a redirect that leaves https, and credentials are dropped when a redirect changes host, digest authentication included.
- Diagnostics redact the password, the account address and the paths to the TLS material.
v1.1.0
Calendars now take the colour their CalDAV server gives them.
Added
- Calendar colours are read from the server and applied to the matching entity. Accounts that already exist get theirs on the next poll, and a colour changed on the server carries over from then on.
- Picking a colour in Home Assistant, or clearing it, overrides the server for good.
- Colours are read in every form servers store them, including the short
#rgbnotation and values carrying a trailing alpha pair such as#00679EFF. - Diagnostics list the colour of each calendar, and say so separately when the colour lookup itself failed.
Notes
- Only calendars whose server actually stores a colour get one. Radicale and Xandikos leave newly created calendars without one until a client sets it; Nextcloud assigns one on creation.
- Home Assistant 2026.3 or newer, unchanged from the previous release.
v1.0.0
First stable release: a full read/write CalDAV integration for calendars and to-dos, picking up where Home Assistant's built-in one stops.
Added
- Edit and delete calendar events, not just create them.
- Full recurrence control: apply an edit or deletion to a single occurrence, that one and everything after it, or the whole series.
- To-do lists (VTODO) with due dates and descriptions; completing a recurring to-do rolls it forward to its next due date instead of closing the series.
- Conflict-safe writes: an edit made on the server since the last refresh is caught instead of quietly overwriting it (ETag).
- Change-gated polling via sync-token (RFC 6578) — the expensive expansion only runs when something actually changed.
- Config entry diagnostics, with URLs and credentials redacted.
- Options for calendar selection, poll interval, look-ahead window, all-day handling and read-only mode.
- German, Spanish, French and Italian translations.
Requirements
- Home Assistant 2026.3 or newer, and a CalDAV account with write access.
v0.1.0
Added
- Calendar entity per CalDAV calendar with full create, edit and delete support in the Home Assistant calendar view.
- Recurring series editing: change or remove a single occurrence, an occurrence and everything after it, or the whole series.
- To-do list entity per calendar for VTODO items (Nextcloud Tasks), with due dates and descriptions.
- Config flow with connection validation and re-authentication when the password changes.
- Options: calendar selection, poll interval, days ahead for the upcoming event, all-day event inclusion, read-only mode.
- English and German translations.
- Live test suite run against Nextcloud 32, 33, 34 and latest in CI.