Managing Home Assistant
You install, update, and uninstall Home Assistant from the OpenHome dashboard with three operations. The buttons you see depend on the current state: before anything is installed you’ll see only Install, and once Home Assistant is installed that’s replaced by Update and Uninstall. Operations run in the background so the dashboard stays responsive, and the button you click is disabled while its operation is in progress.Install
Update
Uninstall
Installing
Installation is hands-off: it creates a user, detects your location automatically, sets your timezone, currency, and unit system, and wires up the connection to OpenHome, all without any prompts.| Scenario | Time |
|---|---|
| First-time install | 8 – 10 minutes |
| Reinstall (installing again after an uninstall) | ~3 minutes |
Updating
When you run an update, OpenHome checks for the newest version of Home Assistant that’s compatible with your device:- A newer version is available → it updates to it and reports success once done.
- You’re already on the latest version → it reports that you’re up to date and makes no changes.
Uninstalling
Uninstall removes Home Assistant and everything it set up, including the app, its configuration, and its saved settings, and leaves the rest of your device untouched. Afterward the Install button reappears, and reinstalling is faster than the first time because the packages it needs are already on the device.Accessing Home Assistant
After installation, the Home Assistant dashboard is available on your network athttp://<devkit-ip>:8123, where <devkit-ip> is your device’s IP address.
You can find your device’s IP in the DevKit section under MQTT, shown as Device IP. For example, if your Device IP is 192.168.18.106, open http://192.168.18.106:8123 in your browser.
Sign in with the default credentials:
| Field | Value |
|---|---|
| Username | openhome_devkit_user |
| Password | admin123 |
Adding integrations
Once you’re signed in to the Home Assistant dashboard, you can add any integration Home Assistant supports, such as lights, sensors, media players, thermostats, and thousands more. Go to Settings → Devices & Services → Add Integration, search for what you want to connect, and follow the prompts. Anything you add is managed entirely within Home Assistant.Control your devices by voice
You’re not limited to the Home Assistant dashboard. Once a device is connected to Home Assistant, you can build an OpenHome Ability that integrates that device and lets you control it by voice through your agent.Connect your device in Home Assistant
Build a Local Ability for that device
- “Turn off the living room lights.”
- “Set the thermostat to 70 degrees.”
- “Is the front door locked?”
Example: voice-control Tasmota lights
This walkthrough builds a working voice integration end to end: a Local Ability that controls Tasmota smart lights through the Home Assistant instance on your device. Once it’s set up you can say “turn on the kitchen light”, “make it warm”, or “set it to red” and your agent does the rest. It comes in two files, which is the standard Local Ability split:| File | Runs on | Responsibility |
|---|---|---|
main.py | Standard Ability runtime | Listens to the user, turns speech into an intent with the LLM, and calls the DevKit side. |
devkit_functions.py | OpenHome DevKit | Talks to Home Assistant’s REST API on the device and performs the actual light action. |
What you’ll need
- Home Assistant installed on your DevKit (covered in the sections above). The MQTT integration is set up automatically during install.
- One or more Tasmota smart bulbs or strips on the same network as your DevKit.
- The OpenHome Live Editor to create the Ability under the Local category.
Step 1: Connecting to Home Assistant (automatic)
You don’t set up authentication yourself. When you install Home Assistant through OpenHome, the credentials your Ability needs are provisioned on the device, and the DevKit side authenticates on its own. There’s no file to create, no token to paste, and nothing to configure. For this Tasmota example, it just works.Reuse the connection in your own Ability
Building a different Ability that talks to Home Assistant? Reuse OpenHome’s connection logic directly. Drop this into yourdevkit_functions.py and call _ensure_auth() before any Home Assistant request. It finds the saved credentials, exchanges them for a short-lived access token at Home Assistant’s /auth/token endpoint, and caches the token until just before it expires:
_ensure_auth() first, so the access token is fetched and refreshed for you automatically. If a token expires mid-session, the next call refreshes it. (See _ha_request() in the full devkit_functions.py below for how each call uses it.)
Where the credentials live (reference)
You normally never touch this, but for advanced or custom setups it helps to know how the connection is stored._ensure_auth() reads a small file containing:
| Key | Value |
|---|---|
HA_URL | The Home Assistant address as seen from the DevKit. Because Home Assistant runs on the same device, http://localhost:8123 works. |
HA_REFRESH_TOKEN | A refresh token issued by Home Assistant for user (openhome_devkit_user, created during install). |
HA_CLIENT_ID | The OAuth client id the token was issued for. Defaults to HA_URL + / if you leave it out. |
- The path in the
OPENHOME_HA_AUTH_PATHenvironment variable ~/.ha_refresh_token/home/openhome/.ha_refresh_token
OPENHOME_HA_AUTH_PATH at your own file.Step 2: Connect your Tasmota device to Home Assistant
Now pair the physical light with Home Assistant. Tasmota talks to the same MQTT broker your DevKit’s Home Assistant already uses, so once it connects, Home Assistant discovers it on its own.Find your Tasmota device's IP
tasmota-XXXXX.local in a browser.Open the Tasmota web UI → Configuration → Configure MQTT
| Field | Value |
|---|---|
| Host | Your DevKit’s IP (for example 192.168.18.106) |
| Port | 1883 |
| User | openhome_devkit_user |
| Password | admin123 |
| Topic | leave default |
| Full Topic | leave default (%prefix%/%topic%/) |
Home Assistant auto-discovers it
light.* entity, which is exactly what the Ability controls.Step 3: Build the Ability
In the OpenHome Live Editor, create a new Ability and select the Local category (Local Abilities are the only type that can reach Home Assistant on the device; see Local Abilities). Give it trigger words so users can launch it by voice, such as “smart home” or “lights”. A Local Ability is two files. This example needs no third-party packages, sorequirements.txt can stay empty, since everything uses the Python standard library.
main.py: voice and intent
main.py runs in the standard Ability runtime. It greets the user, runs a conversation loop, and uses the LLM to convert each spoken request into a structured intent (which integration, which action, which device). It then hands that intent to the DevKit side and speaks a short confirmation.
devkit_functions.py: Home Assistant on the device
devkit_functions.py runs on the DevKit. It authenticates with the credentials file from Step 1, finds the matching Tasmota light entity, and calls Home Assistant’s light services to perform the action. ha_startup is a lightweight ping that also reports which integrations and how many entities are available.
Step 4: Talk to it
Launch the Ability with one of your trigger words, then speak naturally. The conversation loop keeps listening until you say you’re done.- “Turn on the kitchen light.”
- “Make it warm.” (reuses the last light you mentioned)
- “Set the lamp to red.”
- “Dim the bedroom to twenty percent.”
- “That’s all, thanks.” (ends the session)
Extending it
This template is built around an integration registry. To support more than Tasmota lights, add another entry toINTEGRATION_REGISTRY in main.py (a context function describing its actions, and an execute function that maps an intent to a DevKit call) and a matching handler in FUNCTION_REGISTRY in devkit_functions.py. The voice loop, prompt builder, and dispatch logic stay the same.
Edge cases
Home Assistant can't be reached
Home Assistant can't be reached
No lights are found
No lights are found
Only Tasmota lights are controlled
Only Tasmota lights are controlled
You have more than one light
You have more than one light
A light is powered off at the wall
A light is powered off at the wall
It can't tell you whether a light is already on or off
It can't tell you whether a light is already on or off
It didn't catch what you said
It didn't catch what you said
See also
- Local Abilities: full reference for the
main.py+devkit_functions.pysplit - Local Ability quickstart: get a Local Ability running fast
- Voice-First Best Practices: the UX rules behind the spoken responses
Edge cases
The connection to OpenHome can't be reached during setup
The connection to OpenHome can't be reached during setup
Your location can't be detected automatically
Your location can't be detected automatically
Home Assistant takes a while to start the first time
Home Assistant takes a while to start the first time
A first-time install takes several minutes
A first-time install takes several minutes
An update can't be prepared safely
An update can't be prepared safely
The update check can't reach the internet
The update check can't reach the internet
Home Assistant is running when you uninstall
Home Assistant is running when you uninstall

