From ha-nova
Creates, updates, deletes, or lists Home Assistant helpers (storage-based and config-entry families) through HA NOVA Relay.
How this skill is triggered — by the user, by Claude, or both
Slash command
/ha-nova:helperThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
`ha-nova:helper` has two helper families:
ha-nova:helper has two helper families:
input_boolean, input_number, input_text, input_select, input_datetime, input_button, counter, timer, scheduleutility_meter, derivative, integration, min_max, threshold, tod, statistics, history_statsgroup through the live menu-driven flow; end-to-end support is verified for the sensor subtype, and other subtypes must stay anchored to the live step schema instead of guessed fieldsNot handled here:
template, trend, random, filter, generic_thermostat, switch_as_x, generic_hygrostatha-nova:write)Verify relay CLI: ha-nova relay health
If this fails: ha-nova setup
Write payloads with the client's native file-writing tool, then use:
ha-nova relay ws --data-file <payload-file>ha-nova relay core --method <METHOD> --path <PATH> --body-file <payload-file>ha-nova relay ... --out <result-file> for larger read/verify output--jq-file <filter-file> for non-trivial filters; keep inline --jq for short selectors onlyFamily-specific transport:
config_entries/get + WS entity-registry joins for list/read; relay /core config-entry flow, options-flow, and delete writesUse the compact entity registry (abbreviated keys: ei = entity_id, en = name, ai = area_id).
Create <payload-file> with {"type":"config/entity_registry/list_for_display"}, then run:
ha-nova relay ws --data-file <payload-file> --jq-file <filter-file>
Write <filter-file> with:
[.data.entities[] | (.ei | split(".")[0]) as $domain | select(["input_boolean","input_number","input_text","input_select","input_datetime","input_button","counter","timer","schedule"] | index($domain)) | {entity_id: .ei, name: .en, area_id: .ai}] | .[0:30]
If user filters by type, narrow the domain filter to that single storage-based domain.
ha-nova relay ws --data-file <payload-file> --jq-file <filter-file>
Write <filter-file> with:
[.data.entities[] | (.ei | split(".")[0]) as $domain | select(["input_boolean","input_number","input_text","input_select","input_datetime","input_button","counter","timer","schedule"] | index($domain)) | select((.ei + " " + (.en // "")) | test("KEYWORD";"i")) | {entity_id: .ei, name: .en, area_id: .ai}] | .[0:20]
If 0 results: try synonyms or shorter stems. Never dump entire domains.
ha-nova relay ws --data-file <payload-file> --jq-file <filter-file>
Write <filter-file> with:
[.data[] | select(.name | test("KEYWORD";"i"))]
{type}/list + filter.skills/ha-nova/helper-schemas.md for required/optional fields.skills/ha-nova/helper-schemas.md → Suggested Defaults for principles and field name reminders.Suggested defaults for "{name}" ({type}):
1. min: 16, max: 30, step: 0.5
2. unit_of_measurement: "°C"
3. mode: slider
4. icon: mdi:thermometer
Accept all, pick by number (e.g. "1 and 3"), or "skip".
group subtypes, this first confirmation authorizes only the non-persisting menu-step submit, not the final subtype-specific payloadha-nova relay ws --data-file <payload-file>
{type}/list by name or internal id.id from the list response (this is the {type}_id for the update command).## Changes diff (see skills/ha-nova/write-safety.md → Pre-Write Diff). Then run a pre-write impact check — search/related on this helper entity (see skills/review/SKILL.md Step 2) — and surface affected automations/scripts as an advisory. Advisory only; never block.ha-nova relay ws --data-file <payload-file>
revert — see skills/ha-nova/write-safety.md → Update-Revert. Storage-family restore rebuilds a schema-valid {type}/update from before_config (typed {type}_id from its id + writable fields only — never the raw list item, which lacks {type}_id and carries read-only id/entity_id); expected_after is the post-update read-back.{type}/list; extract its id (the {type}_id used for the delete call — internal, not shown to the user).skills/ha-nova/write-safety.md → Output hygiene — no raw internal id):
confirm:<token> (strict: only exact token accepted; see context skill → Safety Baseline).ha-nova relay ws --data-file <payload-file>
{type}/list.Canonical config-entry helper item:
entry_iddomaintitlestatelinked_entities[]supports_optionsentry_id is the canonical identity for config-entry helper writes.
If the user gives only a linked entity_id, resolve it back to config_entry_id through the full entity registry before continuing.
utility_meterderivativeintegrationmin_maxthresholdtodstatisticsgrouphistory_statsha-nova relay ws --data-file <payload-file> --out <entries-file>
with {"type":"config_entries/get"}.ha-nova relay ws --data-file <payload-file> --out <registry-file>
with {"type":"config/entity_registry/list"}.config_entry_id.entry_idsupports_optionsSearch against:
titledomainentity_idIf multiple matches remain, present max 5 candidates and ask one blocking question.
entry_identity_idconfig_entries/get.linked_entities[].supports_options: true, start an options flow:
ha-nova relay core --method POST --path /api/config/config_entries/options/flow --body-file <start-payload-file>
with <start-payload-file> containing {"handler":"<entry_id>","show_advanced_options":false}.step_iddescription.suggested_value when presentdescription.suggested_value, mark its value as unavailable instead of guessing**Helper: {title}** (config-entry `{domain}`)
- **Entry ID:** {entry_id}
- **Config-entry state:** {state}
- **Linked entities:** {linked_entities summary}
- **Supports options-flow editing:** {yes/no}
- **Current flow step:** {step_id or "metadata-only fallback"}
- **Current editable fields:** {field summary from the current options step when available}
skills/ha-nova/helper-flow-schemas.md.
skills/ha-nova/helper-flow-schemas.md:
group with subtype sensor, include the required next_step_id menu choice and the observed final formgroup subtype, plan only the menu choice before the flow starts; inspect the live subtype form before promising the final field setstatistics and history_stats, prepare every later step body before previewgroup subtypes, say that the final subtype form will be previewed after the menu step returns live fieldsha-nova relay ws --data-file <entries-request-file> --out <entries-before-file>
with <entries-request-file> containing {"type":"config_entries/get"}.ha-nova relay core --method POST --path /api/config/config_entries/flow --body-file <start-payload-file>
<start-payload-file> must contain the handler-start body only.flow_id before continuing.
flow_idnext_step_idgroup subtype form, stop and preview the live subtype fields before the terminal submitconfig_entries/get into <entries-after-file>entry_id, passed=true only when that same entry_id is present in <entries-after-file>entry_id, diff config_entries/get before vs after by entry_identry_id values that were absent before and present afterpassed=true only when exactly one new entry_id appeared and its metadata is consistent with the requested createentry_id values, or the new entry metadata is inconsistent with the request, fail loud as ambiguous create verificationdomain/title are fallback tie-breakers only; they never override a terminal-flow entry_idlinked_entities[] through the entity registry as secondary evidence only.supports_options: true, reopen the options flow and store the current editable options snapshot for the post-write response.entry_iddomaintitlelinked_entities[]supports_optionssupports_options is false for this entry:
update unsupported for this helper on this HA versionha-nova relay core --method POST --path /api/config/config_entries/options/flow --body-file <start-payload-file>
with <start-payload-file> containing {"handler":"<entry_id>","show_advanced_options":false}.flow_id before continuing.
update unsupported for this helper on this HA versionflow_iddescription.suggested_value as the current value sourcedescription.suggested_value, fail loud instead of guessing its current valuehistory_stats, preserve HA's two-key window invariant across start, end, and durationhistory_stats, if the requested change switches to a different valid window pair, drop the old third key explicitly so the submit body still contains exactly two of start, end, and duration## Changes diff (see skills/ha-nova/write-safety.md → Pre-Write Diff).ha-nova relay core --method POST --path /api/config/config_entries/options/flow/{flow_id} --body-file <submit-payload-file>
create_entry or explicit failure.config_entries/getpassed=true only when the same entry_id still existspassed=true only when the changed fields now appear in description.suggested_value as requesteddescription.suggested_value, fail loud as unverifiable update on this HA versionlinked_entities[] again as secondary evidence only.entry_iddomaintitlelinked_entities[] when availableutility_meter, derivative, integration, min_max, threshold, tod, statistics, group, history_statsdomain is outside that allowlist, stopDELETE /api/config/config_entries/entry/{entry_id} for out-of-scope domainsha-nova:fallback for any other config-entry domainentry_idsearch/related against up to 3 linked entities before confirmationconfirm:<token> (strict exact-token rule).ha-nova relay core --method DELETE --path /api/config/config_entries/entry/{entry_id}
config_entries/getpassed=true only when the entry_id is absentDo NOT report results to user until complete.
skills/review/SKILL.md Step 1.skills/review/checks.md.search/related for the helper entity, max 3 related automations/scripts.Do not pretend H-01..H-10 apply here. Instead, run the minimal config-entry post-write contract:
entry_id/diff verification passedentry_id still exists and the reopened options-flow snapshot reflects the requested field changessearch/related against up to 3 linked entitiesReport only what has substance (same rule as the write flow — see skills/write/SKILL.md Phase 4): keep Verification (and the editable snapshot when present), but omit an empty Collision check or Advisory — never an empty "none" bucket. When the write is clean, the verification plus a single localized confirmation line suffices.
After reading a helper config, present:
**Helper: {name}** ({type})
- **Entity ID:** {entity_id}
- **Unique ID:** {id}
- **Icon:** {icon}
- {type-specific fields}
For list operations, use:
| Entity ID | Name | Type | Area |
|-----------|------|------|------|
After reading a helper config, present:
**Helper: {title}** (config-entry `{domain}`)
- **Entry ID:** {entry_id}
- **Config-entry state:** {state}
- **Linked entities:** {linked_entities}
- **Supports options-flow editing:** {yes/no}
- **Current flow step:** {step_id or "metadata-only fallback"}
- **Current editable fields:** {field summary from the current options step when available}
For list operations, use:
| Title | Domain | Entry ID | State | Supports Options-Flow Editing | Linked Entities |
|-------|--------|----------|-------|--------------------------------|-----------------|
Never show raw JSON to the user.
entry_id is the canonical write identity for the config-entry familyha-nova relay only## Post-Write Reviewget_statesskills/ha-nova/relay-api.mdskills/ha-nova/helper-schemas.mdskills/ha-nova/helper-flow-schemas.mdskills/review/SKILL.md (entrypoint) + skills/review/checks.md (storage helper catalog)npx claudepluginhub markusleben/ha-nova --plugin ha-novaOperates Home Assistant through HA NOVA relay with local OS-backed auth. Handles setup verification, self-update checks, and build self-reports.
Provides best practices for Home Assistant automations, helpers, scripts, and dashboards. Guides on avoiding templates, using native constructs, and safe refactoring.
Develops custom Home Assistant integrations including config flows, entities, platforms, manifest.json, and device registry. Prevents common errors in coordinators, async setup, and entity registration.