Skip to main content

API reference

Every surface an integration or automation can build on, generated from the shipping code. Labels and descriptions are the same strings Home Assistant shows in its own dialogs, so this page and the UI never disagree.

New to this? Start with the integration guide, which walks through pushing a task and reacting to its completion.

Surface coverage

Every kind of integration surface Home Assistant offers, and where Home Keeper stands on it. The rows that say not applicable or deferred are the useful ones: a list of what exists cannot tell you what is missing.

SurfaceStatusNotes
Actions (services)PublishedEvery operation that mutates or exports Home Keeper data ships as a home_keeper.* service — the interoperability contract.
Bus eventsPublishedEvery observable state change fires a home_keeper_<noun>_<verb> event, built by a pure function so the shipped payload and the documented one are the same object.
Device triggersPublishedTen of the bus events are offered in the visual automation editor on Home Keeper's own appliance and task devices.
Device conditionsNot applicableTask state is readable from the per-task sensor and binary_sensor, so a separate condition platform would add a second way to ask one question.
Device actionsNot applicableThe services cover every device-scoped operation and take a task or asset id directly.
Entity platformsPublishedtodo, calendar, sensor, binary_sensor, button and number — usage surfaces, as opposed to the admin-only panel.
Entity attributesPublishedThe per-task sensors carry enough state that an automation rarely needs to call a service to read anything.
Config entry optionsPublishedThree surfaces write them — the options flow, the set_options service and the panel — through one merge path.
Config flowPublishedA single-instance UI setup flow with an options flow; no YAML configuration.
ErrorsPublishedUser-facing failures raise localized exceptions keyed into strings.json, so they read in the user's language wherever they surface.
DiagnosticsPublishedConfig entry and device diagnostics download from the integration page, with serial numbers, notes and completion detail redacted.
Companion discoveryPublishedIntegrations that work with Home Keeper self-register via register_companion, or are detected from a curated catalog.
Test helperPublishedhome_keeper.testing ships a fake store built on the same event builders, so an integrator tests against the shipped payloads.
Lovelace cardPublishedThe dashboard task card registers itself as a Lovelace resource on storage-mode installs.
Data portabilityPublishedTasks and appliances move as one YAML document with a published JSON Schema, which export_data writes and import_data reads, upserting on a stated primary key.
WebSocket commandsInternalA latency optimization for the panel that delegates to the same store methods; build on the services instead, which are the contract.
HTTP viewsInternalTwo authenticated routes for document and part-file upload and download — a binary can't ride a service call, so this is the one non-service mutation path.
Sidebar panelInternalThe admin-only management UI, served from a static path; it is a client of the surfaces above, not one itself.
Dispatcher signalsDeferredSIGNAL_TASK_CONTRIBUTION is reserved for a future upsert/reconcile contribution API and is not connected to anything yet; SIGNAL_DECLARATIVE_SPECS_CHANGED is internal, between the store and the declarative-companion reconciler.
IntentsDeferredVoice control would go through the intent platform; not built, and the services are reachable from a script in the meantime.
RepairsDeferredNo repair issues are raised yet; problems surface as localized exceptions and log entries.
ConversationNot applicableHome Keeper exposes no conversation agent of its own.
Backup platformNot applicableState is one JSON document under .storage, which Home Assistant's own backup already covers.
Media sourceNot applicableUploaded documents are served by the integration's own authenticated view, not browsable as media.

Actions

Every operation that changes or exports Home Keeper data is a Home Assistant action, so automations, scripts, voice assistants and other integrations all reach it the same way. Guard each call with hass.services.has_service("home_keeper", "<action>") so your integration still works when Home Keeper isn't installed.

home_keeper.add_task

Add task

Create a new maintenance task or chore.

Can return a response

FieldLabelSelectorDescription
name (required)NametextDisplay name of the task.
notesNotestext (multiline)Optional free-text notes. Markdown is rendered in the Home Keeper panel.
recurrence_typeRecurrence typeselect (floating, fixed, one-off, triggered, sensor, use)floating (measured from completion), fixed (anchored schedule), or one-off (do-once, uses a due date). Omit it and the type is inferred from the schedule fields you passed. A name on its own makes a one-off due today.
intervalIntervalnumber (min 1)Repeat every N units (floating) or steps (fixed).
unitUnitselect (days, weeks, months)For floating tasks: days, weeks, or months.
freqFrequencyselect (DAILY, WEEKLY, MONTHLY)For fixed tasks: DAILY, WEEKLY, or MONTHLY.
anchorAnchortextFor fixed tasks: ISO datetime of the first occurrence (sets the time of day).
dueDue datetextFor one-off tasks: ISO datetime the task is due. Optional. Defaults to now (due today).
sensorSensor triggerobjectFor sensor tasks: a mapping with the bound entity, entity_id, mode (usage, threshold or state), and the mode's fields.
last_completedLast completeddatetimeOptional 'last done' date. Seeds an initial completion so a floating task starts measured from this date (next due = last done + interval) instead of being due immediately. Omit for a task that has never been done.
device_idDevicedeviceOptional device to attach this task to.
area_idAreaareaOptional area to associate with this task.
labelsLabelslabel (multiple)Optional Home Assistant labels to tag this task with. Used by the dashboard card's label filter (which also matches labels on the attached device or area).
card_linksCard linksobjectAppliance links to surface on this task's dashboard-card row: a list of (asset_id, entry_id) objects pointing at an appliance's document or metadata links. Usually set from the panel's task editor.
task_chipsTask chipsobjectIntegration-provided metadata chips shown in the task list and dashboard card: a list of (label, icon?, url?) objects. Not user-editable in the panel.
tag_idTagtextId of a Home Assistant tag (from the Tags panel) whose scan completes this task. Scanning it marks the task as done.
require_tag_scanRequire tag scanbooleanOnly let the linked tag complete this task. Every other way of marking it done is refused. Needs a tag.
active_seasonActive seasonobjectRestrict this task to one or more date ranges each year. Outside the active windows the next due date moves to the nearest upcoming window start. Each object has start and end as MM-DD strings. Pass a list or a single object. Wrapping seasons (Nov through Mar) are supported. Null clears the season.
sourceSourceobjectOpaque provenance owned by the integration that created the task. Home Keeper stores and echoes it verbatim and never inspects it. See docs/INTEGRATING.md.
completion_detailCompletion detailselect (none, optional, required)How much context to capture when this task is completed. none skips the prompt entirely, while optional offers the note/cost/photo/who fields and required makes them mandatory (see completion_required_fields). Panel-only capture prompt.
completion_required_fieldsRequired completion fieldsselect (note, cost, photo, who)Which completion-metadata fields the panel makes mandatory when completion detail is required: any of note, cost, photo, who.

