@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.
- package/.claude/settings.local.json +91 -0
- package/CHANGELOG.md +13 -0
- package/LICENSE.md +22 -0
- package/README.md +159 -0
- package/config.schema.json +202 -0
- package/dist/access-controller.d.ts +41 -0
- package/dist/access-controller.js +342 -0
- package/dist/access-controller.js.map +1 -0
- package/dist/access-device-catalog.d.ts +43 -0
- package/dist/access-device-catalog.js +151 -0
- package/dist/access-device-catalog.js.map +1 -0
- package/dist/access-device.d.ts +68 -0
- package/dist/access-device.js +330 -0
- package/dist/access-device.js.map +1 -0
- package/dist/access-events.d.ts +27 -0
- package/dist/access-events.js +152 -0
- package/dist/access-events.js.map +1 -0
- package/dist/access-options.d.ts +32 -0
- package/dist/access-options.js +65 -0
- package/dist/access-options.js.map +1 -0
- package/dist/access-platform.d.ts +15 -0
- package/dist/access-platform.js +74 -0
- package/dist/access-platform.js.map +1 -0
- package/dist/access-types.d.ts +30 -0
- package/dist/access-types.js +42 -0
- package/dist/access-types.js.map +1 -0
- package/dist/hub/access-hub-api.d.ts +13 -0
- package/dist/hub/access-hub-api.js +140 -0
- package/dist/hub/access-hub-api.js.map +1 -0
- package/dist/hub/access-hub-events.d.ts +2 -0
- package/dist/hub/access-hub-events.js +229 -0
- package/dist/hub/access-hub-events.js.map +1 -0
- package/dist/hub/access-hub-mqtt.d.ts +2 -0
- package/dist/hub/access-hub-mqtt.js +137 -0
- package/dist/hub/access-hub-mqtt.js.map +1 -0
- package/dist/hub/access-hub-services.d.ts +4 -0
- package/dist/hub/access-hub-services.js +451 -0
- package/dist/hub/access-hub-services.js.map +1 -0
- package/dist/hub/access-hub-types.d.ts +145 -0
- package/dist/hub/access-hub-types.js +35 -0
- package/dist/hub/access-hub-types.js.map +1 -0
- package/dist/hub/access-hub-utils.d.ts +20 -0
- package/dist/hub/access-hub-utils.js +128 -0
- package/dist/hub/access-hub-utils.js.map +1 -0
- package/dist/hub/access-hub.d.ts +39 -0
- package/dist/hub/access-hub.js +185 -0
- package/dist/hub/access-hub.js.map +1 -0
- package/dist/hub/index.d.ts +4 -0
- package/dist/hub/index.js +7 -0
- package/dist/hub/index.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/settings.d.ts +16 -0
- package/dist/settings.js +49 -0
- package/dist/settings.js.map +1 -0
- package/docs/FeatureOptions.md +120 -0
- package/docs/MQTT.md +116 -0
- package/docs/api_reference.pdf +0 -0
- package/docs/media/homebridge-unifi-access.png +0 -0
- package/docs/media/homebridge-unifi-access.svg +21 -0
- package/eslint.config.mjs +99 -0
- package/homebridge-ui/public/app.js +104 -0
- package/homebridge-ui/public/index.html +267 -0
- package/homebridge-ui/public/modules/constants.js +22 -0
- package/homebridge-ui/public/modules/controllers.js +202 -0
- package/homebridge-ui/public/modules/discovery.js +89 -0
- package/homebridge-ui/public/modules/dom-helpers.js +41 -0
- package/homebridge-ui/public/modules/feature-options.js +625 -0
- package/homebridge-ui/public/modules/state.js +26 -0
- package/homebridge-ui/public/styles.css +533 -0
- package/homebridge-ui/server.js +374 -0
- package/package.json +83 -0
- package/scripts/event-schema-monitor.ts +350 -0
|
@@ -0,0 +1,451 @@
|
|
|
1
|
+
import { AccessReservedNames } from "../access-types.js";
|
|
2
|
+
import { acquireService, validService } from "homebridge-plugin-utils";
|
|
3
|
+
import { GATE_TRANSITION_COOLDOWN_MS, accessMethods, getConfigValue, terminalInputs } from "./access-hub-types.js";
|
|
4
|
+
import { HK_CHARACTERISTIC_REVERT_DELAY_MS } from "../settings.js";
|
|
5
|
+
import { hubDoorLockCommand } from "./access-hub-api.js";
|
|
6
|
+
import { doorServiceType, hasCapability, hubInputState, hubLockState, isClosed, isLocked, isWired } from "./access-hub-utils.js";
|
|
7
|
+
// Configure all HomeKit services on the hub. Called once at device setup.
|
|
8
|
+
export function configureServices(hub) {
|
|
9
|
+
// Configure access method switches, if we're a reader device.
|
|
10
|
+
configureAccessMethodSwitches(hub);
|
|
11
|
+
// Configure the sensors connected to terminal inputs. This must be done before configuring the lock so that the DPS contact sensor exists when configuring a
|
|
12
|
+
// GarageDoorOpener service, which derives its state from the DPS sensor.
|
|
13
|
+
configureTerminalInputs(hub);
|
|
14
|
+
configureSideDoorTerminalInputs(hub);
|
|
15
|
+
// Configure the lock, if we're a hub device.
|
|
16
|
+
configureLock(hub);
|
|
17
|
+
configureLockTrigger(hub, false);
|
|
18
|
+
// Configure the side door lock, if we're a UA Gate device.
|
|
19
|
+
configureSideDoorLock(hub);
|
|
20
|
+
configureLockTrigger(hub, true);
|
|
21
|
+
// Configure the doorbell, if we have one.
|
|
22
|
+
configureDoorbell(hub);
|
|
23
|
+
configureDoorbellTrigger(hub);
|
|
24
|
+
}
|
|
25
|
+
// Register state-change reaction handlers on the hub event bus.
|
|
26
|
+
export function registerServiceReactions(hub) {
|
|
27
|
+
// React to lock state changes by updating the Lock or GarageDoorOpener service.
|
|
28
|
+
hub.hubEvents.on("lock:changed", (data) => {
|
|
29
|
+
const serviceType = data.isSideDoor ? "Lock" : doorServiceType(hub);
|
|
30
|
+
const triggerSubtype = data.isSideDoor ? AccessReservedNames.SWITCH_LOCK_DOOR_SIDE_TRIGGER : AccessReservedNames.SWITCH_LOCK_TRIGGER;
|
|
31
|
+
if (serviceType === "GarageDoorOpener") {
|
|
32
|
+
// For UA Gate, lock trigger only (GarageDoorOpener state is driven by DPS events, not lock events).
|
|
33
|
+
if (hub.catalog.usesLocationApi) {
|
|
34
|
+
hub.accessory.getServiceById(hub.hap.Service.Switch, triggerSubtype)?.updateCharacteristic(hub.hap.Characteristic.On, !isLocked(hub, data.value));
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
// Non-UA Gate hubs: derive GarageDoorOpener state from lock relay.
|
|
38
|
+
const service = hub.accessory.getService(hub.hap.Service.GarageDoorOpener);
|
|
39
|
+
if (service) {
|
|
40
|
+
const doorState = isLocked(hub, data.value) ? hub.hap.Characteristic.CurrentDoorState.CLOSED : hub.hap.Characteristic.CurrentDoorState.OPEN;
|
|
41
|
+
const targetState = isLocked(hub, data.value) ? hub.hap.Characteristic.TargetDoorState.CLOSED : hub.hap.Characteristic.TargetDoorState.OPEN;
|
|
42
|
+
service.updateCharacteristic(hub.hap.Characteristic.TargetDoorState, targetState);
|
|
43
|
+
service.updateCharacteristic(hub.hap.Characteristic.CurrentDoorState, doorState);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
// Lock service update.
|
|
48
|
+
const service = data.isSideDoor ? hub.accessory.getServiceById(hub.hap.Service.LockMechanism, AccessReservedNames.LOCK_DOOR_SIDE) :
|
|
49
|
+
hub.accessory.getService(hub.hap.Service.LockMechanism);
|
|
50
|
+
if (service) {
|
|
51
|
+
service.updateCharacteristic(hub.hap.Characteristic.LockTargetState, isLocked(hub, data.value) ?
|
|
52
|
+
hub.hap.Characteristic.LockTargetState.SECURED : hub.hap.Characteristic.LockTargetState.UNSECURED);
|
|
53
|
+
service.updateCharacteristic(hub.hap.Characteristic.LockCurrentState, data.value);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
// Update the lock trigger switch if enabled.
|
|
57
|
+
hub.accessory.getServiceById(hub.hap.Service.Switch, triggerSubtype)?.updateCharacteristic(hub.hap.Characteristic.On, !isLocked(hub, data.value));
|
|
58
|
+
// Log lock state changes.
|
|
59
|
+
if (hub.hints.logLock) {
|
|
60
|
+
if (data.isSideDoor) {
|
|
61
|
+
hub.log.info("Side door %s.", isLocked(hub, data.value) ? "locked" : "unlocked");
|
|
62
|
+
}
|
|
63
|
+
else if (hub.catalog.usesLocationApi) {
|
|
64
|
+
hub.log.info("Gate %s.", isLocked(hub, data.value) ? "locked" : "unlocked");
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
hub.log.info(isLocked(hub, data.value) ? "Locked." : "Unlocked.");
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
// React to DPS state changes by updating the GarageDoorOpener (UA Gate only).
|
|
72
|
+
hub.hubEvents.on("dps:changed", (data) => {
|
|
73
|
+
// Log DPS state changes.
|
|
74
|
+
if (hub.hints.logDps) {
|
|
75
|
+
hub.log.info("%s position sensor %s.", data.isSideDoor ? "Side door" : "Door", isClosed(hub, data.value) ? "closed" : "open");
|
|
76
|
+
}
|
|
77
|
+
if (doorServiceType(hub) !== "GarageDoorOpener" || !hub.catalog.usesLocationApi) {
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
// Check transition cooldown to let the gate stabilize during movement.
|
|
81
|
+
const transitionUntil = data.isSideDoor ? hub.sideDoorGateTransitionUntil : hub.gateTransitionUntil;
|
|
82
|
+
if (Date.now() < transitionUntil) {
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
const service = hub.accessory.getService(hub.hap.Service.GarageDoorOpener);
|
|
86
|
+
if (service) {
|
|
87
|
+
const doorState = data.value === hub.hap.Characteristic.ContactSensorState.CONTACT_DETECTED ?
|
|
88
|
+
hub.hap.Characteristic.CurrentDoorState.CLOSED : hub.hap.Characteristic.CurrentDoorState.OPEN;
|
|
89
|
+
const targetState = data.value === hub.hap.Characteristic.ContactSensorState.CONTACT_DETECTED ?
|
|
90
|
+
hub.hap.Characteristic.TargetDoorState.CLOSED : hub.hap.Characteristic.TargetDoorState.OPEN;
|
|
91
|
+
service.updateCharacteristic(hub.hap.Characteristic.TargetDoorState, targetState);
|
|
92
|
+
service.updateCharacteristic(hub.hap.Characteristic.CurrentDoorState, doorState);
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
// React to doorbell ring events by updating the doorbell trigger switch.
|
|
96
|
+
hub.hubEvents.on("doorbell:ring", () => {
|
|
97
|
+
hub.accessory.getServiceById(hub.hap.Service.Switch, AccessReservedNames.SWITCH_DOORBELL_TRIGGER)?.updateCharacteristic(hub.hap.Characteristic.On, true);
|
|
98
|
+
});
|
|
99
|
+
// React to doorbell cancel events by updating the doorbell trigger switch.
|
|
100
|
+
hub.hubEvents.on("doorbell:cancel", () => {
|
|
101
|
+
hub.accessory.getServiceById(hub.hap.Service.Switch, AccessReservedNames.SWITCH_DOORBELL_TRIGGER)?.updateCharacteristic(hub.hap.Characteristic.On, false);
|
|
102
|
+
});
|
|
103
|
+
// Log sensor state changes (REL, REN, REX - DPS is logged by dps:changed).
|
|
104
|
+
hub.hubEvents.on("sensor:changed", (data) => {
|
|
105
|
+
// DPS logging is handled by the dps:changed handler.
|
|
106
|
+
if (data.input === "Dps") {
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
if (!isWired(hub, data.input)) {
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
const logKey = ("log" + data.input);
|
|
113
|
+
const label = terminalInputs.find(t => t.input === data.input)?.label;
|
|
114
|
+
if (label && hub.hints[logKey]) {
|
|
115
|
+
hub.log.info("%s %s.", label, isClosed(hub, data.value) ? "closed" : "open");
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
// React to device online status changes by updating contact sensor StatusActive.
|
|
119
|
+
hub.hubEvents.on("device:online", (data) => {
|
|
120
|
+
for (const sensor of Object.keys(AccessReservedNames).filter(key => key.startsWith("CONTACT_"))) {
|
|
121
|
+
hub.accessory.getServiceById(hub.hap.Service.ContactSensor, AccessReservedNames[sensor])?.
|
|
122
|
+
updateCharacteristic(hub.hap.Characteristic.StatusActive, data.isOnline);
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
// Configure the access method switches for HomeKit.
|
|
127
|
+
function configureAccessMethodSwitches(hub) {
|
|
128
|
+
for (const accessMethod of accessMethods) {
|
|
129
|
+
// Validate whether we should have this service enabled.
|
|
130
|
+
if (!validService(hub.accessory, hub.hap.Service.Switch, hasCapability(hub, "is_reader") && hasCapability(hub, accessMethod.capability) && hub.hasFeature(accessMethod.option), accessMethod.subtype)) {
|
|
131
|
+
continue;
|
|
132
|
+
}
|
|
133
|
+
// Acquire the service.
|
|
134
|
+
const service = acquireService(hub.accessory, hub.hap.Service.Switch, hub.accessoryName + " " + accessMethod.name, accessMethod.subtype);
|
|
135
|
+
if (!service) {
|
|
136
|
+
hub.log.error("Unable to add the %s access method switch.", accessMethod.name);
|
|
137
|
+
continue;
|
|
138
|
+
}
|
|
139
|
+
// Retrieve the state when requested.
|
|
140
|
+
service.getCharacteristic(hub.hap.Characteristic.On).onGet(() => getConfigValue(hub.uda.configs, accessMethod.key) === "yes");
|
|
141
|
+
// Set the state when requested.
|
|
142
|
+
service.getCharacteristic(hub.hap.Characteristic.On).onSet(async (value) => {
|
|
143
|
+
const entry = getConfigValue(hub.uda.configs, accessMethod.key);
|
|
144
|
+
const isConfigsApi = hub.catalog.usesConfigsApi;
|
|
145
|
+
let success;
|
|
146
|
+
if (entry) {
|
|
147
|
+
const endpoint = isConfigsApi ? "/configs?is_camera=true" : "/settings";
|
|
148
|
+
const keys = (isConfigsApi && ("configsApiKeys" in accessMethod)) ? accessMethod.configsApiKeys : [accessMethod.key];
|
|
149
|
+
const payload = keys.map(key => ({ key: key, tag: "open_door_mode", value: value ? "yes" : "no" }));
|
|
150
|
+
const response = await hub.controller.udaApi.retrieve(hub.controller.udaApi.getApiEndpoint("device") + "/" + hub.uda.unique_id + endpoint, {
|
|
151
|
+
body: JSON.stringify(payload),
|
|
152
|
+
method: "PUT"
|
|
153
|
+
});
|
|
154
|
+
success = hub.controller.udaApi.responseOk(response?.statusCode);
|
|
155
|
+
}
|
|
156
|
+
// If we didn't find the configuration entry or we didn't succeed in setting the value, revert our switch state.
|
|
157
|
+
if (!success) {
|
|
158
|
+
hub.log.error("Unable to %s the %s access method.", value ? "activate" : "deactivate", accessMethod.name);
|
|
159
|
+
setTimeout(() => service.updateCharacteristic(hub.hap.Characteristic.On, !value), HK_CHARACTERISTIC_REVERT_DELAY_MS);
|
|
160
|
+
}
|
|
161
|
+
});
|
|
162
|
+
// Initialize the switch.
|
|
163
|
+
service.updateCharacteristic(hub.hap.Characteristic.On, getConfigValue(hub.uda.configs, accessMethod.key) === "yes");
|
|
164
|
+
}
|
|
165
|
+
return true;
|
|
166
|
+
}
|
|
167
|
+
// Configure the doorbell service for HomeKit.
|
|
168
|
+
function configureDoorbell(hub) {
|
|
169
|
+
// Validate whether we should have this service enabled.
|
|
170
|
+
if (!validService(hub.accessory, hub.hap.Service.Doorbell, hasCapability(hub, "door_bell") && hub.hasFeature("Hub.Doorbell"))) {
|
|
171
|
+
return false;
|
|
172
|
+
}
|
|
173
|
+
// Acquire the service.
|
|
174
|
+
const service = acquireService(hub.accessory, hub.hap.Service.Doorbell, hub.accessoryName, undefined, () => hub.log.info("Enabling the doorbell."));
|
|
175
|
+
if (!service) {
|
|
176
|
+
hub.log.error("Unable to add the doorbell.");
|
|
177
|
+
return false;
|
|
178
|
+
}
|
|
179
|
+
service.setPrimaryService(true);
|
|
180
|
+
return true;
|
|
181
|
+
}
|
|
182
|
+
// Configure a switch to manually trigger a doorbell ring event for HomeKit.
|
|
183
|
+
function configureDoorbellTrigger(hub) {
|
|
184
|
+
// Validate whether we should have this service enabled.
|
|
185
|
+
if (!validService(hub.accessory, hub.hap.Service.Switch, hasCapability(hub, "door_bell") && hub.hasFeature("Hub.Doorbell.Trigger"), AccessReservedNames.SWITCH_DOORBELL_TRIGGER)) {
|
|
186
|
+
return false;
|
|
187
|
+
}
|
|
188
|
+
// Acquire the service.
|
|
189
|
+
const service = acquireService(hub.accessory, hub.hap.Service.Switch, hub.accessoryName + " Doorbell Trigger", AccessReservedNames.SWITCH_DOORBELL_TRIGGER, () => hub.log.info("Enabling the doorbell automation trigger."));
|
|
190
|
+
if (!service) {
|
|
191
|
+
hub.log.error("Unable to add the doorbell automation trigger.");
|
|
192
|
+
return false;
|
|
193
|
+
}
|
|
194
|
+
// Trigger the doorbell.
|
|
195
|
+
service.getCharacteristic(hub.hap.Characteristic.On).onGet(() => hub.doorbellRingRequestId !== null);
|
|
196
|
+
// The state isn't really user-triggerable. We have no way, currently, to trigger a ring event on the hub.
|
|
197
|
+
service.getCharacteristic(hub.hap.Characteristic.On).onSet(() => {
|
|
198
|
+
setTimeout(() => service.updateCharacteristic(hub.hap.Characteristic.On, hub.doorbellRingRequestId !== null), HK_CHARACTERISTIC_REVERT_DELAY_MS);
|
|
199
|
+
});
|
|
200
|
+
// Initialize the switch.
|
|
201
|
+
service.updateCharacteristic(hub.hap.Characteristic.ConfiguredName, hub.accessoryName + " Doorbell Trigger");
|
|
202
|
+
service.updateCharacteristic(hub.hap.Characteristic.On, false);
|
|
203
|
+
return true;
|
|
204
|
+
}
|
|
205
|
+
// Configure contact sensors for HomeKit. Availability is determined by a combination of hub model, what's been configured on the hub, and feature options.
|
|
206
|
+
export function configureTerminalInputs(hub) {
|
|
207
|
+
for (const { input, label } of terminalInputs) {
|
|
208
|
+
const hint = ("hasWiring" + input);
|
|
209
|
+
const reservedId = AccessReservedNames[("CONTACT_" + input.toUpperCase())];
|
|
210
|
+
// Validate whether we should have this service enabled.
|
|
211
|
+
if (!validService(hub.accessory, hub.hap.Service.ContactSensor, (hasService) => {
|
|
212
|
+
if (!hub.hints[hint] && hasService) {
|
|
213
|
+
hub.log.info("Disabling the " + label.toLowerCase() + ".");
|
|
214
|
+
}
|
|
215
|
+
return hub.hints[hint];
|
|
216
|
+
}, reservedId)) {
|
|
217
|
+
continue;
|
|
218
|
+
}
|
|
219
|
+
// Acquire the service.
|
|
220
|
+
const service = acquireService(hub.accessory, hub.hap.Service.ContactSensor, hub.accessoryName + " " + label, reservedId, () => hub.log.info("Enabling the " + label.toLowerCase() + "."));
|
|
221
|
+
if (!service) {
|
|
222
|
+
hub.log.error("Unable to add the " + label.toLowerCase() + ".");
|
|
223
|
+
continue;
|
|
224
|
+
}
|
|
225
|
+
// Initialize the sensor state.
|
|
226
|
+
service.updateCharacteristic(hub.hap.Characteristic.ContactSensorState, hubInputState(hub, input));
|
|
227
|
+
service.updateCharacteristic(hub.hap.Characteristic.StatusActive, !!hub.uda.is_online);
|
|
228
|
+
configureTamperDetection(hub, service);
|
|
229
|
+
}
|
|
230
|
+
return true;
|
|
231
|
+
}
|
|
232
|
+
// Configure contact sensors for the side door terminal inputs on UA Gate hubs.
|
|
233
|
+
function configureSideDoorTerminalInputs(hub) {
|
|
234
|
+
// We only configure side door terminal inputs for UA Gate hubs that have the side door enabled.
|
|
235
|
+
if (!hub.hints.hasSideDoor) {
|
|
236
|
+
return false;
|
|
237
|
+
}
|
|
238
|
+
// Validate whether we should have this service enabled. We check the hasWiringSideDoorDps hint which already incorporates the feature option check.
|
|
239
|
+
if (!validService(hub.accessory, hub.hap.Service.ContactSensor, (hasService) => {
|
|
240
|
+
if (!hub.hints.hasWiringSideDoorDps && hasService) {
|
|
241
|
+
hub.log.info("Disabling the side door position sensor.");
|
|
242
|
+
}
|
|
243
|
+
return hub.hints.hasWiringSideDoorDps;
|
|
244
|
+
}, AccessReservedNames.CONTACT_DPS_SIDE)) {
|
|
245
|
+
return false;
|
|
246
|
+
}
|
|
247
|
+
// Acquire the service.
|
|
248
|
+
const service = acquireService(hub.accessory, hub.hap.Service.ContactSensor, hub.accessoryName + " Side Door Position Sensor", AccessReservedNames.CONTACT_DPS_SIDE, () => hub.log.info("Enabling the side door position sensor."));
|
|
249
|
+
if (!service) {
|
|
250
|
+
hub.log.error("Unable to add the side door position sensor.");
|
|
251
|
+
return false;
|
|
252
|
+
}
|
|
253
|
+
// Initialize the sensor state from the current side door DPS state.
|
|
254
|
+
service.updateCharacteristic(hub.hap.Characteristic.ContactSensorState, hub._hkSideDoorDpsState);
|
|
255
|
+
service.updateCharacteristic(hub.hap.Characteristic.StatusActive, !!hub.uda.is_online);
|
|
256
|
+
configureTamperDetection(hub, service);
|
|
257
|
+
return true;
|
|
258
|
+
}
|
|
259
|
+
// Configure the door for HomeKit. Supports Lock and GarageDoorOpener service types.
|
|
260
|
+
function configureLock(hub) {
|
|
261
|
+
const currentServiceType = doorServiceType(hub);
|
|
262
|
+
// First, remove any previous service types that are no longer selected.
|
|
263
|
+
const serviceTypes = [hub.hap.Service.LockMechanism, hub.hap.Service.GarageDoorOpener];
|
|
264
|
+
const selectedService = currentServiceType === "GarageDoorOpener" ? hub.hap.Service.GarageDoorOpener : hub.hap.Service.LockMechanism;
|
|
265
|
+
for (const serviceType of serviceTypes) {
|
|
266
|
+
if (serviceType !== selectedService) {
|
|
267
|
+
const oldService = hub.accessory.getService(serviceType);
|
|
268
|
+
if (oldService) {
|
|
269
|
+
hub.accessory.removeService(oldService);
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
// Validate whether we should have this service enabled.
|
|
274
|
+
if (!validService(hub.accessory, selectedService, hasCapability(hub, "is_hub"))) {
|
|
275
|
+
return false;
|
|
276
|
+
}
|
|
277
|
+
// Acquire the service.
|
|
278
|
+
const service = acquireService(hub.accessory, selectedService, hub.accessoryName, undefined, () => hub.log.info("Configuring door as %s service.", currentServiceType));
|
|
279
|
+
if (!service) {
|
|
280
|
+
hub.log.error("Unable to add the door.");
|
|
281
|
+
return false;
|
|
282
|
+
}
|
|
283
|
+
// Configure based on service type.
|
|
284
|
+
if (currentServiceType === "GarageDoorOpener") {
|
|
285
|
+
configureGarageDoorService(hub, service, false);
|
|
286
|
+
}
|
|
287
|
+
else {
|
|
288
|
+
configureLockService(hub, service, false);
|
|
289
|
+
}
|
|
290
|
+
// Initialize the state.
|
|
291
|
+
hub._hkLockState = -1;
|
|
292
|
+
service.displayName = hub.accessoryName;
|
|
293
|
+
service.updateCharacteristic(hub.hap.Characteristic.Name, hub.accessoryName);
|
|
294
|
+
hub.hkLockState = hubLockState(hub);
|
|
295
|
+
service.setPrimaryService(true);
|
|
296
|
+
return true;
|
|
297
|
+
}
|
|
298
|
+
// Configure a LockMechanism service.
|
|
299
|
+
function configureLockService(hub, service, isSideDoor) {
|
|
300
|
+
if (!service) {
|
|
301
|
+
return;
|
|
302
|
+
}
|
|
303
|
+
const lockStateGetter = isSideDoor ? () => hub.hkSideDoorLockState : () => hub.hkLockState;
|
|
304
|
+
const lockCommand = async (lock) => hubDoorLockCommand(hub, lock, isSideDoor);
|
|
305
|
+
service.getCharacteristic(hub.hap.Characteristic.LockCurrentState).onGet(lockStateGetter);
|
|
306
|
+
service.getCharacteristic(hub.hap.Characteristic.LockTargetState).onGet(lockStateGetter);
|
|
307
|
+
service.getCharacteristic(hub.hap.Characteristic.LockTargetState).onSet(async (value) => {
|
|
308
|
+
// Check if this is just syncing state from an event (current state already matches target).
|
|
309
|
+
const currentState = lockStateGetter();
|
|
310
|
+
const targetLocked = value === hub.hap.Characteristic.LockTargetState.SECURED;
|
|
311
|
+
const currentlyLocked = isLocked(hub, currentState);
|
|
312
|
+
// If state already matches, this is just a sync from an event - don't send command.
|
|
313
|
+
if (targetLocked === currentlyLocked) {
|
|
314
|
+
return;
|
|
315
|
+
}
|
|
316
|
+
if (!(await lockCommand(targetLocked))) {
|
|
317
|
+
setTimeout(() => service.updateCharacteristic(hub.hap.Characteristic.LockTargetState, currentlyLocked ? hub.hap.Characteristic.LockTargetState.SECURED : hub.hap.Characteristic.LockTargetState.UNSECURED), HK_CHARACTERISTIC_REVERT_DELAY_MS);
|
|
318
|
+
}
|
|
319
|
+
service.updateCharacteristic(hub.hap.Characteristic.LockCurrentState, lockStateGetter());
|
|
320
|
+
});
|
|
321
|
+
}
|
|
322
|
+
// Configure a GarageDoorOpener service.
|
|
323
|
+
function configureGarageDoorService(hub, service, isSideDoor) {
|
|
324
|
+
if (!service) {
|
|
325
|
+
return;
|
|
326
|
+
}
|
|
327
|
+
// For devices using the location API, we use unlock/trigger command for both open and close operations.
|
|
328
|
+
const isUaGate = hub.catalog.usesLocationApi;
|
|
329
|
+
// Determine the current door state.
|
|
330
|
+
const getDoorState = () => {
|
|
331
|
+
if (isUaGate) {
|
|
332
|
+
const dpsState = isSideDoor ? hub._hkSideDoorDpsState : hub.hkDpsState;
|
|
333
|
+
return dpsState === hub.hap.Characteristic.ContactSensorState.CONTACT_DETECTED ? hub.hap.Characteristic.CurrentDoorState.CLOSED :
|
|
334
|
+
hub.hap.Characteristic.CurrentDoorState.OPEN;
|
|
335
|
+
}
|
|
336
|
+
// Non-UA Gate hubs: derive from lock relay state.
|
|
337
|
+
const lockState = isSideDoor ? hub.hkSideDoorLockState : hub.hkLockState;
|
|
338
|
+
return isLocked(hub, lockState) ? hub.hap.Characteristic.CurrentDoorState.CLOSED : hub.hap.Characteristic.CurrentDoorState.OPEN;
|
|
339
|
+
};
|
|
340
|
+
service.getCharacteristic(hub.hap.Characteristic.CurrentDoorState).onGet(getDoorState);
|
|
341
|
+
service.getCharacteristic(hub.hap.Characteristic.TargetDoorState).onSet(async (value) => {
|
|
342
|
+
const shouldClose = value === hub.hap.Characteristic.TargetDoorState.CLOSED;
|
|
343
|
+
// UA Gate uses a single trigger command that toggles the motorized gate.
|
|
344
|
+
if (isUaGate) {
|
|
345
|
+
// Set a transition cooldown to prevent WebSocket events from immediately reverting the door state.
|
|
346
|
+
if (isSideDoor) {
|
|
347
|
+
hub.sideDoorGateTransitionUntil = Date.now() + GATE_TRANSITION_COOLDOWN_MS;
|
|
348
|
+
}
|
|
349
|
+
else {
|
|
350
|
+
hub.gateTransitionUntil = Date.now() + GATE_TRANSITION_COOLDOWN_MS;
|
|
351
|
+
}
|
|
352
|
+
// Immediately show transitional state (Opening/Closing) while the door moves.
|
|
353
|
+
service.updateCharacteristic(hub.hap.Characteristic.CurrentDoorState, shouldClose ? hub.hap.Characteristic.CurrentDoorState.CLOSING :
|
|
354
|
+
hub.hap.Characteristic.CurrentDoorState.OPENING);
|
|
355
|
+
// Trigger the gate.
|
|
356
|
+
if (!(await hubDoorLockCommand(hub, false, isSideDoor))) {
|
|
357
|
+
// Clear the transition cooldown on failure.
|
|
358
|
+
if (isSideDoor) {
|
|
359
|
+
hub.sideDoorGateTransitionUntil = 0;
|
|
360
|
+
}
|
|
361
|
+
else {
|
|
362
|
+
hub.gateTransitionUntil = 0;
|
|
363
|
+
}
|
|
364
|
+
// Revert target state on failure.
|
|
365
|
+
setTimeout(() => {
|
|
366
|
+
service.updateCharacteristic(hub.hap.Characteristic.TargetDoorState, shouldClose ? hub.hap.Characteristic.TargetDoorState.OPEN : hub.hap.Characteristic.TargetDoorState.CLOSED);
|
|
367
|
+
service.updateCharacteristic(hub.hap.Characteristic.CurrentDoorState, getDoorState());
|
|
368
|
+
}, HK_CHARACTERISTIC_REVERT_DELAY_MS);
|
|
369
|
+
}
|
|
370
|
+
// The DPS sensor event will update the CurrentDoorState when the gate finishes moving.
|
|
371
|
+
return;
|
|
372
|
+
}
|
|
373
|
+
// Non-UA Gate hubs: use lock/unlock commands directly.
|
|
374
|
+
if (!(await hubDoorLockCommand(hub, shouldClose, isSideDoor))) {
|
|
375
|
+
// Revert target state on failure.
|
|
376
|
+
setTimeout(() => {
|
|
377
|
+
service.updateCharacteristic(hub.hap.Characteristic.TargetDoorState, shouldClose ? hub.hap.Characteristic.TargetDoorState.OPEN : hub.hap.Characteristic.TargetDoorState.CLOSED);
|
|
378
|
+
service.updateCharacteristic(hub.hap.Characteristic.CurrentDoorState, getDoorState());
|
|
379
|
+
}, HK_CHARACTERISTIC_REVERT_DELAY_MS);
|
|
380
|
+
}
|
|
381
|
+
});
|
|
382
|
+
// ObstructionDetected is required - we always report no obstruction.
|
|
383
|
+
service.getCharacteristic(hub.hap.Characteristic.ObstructionDetected).onGet(() => false);
|
|
384
|
+
}
|
|
385
|
+
// Configure a switch to automate lock and unlock events in HomeKit.
|
|
386
|
+
function configureLockTrigger(hub, isSideDoor) {
|
|
387
|
+
const condition = isSideDoor
|
|
388
|
+
? hub.hints.hasSideDoor && hub.hasFeature("Hub.SideDoor.Lock.Trigger")
|
|
389
|
+
: hasCapability(hub, "is_hub") && hub.hasFeature("Hub.Lock.Trigger");
|
|
390
|
+
const subtype = isSideDoor ? AccessReservedNames.SWITCH_LOCK_DOOR_SIDE_TRIGGER : AccessReservedNames.SWITCH_LOCK_TRIGGER;
|
|
391
|
+
const label = isSideDoor ? "Side Door Lock Trigger" : "Lock Trigger";
|
|
392
|
+
const logLabel = isSideDoor ? "side door lock automation trigger" : "lock automation trigger";
|
|
393
|
+
// Validate whether we should have this service enabled.
|
|
394
|
+
if (!validService(hub.accessory, hub.hap.Service.Switch, condition, subtype)) {
|
|
395
|
+
return false;
|
|
396
|
+
}
|
|
397
|
+
// Acquire the service.
|
|
398
|
+
const service = acquireService(hub.accessory, hub.hap.Service.Switch, hub.accessoryName + " " + label, subtype, () => hub.log.info("Enabling the %s.", logLabel));
|
|
399
|
+
if (!service) {
|
|
400
|
+
hub.log.error("Unable to add the %s.", logLabel);
|
|
401
|
+
return false;
|
|
402
|
+
}
|
|
403
|
+
// Return the lock state.
|
|
404
|
+
service.getCharacteristic(hub.hap.Characteristic.On)
|
|
405
|
+
.onGet(() => !isLocked(hub, isSideDoor ? hub.hkSideDoorLockState : hub.hkLockState));
|
|
406
|
+
// The state isn't really user-triggerable.
|
|
407
|
+
service.getCharacteristic(hub.hap.Characteristic.On).onSet(async (value) => {
|
|
408
|
+
// If we are on, we are in an unlocked state. If we are off, we are in a locked state.
|
|
409
|
+
if (!(await hubDoorLockCommand(hub, !value, isSideDoor))) {
|
|
410
|
+
// Revert our state.
|
|
411
|
+
setTimeout(() => service.updateCharacteristic(hub.hap.Characteristic.On, !value), HK_CHARACTERISTIC_REVERT_DELAY_MS);
|
|
412
|
+
}
|
|
413
|
+
});
|
|
414
|
+
// Initialize the switch.
|
|
415
|
+
service.updateCharacteristic(hub.hap.Characteristic.ConfiguredName, hub.accessoryName + " " + label);
|
|
416
|
+
service.updateCharacteristic(hub.hap.Characteristic.On, false);
|
|
417
|
+
return true;
|
|
418
|
+
}
|
|
419
|
+
// Configure the side door for HomeKit (UA Gate only) - always uses Lock service.
|
|
420
|
+
function configureSideDoorLock(hub) {
|
|
421
|
+
// Validate whether we should have this service enabled.
|
|
422
|
+
if (!validService(hub.accessory, hub.hap.Service.LockMechanism, hub.hints.hasSideDoor, AccessReservedNames.LOCK_DOOR_SIDE)) {
|
|
423
|
+
return false;
|
|
424
|
+
}
|
|
425
|
+
// Acquire the service.
|
|
426
|
+
const service = acquireService(hub.accessory, hub.hap.Service.LockMechanism, hub.accessoryName + " Side Door", AccessReservedNames.LOCK_DOOR_SIDE, () => hub.log.info("Configuring side door lock."));
|
|
427
|
+
if (!service) {
|
|
428
|
+
hub.log.error("Unable to add the side door.");
|
|
429
|
+
return false;
|
|
430
|
+
}
|
|
431
|
+
// Configure the lock service.
|
|
432
|
+
configureLockService(hub, service, true);
|
|
433
|
+
// Initialize the lock.
|
|
434
|
+
hub._hkSideDoorLockState = -1;
|
|
435
|
+
service.displayName = hub.accessoryName + " Side Door";
|
|
436
|
+
service.updateCharacteristic(hub.hap.Characteristic.Name, hub.accessoryName + " Side Door");
|
|
437
|
+
hub.hkSideDoorLockState = hubLockState(hub, true);
|
|
438
|
+
return true;
|
|
439
|
+
}
|
|
440
|
+
// Configure tamper detection on a contact sensor service if the hub supports it.
|
|
441
|
+
function configureTamperDetection(hub, service) {
|
|
442
|
+
if (!service || !hasCapability(hub, "tamper_proofing")) {
|
|
443
|
+
return;
|
|
444
|
+
}
|
|
445
|
+
const tamperedEntry = getConfigValue(hub.uda.configs, "tamper_event");
|
|
446
|
+
if (tamperedEntry) {
|
|
447
|
+
service.updateCharacteristic(hub.hap.Characteristic.StatusTampered, (tamperedEntry === "true") ? hub.hap.Characteristic.StatusTampered.TAMPERED :
|
|
448
|
+
hub.hap.Characteristic.StatusTampered.NOT_TAMPERED);
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
//# sourceMappingURL=access-hub-services.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"access-hub-services.js","sourceRoot":"","sources":["../../src/hub/access-hub-services.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import type { AccessHints } from "../access-device.js";
|
|
2
|
+
import { AccessReservedNames } from "../access-types.js";
|
|
3
|
+
import type { CharacteristicValue } from "homebridge";
|
|
4
|
+
import type { SensorInput } from "../access-device-catalog.js";
|
|
5
|
+
export declare const accessMethods: readonly [{
|
|
6
|
+
readonly capability: "identity_face_unlock";
|
|
7
|
+
readonly key: "face";
|
|
8
|
+
readonly name: "Face Unlock";
|
|
9
|
+
readonly option: "AccessMethod.Face";
|
|
10
|
+
readonly subtype: AccessReservedNames.SWITCH_ACCESSMETHOD_FACE;
|
|
11
|
+
}, {
|
|
12
|
+
readonly capability: "hand_wave";
|
|
13
|
+
readonly key: "wave";
|
|
14
|
+
readonly name: "Hand Wave";
|
|
15
|
+
readonly option: "AccessMethod.Hand";
|
|
16
|
+
readonly subtype: AccessReservedNames.SWITCH_ACCESSMETHOD_HAND;
|
|
17
|
+
}, {
|
|
18
|
+
readonly capability: readonly ["mobile_unlock_ver2", "support_mobile_unlock"];
|
|
19
|
+
readonly configsApiKeys: readonly ["bt", "bt_button", "bt_tap"];
|
|
20
|
+
readonly key: "bt_button";
|
|
21
|
+
readonly name: "Mobile";
|
|
22
|
+
readonly option: "AccessMethod.Mobile";
|
|
23
|
+
readonly subtype: AccessReservedNames.SWITCH_ACCESSMETHOD_MOBILE;
|
|
24
|
+
}, {
|
|
25
|
+
readonly capability: "nfc_card_easy_provision";
|
|
26
|
+
readonly key: "nfc";
|
|
27
|
+
readonly name: "NFC";
|
|
28
|
+
readonly option: "AccessMethod.NFC";
|
|
29
|
+
readonly subtype: AccessReservedNames.SWITCH_ACCESSMETHOD_NFC;
|
|
30
|
+
}, {
|
|
31
|
+
readonly capability: "pin_code";
|
|
32
|
+
readonly key: "pin_code";
|
|
33
|
+
readonly name: "PIN";
|
|
34
|
+
readonly option: "AccessMethod.PIN";
|
|
35
|
+
readonly subtype: AccessReservedNames.SWITCH_ACCESSMETHOD_PIN;
|
|
36
|
+
}, {
|
|
37
|
+
readonly capability: "qr_code";
|
|
38
|
+
readonly key: "qr_code";
|
|
39
|
+
readonly name: "QR Code";
|
|
40
|
+
readonly option: "AccessMethod.QR";
|
|
41
|
+
readonly subtype: AccessReservedNames.SWITCH_ACCESSMETHOD_QR;
|
|
42
|
+
}, {
|
|
43
|
+
readonly capability: "support_apple_pass";
|
|
44
|
+
readonly key: "apple_pass";
|
|
45
|
+
readonly name: "TouchPass";
|
|
46
|
+
readonly option: "AccessMethod.TouchPass";
|
|
47
|
+
readonly subtype: AccessReservedNames.SWITCH_ACCESSMETHOD_TOUCHPASS;
|
|
48
|
+
}];
|
|
49
|
+
export type AccessMethodKey = typeof accessMethods[number]["key"];
|
|
50
|
+
export interface AccessEventDeviceUpdateV2 {
|
|
51
|
+
access_method?: {
|
|
52
|
+
[K in AccessMethodKey]?: "yes" | "no";
|
|
53
|
+
};
|
|
54
|
+
location_states?: {
|
|
55
|
+
dps: "open" | "close";
|
|
56
|
+
dps_connected: boolean;
|
|
57
|
+
emergency?: Record<string, unknown>;
|
|
58
|
+
enable: boolean;
|
|
59
|
+
hub_gate_door_mode?: string;
|
|
60
|
+
is_unavailable: boolean;
|
|
61
|
+
location_id: string;
|
|
62
|
+
lock: "locked" | "unlocked";
|
|
63
|
+
manually_action_button_number?: number;
|
|
64
|
+
}[];
|
|
65
|
+
}
|
|
66
|
+
export declare const sensorInputs: readonly SensorInput[];
|
|
67
|
+
export type AccessHubHKProps = {
|
|
68
|
+
[K in `hk${SensorInput}State` as K extends "hkDpsState" ? never : K]: CharacteristicValue;
|
|
69
|
+
};
|
|
70
|
+
export type AccessHubWiredProps = {
|
|
71
|
+
[P in `is${SensorInput}Wired`]: boolean;
|
|
72
|
+
};
|
|
73
|
+
export type KeyOf<T, Prefix extends string, Suffix extends string = ""> = Extract<keyof T, `${Prefix}${SensorInput}${Suffix}`>;
|
|
74
|
+
export type HasWiringHintKey = KeyOf<AccessHints, "hasWiring">;
|
|
75
|
+
export type LogHintKey = KeyOf<AccessHints, "log">;
|
|
76
|
+
export type DoorServiceType = "Lock" | "GarageDoorOpener";
|
|
77
|
+
export declare const AUTO_LOCK_DELAY_MS = 5000;
|
|
78
|
+
export declare const GATE_TRANSITION_COOLDOWN_MS = 5000;
|
|
79
|
+
export declare function getConfigValue(configs: {
|
|
80
|
+
key: string;
|
|
81
|
+
value: string;
|
|
82
|
+
}[] | undefined, key: string): string | undefined;
|
|
83
|
+
export declare function areWiringKeysActive(configs: {
|
|
84
|
+
key: string;
|
|
85
|
+
value: string;
|
|
86
|
+
}[] | undefined, wiringKeys: string[]): boolean;
|
|
87
|
+
export declare const REX_BUTTON_MODE_CONFIG_KEY = "rex_button_mode";
|
|
88
|
+
export declare const terminalInputs: readonly {
|
|
89
|
+
input: SensorInput;
|
|
90
|
+
label: string;
|
|
91
|
+
topic: string;
|
|
92
|
+
}[];
|
|
93
|
+
export interface AccessEventLocationDataUpdate {
|
|
94
|
+
extras?: Record<string, unknown>;
|
|
95
|
+
extra_type?: string;
|
|
96
|
+
full_name?: string;
|
|
97
|
+
level?: number;
|
|
98
|
+
location_type?: string;
|
|
99
|
+
name: string;
|
|
100
|
+
previous_name?: string;
|
|
101
|
+
timezone?: string;
|
|
102
|
+
unique_id: string;
|
|
103
|
+
up_id?: string;
|
|
104
|
+
work_time?: string;
|
|
105
|
+
work_time_id?: string;
|
|
106
|
+
}
|
|
107
|
+
export interface AccessEventLocationUpdate {
|
|
108
|
+
device_ids?: string[];
|
|
109
|
+
extras?: Record<string, unknown>;
|
|
110
|
+
id: string;
|
|
111
|
+
last_activity?: number;
|
|
112
|
+
location_type?: string;
|
|
113
|
+
name: string;
|
|
114
|
+
state?: {
|
|
115
|
+
dps: "open" | "close";
|
|
116
|
+
dps_connected?: boolean;
|
|
117
|
+
enable?: boolean;
|
|
118
|
+
is_unavailable?: boolean;
|
|
119
|
+
lock: "locked" | "unlocked";
|
|
120
|
+
};
|
|
121
|
+
thumbnail?: Record<string, unknown>;
|
|
122
|
+
up_id?: string;
|
|
123
|
+
}
|
|
124
|
+
export interface HubEventMap {
|
|
125
|
+
"lock:changed": {
|
|
126
|
+
isSideDoor: boolean;
|
|
127
|
+
value: CharacteristicValue;
|
|
128
|
+
};
|
|
129
|
+
"dps:changed": {
|
|
130
|
+
isSideDoor: boolean;
|
|
131
|
+
value: CharacteristicValue;
|
|
132
|
+
};
|
|
133
|
+
"sensor:changed": {
|
|
134
|
+
input: SensorInput;
|
|
135
|
+
value: CharacteristicValue;
|
|
136
|
+
};
|
|
137
|
+
"doorbell:ring": {
|
|
138
|
+
requestId: string;
|
|
139
|
+
};
|
|
140
|
+
"doorbell:cancel": Record<string, never>;
|
|
141
|
+
"device:online": {
|
|
142
|
+
isOnline: boolean;
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
export type HubEventKey = keyof HubEventMap;
|