diff --git a/SKILL.md b/SKILL.md index c284b65..7ef6064 100644 --- a/SKILL.md +++ b/SKILL.md @@ -46,7 +46,7 @@ user-invocable: true diff --git a/reference/locks.md b/reference/locks.md index 64cbf6e..1763a32 100644 --- a/reference/locks.md +++ b/reference/locks.md @@ -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 Management" Lovelace view via helpers: `input_text.lock_slotN_user`, `input_text.lock_slotN_code`, -`input_boolean.lock_slotN_enabled` (N = 1–8). +`input_boolean.lock_slotN_lodge_enabled`, and +`input_boolean.lock_slotN_bunkhouse_enabled` (N = 1–8). 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. All code writes go through `script.lock_sync_slot` (fields: `slot` 1–8), the -single source of truth. Per slot it: resolves the code (slot's own code if -`_enabled` on, else the slot-1 family code), REFUSES non-4-10-digit codes -(persistent notification "slot N SKIPPED", nothing written), then per lock does -a UserCode CC `get` (repopulates the Z-Wave value cache so a missing cached -slot can't error) followed by `zwave_js.set_lock_usercode` — every zwave call -`continue_on_error` so one lock/slot never blocks the rest. +single source of truth. Per slot and door it resolves the code (slot's own code +if that door's toggle is on, else the slot-1 family code), refuses an invalid +effective code for only that door with a door-specific notification, then does +a UserCode CC `get` followed by `zwave_js.set_lock_usercode`. Every Z-Wave call +uses `continue_on_error`, so one door never blocks the other. - `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 `lock_sync_slot` for slots 1–8. -- `automation.lock_slot_N_sync_both_locks` (×8) — trigger on the slot's - `_enabled` OR `_code` helper change → `lock_sync_slot` for that slot. +- `automation.lock_slot_N_sync_both_locks` (×8, alias "Sync Door Codes") — + 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 10 min after HA start, so transient failures heal within a day. -Disabled slots are overwritten with the family code (design choice), so the -family code exists in multiple lock slots. +Each disabled door slot is overwritten with the family code, so the family code +exists in multiple slots. Slot 1's toggles are no-ops because its fallback is +its own family code.