home_keeper.update_task

Update task

Update fields of an existing task.

FieldLabelSelectorDescription
task_id (required)Task name or IDtextThe id of the task to update. Its name works too. The panel shows the id.
nameNametextNew display name.
notesNotestext (multiline)New notes. Markdown is rendered in the Home Keeper panel.
recurrence_typeRecurrence typeselect (floating, fixed, one-off, triggered, sensor, use)floating, fixed, or one-off (do-once).
intervalIntervalnumber (min 1)Repeat every N units/steps.
unitUnitselect (days, weeks, months)days, weeks, or months (floating).
freqFrequencyselect (DAILY, WEEKLY, MONTHLY)DAILY, WEEKLY, or MONTHLY (fixed).
anchorAnchortextISO datetime of the first occurrence (fixed).
dueDue datetextISO datetime the task is due (one-off).
sensorSensor triggerobjectSensor binding for a sensor task, entity_id, mode (usage, threshold or state), and the mode's fields (replaces the whole binding).
device_idDevicedeviceDevice to attach this task to.
area_idAreaareaArea to associate with this task.
labelsLabelslabel (multiple)Home Assistant labels to tag this task with (replaces the current set). Used by the dashboard card's label filter.
card_linksCard linksobjectAppliance links to surface on this task's dashboard-card row (replaces the current set): a list of (asset_id, entry_id) objects. Usually set from the panel's task editor.
task_chipsTask chipsobjectIntegration-provided metadata chips (replaces the current set): a list of (label, icon?, url?) objects. See add_task for the full schema.
tag_idTagtextId of the Home Assistant tag whose scan completes this task. Send an empty value to unlink it, which fails while a tag scan is required.
require_tag_scanRequire tag scanbooleanOnly let the linked tag complete this task. Needs a tag.
active_seasonActive seasonobjectRestrict this task to one or more date ranges each year. Each object has start and end as MM-DD strings. Pass a list or a single object. Send null to clear the season.
sourceSourceobjectOpaque provenance owned by the integration that created the task. See docs/INTEGRATING.md.
completion_detailCompletion detailselect (none, optional, required)How much context to capture on completion: none, optional, or required (see add_task). Panel-only capture prompt.
completion_required_fieldsRequired completion fieldsselect (note, cost, photo, who)Which completion-metadata fields the panel makes mandatory when completion detail is required: any of note, cost, photo, who.

home_keeper.delete_task

Delete task

Delete a task.

FieldLabelSelectorDescription
task_id (required)Task name or IDtextThe id of the task to delete. Its name works too. The panel shows the id.
forceForcebooleanBypass deletion protection for a task managed by another integration. Use this to clean up a task whose managing integration was uninstalled or is misbehaving and can't remove it itself.

home_keeper.complete_task

Complete task

Mark a task complete and advance its recurrence.

FieldLabelSelectorDescription
task_id (required)Task name or IDtextThe id of the task to complete. Its name works too. The panel shows the id.
completed_atCompleted atdatetimeOptional completion timestamp (defaults to now).
originOrigintextOptional free-form marker echoed back in the home_keeper_task_completed event so a contributing integration can recognise and ignore the completion it triggered (loop prevention), and Home Keeper never interprets it.
noteNotetext (multiline)Optional free-form note recorded with this completion.
costCostnumber (min 0)Optional cost recorded with this completion (your HA currency).
photoPhototextOptional Home Assistant image-upload id to attach as the completion photo (the panel sets this when you upload from the completion dialog).
whoWhoentityOptional person who performed the task (a person entity id).
readingMeter readingnumberFor a sensor task in usage or threshold mode, the bound sensor's value when the work was done. Omit it and Home Keeper reads the sensor live. Pass it explicitly when back-dating, because the meter has moved since. On a usage task it also becomes the new baseline.

home_keeper.update_completion

Update completion

