This is a forked Home Assistant custom integration for Ultraloq / U-Tec / Xthings BLE locks.
I really wanted to have local control over my U-Bolt Pro locks, and the original integration was simply nonfunctional for that. So I forked it and fixed the biggest bugs, then did extensive testing and iterating with the help of Codex. One other notable improvement is that autolock status and battery level are now first class sensors instead of being buried in the attributes. This integration should have all of the original features (plus first class sensors) for non U-Bolt Pro locks, plus full support for the U-Bolt Pro locks.
Entities currently exposed per lock:
locksensor.battery_levelsensorsensor.lock_modesensor.bolt_statuswhen the model reports meaningful bolt status. U-Bolt Pros do not.number.autolock_time
Integration service:
ultraloq_ble.refresh_locksrefreshes cached lock metadata from the cloud and reloads the integration.
Important Bluetooth note:
- Passive advertisement-only proxies are not enough for lock control
- Shelly Bluetooth proxy sightings can help discovery, but active GATT connectivity is what actually matters for operating the lock
- If HA decides that the advertisement is not connectable, it will cause status updates and lock controls to fail
You can install using HACS:
Or manually:
- Open your Home Assistant config directory.
- Create
custom_componentsif it does not already exist. - Copy the
custom_components/ultraloq_ble/folder from this repository into your Home Assistant config directory. - Restart Home Assistant.
This integration relies on a direct, active BLE connection to the lock. Ultraloq locks are VERY stingy about BLE connections, even with the offical WiFi bridge. This means that updates may fail, and the update speed will be much lower than a normal Zigbee/WiFi lock.
This integration is designed so the cloud is used only when needed:
- first setup
- credential reauthentication
- manual lock metadata refresh
Normal operation such as:
- lock
- unlock
- state updates
- reading battery/autolock/mode values
- setting the auto-lock timer
is intended to happen locally over BLE.
I am working on a local only version, but I am still exploring whether it's viable for normal users.
Each lock may expose:
Battery LevelAutolock TimeLock ModeBolt Status
Notes:
Bolt Statusis skipped for models where it is known to be useless or always unavailableAutolock Timeis exposed as a duration sensor in seconds
- Bluetooth quality matters a lot. Weak or non-connectable advertisements will cause timeouts or unavailable entities. You will need active-capable Bluetooth nodes very close to each lock.
- Some lock models may still need extra command or capability tuning.
- The integration exposes the raw autolock controls. The lock seems to discard some seconds inputs, if I could find all of the accepted inputs we could add a proper selector.
- State updates after a lock or unlock are very slow and dependent on refresh interval. Perhaps there is a way to subscribe to Ultraloq BLE pushes, but I do not have the tools to reverse engineer such a thing.
- Shelly Bluetooth proxies are incapable of starting an active GATT BLE connection, so you will need either a USB Bluetooth adapter or an ESPHome device with
active: trueenabled in the Bluetooth configuration. - There is a Bleak depreciation warning in the debug logs. I am aware of this but I'd like to get the rest of the implementation stable before attacking that.
- Some locks randomly go offline due to them not responding to
ADMIN_LOGIN. I am working on a fix, but it only happens occasionally.
Check:
- the lock is in Bluetooth range
- your Home Assistant Bluetooth adapter or ESPHome proxy can make active connections
- the lock is not only being seen as
connectable: false - Unsupported device, in which case you could try reporting an issue here
Full disclaimer: Most of the improvements from the original were by GPT 5.4 Codex. However, I personally use this integration and I am happy with it, so I am sharing it in case it could be useful to anyone else.