@mp-consulting/homebridge-unifi-access 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. package/.claude/settings.local.json +91 -0
  2. package/CHANGELOG.md +13 -0
  3. package/LICENSE.md +22 -0
  4. package/README.md +159 -0
  5. package/config.schema.json +202 -0
  6. package/dist/access-controller.d.ts +41 -0
  7. package/dist/access-controller.js +342 -0
  8. package/dist/access-controller.js.map +1 -0
  9. package/dist/access-device-catalog.d.ts +43 -0
  10. package/dist/access-device-catalog.js +151 -0
  11. package/dist/access-device-catalog.js.map +1 -0
  12. package/dist/access-device.d.ts +68 -0
  13. package/dist/access-device.js +330 -0
  14. package/dist/access-device.js.map +1 -0
  15. package/dist/access-events.d.ts +27 -0
  16. package/dist/access-events.js +152 -0
  17. package/dist/access-events.js.map +1 -0
  18. package/dist/access-options.d.ts +32 -0
  19. package/dist/access-options.js +65 -0
  20. package/dist/access-options.js.map +1 -0
  21. package/dist/access-platform.d.ts +15 -0
  22. package/dist/access-platform.js +74 -0
  23. package/dist/access-platform.js.map +1 -0
  24. package/dist/access-types.d.ts +30 -0
  25. package/dist/access-types.js +42 -0
  26. package/dist/access-types.js.map +1 -0
  27. package/dist/hub/access-hub-api.d.ts +13 -0
  28. package/dist/hub/access-hub-api.js +140 -0
  29. package/dist/hub/access-hub-api.js.map +1 -0
  30. package/dist/hub/access-hub-events.d.ts +2 -0
  31. package/dist/hub/access-hub-events.js +229 -0
  32. package/dist/hub/access-hub-events.js.map +1 -0
  33. package/dist/hub/access-hub-mqtt.d.ts +2 -0
  34. package/dist/hub/access-hub-mqtt.js +137 -0
  35. package/dist/hub/access-hub-mqtt.js.map +1 -0
  36. package/dist/hub/access-hub-services.d.ts +4 -0
  37. package/dist/hub/access-hub-services.js +451 -0
  38. package/dist/hub/access-hub-services.js.map +1 -0
  39. package/dist/hub/access-hub-types.d.ts +145 -0
  40. package/dist/hub/access-hub-types.js +35 -0
  41. package/dist/hub/access-hub-types.js.map +1 -0
  42. package/dist/hub/access-hub-utils.d.ts +20 -0
  43. package/dist/hub/access-hub-utils.js +128 -0
  44. package/dist/hub/access-hub-utils.js.map +1 -0
  45. package/dist/hub/access-hub.d.ts +39 -0
  46. package/dist/hub/access-hub.js +185 -0
  47. package/dist/hub/access-hub.js.map +1 -0
  48. package/dist/hub/index.d.ts +4 -0
  49. package/dist/hub/index.js +7 -0
  50. package/dist/hub/index.js.map +1 -0
  51. package/dist/index.d.ts +3 -0
  52. package/dist/index.js +11 -0
  53. package/dist/index.js.map +1 -0
  54. package/dist/settings.d.ts +16 -0
  55. package/dist/settings.js +49 -0
  56. package/dist/settings.js.map +1 -0
  57. package/docs/FeatureOptions.md +120 -0
  58. package/docs/MQTT.md +116 -0
  59. package/docs/api_reference.pdf +0 -0
  60. package/docs/media/homebridge-unifi-access.png +0 -0
  61. package/docs/media/homebridge-unifi-access.svg +21 -0
  62. package/eslint.config.mjs +99 -0
  63. package/homebridge-ui/public/app.js +104 -0
  64. package/homebridge-ui/public/index.html +267 -0
  65. package/homebridge-ui/public/modules/constants.js +22 -0
  66. package/homebridge-ui/public/modules/controllers.js +202 -0
  67. package/homebridge-ui/public/modules/discovery.js +89 -0
  68. package/homebridge-ui/public/modules/dom-helpers.js +41 -0
  69. package/homebridge-ui/public/modules/feature-options.js +625 -0
  70. package/homebridge-ui/public/modules/state.js +26 -0
  71. package/homebridge-ui/public/styles.css +533 -0
  72. package/homebridge-ui/server.js +374 -0
  73. package/package.json +83 -0
  74. package/scripts/event-schema-monitor.ts +350 -0
