Unofficial Home Assistant integration for ULTRALOQ / U-tec smart locks through the Xthings Home cloud.
This is not local LAN control. Wi-Fi Bolts do not expose a lock/unlock TCP API on your network. Status is polled from Xthings cloud. Lock and unlock use U-tec’s documented OpenAPI.
Not affiliated with U-tec, ULTRALOQ, or Xthings. Use at your own risk.
| Entity | What it does |
|---|---|
lock.<name> |
Lock and unlock over the lock’s Wi-Fi (OpenAPI) |
sensor.<name>_battery |
Cloud battery: Depleted / Replace / Low / Medium / High |
sensor.<name>_wi_fi_rssi |
Signal in dBm |
binary_sensor.<name>_wi_fi_remote |
Whether Wi-Fi remote is enabled in the Xthings app |
After a lock/unlock command the UI updates immediately (optimistic, ~20s), then the cloud poll (30s) or a DeviceState webhook confirms the real bolt state.
Before you install anything in Home Assistant:
- The lock already works in the Xthings Home phone app.
- Wi-Fi remote is enabled for that lock in the app (not BLE-only).
- Home Assistant 2024.8 or newer.
- You can log into the same Xthings account (email + password) that owns the lock.
- For lock/unlock (not just status): an OpenAPI client in the Xthings app (steps below).
- For OAuth and optional instant status: Home Assistant has an external HTTPS URL
(Settings → System → Network → Home Assistant URL). Nabu Casa, a reverse proxy, or a tunnel all work.
Do this in the Xthings Home app (or U-tec OpenAPI page if your app version labels it that way).
-
Open My Account → OpenAPI (wording may be Developer / Open API).
-
Create a client. Copy the Client ID and Client Secret. Treat the secret like a password.
-
Set the redirect URI to exactly:
https://my.home-assistant.io/redirect/oauth -
Scope:
openapi. -
Save.
If OAuth later fails with a redirect mismatch, also add your instance callback:
https://YOUR-HOME-ASSISTANT-HOSTNAME/auth/external/callback
Keep the my.home-assistant.io URI. That is the one Home Assistant’s Application Credentials flow uses.
Once this repository is in the HACS default list you can search for Xthings Locks. Until then, add it as a custom repository:
- Open HACS and add this repository
or: HACS → Integrations → ⋮ → Custom repositories - URL:
https://github.com/Z0AT/xthings-ha - Type: Integration
- Download / Install Xthings Locks
- Restart Home Assistant
Copy custom_components/xthings_lock/ into /config/custom_components/xthings_lock/ and restart.
Lock/unlock will not work until this is done.
- Settings → Devices & services
- Open Application credentials (three-dot menu on that page, or the link at the bottom)
- Add credential
- Application: Xthings Locks
- Paste the OpenAPI Client ID and Client Secret
- Save
- Settings → Devices & services → Add integration
- Search Xthings Locks
- Sign in with the same email and password as the Xthings Home app
(this is how status, battery, and RSSI are read) - Home Assistant will send you to Xthings to Authorize OpenAPI
(this is how lock/unlock is sent) - Approve, then you should land back in Home Assistant with a device per lock
If you added the integration before Application Credentials:
- Status entities still appear
- Lock/unlock shows OpenAPI is not linked yet
- Add the credential (step 3), then Add integration → Xthings Locks again, sign in, and finish Authorize. It merges onto the existing entry; you do not get a second copy of the locks.
Without extra work, lock state refreshes about every 30 seconds.
If Home Assistant is reachable from the internet over HTTPS, the integration registers a webhook so keypad / app / fingerprint changes can show up without waiting for the poll.
Check Settings → System → Network → Home Assistant URL (the internet one). After a reload of the integration you should see Registered Xthings push URL in the logs. If that line is a warning instead, polling still works.
Each lock is a normal Home Assistant lock entity. Example:
action: lock.unlock
target:
entity_id: lock.front_doortriggers:
- trigger: state
entity_id: lock.front_door
to: unlockedNames come from the Xthings app. Rename them in Home Assistant if you want.
| What you see | What to do |
|---|---|
| Integration not in the Add list | Restart after HACS download. Confirm custom_components/xthings_lock/ exists. |
| Login failed | Same email/password as the Xthings app. Not the OpenAPI client id. |
| Could not reach Xthings cloud | HA needs outbound HTTPS to cloud.u-tec.com / oauth.u-tec.com / api.u-tec.com. |
| Add Xthings OpenAPI application credentials first | Step 3 was skipped. Add the client id/secret, then add the integration again. |
| OpenAPI is not linked yet | OAuth never finished. Add integration again and complete Authorize. |
| Locks show unavailable | Confirm Wi-Fi remote is on in the app and the lock is online there. |
| Command works, UI lags | Normal for a few seconds. Enable an external URL if you want push. |
| OAuth redirect error | Redirect URI must be exactly https://my.home-assistant.io/redirect/oauth. Set HA’s external URL. |
| No devices | The Xthings account has no locks, or they are on a different email. |
Download diagnostics from the integration card if you open a GitHub issue. Credentials and tokens are stripped.
- Cloud-dependent. If Xthings or your WAN is down, commands fail the same way the phone app would.
- Not Bluetooth and not Z-Wave. Those are different hardware paths.
- Unofficial. U-tec can change the cloud API at any time.
MIT for the integration code. See LICENSE.
The ZOAT mark in brand/ is the project logo (PNG, transparent). It is not a U-tec / ULTRALOQ trademark.