locks: document per-door code toggles

This commit is contained in:
Donavan Fritz
2026-07-16 20:34:33 -05:00
parent 06c246f021
commit ccca08caaf
2 changed files with 16 additions and 12 deletions
+1 -1
View File
@@ -46,7 +46,7 @@ user-invocable: true
<references> <references>
<reference file="reference/locks.md" <reference file="reference/locks.md"
summary="Door locks: two zwave_js keypad locks, 8 code slots via helpers, lock_sync_slot single-source script + all-codes wrapper + per-slot and self-healing automations, usercode-cache fix, nightly git backup" summary="Door locks: two zwave_js keypads, 8 shared codes with per-door enable toggles, lock_sync_slot + full/self-healing sync, usercode-cache fix, nightly git backup"
categories=["home-automation"] categories=["home-automation"]
keywords=["lock", "locks", "door code", "door codes", "usercode", "code slot", "keypad", "lock_sync_all_codes", "set_lock_usercode", "zwave", "front door", "bunkhouse"] /> keywords=["lock", "locks", "door code", "door codes", "usercode", "code slot", "keypad", "lock_sync_all_codes", "set_lock_usercode", "zwave", "front door", "bunkhouse"] />
</references> </references>
+15 -11
View File
@@ -5,29 +5,33 @@ Two Z-Wave (zwave_js) keypad locks: `lock.lodge_front_door_lock` (node 3) and
`lock.bunkhouse_frontdoor_lock`. 8 shared code slots, managed from the `lock.bunkhouse_frontdoor_lock`. 8 shared code slots, managed from the
"Lock Management" Lovelace view via helpers: "Lock Management" Lovelace view via helpers:
`input_text.lock_slotN_user`, `input_text.lock_slotN_code`, `input_text.lock_slotN_user`, `input_text.lock_slotN_code`,
`input_boolean.lock_slotN_enabled` (N = 18). `input_boolean.lock_slotN_lodge_enabled`, and
`input_boolean.lock_slotN_bunkhouse_enabled` (N = 18).
Slot 1 = Fritz family, 2 = cleaner, 4 = carpenter, 5 = backup. Slot 1 = Fritz family, 2 = cleaner, 4 = carpenter, 5 = backup.
Legacy `input_boolean.lock_slotN_enabled` helpers remain but are unwired and
hidden from the dashboard.
</overview> </overview>
<sync> <sync>
All code writes go through `script.lock_sync_slot` (fields: `slot` 18), the All code writes go through `script.lock_sync_slot` (fields: `slot` 18), the
single source of truth. Per slot it: resolves the code (slot's own code if single source of truth. Per slot and door it resolves the code (slot's own code
`_enabled` on, else the slot-1 family code), REFUSES non-4-10-digit codes if that door's toggle is on, else the slot-1 family code), refuses an invalid
(persistent notification "slot N SKIPPED", nothing written), then per lock does effective code for only that door with a door-specific notification, then does
a UserCode CC `get` (repopulates the Z-Wave value cache so a missing cached a UserCode CC `get` followed by `zwave_js.set_lock_usercode`. Every Z-Wave call
slot can't error) followed by `zwave_js.set_lock_usercode` — every zwave call uses `continue_on_error`, so one door never blocks the other.
`continue_on_error` so one lock/slot never blocks the rest.
- `script.lock_sync_all_codes` — warns (persistent + `notify.mobile_app_donavan_s_iphone_16_pro`) - `script.lock_sync_all_codes` — warns (persistent + `notify.mobile_app_donavan_s_iphone_16_pro`)
if a lock's `*_node_status` sensor isn't alive/asleep, then runs if a lock's `*_node_status` sensor isn't alive/asleep, then runs
`lock_sync_slot` for slots 18. `lock_sync_slot` for slots 18.
- `automation.lock_slot_N_sync_both_locks` (×8) — trigger on the slot's - `automation.lock_slot_N_sync_both_locks` (×8, alias "Sync Door Codes") —
`_enabled` OR `_code` helper change → `lock_sync_slot` for that slot. trigger on either door's enabled toggle OR the slot's `_code` helper →
`lock_sync_slot` for that slot.
- `automation.lock_codes_full_sync_self_heal` — full sync daily 04:00 and - `automation.lock_codes_full_sync_self_heal` — full sync daily 04:00 and
10 min after HA start, so transient failures heal within a day. 10 min after HA start, so transient failures heal within a day.
Disabled slots are overwritten with the family code (design choice), so the Each disabled door slot is overwritten with the family code, so the family code
family code exists in multiple lock slots. exists in multiple slots. Slot 1's toggles are no-ops because its fallback is
its own family code.
</sync> </sync>
<troubleshooting> <troubleshooting>