@@ -0,0 +1,229 @@
1
+ import { AccessEventType } from "../access-types.js";
2
+ import { AUTO_LOCK_DELAY_MS, accessMethods, terminalInputs } from "./access-hub-types.js";
3
+ import { UGT_MAIN_PORT_SOURCE_ID, UGT_SIDE_PORT_SOURCE_ID } from "../access-device-catalog.js";
4
+ import { configureTerminalInputs } from "./access-hub-services.js";
5
+ import { checkUltraInputs, hasCapability, hubDpsState, hubInputState, hubLockState, toDpsState, toLockState } from "./access-hub-utils.js";
6
+ // Register external event handlers on the controller's event emitter. This is the entry point for all UniFi Access API events.
7
+ export function registerEventHandlers(hub) {
8
+ const boundHandler = (packet) => eventHandler(hub, packet);
9
+ hub.controller.events.on(hub.uda.unique_id, hub.listeners[hub.uda.unique_id] = boundHandler);
10
+ hub.controller.events.on(AccessEventType.DOORBELL_RING, hub.listeners[AccessEventType.DOORBELL_RING] = boundHandler);
11
+ hub.controller.events.on(AccessEventType.DOORBELL_CANCEL, hub.listeners[AccessEventType.DOORBELL_CANCEL] = boundHandler);
12
+ // For devices using the location API, subscribe to door-specific events.
13
+ if (hub.catalog.usesLocationApi) {
14
+ if (hub.mainDoorLocationId) {
15
+ hub.controller.events.on(hub.mainDoorLocationId, hub.listeners[hub.mainDoorLocationId] = boundHandler);
16
+ }
17
+ if (hub.sideDoorLocationId) {
18
+ hub.controller.events.on(hub.sideDoorLocationId, hub.listeners[hub.sideDoorLocationId] = boundHandler);
19
+ }
20
+ }
21
+ }
22
+ // Top-level event dispatcher.
23
+ function eventHandler(hub, packet) {
24
+ switch (packet.event) {
25
+ case AccessEventType.DEVICE_REMOTE_UNLOCK:
26
+ handleRemoteUnlock(hub, packet);
27
+ break;
28
+ case AccessEventType.DEVICE_UPDATE:
29
+ handleDeviceUpdate(hub, packet);
30
+ break;
31
+ case AccessEventType.DEVICE_UPDATE_V2:
32
+ handleDeviceUpdateV2(hub, packet);
33
+ break;
34
+ case AccessEventType.LOCATION_UPDATE:
35
+ handleLocationUpdate(hub, packet);
36
+ break;
37
+ case AccessEventType.DOORBELL_RING:
38
+ handleDoorbellRing(hub, packet);
39
+ break;
40
+ case AccessEventType.DOORBELL_CANCEL:
41
+ handleDoorbellCancel(hub, packet);
42
+ break;
43
+ default:
44
+ break;
45
+ }
46
+ }
47
+ // Handle remote unlock events.
48
+ function handleRemoteUnlock(hub, packet) {
49
+ // For UA Gate hubs, determine which door was unlocked based on the event_object_id.
50
+ if (hub.catalog.usesLocationApi) {
51
+ const eventDoorId = packet.event_object_id;
52
+ const isSideDoor = hub.sideDoorLocationId && (eventDoorId === hub.sideDoorLocationId);
53
+ const isMainDoor = hub.mainDoorLocationId && (eventDoorId === hub.mainDoorLocationId);
54
+ if (!isSideDoor && !isMainDoor) {
55
+ return;
56
+ }
57
+ // Set unlocked state. The hub event bus will handle MQTT publishing and logging.
58
+ if (isSideDoor) {
59
+ hub.hkSideDoorLockState = hub.hap.Characteristic.LockCurrentState.UNSECURED;
60
+ }
61
+ else {
62
+ hub.hkLockState = hub.hap.Characteristic.LockCurrentState.UNSECURED;
63
+ }
64
+ // Auto-lock after delay.
65
+ setTimeout(() => {
66
+ if (isSideDoor) {
67
+ hub.hkSideDoorLockState = hub.hap.Characteristic.LockCurrentState.SECURED;
68
+ }
69
+ else {
70
+ hub.hkLockState = hub.hap.Characteristic.LockCurrentState.SECURED;
71
+ }
72
+ }, AUTO_LOCK_DELAY_MS);
73
+ }
74
+ else {
75
+ // Non-UA Gate hubs: default behavior.
76
+ hub.hkLockState = hub.hap.Characteristic.LockCurrentState.UNSECURED;
77
+ }
78
+ }
79
+ // Handle device update events (v1 API).
80
+ function handleDeviceUpdate(hub, packet) {
81
+ // Process a lock update event if our state has changed. Skip for UA Gate hubs since we handle state manually.
82
+ if (!hub.catalog.skipsV1LockEvents && (hubLockState(hub) !== hub._hkLockState)) {
83
+ hub.hkLockState = hubLockState(hub);
84
+ }
85
+ // Process a side door lock update event if our state has changed (UA Gate only).
86
+ if (hub.hints.hasSideDoor && !hub.catalog.skipsV1LockEvents) {
87
+ const newHubState = hubLockState(hub, true);
88
+ if (newHubState !== hub._hkSideDoorLockState) {
89
+ hub.hkSideDoorLockState = newHubState;
90
+ }
91
+ }
92
+ // Process a side door DPS update event if our state has changed (UA Gate only).
93
+ if (hub.hints.hasSideDoor && hub.hints.hasWiringDps && !hub.catalog.skipsV1LockEvents) {
94
+ const newSideDoorDpsState = hubDpsState(hub, true);
95
+ if (newSideDoorDpsState !== hub._hkSideDoorDpsState) {
96
+ hub._hkSideDoorDpsState = newSideDoorDpsState;
97
+ hub.hubEvents.emit("dps:changed", { isSideDoor: true, value: newSideDoorDpsState });
98
+ }
99
+ }
100
+ // Process any terminal input update events if our state has changed.
101
+ for (const { input } of terminalInputs) {
102
+ const hasKey = ("hasWiring" + input);
103
+ const hkKey = ("hk" + input + "State");
104
+ const newState = hubInputState(hub, input);
105
+ if (hub.hints[hasKey] && (newState !== hub[hkKey])) {
106
+ // Setting via the dynamic property triggers the appropriate event emission:
107
+ // - For Dps: the hkDpsState setter emits "dps:changed" + "sensor:changed"
108
+ // - For Rel/Ren/Rex: the dynamic setter emits "sensor:changed"
109
+ hub[hkKey] = newState;
110
+ }
111
+ }
112
+ // Process any changes to terminal input configuration.
113
+ if (packet.data.extensions?.[0]?.target_config && hub.catalog.usesProxyMode) {
114
+ checkUltraInputs(hub);
115
+ configureTerminalInputs(hub);
116
+ }
117
+ // Process any changes to our online status.
118
+ if (packet.data.is_online !== undefined) {
119
+ hub.hubEvents.emit("device:online", { isOnline: !!packet.data.is_online });
120
+ }
121
+ }
122
+ // Handle device update v2 events.
123
+ function handleDeviceUpdateV2(hub, packet) {
124
+ const data = packet.data;
125
+ // Process access method updates.
126
+ if (data.access_method) {
127
+ for (const [key, value] of Object.entries(data.access_method)) {
128
+ if ((value !== "yes") && (value !== "no")) {
129
+ continue;
130
+ }
131
+ const accessMethod = accessMethods.find(entry => entry.key === key);
132
+ if (accessMethod) {
133
+ hub.accessory.getServiceById(hub.hap.Service.Switch, accessMethod.subtype)?.updateCharacteristic(hub.hap.Characteristic.On, value === "yes");
134
+ }
135
+ }
136
+ }
137
+ // Process location_states for UA Gate hubs - this contains lock state per door.
138
+ if (data.location_states && hub.catalog.usesLocationApi) {
139
+ const locationStates = data.location_states;
140
+ // Process main door state.
141
+ const mainDoorExtension = hub.uda.extensions?.find(ext => ext.source_id === UGT_MAIN_PORT_SOURCE_ID);
142
+ const mainDoorId = mainDoorExtension?.target_value ?? hub.mainDoorLocationId;
143
+ if (mainDoorId) {
144
+ const mainDoorState = locationStates.find(state => state.location_id === mainDoorId);
145
+ if (mainDoorState) {
146
+ updateDoorFromLocationState(hub, mainDoorState, false);
147
+ }
148
+ }
149
+ // Process side door state.
150
+ if (hub.hints.hasSideDoor) {
151
+ const sideDoorExtension = hub.uda.extensions?.find(ext => ext.source_id === UGT_SIDE_PORT_SOURCE_ID);
152
+ const sideDoorId = sideDoorExtension?.target_value ?? hub.sideDoorLocationId;
153
+ if (sideDoorId) {
154
+ const sideDoorState = locationStates.find(state => state.location_id === sideDoorId);
155
+ if (sideDoorState) {
156
+ updateDoorFromLocationState(hub, sideDoorState, true);
157
+ }
158
+ }
159
+ }
160
+ }
161
+ }
162
+ // Handle location update events (v2 API).
163
+ function handleLocationUpdate(hub, packet) {
164
+ // Only process for UA Gate hubs.
165
+ if (!hub.catalog.usesLocationApi) {
166
+ return;
167
+ }
168
+ const locationData = packet.data;
169
+ if (!locationData.state) {
170
+ return;
171
+ }
172
+ const locationId = locationData.id;
173
+ const isMainDoor = locationId === hub.mainDoorLocationId;
174
+ const isSideDoor = locationId === hub.sideDoorLocationId;
175
+ if (isMainDoor) {
176
+ updateDoorFromLocationState(hub, locationData.state, false);
177
+ }
178
+ else if (isSideDoor && hub.hints.hasSideDoor) {
179
+ updateDoorFromLocationState(hub, locationData.state, true);
180
+ }
181
+ }
182
+ // Handle doorbell ring events.
183
+ function handleDoorbellRing(hub, packet) {
184
+ if ((packet.data.connected_uah_id !== hub.uda.unique_id) || !hasCapability(hub, "door_bell")) {
185
+ return;
186
+ }
187
+ hub.doorbellRingRequestId = packet.data.request_id;
188
+ // Trigger the doorbell event in HomeKit.
189
+ hub.accessory.getService(hub.hap.Service.Doorbell)?.getCharacteristic(hub.hap.Characteristic.ProgrammableSwitchEvent)
190
+ ?.sendEventNotification(hub.hap.Characteristic.ProgrammableSwitchEvent.SINGLE_PRESS);
191
+ // Emit on the hub event bus for trigger switch and MQTT.
192
+ hub.hubEvents.emit("doorbell:ring", { requestId: hub.doorbellRingRequestId });
193
+ if (hub.hints.logDoorbell) {
194
+ hub.log.info("Doorbell ring detected.");
195
+ }
196
+ }
197
+ // Handle doorbell cancel events.
198
+ function handleDoorbellCancel(hub, packet) {
199
+ if (hub.doorbellRingRequestId !== packet.data.remote_call_request_id) {
200
+ return;
201
+ }
202
+ hub.doorbellRingRequestId = null;
203
+ // Emit on the hub event bus for trigger switch and MQTT.
204
+ hub.hubEvents.emit("doorbell:cancel", {});
205
+ if (hub.hints.logDoorbell) {
206
+ hub.log.info("Doorbell ring cancelled.");
207
+ }
208
+ }
209
+ // Update door state from location data (lock and DPS).
210
+ function updateDoorFromLocationState(hub, doorState, isSideDoor) {
211
+ const newLockState = toLockState(hub, doorState.lock);
212
+ const newDpsState = toDpsState(hub, doorState.dps);
213
+ // Update lock state. The hub event bus will handle MQTT publishing and logging.
214
+ if (isSideDoor) {
215
+ hub.hkSideDoorLockState = newLockState;
216
+ }
217
+ else {
218
+ hub.hkLockState = newLockState;
219
+ }
220
+ // Update DPS state. The hub event bus will handle MQTT publishing and logging.
221
+ if (isSideDoor) {
222
+ hub._hkSideDoorDpsState = newDpsState;
223
+ hub.hubEvents.emit("dps:changed", { isSideDoor: true, value: newDpsState });
224
+ }
225
+ else {
226
+ hub.hkDpsState = newDpsState;
227
+ }
228
+ }
229
+ //# sourceMappingURL=access-hub-events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"access-hub-events.js","sourceRoot":"","sources":["../../src/hub/access-hub-events.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { AccessHub } from "./access-hub.js";
2
+ export declare function configureMqtt(hub: AccessHub): boolean;
@@ -0,0 +1,137 @@
1
+ /* Copyright(C) 2026, Mickael Palma. All rights reserved.
2
+ *
3
+ * access-hub-mqtt.ts: MQTT configuration and state-change publishing for the UniFi Access hub.
4
+ */
5
+ import { terminalInputs } from "./access-hub-types.js";
6
+ import { hubDoorLockCommand } from "./access-hub-api.js";
7
+ import { isClosed, isLocked, isSideDoorDpsWired, isWired } from "./access-hub-utils.js";
8
+ // Configure MQTT capabilities of this hub and subscribe to hub events for automatic state publishing.
9
+ export function configureMqtt(hub) {
10
+ // Always register event bus reactions for MQTT publishing, even if no lock service (e.g. reader-only devices).
11
+ registerMqttReactions(hub);
12
+ const lockService = hub.accessory.getService(hub.hap.Service.LockMechanism);
13
+ if (!lockService) {
14
+ return false;
15
+ }
16
+ // MQTT doorbell status.
17
+ hub.controller.mqtt?.subscribeGet(hub.id, "doorbell", "Doorbell ring", () => {
18
+ return hub.doorbellRingRequestId !== null ? "true" : "false";
19
+ });
20
+ // MQTT DPS status.
21
+ hub.controller.mqtt?.subscribeGet(hub.id, "dps", "Door position sensor", () => {
22
+ if (!isWired(hub, "Dps")) {
23
+ return "unknown";
24
+ }
25
+ switch (hub.hkDpsState) {
26
+ case hub.hap.Characteristic.ContactSensorState.CONTACT_DETECTED:
27
+ return "false";
28
+ case hub.hap.Characteristic.ContactSensorState.CONTACT_NOT_DETECTED:
29
+ return "true";
30
+ default:
31
+ return "unknown";
32
+ }
33
+ });
34
+ // MQTT lock status.
35
+ hub.controller.mqtt?.subscribeGet(hub.id, "lock", "Lock", () => {
36
+ switch (hub.hkLockState) {
37
+ case hub.hap.Characteristic.LockCurrentState.SECURED:
38
+ return "true";
39
+ case hub.hap.Characteristic.LockCurrentState.UNSECURED:
40
+ return "false";
41
+ default:
42
+ return "unknown";
43
+ }
44
+ });
45
+ // MQTT lock set command.
46
+ hub.controller.mqtt?.subscribeSet(hub.id, "lock", "Lock", (value) => {
47
+ switch (value) {
48
+ case "true":
49
+ void hubDoorLockCommand(hub, true);
50
+ break;
51
+ case "false":
52
+ void hubDoorLockCommand(hub, false);
53
+ break;
54
+ default:
55
+ hub.log.error("MQTT: Unknown lock set message received: %s.", value);
56
+ break;
57
+ }
58
+ });
59
+ // MQTT side door subscriptions (UA Gate only).
60
+ if (hub.hints.hasSideDoor) {
61
+ hub.controller.mqtt?.subscribeGet(hub.id, "sidedoor/lock", "Side Door Lock", () => {
62
+ switch (hub.hkSideDoorLockState) {
63
+ case hub.hap.Characteristic.LockCurrentState.SECURED:
64
+ return "true";
65
+ case hub.hap.Characteristic.LockCurrentState.UNSECURED:
66
+ return "false";
67
+ default:
68
+ return "unknown";
69
+ }
70
+ });
71
+ hub.controller.mqtt?.subscribeSet(hub.id, "sidedoor/lock", "Side Door Lock", (value) => {
72
+ switch (value) {
73
+ case "true":
74
+ void hubDoorLockCommand(hub, true, true);
75
+ break;
76
+ case "false":
77
+ void hubDoorLockCommand(hub, false, true);
78
+ break;
79
+ default:
80
+ hub.log.error("MQTT: Unknown side door lock set message received: %s.", value);
81
+ break;
82
+ }
83
+ });
84
+ // MQTT side door DPS status.
85
+ hub.controller.mqtt?.subscribeGet(hub.id, "sidedoor/dps", "Side door position sensor", () => {
86
+ if (!isSideDoorDpsWired(hub)) {
87
+ return "unknown";
88
+ }
89
+ switch (hub._hkSideDoorDpsState) {
90
+ case hub.hap.Characteristic.ContactSensorState.CONTACT_DETECTED:
91
+ return "false";
92
+ case hub.hap.Characteristic.ContactSensorState.CONTACT_NOT_DETECTED:
93
+ return "true";
94
+ default:
95
+ return "unknown";
96
+ }
97
+ });
98
+ }
99
+ return true;
100
+ }
101
+ // Register hub event bus handlers for MQTT publishing.
102
+ function registerMqttReactions(hub) {
103
+ // Publish lock state changes.
104
+ hub.hubEvents.on("lock:changed", (data) => {
105
+ const topic = data.isSideDoor ? "sidedoor/lock" : "lock";
106
+ hub.controller.mqtt?.publish(hub.id, topic, isLocked(hub, data.value) ? "true" : "false");
107
+ });
108
+ // Publish DPS state changes.
109
+ hub.hubEvents.on("dps:changed", (data) => {
110
+ const topic = data.isSideDoor ? "sidedoor/dps" : "dps";
111
+ const contactDetected = isClosed(hub, data.value);
112
+ hub.controller.mqtt?.publish(hub.id, topic, contactDetected ? "false" : "true");
113
+ });
114
+ // Publish sensor state changes (REL, REN, REX - DPS is handled above).
115
+ hub.hubEvents.on("sensor:changed", (data) => {
116
+ // DPS is handled by the dps:changed event.
117
+ if (data.input === "Dps") {
118
+ return;
119
+ }
120
+ if (!isWired(hub, data.input)) {
121
+ return;
122
+ }
123
+ const contactDetected = isClosed(hub, data.value);
124
+ const topic = terminalInputs.find(t => t.input === data.input)?.topic;
125
+ if (topic) {
126
+ hub.controller.mqtt?.publish(hub.id, topic, contactDetected ? "false" : "true");
127
+ }
128
+ });
129
+ // Publish doorbell state changes.
130
+ hub.hubEvents.on("doorbell:ring", () => {
131
+ hub.controller.mqtt?.publish(hub.id, "doorbell", "true");
132
+ });
133
+ hub.hubEvents.on("doorbell:cancel", () => {
134
+ hub.controller.mqtt?.publish(hub.id, "doorbell", "false");
135
+ });
136
+ }
137
+ //# sourceMappingURL=access-hub-mqtt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"access-hub-mqtt.js","sourceRoot":"","sources":["../../src/hub/access-hub-mqtt.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { AccessHub } from "./access-hub.js";
2
+ export declare function configureServices(hub: AccessHub): void;
3
+ export declare function registerServiceReactions(hub: AccessHub): void;
4
+ export declare function configureTerminalInputs(hub: AccessHub): boolean;