Amend the metadata (note, cost, photo, who) of an already-recorded completion, identified by its timestamp. Does not change the schedule or due date.

FieldLabelSelectorDescription
task_id (required)Task name or IDtextThe id of the task whose completion you are editing. Its name works too. The panel shows the id.
ts (required)Completion timestamptextThe ISO timestamp (ts) of the completion entry to edit.
noteNotetext (multiline)New note (omit or leave blank to clear it).
costCostnumber (min 0)New cost (omit or leave blank to clear it).
photoPhototextNew image-upload id (omit or leave blank to clear it).
whoWhoentityNew person entity id (omit or leave blank to clear it).
readingMeter readingnumberNew sensor reading for this completion (omit or leave blank to clear it). Only valid for a sensor task in usage or threshold mode.

home_keeper.delete_completion

Delete completion

Remove one completion from a task's history (undo an accidental “done”), identified by its timestamp.

FieldLabelSelectorDescription
task_id (required)Task name or IDtextThe id of the task whose completion you are removing. Its name works too. The panel shows the id.
ts (required)Completion timestamptextThe ISO timestamp (ts) of the completion entry to remove.
originOrigintextOptional free-form marker echoed back in the home_keeper_task_uncompleted event so a contributing integration can recognise and ignore the undo it triggered (loop prevention), and Home Keeper never interprets it.

home_keeper.move_completion

Move completion

Re-timestamp an already-recorded completion (back-date or correct it), identified by its current timestamp. Unlike Update completion, this changes the completion's date/time and re-derives the task's last-completed and next-due dates from the result.

FieldLabelSelectorDescription
task_id (required)Task name or IDtextThe id of the task whose completion you are moving. Its name works too. The panel shows the id.
old_ts (required)Current completion timestamptextThe ISO timestamp (ts) of the completion entry to move.
new_completed_at (required)New completed atdatetimeThe new date/time to record the completion at.

home_keeper.delete_archived_completion

Delete archived completion

Remove one completion from an appliance's archived task history, identified by the originating task id and completion timestamp.

FieldLabelSelectorDescription
asset_id (required)Appliance name or IDtextThe id of the appliance whose archived history you are editing. Its name works too. The panel shows the id.
task_id (required)Task name or IDtextThe id of the original task the archived completion belongs to. Its name works too. The panel shows the id.
ts (required)Completion timestamptextThe ISO timestamp (ts) of the archived completion to remove.

home_keeper.trigger_task

Trigger task

Arm a condition-driven (triggered) task so it reads as due now. This is the owner-facing counterpart to Complete task (which clears it back to dormant). Idempotent. Only valid for triggered tasks.

FieldLabelSelectorDescription
task_id (required)Task name or IDtextThe id of the triggered task to arm. Its name works too. The panel shows the id.

home_keeper.set_task_meter

Set task meter

Re-anchor a usage (meter) sensor task's baseline without recording a completion. Use it when the work was done before Home Keeper was watching, or when the bound meter itself was replaced or zeroed. Omit baseline to anchor to the sensor's current reading. Only valid for a sensor task in usage mode.

FieldLabelSelectorDescription
task_id (required)Task name or IDtextThe id of the usage sensor task to re-anchor. Its name works too. The panel shows the id.
baselineBaselinenumberThe meter reading to count from. Leave empty to use the bound sensor's current reading.

home_keeper.snooze_task

Snooze task

Defer a task's due date without recording a completion or advancing its recurrence.

FieldLabelSelectorDescription
task_id (required)Task name or IDtextThe id of the task to snooze. Its name works too. The panel shows the id.
hoursHoursnumber (min 1, max 8760)How many hours to defer the task (defaults to 24). Ignored when Until is set.
untilUntildatetimeDefer the task to this exact date and time instead of a number of hours. Setting this leaves Hours unused.
originOrigintextOptional free-form marker echoed back in the home_keeper_task_snoozed event so a contributing integration can recognise and ignore the snooze it triggered (loop prevention), and Home Keeper never interprets it.

home_keeper.skip_task

Skip task

Advance a task to its next occurrence without recording a completion. Home Keeper logs the skip separately from the completions, so it is never counted as a completion.

FieldLabelSelectorDescription
task_id (required)Task name or IDtextThe id of the task to skip. Its name works too. The panel shows the id.
noteNotetext (multiline)Why this occurrence was skipped.
whoWhotextWho decided to skip it.
readingMeter readingnumberThe bound sensor's value at the moment of the skip, for a usage task.
originOrigintextOptional free-form marker echoed back in the home_keeper_task_skipped event so a contributing integration can recognise and ignore the skip it triggered (loop prevention), and Home Keeper never interprets it.

home_keeper.set_due_today

Set task due today

Move a task's due date to now, whatever its periodic schedule says, without recording a completion or changing its recurrence.

FieldLabelSelectorDescription
task_id (required)Task name or IDtextThe id of the task to move. Its name works too. The panel shows the id.
originOrigintextOptional free-form marker echoed back in the home_keeper_task_due_today_set event so a contributing integration can recognise and ignore the change it triggered (loop prevention), and Home Keeper never interprets it.

home_keeper.update_skip

Update skip

Amend a recorded skip's detail, identified by its timestamp. The skip keeps its date, and the schedule of the task does not change.

