home-assistant/core · error · HomeAssistantError

CalDAV save error: {err}

Error message

CalDAV save error: {err}

What it means

HomeAssistantError raised when creating a to-do item fails because calendar.save_todo raises requests.ConnectionError, requests.Timeout, or DAVError. It aborts the create and reports 'CalDAV save error' with the underlying exception text.

Source

Thrown at homeassistant/components/caldav/todo.py:144

    async def async_create_todo_item(self, item: TodoItem) -> None:
        """Add an item to the To-do list."""
        item_data: dict[str, Any] = {}
        if summary := item.summary:
            item_data["summary"] = summary
        if status := item.status:
            item_data["status"] = TODO_STATUS_MAP_INV.get(status, "NEEDS-ACTION")
        if due := item.due:
            item_data["due"] = due
        if description := item.description:
            item_data["description"] = description
        try:
            await self.hass.async_add_executor_job(
                partial(self._calendar.save_todo, **item_data),
            )
            # refreshing async otherwise it would take too much time
            self.hass.async_create_task(self.async_update_ha_state(force_refresh=True))
        except (requests.ConnectionError, requests.Timeout, DAVError) as err:
            raise HomeAssistantError(f"CalDAV save error: {err}") from err

    @override
    async def async_update_todo_item(self, item: TodoItem) -> None:
        """Update a To-do item."""
        uid: str = cast(str, item.uid)
        try:
            todo = await self.hass.async_add_executor_job(
                self._calendar.todo_by_uid, uid
            )
        except NotFoundError as err:
            raise HomeAssistantError(f"Could not find To-do item {uid}") from err
        except (requests.ConnectionError, requests.Timeout, DAVError) as err:
            raise HomeAssistantError(f"CalDAV lookup error: {err}") from err
        vtodo = todo.icalendar_component  # type: ignore[attr-defined]
        vtodo["SUMMARY"] = item.summary or ""
        if status := item.status:
            vtodo["STATUS"] = TODO_STATUS_MAP_INV.get(status, "NEEDS-ACTION")
        if due := item.due:

View on GitHub (pinned to 58a3fdb3ea)

Solutions

  1. Confirm the CalDAV server is reachable and responsive
  2. Check whether the target calendar collection supports VTODO (some calendar collections are events-only)
  3. Retry the item creation after connectivity is restored
Defensive patterns

Strategy: try-catch

Try / catch

try:
    await hass.async_add_executor_job(partial(self._calendar.save_todo, **item_data))
except (requests.ConnectionError, requests.Timeout, DAVError) as err:
    raise HomeAssistantError(f"CalDAV save error: {err}") from err

Prevention

When it happens

Trigger: Calling todo.add_item (async_create_todo_item) while the server is unreachable or the save_todo VTODO PUT fails at the transport/DAV level.

Common situations: Transient network outages during to-do edits, servers with restrictive VTODO support rejecting the item, or slow servers exceeding the client timeout.

Related errors


AI-assisted analysis of home-assistant/core@58a3fdb3ea (2026-08-14). Data as JSON: /api/errors/60be1b82eb1ac44f. Report an issue: GitHub.