Hassonic
Hassonic is a native iOS app for Home Assistant. Its assistant feature sends spoken or typed requests (“put the Seahawks game on”, “turn off the family room lights”) to Octo, which carries them out through Home Assistant.
This page covers only the OpenClaw side: how the app connects, the agent it talks to, and the checks every action passes. For the app itself, see the Hassonic-iOS repo on GitHub.
How it connects
- The app connects to the OpenClaw Gateway as a paired device over the Gateway WebSocket, through Tailscale Funnel (see External Integrations).
- It talks only to the dedicated
hassonicagent. It can’t reachmainor any other agent. - It requests the
operator.read,operator.writeandoperator.approvalsscopes. OpenClaw passes the connection’s scopes on to each agent run, and OpenClaw’s plugin-approval calls needoperator.approvals.
The hassonic agent
The agent has a deliberately small tool surface:
| Tool | Purpose |
|---|---|
hass_state_get, hass_state_list | Read Home Assistant state |
hass_service_call | Call an allowlisted Home Assistant action |
web_search, web_fetch | Look things up, e.g. which channel a game is on |
skill_workshop | Propose changes to its own skills for review |
It can’t send messages, read files, run commands or change automations. See Agents & Channels for how it compares to the other agents. The Octo MCP’s external agent uses the same Home Assistant tools under the same guard.
Safety checks
Every Home Assistant action goes through the Hass Guard plugin before it runs:
- Allowlist. Only listed domains and services can be called: lights, switches, fans, media players, remotes (including the Xfinity remote’s
tuneandsend_text), scenes, climate, covers, input helpers and three named TV scripts. Calls without anentity_id, aimed atall, targeting an entity from another domain, or widening the target witharea_id,device_id,floor_id,label_idortargetare blocked. - Safety rating. Plain light and switch on/off runs without one. Every other allowed call is rated by the agent’s decision model (Jev, from TypeSafe AI; see Decision Models) on one question: “routine and safe to do without asking?”. At 85% or higher, the call runs.
- Blocked with a reason. Below 85%, or when the check is unavailable, the call is not run. The agent is told why and passes the explanation back to the app.