FieldLabelSelectorDescription
task_id (required)Task name or IDtextThe id of the task whose skip you are editing. Its name works too. The panel shows the id.
ts (required)Skip timestamptextThe ISO timestamp (ts) of the skip entry to edit.
noteNotetext (multiline)Why this occurrence was skipped. An empty value clears it.
whoWhotextWho decided to skip it. An empty value clears it.
readingMeter readingnumberThe bound sensor's value at the moment of the skip, for a usage task.

home_keeper.delete_skip

Delete skip

Remove a recorded skip, identified by its timestamp. Removal of the skip that last reset a usage meter restores that meter.

FieldLabelSelectorDescription
task_id (required)Task name or IDtextThe id of the task whose skip you are removing. Its name works too. The panel shows the id.
ts (required)Skip timestamptextThe ISO timestamp (ts) of the skip entry to remove.

home_keeper.move_skip

Move skip

Re-date a recorded skip, identified by its current timestamp. The date of the skip changes, and the schedule of the task does not.

FieldLabelSelectorDescription
task_id (required)Task name or IDtextThe id of the task whose skip you are moving. Its name works too. The panel shows the id.
old_ts (required)Current skip timestamptextThe ISO timestamp (ts) of the skip entry to move.
new_ts (required)New datedatetimeThe new date and time to record the skip at.

home_keeper.set_task_consumable

Link task to a consumable

Link a task to an appliance consumable/part so completing it consumes one spare from the part's stock and fires a low-stock event at the reorder threshold. Omit asset_id and part_id to clear the link.

FieldLabelSelectorDescription
task_id (required)Task name or IDtextThe id of the task to link (or unlink). Its name works too. The panel shows the id.
asset_idAppliance name or IDtextThe id of the appliance the consumable belongs to. Omit to unlink. Its name works too. The panel shows the id.
part_idPart name or IDtextThe id of the consumable/part to link. Omit to unlink. Its name works too. The panel shows the id.

home_keeper.notify

Notify what's due

Send an actionable push notification for what's currently due: name a saved notification or profile, optionally overriding the notify target.

Can return a response

FieldLabelSelectorDescription
notificationNotificationtextName or id of a saved notification (uses its profile + delivery).
profileProfiletextName or id of a saved profile (filter) to send.
targetTargettext (multiple)Notify services to send to, overriding the profile. Must be companion-app services (e.g. mobile_app_phone) or persistent_notification.
statusStatusselect (overdue, due_soon, all, none)Overrides the profile's own status for this call. Use overdue, due_soon or all to widen the filter. Use none to match no task, which sends the all-clear notification on demand.
when_emptyWhen nothing matchesselect (skip, all_clear)What a call sends if the filter matches no task. Defaults to skip, so the call sends nothing. Set it to all_clear to send the all-clear notification instead.

home_keeper.list_tasks

List tasks

Return all tasks as a response.

Returns a response

Takes no fields.

home_keeper.list_profiles

List profiles

Return the saved profiles (named task filters) as a response.

Returns a response

Takes no fields.

home_keeper.add_asset

Add appliance

Register an appliance/asset. By default Home Keeper creates a virtual device for it. Set kind to existing to attach metadata to a device from another integration.

Admin only

