Install
$ agentstack add skill-markusleben-ha-nova-entity-discovery ✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ✓ Network access No
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
Verified badge
Passed review? Show it. Paste this badge into your README, it links to the public security report.
Reliability & compatibility
Declared compatibility
Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.
We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.
How agent discovery & health will work →About
HA NOVA Entity Discovery
Scope
Use for:
- listing entities by domain
- searching entities by user phrase
- bulk inventory by
prefix,domain,area, orlabel - resolving likely targets before writes
Read-only behavior.
- No
POST,PUT,PATCH, orDELETErelay writes. - If the user moves from discovery to mutation, stop after resolution and hand off to the write-capable skill.
Bootstrap (once per session)
Verify relay CLI: ha-nova relay health If this fails: ha-nova setup
Relay Contract
Use file-based relay requests by default:
ha-nova relay ws --data-fileha-nova relay core --method --path --body-filewhen a body is needed--jq-filefor non-trivial filters; keep inline--jqfor short selectors only--outfor large reads- On Windows PowerShell, never chain commands with
&&or||; run separate shell commands instead. - Never call external
jq; use relay-native filters orha-nova relay jq --file ....
Flow
Step 1: Search entity registry
Entity registry uses compact abbreviated keys: ei=entityid, en=name, ai=areaid.
Search both entity_id and name. Use short keyword stems to handle spelling variants. Always limit to 20 results.
For bulk selectors, follow skills/ha-nova/bulk-patterns.md.
prefix: case-insensitive prefix match on the entity_id suffix and display namedomain: exact domain filterarea: resolve the area, then usesearch/relatedas the primary shortlist source; useaionly as optional extra evidence when presentlabel: escalate to the full registry only when label evidence is required;config/entity_registry/listreturns the entity array directly in.datahelper+area: not a first-class bulk selector contract; do not imply room-owned helper discovery unless live helper-area semantics are explicitly defined
For domain counts or domain shortlists:
- count only the requested domain unless the user explicitly asks for heuristics or related domains
- use
--jq-filefor the count filter - if you need a follow-up count from a saved file, use
ha-nova relay jq --file length
Create ` with {"type":"config/entityregistry/listfor_display"}`, then run:
ha-nova relay ws --data-file --jq-file
Write `` with:
[.data.entities[] | select((.ei + " " + (.en // "")) | test("KEYWORD";"i")) | {entity_id: .ei, name: .en, area_id: .ai}] | .[0:20]
This generic test("KEYWORD";"i") example is for free-text search, not explicit prefix matching. For an explicit prefix selector, match the suffix and display name with startswith(...), not loose substring search.
If 0 results: try synonyms, alternative terms, or shorter keyword stems. Use OR for multiple variants: test("kw1|kw2|kw3";"i"). If too many: narrow with AND: test("kw1";"i") and test("kw2";"i"). Never dump entire domains without a user-intent keyword.
When the task is multi-target inventory:
- save the shortlist with
--out - do not trim to 20 inside the initial selector filter
- dedupe first, then sort deterministically, then compute the exact matched count, then apply the 20-row display cap
- keep ordering deterministic: domain, then entity_id
- return the exact matched count separately from the displayed rows
Step 2: Get state or config
# State
ha-nova relay core --method GET --path /api/states/{entity_id}
# Automation/script config — always resolve unique_id first (see relay-api.md → ID Types)
ha-nova relay ws --data-file --out
ha-nova relay jq -r --file '.data.unique_id'
ha-nova relay core --method GET --path /api/config/automation/config/{unique_id} --jq-file --out
# For scripts: use script.{slug} and /api/config/script/config/{unique_id}
Write `` with:
if .ok then .data.body else error("relay error: \(.error.message // "unknown")") end
Step 3: Find automations related to a device or area
Automations rarely have reliable direct area_id data in the compact registry. When user asks "automations for X in room Y":
- Resolve room name to area_id:
ha-nova relay ws --data-file then filter by name with --jq
- Query the area directly:
{"type":"search/related","item_type":"area","item_id":""}
- Treat the response as a keyed object, not an array:
- automation discovery uses
.data.automation - script discovery uses
.data.script - entity discovery uses
.data.entity
- If automation/script keys are absent and only area entities are present, use
search/relatedon those entities to derive the automation/script shortlist:
``text ha-nova relay ws --data-file ``
This is more reliable than keyword search or assuming .ai is populated for room-based queries.
Step 4: Return shortlist
entity_id,friendly_name,state(if fetched), short relevance reason- for bulk inventory: filter used, matched count, displayed rows
- do not fetch full YAML for every matched item in one response
IMPORTANT: Never dump raw get_states — it returns thousands of entities with full attributes.
Matching Rules
- area-first bulk discovery by room/area uses
search/relatedon the resolved area before keyword heuristics - exact
entity_idmatch wins - keyword match on entity_id + name second
If ambiguity remains: present top candidates (max 10), ask one selection question.
Safety
- Read-only — this skill never modifies Home Assistant state or config.
- No
POST,PUT,PATCH, orDELETErelay writes. - All communication with Home Assistant goes through
ha-nova relayexclusively.
Guardrails
- never guess entity IDs
- cap displayed shortlist rows at 20 only after exact matched-count computation for bulk inventory
- no writes
- no proactive doctor before real failure
Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: markusleben
- Source: markusleben/ha-nova
- License: MIT
- Homepage: https://github.com/markusleben/ha-nova
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet, be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.