{"record":{"id":"60be1b82eb1ac44f","repo":"home-assistant/core","slug":"caldav-save-error-err-60be1b","errorCode":null,"errorMessage":"CalDAV save error: {err}","messagePattern":"CalDAV save error: (.+?)","errorType":"exception","errorClass":"HomeAssistantError","httpStatus":null,"severity":"error","filePath":"homeassistant/components/caldav/todo.py","lineNumber":144,"sourceCode":"    async def async_create_todo_item(self, item: TodoItem) -> None:\n        \"\"\"Add an item to the To-do list.\"\"\"\n        item_data: dict[str, Any] = {}\n        if summary := item.summary:\n            item_data[\"summary\"] = summary\n        if status := item.status:\n            item_data[\"status\"] = TODO_STATUS_MAP_INV.get(status, \"NEEDS-ACTION\")\n        if due := item.due:\n            item_data[\"due\"] = due\n        if description := item.description:\n            item_data[\"description\"] = description\n        try:\n            await self.hass.async_add_executor_job(\n                partial(self._calendar.save_todo, **item_data),\n            )\n            # refreshing async otherwise it would take too much time\n            self.hass.async_create_task(self.async_update_ha_state(force_refresh=True))\n        except (requests.ConnectionError, requests.Timeout, DAVError) as err:\n            raise HomeAssistantError(f\"CalDAV save error: {err}\") from err\n\n    @override\n    async def async_update_todo_item(self, item: TodoItem) -> None:\n        \"\"\"Update a To-do item.\"\"\"\n        uid: str = cast(str, item.uid)\n        try:\n            todo = await self.hass.async_add_executor_job(\n                self._calendar.todo_by_uid, uid\n            )\n        except NotFoundError as err:\n            raise HomeAssistantError(f\"Could not find To-do item {uid}\") from err\n        except (requests.ConnectionError, requests.Timeout, DAVError) as err:\n            raise HomeAssistantError(f\"CalDAV lookup error: {err}\") from err\n        vtodo = todo.icalendar_component  # type: ignore[attr-defined]\n        vtodo[\"SUMMARY\"] = item.summary or \"\"\n        if status := item.status:\n            vtodo[\"STATUS\"] = TODO_STATUS_MAP_INV.get(status, \"NEEDS-ACTION\")\n        if due := item.due:","sourceCodeStart":126,"sourceCodeEnd":162,"githubUrl":"https://github.com/home-assistant/core/blob/58a3fdb3ea0538617f0a07efcfba6294de64fd59/homeassistant/components/caldav/todo.py#L126-L162","documentation":"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.","triggerScenarios":"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.","commonSituations":"Transient network outages during to-do edits, servers with restrictive VTODO support rejecting the item, or slow servers exceeding the client timeout.","solutions":["Confirm the CalDAV server is reachable and responsive","Check whether the target calendar collection supports VTODO (some calendar collections are events-only)","Retry the item creation after connectivity is restored"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"try:\n    await hass.async_add_executor_job(partial(self._calendar.save_todo, **item_data))\nexcept (requests.ConnectionError, requests.Timeout, DAVError) as err:\n    raise HomeAssistantError(f\"CalDAV save error: {err}\") from err","preventionTips":["Confirm the target collection supports VTODO before enabling the to-do list","Retry creates after connectivity checks when automations add items","Keep item payloads simple (summary/status/due) for maximum server compatibility"],"tags":["homeassistant","caldav","todo","service-call"],"backgroundTag":null,"analyzedSha":"58a3fdb3ea0538617f0a07efcfba6294de64fd59","analyzedAt":"2026-08-14T20:54:38.818Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}