FieldLabelSelectorDescription
nameNametextDisplay name (required for a new virtual device).
kindKindselect (virtual, existing)virtual (Home Keeper creates the device) or existing (attach to one).
device_idDevicedeviceExisting device to attach metadata to (required when kind is existing).
area_idAreaareaOptional area for the appliance.
manufacturerManufacturertextMaker of the appliance.
modelModeltextModel name or number.
serial_numberSerial numbertextSerial number (shown in the appliance's device-page info block).
notesNotestext (multiline)Optional free-text notes about the appliance. Markdown is rendered in the Home Keeper panel.
costCostnumber (min 0)Replacement cost. The appliance report totals it.
documentsDocumentsobjectManuals/warranties/receipts: a list of links or uploaded files. This service adds link documents (name + url). Upload files from the panel.
iconIconiconOptional mdi icon (e.g. mdi:piano).
metadataMetadataobjectFree-form metadata entries (label, type text/link/date, value). A date with track:true also becomes a sensor.
partsPartsobjectStructured parts/wear items. Wear items with an interval drive a maintenance task.
parent_asset_idParent appliancetextMake this a subdevice of another appliance. Give its name or its id.
related_device_idsRelated devicesdevice (multiple)Other registry devices to associate with this appliance.

home_keeper.update_asset

Update appliance

Update fields of an existing appliance/asset.

Admin only

FieldLabelSelectorDescription
asset_id (required)Appliance name or IDtextThe id of the asset to update. Its name works too. The panel shows the id.
nameNametextNew display name.
device_idDevicedeviceRe-target an existing-device asset.
area_idAreaareaArea for the appliance.
manufacturerManufacturertextMaker of the appliance.
modelModeltextModel name or number.
serial_numberSerial numbertextSerial number (shown in the appliance's device-page info block).
notesNotestext (multiline)New notes. Markdown is rendered in the Home Keeper panel.
costCostnumber (min 0)Replacement cost. The appliance report totals it.
documentsDocumentsobjectDocuments (links/files) on the appliance (see add_asset).
iconIconiconOptional mdi icon (e.g. mdi:piano).
metadataMetadataobjectFree-form metadata entries (see add_asset).
partsPartsobjectStructured parts/wear items. Wear items with an interval drive a maintenance task.
parent_asset_idParent appliancetextMake this a subdevice of another appliance. Give its name or its id.
related_device_idsRelated devicesdevice (multiple)Other registry devices to associate with this appliance.

home_keeper.delete_asset

Delete appliance

Delete an appliance/asset. Its virtual device (if any) is removed and tasks attached to it become standalone.

Admin only

FieldLabelSelectorDescription
asset_id (required)Appliance name or IDtextThe id of the asset to delete. Its name works too. The panel shows the id.

home_keeper.archive_asset

Archive appliance

Hide an appliance/asset from the default view without deleting its data. Its device, entities, and attached tasks are left untouched. restore_asset undoes it.

Admin only

FieldLabelSelectorDescription
asset_id (required)Appliance name or IDtextThe id of the asset to archive. Its name works too. The panel shows the id.

home_keeper.restore_asset

Restore appliance

Undo archive_asset, returning an archived appliance to the default view.

Admin only

FieldLabelSelectorDescription
asset_id (required)Appliance name or IDtextThe id of the asset to restore. Its name works too. The panel shows the id.

home_keeper.list_assets

List appliances

Return all appliances/assets as a response.

Returns a response

Takes no fields.

home_keeper.adjust_part_stock

Adjust part stock

Change a part's on-hand spare quantity by a signed delta (clamped at zero). Decimals are allowed. When a decrease reaches or crosses the reorder threshold, a low-stock event fires.

Admin only

FieldLabelSelectorDescription
asset_id (required)Appliance name or IDtextThe id of the appliance the part belongs to. Its name works too. The panel shows the id.
part_id (required)Part name or IDtextThe id of the part whose stock to adjust. Its name works too. The panel shows the id.
delta (required)DeltanumberSigned change to apply to the spare quantity, decimals allowed (e.g. -1 to consume a spare, -250 for 250 ml, 2 to restock).

home_keeper.remove_part_file

Remove part file

Detach a part's attached file (receipt/spec sheet/photo), deleting its on-disk blob. Upload/replace a file from the panel. This service handles removal only.

Admin only

FieldLabelSelectorDescription
asset_id (required)Appliance name or IDtextThe id of the appliance the part belongs to. Its name works too. The panel shows the id.
part_id (required)Part name or IDtextThe id of the part whose file to remove. Its name works too. The panel shows the id.

home_keeper.add_asset_document

Add appliance document

Attach a link document (manual/warranty/receipt) to an appliance. Upload files from the panel. This service handles links only.

Admin only

FieldLabelSelectorDescription
asset_id (required)Appliance name or IDtextThe id of the appliance to attach the document to. Its name works too. The panel shows the id.
document (required)DocumentobjectThe document to add is an object with name and url.

home_keeper.remove_asset_document

Remove appliance document

Detach a document from an appliance. An uploaded file's stored copy is deleted from disk too.

Admin only

FieldLabelSelectorDescription
asset_id (required)Appliance name or IDtextThe id of the appliance the document belongs to. Its name works too. The panel shows the id.
document_id (required)Document name or IDtextThe id of the document to remove. Its name works too. The panel shows the id.

home_keeper.update_asset_document

Update appliance document

Edit an existing document on an appliance: rename it, or (for link documents) change its URL. Uploaded file documents can only be renamed.

Admin only

FieldLabelSelectorDescription
asset_id (required)Appliance name or IDtextThe id of the appliance the document belongs to. Its name works too. The panel shows the id.
document_id (required)Document name or IDtextThe id of the document to edit. Its name works too. The panel shows the id.
changes (required)ChangesobjectThe fields to change are an object with an optional name and (for link documents) an optional url.

home_keeper.sign_document_url

Sign document URL

Mint a short-lived URL (no auth header needed) an external caller can fetch the file document's bytes from, e.g. an MCP-connected agent.

Returns a response

FieldLabelSelectorDescription
asset_id (required)Appliance name or IDtextThe id of the appliance the document belongs to. Its name works too. The panel shows the id.
document_id (required)Document name or IDtextThe id of the document to sign a URL for. Its name works too. The panel shows the id.

home_keeper.sign_part_file_url

Sign part file URL

Mint a short-lived URL (no auth header needed) an external caller can fetch a part's attached file bytes from, e.g. an MCP-connected agent.

Returns a response

FieldLabelSelectorDescription
asset_id (required)Appliance name or IDtextThe id of the appliance the part belongs to. Its name works too. The panel shows the id.
part_id (required)Part name or IDtextThe id of the part whose attached file to sign a URL for. Its name works too. The panel shows the id.

home_keeper.export_appliance_report

Export appliance report

Return the appliance report as a response (one row per appliance plus totals), with a ready-to-save CSV under the "csv" key.

Admin only · Returns a response

Takes no fields.

home_keeper.export_data

Export data

Return every task and appliance as one portable document, with the same document as a ready-to-save YAML file under the "yaml" key.

Admin only · Returns a response

FieldLabelSelectorDescription
includeIncludeselect (appliances, tasks)Which sections to export. Both by default.

home_keeper.import_data

Import data

Read a portable document and create or update the tasks and appliances in it. The whole document is checked first, so a document with an error writes nothing.

Admin only · Returns a response

FieldLabelSelectorDescription
document (required)DocumentobjectThe document to read, in the shape export_data returns. Give it as a mapping, or as the whole file in one string.
dry_runPreview onlybooleanCheck the document and report what would change, without writing anything.
matchMatchselect (auto, none)How to find the record a document record refers to. "auto" matches on id, then external_id, then name. "none" creates every record.

home_keeper.set_options

Set options

Update Home Keeper's integration options: the same settings as the panel's Settings tab and the options flow. Only the fields you pass change.

Admin only

FieldLabelSelectorDescription
sync_problem_sensorsSync problem sensors as tasksboolean
one_off_retention_daysOne-off retention (days)number (min 0, max 3650)Auto-delete a completed one-off task this many days after completion. 0 keeps them forever.
shopping_list_entityShopping listentityAn existing to-do list to sync auto-buy reminders onto. Ticking an item off there completes the Home Keeper reminder and restocks the part. Leave empty to turn the sync off.
problem_sensor_exclude_entitiesExcluded sensorsentity (multiple)
problem_sensor_exclude_devicesExcluded devicesdevice (multiple)
problem_sensor_exclude_areasExcluded areasarea (multiple)
problem_sensor_exclude_labelsExcluded labelslabel (multiple)
dismissed_companionsDismissed companionstext (multiple)Glue integration domains to hide from the Settings → Companions "Suggested" list. Dismissing only silences a suggestion. A connected pairing is always shown.

home_keeper.register_companion

Register companion

Announce another integration that works with Home Keeper so it appears in the panel's Settings → Companions section. Home Keeper stores the descriptor verbatim and never imports the companion.

Can return a response

FieldLabelSelectorDescription
domain (required)DomaintextThe companion integration's domain.
name (required)NametextDisplay name shown in the Companions list.
iconIconiconAn mdi icon for the row.
descriptionDescriptiontextOne line describing what the companion does with Home Keeper.
config_entry_idConfig entry idtextThe companion's config entry id, so the panel's "Configure" button can deep-link to its options page.
docs_urlDocs URLtextA link to the companion's documentation.
capabilitiesCapabilitiestext (multiple)Free-form capability tags (e.g. care_schedules, battery_replacement).

home_keeper.list_companions

List companions

Return the merged companion list (self-registered integrations plus detected upstreams whose glue isn't installed yet) as a response.

Returns a response

Takes no fields.

home_keeper.add_declarative_companion

Add declarative companion

Register a declarative companion. The recipe materializes one managed sensor task per entity matched by target integration and entity filters, with Jinja-templated task name and notes. Admin-only.

Admin only · Returns a response

Takes no fields.

home_keeper.update_declarative_companion

Update declarative companion

Update fields of a stored declarative-companion spec by id. Admin-only.

Admin only · Returns a response

FieldLabelSelectorDescription
id (required)Companion idtextThe spec's stable uuid, from list_declarative_companions.

home_keeper.delete_declarative_companion

Delete declarative companion

Remove a declarative-companion spec and every managed task it materialized. Admin-only.

Admin only

FieldLabelSelectorDescription
id (required)Companion idtextThe spec's stable uuid, from list_declarative_companions.

home_keeper.list_declarative_companions

List declarative companions

Return every stored declarative-companion spec as a response.

Returns a response

Takes no fields.

Events

Home Keeper fires a bus event for every observable state change. Names follow home_keeper_<noun>_<verb>. For when each one fires in context — edge triggering, what a restart replays, worked automations — see the events guide.

EventFires whenPayloadAdds
home_keeper_task_createda task is created, from the panel, a service, a contributing integration, or as a wear-part task generated from an appliancetask
home_keeper_task_updateda task actually changestaskchanged_fields
home_keeper_task_deleteda task is removed, directly or because its appliance or part wastask
home_keeper_task_completeda task is completed from any surface: the to-do checkbox, a device button, a tag scan, or complete_tasktaskcompleted_at, origin, note, cost, photo, who, reading
home_keeper_task_uncompleteda completion is undone and next_due is re-derived; undoing a timestamp that isn't in the history changes nothing and fires nothingtaskts, origin
home_keeper_task_completion_updateda recorded completion's detail is edited after the fact; the schedule is untouchedtaskts, meter_baseline
home_keeper_task_triggereda condition-driven or sensor-based task is armed, moving from dormant to due-nowtask
home_keeper_task_snoozeda task's due date is deferred without recording a completion; only next_due moves, the recurrence is untouchedtasksnoozed_until, origin
home_keeper_task_skippeda task is advanced to its next occurrence without recording a completion; the skip itself is logged, and a usage task's meter is resettaskts, origin
home_keeper_task_due_today_seta task's due date is moved to now without recording a completion; only next_due moves, the recurrence is untouched — the mirror of a snoozetaskorigin
home_keeper_task_skip_updateda recorded skip's detail or date is edited after the fact; the schedule is untouchedtaskts, meter_baseline
home_keeper_task_skip_removeda recorded skip is undone; a usage task's meter returns to the baseline the skip replacedtaskts
home_keeper_task_overduea task passes its due date, at most once per due date while HA runstaskdays_overdue
home_keeper_task_due_soona task enters the three-day due-soon window, at most once per due datetaskdue_in_hours
home_keeper_part_low_stocka part's on-hand stock crosses down to its reorder thresholdstock
home_keeper_part_out_of_stocka part's stock reaches zero; this wins over low stock on a single stepstock
home_keeper_part_restockeda part's stock rises back above its reorder thresholdstock
home_keeper_asset_createdan appliance is createdasset
home_keeper_asset_updatedan appliance changes, including its documents, parts and archived historyassetchanged_fields
home_keeper_asset_deletedan appliance is removedasset
home_keeper_asset_archivedan appliance is archived, hiding it without deleting its dataasset
home_keeper_asset_restoredan archived appliance is restoredasset
home_keeper_companion_connecteda companion integration newly becomes connected, by self-registering or by a known glue being detected installedcompanion
home_keeper_companion_suggesteda curated upstream is newly detected installed while its glue isn'tcompanion
home_keeper_declarative_companion_addeda declarative-companion recipe is created; the tasks it materializes fire the ordinary task events on their owndeclarative_companionmatch_count
home_keeper_declarative_companion_updateda declarative-companion recipe changesdeclarative_companionmatch_count
home_keeper_declarative_companion_removeda declarative-companion recipe is deleted, along with every task it materializeddeclarative_companionmatch_count
home_keeper_register_companionsHome Keeper has set up and asks companions to re-announce themselves by calling register_companion; carries no payloadnone

Home Keeper also listens for events it does not own:

EventHome Keeper's reaction
tag_scannedHome Assistant's own tag integration fired a scan; Home Keeper completes the task bound to that tag_id

Payloads

Events sharing a payload shape are interchangeable in one automation template. Per-event additions from the table above merge onto these.

Task payload

Carried by home_keeper_task_created, home_keeper_task_updated, home_keeper_task_deleted, home_keeper_task_completed, home_keeper_task_uncompleted, home_keeper_task_completion_updated, home_keeper_task_triggered, home_keeper_task_snoozed, home_keeper_task_skipped, home_keeper_task_due_today_set, home_keeper_task_skip_updated, home_keeper_task_skip_removed, home_keeper_task_overdue, home_keeper_task_due_soon.

FieldTypeNotes
task_idstr
namestr
device_idstr | Nonethe task's registry device id, or None when it's a standalone task (its entities then live on a self-owned device)
area_idstr | None
recurrence_typestrfloating / fixed / one-off / triggered / sensor / use
next_duestr | NoneISO; None for a dormant triggered/sensor task or a completed one-off
enabledbool
labelslist[str]HA label-registry ids attached to the task (empty when none)
sourcedict | Noneopaque provenance, echoed verbatim
managed_bydict | Nonewell-known ownership block, or None
task_chipslist[dict]integration-provided metadata chips; each has label, optional icon (mdi: name) and optional url (http(s)://)
tag_idstr | Nonethe HA tag whose scan completes the task, or None when none is linked
active_seasonlist[dict] | Nonethe date ranges the task is scheduled in, each a {"start": "MM-DD", "end": "MM-DD"} window, or None when it runs all year

Stock payload

Carried by home_keeper_part_low_stock, home_keeper_part_out_of_stock, home_keeper_part_restocked.

FieldTypeNotes
asset_idstr
asset_namestr
device_idstr | None
part_idstr
part_namestr
part_numberstr
vendorstr
stockfloaton-hand quantity; can be fractional
reorder_atfloatthe low-stock threshold
unitstrwhat the part counts itself in ("ml", "bottles"), or "" for whole spares

Asset payload

Carried by home_keeper_asset_created, home_keeper_asset_updated, home_keeper_asset_deleted, home_keeper_asset_archived, home_keeper_asset_restored.

FieldTypeNotes
asset_idstr
asset_namestr
device_idstr | NoneNone until a virtual appliance's device is provisioned

Companion payload

Carried by home_keeper_companion_connected, home_keeper_companion_suggested.

FieldTypeNotes
domainstr
namestr
statusstrconnected / suggested
config_entry_idstr | Nonethe companion's config entry, for a connected companion
upstream_domainstr | Nonethe detected upstream, for a catalog-suggested glue

Declarative_companion payload

Carried by home_keeper_declarative_companion_added, home_keeper_declarative_companion_updated, home_keeper_declarative_companion_removed.

FieldTypeNotes
spec_idstr
namestr
enabledbool
preset_idstr | Nonethe bundled preset the recipe was seeded from, or None for one written by hand

Device triggers

On a Home Keeper device, Add automation → When offers these by name, so an automation can be built without knowing any event name. They are the same events as above, filtered to that one device.

TriggerShown asEventOffered on
task_completedTask completedhome_keeper_task_completeddevices with tasks
task_overdueTask became overduehome_keeper_task_overduedevices with tasks
task_due_soonTask due soonhome_keeper_task_due_soondevices with tasks
task_createdTask createdhome_keeper_task_createddevices with tasks
task_updatedTask updatedhome_keeper_task_updateddevices with tasks
task_snoozedTask snoozedhome_keeper_task_snoozeddevices with tasks
task_skippedTask skippedhome_keeper_task_skippeddevices with tasks
part_low_stockSpare part low on stockhome_keeper_part_low_stockappliances
part_out_of_stockSpare part out of stockhome_keeper_part_out_of_stockappliances
part_restockedSpare part restockedhome_keeper_part_restockedappliances

Entities

Task and appliance state is readable as ordinary entities, so most automations never need to call an action to find something out. Entity names are templates: Home Assistant fills {task_name} and {part} in from the task or spare part the entity belongs to.

todo

One list entity for the whole integration, named directly.

calendar

One list entity for the whole integration, named directly.

button

Entities: {task_name}Mark done (mark_done).

sensor

Entities: {task_name}Next due (next_due), Tasks (all_tasks), {profile} tasks (profile_tasks).

State attributes:

FieldTypeNotes
task_idstrnext-due sensor
task_namestrnext-due sensor
recurrence_typestr
last_completedstr | NoneISO
completions_countint
last_completion_*str | floatone key per recorded detail on the latest completion: last_completion_note / _cost / _photo / _who / _reading
usage_*float | strmeter progress on a usage sensor task: usage_target, usage_unit, usage_baseline, usage_consumed, usage_remaining, usage_percent, plus backstop_due; and the usage between past completions as usage_last_interval, usage_avg_interval, usage_min_interval and usage_max_interval, once two completions carry a reading; absent on every other task
totalintcount sensors; every active scheduled task the profile scopes to, whatever its status tier
overdueintcount sensors
due_soonintcount sensors; due within the three-day window and not yet overdue, so a due-soon profile's state is overdue + due_soon
due_todayintcount sensors; next_due falls on today's local calendar date
next_duestr | Nonecount sensors; ISO, the earliest task in the profile's scope
next_task_namestr | Nonecount sensors
next_task_idstr | Nonecount sensors
most_overdue_daysfloat | Nonecount sensors; days past due for the most overdue task, to one decimal place; absent value when nothing is overdue

binary_sensor

Entities: {task_name}Overdue (overdue), {part} low stock (part_low_stock).

State attributes:

FieldTypeNotes
task_idstroverdue sensor
due_soonbooloverdue sensor; within the three-day window
next_duestr | Noneoverdue sensor; ISO
asset_idstrpart low-stock sensor
part_idstrpart low-stock sensor
stockfloatpart low-stock sensor
reorder_atfloatpart low-stock sensor
unitstrpart low-stock sensor

number

Entities: {part} spares (part_spares).

Config entry options

Readable and writable through the set_options action. The ones marked Configure dialog also appear on the integration's options form; the rest are edited in the Home Keeper panel.

OptionLabelWhereNotes
sync_problem_sensorsSync problem sensors as tasksConfigure dialogA synced task clears only when the source integration resolves the problem, not when you tap Done. Reminders for one offer Snooze in place of Mark done.
allow_snoozePanel
allow_skipPanel
allow_due_todayPanel
one_off_retention_daysOne-off retention (days)Configure dialogAuto-delete a completed one-off task this many days after it is completed. 0 keeps completed one-offs forever.
shopping_list_entityShopping listConfigure dialogSync auto-buy reminders onto this to-do list. Ticking an item off there completes the Home Keeper reminder and restocks the part. Leave empty to turn the sync off.
profilesPanel
notificationsPanel
problem_sensor_exclude_entitiesExcluded sensorsConfigure dialog
problem_sensor_exclude_devicesExcluded devicesConfigure dialog
problem_sensor_exclude_areasExcluded areasConfigure dialog
problem_sensor_exclude_labelsExcluded labelsConfigure dialog
dismissed_companionsPanel

Errors

A rejected action raises a localized Home Assistant error. The key is stable; the message shown is in the user's language.

KeyEnglish message
asset_ambiguousSeveral appliances are named {name}. Use an id instead: {ids}
asset_not_foundAsset not found: {asset_id}
complete_failed{error}
declarative_companion_not_foundDeclarative companion not found: {spec_id}
document_ambiguousSeveral documents are named {name}. Use an id instead: {ids}
expected_multipart_uploadExpected a multipart upload.
failed_to_store_fileFailed to store the file.
file_too_largeFile exceeds the {mb} MB limit.
integration_not_loadedHome Keeper isn't loaded right now. Please try again in a moment.
invalid_asset{error}
invalid_completed_atInvalid completed_at timestamp.
invalid_declarative_companion{error}
invalid_task{error}
link_documents_onlyOnly link documents can be added here.
no_file_in_uploadNo file part in upload.
no_instance_urlCould not determine a URL for this Home Assistant instance to build a signed document/part-file URL. Configure an internal or external URL under Settings > System > Network.
notify_invalid_targetNotify target(s) {target} are not supported. Home Keeper sends actionable notifications through the companion app, so each target must be a {prefix}* notify service (or {persistent}).
notify_no_targetsThis notification has no target to send to. Add a "Send to" device in Settings → Notifications, or pass target: when calling the service.
notify_notification_not_foundNo notification named {notification}.
notify_profile_not_foundNo notification profile named {profile}.
part_ambiguousSeveral parts are named {name}. Use an id instead: {ids}
profile_in_useHome Keeper cannot delete these profiles: {profiles}. These notifications use them: {notifications}. Change or delete each notification, and then save again.
task_ambiguousSeveral tasks are named {name}. Use an id instead: {ids}
task_not_foundTask not found: {task_id}
unknown_areaUnknown area: {area_id}
unknown_documentUnknown document: {document_id}
unknown_partUnknown appliance or part: {asset_id} / {part_id}
unknown_part_fileUnknown part or no attached file.
upload_requires_userUploads must come from a signed-in user. This request was authenticated by a shared link, which can only read files.