From ha-nova
Lists and reads Home Assistant automation and script configs via HA NOVA Relay. Use for entity registry lookups, keyword searches, and single-config reads.
How this skill is triggered — by the user, by Claude, or both
Slash command
/ha-nova:readThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Read only:
Read only:
automation.listautomation.readscript.listscript.readautomation.tracescript.traceNot for helpers — use ha-nova:helper for helper list/read.
Multi-target scope is inventory-only:
skills/ha-nova/bulk-patterns.md for prefix / domain / area / labelNo writes.
POST, PUT, PATCH, or DELETE relay requests.ha-nova:write with resolved IDs and current config.Verify relay CLI: ha-nova relay health
If this fails: ha-nova setup
Use file-based relay requests:
perl -0pi, sed -i, or similar rewrites.ha-nova relay ws --data-file <payload-file>.ha-nova relay core --method <METHOD> --path <PATH> --body-file <payload-file> when a body is needed.--jq-file <filter-file> for non-trivial filters and --out <result-file> for large responses.Use 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 one of:
[.data.entities[] | select(.ei | startswith("automation.")) | {entity_id: .ei, name: .en, area_id: .ai}] | .[0:30]
[.data.entities[] | select(.ei | startswith("script.")) | {entity_id: .ei, name: .en, area_id: .ai}] | .[0:30]
For bulk inventory by prefix, domain, area, or label, reuse skills/ha-nova/bulk-patterns.md and return the compact table only. For area scope, use the search/related area projection rules, not compact-registry ai.
Use short keyword stems and always limit results.
ha-nova relay ws --data-file <payload-file> --jq-file <filter-file>
Write <filter-file> with:
[.data.entities[] | select(.ei | startswith("automation.")) | select((.ei + " " + (.en // "")) | test("KEYWORD";"i")) | {entity_id: .ei, name: .en, area_id: .ai}] | .[0:20]
If 0 results: try synonyms or shorter stems: test("kw1|kw2";"i").
For "automations in room X": stay inside read and follow the area-first search/related flow from skills/ha-nova/bulk-patterns.md.
Resolve the config key via entity registry first; UI-created items often use numeric unique_id values.
unique_id:
<payload-file> with {"type":"config/entity_registry/get","entity_id":"automation.{slug}"}ha-nova relay ws --data-file <payload-file> --out <registry-file>ha-nova relay jq -r --file <registry-file> '.data.unique_id' (POSIX example; on Windows/PowerShell pass the same filter with native argument quoting)entity_id value directly into <payload-file>; do not use placeholder tokens such as REPLACE_ENTITY_IDscript.{slug}<result-file>:
ha-nova relay core --method GET --path /api/config/automation/config/{unique_id} --jq-file <filter-file> --out <result-file>/api/config/script/config/{unique_id}skills/ha-nova/config-body-filter.jq to <filter-file><filter-file> with:
if .ok then .data.body else error("relay error: \(.error.message // "unknown")") end
<filter-file> with the canonical line before the first config read; do not create alternate config-filter filenamesha-nova relay jq --file <result-file> -e --jq-file <filter-file>type == "object"ha-nova relay jq --file <result-file> with length or --jq-file <filter-file>.Read the saved file with the native file-reading tool. Do not analyze configs from shell output.
Find automations/scripts that use a specific entity:
Create <payload-file> with:
{"type":"search/related","item_type":"entity","item_id":"{entity_id}"}
Then run:
ha-nova relay ws --data-file <payload-file>
If id is ambiguous, ask one clarifying question. Never use raw get_states.
After reading a config, present:
**{Automation|Script}: {alias}**
- **ID:** {id}
- **Entities:** {list all entity_ids used in triggers, conditions, and actions}
- **Triggers:** {short description of each trigger}
- **Conditions:** {short description or "none"}
- **Actions:** {short description of each action, grouped by trigger if applicable}
- **Mode:** {single|restart|queued|parallel}
Then show the full YAML config:
alias: ...
triggers: ...
actions: ...
For list operations, use a compact table:
| Entity ID | Name | Area |
|-----------|------|------|
Never show raw JSON to the user.
For trace queries:
unique_id (config key). item_id requires the unique_id, NOT the entity_id slug.
Create <payload-file> with the config/entity_registry/get request, then run:
ha-nova relay ws --data-file <payload-file> --out <registry-file>
ha-nova relay jq -r --file <registry-file> '.data.unique_id'
The jq filter quoting above is a POSIX example. On Windows/PowerShell pass the same filter with native argument quoting.unique_id:
Create <payload-file> with:
{"type":"trace/list","domain":"automation","item_id":"{unique_id}"}
ha-nova relay ws --data-file <payload-file>
For scripts: "domain":"script".trace/get to <result-file>:
Create <payload-file> with:
{"type":"trace/get","domain":"automation","item_id":"{unique_id}","run_id":"{run_id}"}
ha-nova relay ws --data-file <payload-file> --out <result-file>
ha-nova relay jq --file <result-file> empty
Read the file with your native file-reading tool.last_changed via /api/states/{entity_id}.item_id in trace data matches the target's unique_id. see skills/ha-nova/SKILL.md → Claim-Evidence Binding./health preflightnpx claudepluginhub markusleben/ha-nova --plugin ha-novaCreates and manages Home Assistant automations including rules, triggers, conditions, actions, scripts, scenes, and blueprints. Covers device triggers and conditional logic.
Operates Home Assistant through HA NOVA relay with local OS-backed auth. Handles setup verification, self-update checks, and build self-reports.
Provides YAML patterns, triggers (state, time, sun, numeric, template, event, device, webhook, MQTT), conditions, actions, and best practices for Home Assistant automations. Useful for creating or editing YAML configs.