Same here but holding off until a Matter integration is available. Not planning to use Wifi but Thread. I know I probably have to wait for a while but I’m not in a hurry
I got the Level Bolt with Connect to work, and just also got the local connection over HomeKit to work in parallel.
I can lock/unlock in multiple ways:
- Level app: Phone bluetooth » level bolt
- Level app: Level cloud » Connect » level bolt
- Home Assistant: HomeKit integration » ESP bluetooth proxy » level bolt
Only 1 & 3 are local connections. You can add to Google Home via Level’s Connect as well, which I did while I was waiting for my ESP32 boards to come in, but now I have it all set up within Home Assistant which can be controlled via Google Home, and it’s faster than the cloud approach.
I paired the bolt originally using a bluetooth dongle and taking the bolt out of the door and placing it right next to it, then I installed the ESP proxy after everything was set up properly.
The full process I did was:
- Connect the Level Bolt in the Level app via bluetooth and perform any firmware upgrades
- Plug in the Level Connect and install using the Level app and perform any firmware upgrades. This was tedious as it had issues all the time, but I eventually got it working. I did factory resets if I ever had it hanging and not working.
- Disassemble the Level Bolt or remove the battery, turning it off.
- Make sure a bluetooth dongle is installed and the integration is in Home Assistant
- Place the Level Bolt next to your Home Assistant dongle and re-assemble it, turning it on.
- Find the Level Bolt using the HomeKit integration and configure it.
- Install the Level Bolt in your door, and add an ESPHome bluetooth proxy nearby. Mine is in the closet next to the door, like 4 feet away.
I wanted to chime in to share my experience getting this to pair with HA.
First, I installed the connect thing to bridge it to wifi, but I couldn’t get it to pair. So, I reset the lock using the button inside and holding for 8-10 seconds to wait for the chime. Then I did the following:
- Setup the bolt only using the Level App.
- Went to HA Homekit to look for it.
- Saw it as A229949A (Door Lock)
- Tried to pair, long wait no luck. Error.
- Moved my pi4 running HA closer (using the internal BT chip)
- Cycled power on the lock by pulling the battery.
- See it again in HA, no luck pairing.
- Updated the lock to extend BT range…no luck.
- Pick up my pi off the floor next to the door and place it on an amazon box, brining it from like 4 ft to 2ft away from the lock.
- Cycle battery, pairs right away.
Some people have said “It needs to be close to pair.” For me, close meant close. Like, real close. Like…what’s the difference between the floor and up on a 2ft box? Don’t know, but that was the trick.
Sounds like with the connect Wi-Fi bridge it’s still a cloud solution so that’s a no joy for me. If nothing else want my access to my house to be local only.
My HA is on a Hyper-V server in my basement crawlspace and Z-WaveJS UI as a service on a separate PC. Works great for what I have now. Don’t think Bluetooth, HomeKit, not even sure about Matter is an option in this setup.
Does anyone have experience pairing the Level Bolt to HA after it was previously paired to HomeKit? Can you describe the process you took, in detail, if you don’t mind, or at least share whether it needed to be removed from HomeKit first or not? Thanks!
I have the Level Lock+, not the Bolt, but I’m happy to share my experience. I spent many hours toiling and tinkering, eventually discovering that it can only be officially paired to one of them. So you’ll need to choose either HomeKit or HASS. Each has advantages and disadvantages. I’m probably missing some; these are just off the top of my head.
Pairing to HomeKit - Advantages:
- First party support. Plays nicely with everything else in your HomeKit & Apple ecosystem.
- You can use the Level Lock app to add (and manage) additional NFC devices like keycards, your spouse’s phone, and an Apple Watch
- If/when Apple actually builds out the ability to share a digital HomeKey, you’ll get this too.
- Adding it as a passive device to HASS (inheriting states only) is super easy
Pairing to HomeKit - Disadvantages:
- Getting full functionality in HASS requires lots of overhead
- Cannot be directly controlled from HASS (I think?)
- Cannot use a bluetooth proxy. Biggest downside IMO.
Pairing to HASS - Advantages:
- Can use a bluetooth proxy!
- Plays nicely with your other HASS accessories
- Easy addition to your dashboards & automations
Pairing to HASS - Disadvantages:
- Can’t add it to your Home app
- NFC doesn’t work with phones (or Apple Watches) from family members. Unsure if the NFC reader can be leveraged to work like a typical HASS NFC reader.
- If/when Apple finally releases their HomeKey product, you won’t be able to send a digital Key to your neighbor’s iPhone.
Fortunately, the bluetooth proxy wasn’t absolutely necessary for me, so I decided to pair it to HomeKit. I created some virtual helpers in HASS and paired them with some automations in the Home app to get the best of both worlds. Here’s what I did:
- In HASS, create an
input_boolean
to keep track of the lock’s state. It’s critical you don’t allow any HASS users to update this helper! - In HASS, create a momentary switch to capture lock requests initiated by HASS. To avoid impatient users from hammering the dashboard button I use to trigger the lock, I use an 8-second toggle for the momentary switch to let me display a “please wait” state while we wait for the lock to do its thing. YMMV.
- platform: momentary
name: Front Door Lock Trigger
mode: "on"
toggle_for: 8
cancellable: False
- In HASS, create another momentary switch to capture unlock requests initiated by HASS. Same 8-second delay here.
- platform: momentary
name: Front Door Unlock Trigger
mode: "on"
toggle_for: 8
cancellable: False
- In HASS, expose the 3 above sensors to the HomeKit bridge so they’re available in the Home app
- In the Home app, create automations that update your input boolean whenever the Level Lock is either locked or unlocked
- In the Home app, create automations that lock or unlock the Level Lock when the relevant momentary switch is flipped
- In HASS, create an automation to trigger the proper momentary switch when HomeKit updates the
input_boolean
used to track the lock’s state locally:
alias: Front Door Lock Toggle
description: Triggers the proper momentary switch to lock/unlock the door when HomeKit toggles our input boolean.
trigger:
- platform: state
entity_id:
- input_button.toggle_front_door_lock
to: null
condition:
- condition: state
entity_id: switch.momentary_front_door_lock_trigger
state: "off"
- condition: state
entity_id: switch.momentary_front_door_unlock_trigger
state: "off"
action:
- choose:
- conditions:
- condition: state
entity_id: input_boolean.is_front_door_locked
state: "on"
sequence:
- service: switch.turn_on
target:
entity_id: switch.momentary_front_door_unlock_trigger
data: {}
- conditions:
- condition: state
entity_id: input_boolean.is_front_door_locked
state: "off"
sequence:
- service: switch.turn_on
data: {}
target:
entity_id: switch.momentary_front_door_lock_trigger
mode: single
- Add a mushroom template card to your dashboard incorporating all of the above. My config is part of a single-column grid, so you may need to adjust for your dashboard layout:
- type: custom:mushroom-template-card
primary: Front Door Lock
secondary: >-
{%- if states.switch.momentary_front_door_lock_trigger.state | bool +
states.switch.momentary_front_door_unlock_trigger.state | bool == 0 %}
{%- if states.input_boolean.is_front_door_locked.state | bool %}
Locked
{% else %}
Unlocked
{% endif %}
{% else %}
{%- if states.switch.momentary_front_door_unlock_trigger.state | bool %}
Unlock requested, please wait.
{% else %}
Lock requested, please wait.
{% endif %}
{% endif %}
icon: |-
{%- if states.input_boolean.is_front_door_locked.state | bool %}
mdi:lock
{% else %}
mdi:lock-open
{% endif %}
icon_color: >-
{%- if states.switch.momentary_front_door_lock_trigger.state | bool +
states.switch.momentary_front_door_unlock_trigger.state | bool == 0 %}
{%- if states.input_boolean.is_front_door_locked.state | bool %}
green
{% else %}
red
{% endif %}
{% else %}
yellow
{% endif %}
badge_icon: ''
hold_action:
action: more-info
double_tap_action:
action: none
entity: input_boolean.is_front_door_locked
multiline_secondary: true
fill_container: true
tap_action:
action: call-service
service: input_button.press
target:
entity_id: input_button.toggle_front_door_lock
Here’s what all of that gets you. Unlocked state:
When tapped from the unlocked state, it requests the door be locked and shows this pending state:
Locked state:
From the locked state, the card can be tapped in HASS for another pending state while the lock is doing its thing.
Best of both worlds, as long as you don’t need the BT proxy. My wife can tap her Apple Watch to the lock face to lock/unlock it, I can do the same with my iPhone, and everything is still accessible and controllable via HASS.
Wow, thank you so much for this detailed and incredibly helpful post! I haven’t had a chance to apply it to my situation yet, but when I do, I will post again to confirm for others whether it worked (or, if it didn’t, if I learned anything) with the Bolt. Cheers!
@brystmar Sorry, could you just confirm one thing that I think is clearly implied in your post, but about which I’m being dense / seeking concrete clarification? Am I correct in understanding that you did nothing to directly integrate the lock with HASS but instead created the virtual helpers, brought them into HomeKit (presumably using the HA HK integration), and then created automations in HK and HA, as detailed so well, to synchronize the two? Sorry for being so dense, and thanks again!
For my part, rather than carefully following the suggested steps that you and others in this thread detailed, I so far have added the lock to HA (I was watching a movie with my wife, glanced at HA as I am wont to do, and saw the ‘device discovered’ notification, so I went for it, and it was successfully added), but the results are not satisfactory - the state doesn’t accurately or consistently show in HA (it’s stuck on ‘locking’ for long periods of time until I manually cycle it, for instance). So, I think I’m going to remove it again and follow your approach once you confirm my understanding of it.
Thanks again!
That’s correct. Your lock can only be officially connected to one ecosystem: HomeKit, or HASS. From my Level Lock’s point of view, it is only connected to HomeKit. I created those other helpers and automations to work around this limitation.
Sounds like you aren’t getting the desired performance from the lock. This is typically due to one of two reasons:
-
Your door alignment isn’t great. Ensure the door is always fully closed every time — easier said than done with kids. The lock mechanism isn’t strong enough to overcome much friction, so it will throw an error or just stay in the “locking” status indefinitely if it can’t turn the lock fully in either direction. My household has this problem too.
-
Weak or inconsistent Bluetooth connection. If your HomeKit hub device (HomePod, Apple TV) is closer to the lock than your HASS Bluetooth adapter, you might have better luck pairing it to HomeKit. You can also try enabling the boost Bluetooth setting in the Level app. Otherwise you’ll need a Bluetooth proxy, and that will prevent you from using the solution I outlined above.
Hi once again - while I’m not completely done implementing your good ideas, I wanted to thank you again and give an update in case others read this thread in the future.
While I haven’t implemented your system to create delays (due to some challenges figuring out momentary switches with delays), I’ve created the boolean, brought that into HK (a first for me with HA), created HK automations to sync the boolean with the lock, and added the boolean to a HA dashboard. So, I’ve learned a lot, and it’s working “good enough” for a proof of concept already.
Thanks again for your help and encouragement, Thomas! All the best.
Hi, this is REALLY cool.
I tried your code and had to make some changes (had to use states(‘entity’) rather than state.entity.state) but other than that worked brilliantly.
You missed the instruction to add an input_button and an automation to conditionally call the right monentary trigger too, but once I added that it all worked no problem.
THANK YOU SO MUCH this is just what I wanted.
Tony
Glad it’s working for you @TonySeeley and @ajfi-droid2! Thanks for identifying the missing HA automation — I’m updating my post now to include that piece.
Wanted to add a quick disclaimer that much (most?) of the config in my above post was derived from suggestions by other HA community members, probably even from this thread. Community-driven solutions are the best solutions
It’s funny I found on line that the state.entity.state approach should have worked but it didn’t for me (not sure why), so my code looks like this.
- type: custom:mushroom-template-card
primary: Front Door
entity: input_boolean.front_door
secondary: |-
{% if states('switch.momentary_front_door_lock_trigger') == 'off' and states('switch.momentary_front_door_unlock_trigger') == 'off' %}
{% if states('input_boolean.front_door') == 'on' %}
Locked
{% else %}
Unlocked
{% endif %}
{% else %}
{% if states('switch.momentary_front_door_lock_trigger') == 'on' %}
Lock requested, please wait.
{% else %}
Unlock requested, please wait.
{% endif %}
{% endif %}
icon: |-
{% if states('input_boolean.front_door') == 'on' %}
mdi:lock
{% else %}
mdi:lock-open
{% endif %}
icon_color: |-
{% if states('switch.momentary_front_door_lock_trigger') == 'off' and states('switch.momentary_front_door_unlock_trigger') == 'off' %}
{% if states('input_boolean.front_door') == 'on' %}
green
{% else %}
red
{% endif %}
{% else %}
yellow
{% endif %}
hold_action:
action: none
double_tap_action:
action: none
multiline_secondary: true
fill_container: true
tap_action:
action: call-service
service: input_button.press
target:
entity_id: input_button.front_door_toggle
and it works brilliantly.
So thank you again
I have a spare Level Lock Keypad Door Lock Keypad | Level Lock Keypad | Level.
Is it possible to detect use of the keypad with Home Assistant independently of an actual lock? I’m wondering if I could use the keypad as a trigger for another action.
Thanks
I just set up my first bluetooth proxy, and that seems to have been successful. Unfortunately, the only way this lock is showing up in HA is through HK integrations, not bluetooth.
Ideas? I tried removing it from the app as others suggested. I’m seeing it scan in the logs, and it just isn’t finding anything. I disabled my bluetooth adapter on the rpi, too.
I’ve also tried factor resetting the lock itself.
If it helps, I have the level bolt, but they should all act the same I imagine.
That’s exactly how the lock is supposed to show up. It’s a HomeKit device that’s connecting to HA using Bluetooth.
Thank you.
Oh, then I think I misunderstood some of the other posts here that it was one or the other. So, the downside is that I am still seeing errors.
An unhandled error occurred while attempting to pair with this device. This may be a temporary failure or your device may not be supported currently: Bluetooth GATT Error
The only other part of this thread that shows someone got this error was here: Level door lock? - #151 by amyleighbaker But it doesn’t seem like they solved it
Edit:
Looking at the ESPHome logs on the BT proxy, it tries to connect but then kicks out an error:
Error reading char/descriptor at handle 0x56, status=133
Update: So I got frustrated and gave up for a day or so, and then decided to retry. I simultaneously unplugged the BT proxy and took the battery out of the lock, and then put both back. When I returned to home assistant, this time it let me pair!
I currently have the BT proxy painters taped to the wall nearby the device. I plan on moving it a bit farther away once I validate the config stays working. We’ll see how that goes.
I requested the update as soon as I got the email this morning. No idea when the update will actually come through, tho…