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 hassonic agent. It can’t reach main or any other agent.
  • It requests the operator.read, operator.write and operator.approvals scopes. OpenClaw passes the connection’s scopes on to each agent run, and OpenClaw’s plugin-approval calls need operator.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:

  1. Allowlist. Only listed domains and services can be called: lights, switches, fans, media players, remotes (including the Xfinity remote’s tune and send_text), scenes, climate, covers, input helpers and three named TV scripts. Calls without an entity_id, aimed at all, targeting an entity from another domain, or widening the target with area_id, device_id, floor_id, label_id or target are blocked.
  2. 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.
  3. 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.