homebridge-unifi-protect 6.22.0 → 7.0.1

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 (88) hide show
  1. package/README.md +29 -29
  2. package/config.schema.json +5 -15
  3. package/dist/devices/protect-camera-package.d.ts +0 -2
  4. package/dist/devices/protect-camera-package.js +4 -12
  5. package/dist/devices/protect-camera-package.js.map +1 -1
  6. package/dist/devices/protect-camera.d.ts +2 -3
  7. package/dist/devices/protect-camera.js +35 -124
  8. package/dist/devices/protect-camera.js.map +1 -1
  9. package/dist/devices/protect-chime.js +2 -6
  10. package/dist/devices/protect-chime.js.map +1 -1
  11. package/dist/devices/protect-device.d.ts +10 -6
  12. package/dist/devices/protect-device.js +23 -22
  13. package/dist/devices/protect-device.js.map +1 -1
  14. package/dist/devices/protect-doorbell.d.ts +0 -2
  15. package/dist/devices/protect-doorbell.js +41 -60
  16. package/dist/devices/protect-doorbell.js.map +1 -1
  17. package/dist/devices/protect-light.js +1 -3
  18. package/dist/devices/protect-light.js.map +1 -1
  19. package/dist/devices/protect-liveviews.js +2 -1
  20. package/dist/devices/protect-liveviews.js.map +1 -1
  21. package/dist/devices/protect-nvr-systeminfo.js +1 -1
  22. package/dist/devices/protect-nvr-systeminfo.js.map +1 -1
  23. package/dist/devices/protect-securitysystem.js +4 -4
  24. package/dist/devices/protect-securitysystem.js.map +1 -1
  25. package/dist/devices/protect-sensor.js +2 -6
  26. package/dist/devices/protect-sensor.js.map +1 -1
  27. package/dist/devices/protect-viewer.js +1 -1
  28. package/dist/devices/protect-viewer.js.map +1 -1
  29. package/dist/ffmpeg/protect-ffmpeg-codecs.js.map +1 -1
  30. package/dist/ffmpeg/protect-ffmpeg-exec.js +1 -1
  31. package/dist/ffmpeg/protect-ffmpeg-exec.js.map +1 -1
  32. package/dist/ffmpeg/protect-ffmpeg-options.js +2 -19
  33. package/dist/ffmpeg/protect-ffmpeg-options.js.map +1 -1
  34. package/dist/ffmpeg/protect-ffmpeg-record.js +2 -1
  35. package/dist/ffmpeg/protect-ffmpeg-record.js.map +1 -1
  36. package/dist/ffmpeg/protect-ffmpeg-stream.js +14 -8
  37. package/dist/ffmpeg/protect-ffmpeg-stream.js.map +1 -1
  38. package/dist/ffmpeg/protect-ffmpeg.d.ts +2 -2
  39. package/dist/ffmpeg/protect-ffmpeg.js.map +1 -1
  40. package/dist/protect-events.d.ts +1 -3
  41. package/dist/protect-events.js +38 -43
  42. package/dist/protect-events.js.map +1 -1
  43. package/dist/protect-livestream.d.ts +12 -0
  44. package/dist/protect-livestream.js +63 -0
  45. package/dist/protect-livestream.js.map +1 -0
  46. package/dist/protect-nvr.d.ts +7 -11
  47. package/dist/protect-nvr.js +15 -61
  48. package/dist/protect-nvr.js.map +1 -1
  49. package/dist/protect-options.d.ts +8 -23
  50. package/dist/protect-options.js +4 -128
  51. package/dist/protect-options.js.map +1 -1
  52. package/dist/protect-platform.d.ts +2 -4
  53. package/dist/protect-platform.js +3 -28
  54. package/dist/protect-platform.js.map +1 -1
  55. package/dist/protect-record.d.ts +4 -3
  56. package/dist/protect-record.js +23 -29
  57. package/dist/protect-record.js.map +1 -1
  58. package/dist/protect-snapshot.d.ts +2 -2
  59. package/dist/protect-snapshot.js +7 -3
  60. package/dist/protect-snapshot.js.map +1 -1
  61. package/dist/protect-stream.d.ts +3 -4
  62. package/dist/protect-stream.js +116 -98
  63. package/dist/protect-stream.js.map +1 -1
  64. package/dist/protect-timeshift.d.ts +16 -10
  65. package/dist/protect-timeshift.js +88 -51
  66. package/dist/protect-timeshift.js.map +1 -1
  67. package/dist/protect-types.d.ts +0 -7
  68. package/dist/protect-types.js +0 -1
  69. package/dist/protect-types.js.map +1 -1
  70. package/dist/settings.d.ts +2 -1
  71. package/dist/settings.js +4 -2
  72. package/dist/settings.js.map +1 -1
  73. package/homebridge-ui/public/index.html +42 -21
  74. package/homebridge-ui/public/lib/featureoptions.js +376 -0
  75. package/homebridge-ui/public/lib/featureoptions.js.map +1 -0
  76. package/homebridge-ui/public/lib/webUi-featureoptions.mjs +836 -0
  77. package/homebridge-ui/public/lib/webUi.mjs +184 -0
  78. package/homebridge-ui/public/ui.mjs +213 -124
  79. package/homebridge-ui/server.js +13 -52
  80. package/package.json +22 -21
  81. package/dist/protect-mqtt.d.ts +0 -20
  82. package/dist/protect-mqtt.js +0 -177
  83. package/dist/protect-mqtt.js.map +0 -1
  84. package/dist/protect-rtp.d.ts +0 -26
  85. package/dist/protect-rtp.js +0 -180
  86. package/dist/protect-rtp.js.map +0 -1
  87. package/homebridge-ui/public/lib/featureoptions.mjs +0 -201
  88. package/homebridge-ui/public/protect-featureoptions.mjs +0 -736
@@ -12,8 +12,6 @@ export class ProtectEvents extends EventEmitter {
12
12
  ufpDeviceState;
13
13
  platform;
14
14
  unsupportedDevices;
15
- eventsHandler;
16
- ufpUpdatesHandler;
17
15
  // Initialize an instance of our Protect events handler.
18
16
  constructor(nvr) {
19
17
  super();
@@ -27,8 +25,6 @@ export class ProtectEvents extends EventEmitter {
27
25
  this.ufpDeviceState = {};
28
26
  this.platform = nvr.platform;
29
27
  this.unsupportedDevices = {};
30
- this.eventsHandler = null;
31
- this.ufpUpdatesHandler = null;
32
28
  // If we've enabled telemetry from the controller inform the user.
33
29
  if (this.mqttPublishTelemetry) {
34
30
  this.log.info("Protect controller telemetry enabled.");
@@ -39,37 +35,40 @@ export class ProtectEvents extends EventEmitter {
39
35
  // with object merges and we've accounted for those in this deep merge / deep patch utility.
40
36
  //
41
37
  // Thanks to https://stackoverflow.com/a/48218209 for the foundation for this one in thinking about how to do deep object merges in JavaScript.
42
- patchUfpConfigJson(...objects) {
43
- const result = {};
44
- // Utility to validate if a value is an object, excluding arrays.
45
- const isObject = (value) => (typeof value === "object") && !Array.isArray(value) && (value !== null);
46
- // Process each object in the input array
47
- for (const object of objects) {
48
- // Iterate through the keys that belong to this object while explicitly filter out any keys that are inherited. This could ostensibly be done using reduce, but we
49
- // take a more performance-conscious view of things here given that this code will be called quite frequently due to the number of Protect events we typically
50
- // process.
51
- for (const key of Object.keys(object).filter(key => Object.hasOwn(object, key))) {
52
- // Initialize.
53
- const existingValue = result[key];
54
- const newValue = object[key];
55
- // Check if both the existing value and the new value are non-array, non-null, objects, in which case we recurse to do a deep merge of the objects.
56
- if (isObject(existingValue) && isObject(newValue)) {
57
- result[key] = this.patchUfpConfigJson(existingValue, newValue);
58
- continue;
38
+ updateUfp(ufp, payload) {
39
+ const mergeJson = (...objects) => {
40
+ const result = {};
41
+ // Utility to validate if a value is an object, excluding arrays.
42
+ const isObject = (value) => (typeof value === "object") && !Array.isArray(value) && (value !== null);
43
+ // Process each object in the input array
44
+ for (const object of objects) {
45
+ // Iterate through the keys that belong to this object while explicitly filter out any keys that are inherited. This could ostensibly be done using reduce, but we
46
+ // take a more performance-conscious view of things here given that this code will be called quite frequently due to the number of Protect events we typically
47
+ // process.
48
+ for (const key of Object.keys(object).filter(key => Object.hasOwn(object, key))) {
49
+ // Initialize.
50
+ const existingValue = result[key];
51
+ const newValue = object[key];
52
+ // Check if both the existing value and the new value are non-array, non-null, objects, in which case we recurse to do a deep merge of the objects.
53
+ if (isObject(existingValue) && isObject(newValue)) {
54
+ result[key] = mergeJson(existingValue, newValue);
55
+ continue;
56
+ }
57
+ // Otherwise, let's directly assign the new value.
58
+ result[key] = newValue;
59
59
  }
60
- // Otherwise, let's directly assign the new value.
61
- result[key] = newValue;
62
60
  }
63
- }
64
- // We're done.
65
- return result;
61
+ // We're done.
62
+ return result;
63
+ };
64
+ return mergeJson(ufp, payload);
66
65
  }
67
66
  // Process Protect API update events.
68
67
  ufpUpdates(packet) {
69
68
  let protectDevice;
70
69
  switch (packet.header.modelKey) {
71
70
  case "nvr":
72
- this.nvr.ufp = this.patchUfpConfigJson(this.nvr.ufp, packet.payload);
71
+ this.nvr.ufp = this.updateUfp(this.nvr.ufp, packet.payload);
73
72
  break;
74
73
  default:
75
74
  // Lookup the device.
@@ -79,7 +78,7 @@ export class ProtectEvents extends EventEmitter {
79
78
  break;
80
79
  }
81
80
  // Update our device state.
82
- protectDevice.ufp = this.patchUfpConfigJson(protectDevice.ufp, packet.payload);
81
+ protectDevice.ufp = this.updateUfp(protectDevice.ufp, packet.payload);
83
82
  // Detect device availability changes.
84
83
  if (packet.payload.state) {
85
84
  protectDevice.log.debug("State has changed to %s.", protectDevice.isOnline ? "online" : "offline");
@@ -132,16 +131,12 @@ export class ProtectEvents extends EventEmitter {
132
131
  }
133
132
  // Listen to the UniFi Protect realtime updates API for updates we are interested in (e.g. motion).
134
133
  configureEvents() {
135
- // Only configure the event listener if it exists and it's not already configured.
136
- if (this.eventsHandler && this.ufpUpdatesHandler) {
137
- return true;
138
- }
139
134
  // Ensure we update our UFP state before we process any other events.
140
- this.prependListener("updateEvent", this.ufpUpdatesHandler = this.ufpUpdates.bind(this));
135
+ this.prependListener("updateEvent", this.ufpUpdates.bind(this));
141
136
  // Process remove events.
142
137
  this.prependListener("addEvent", this.manageDevices.bind(this));
143
138
  // Listen for any messages coming in from our listener. We route events to the appropriate handlers based on the type of event that comes across.
144
- this.ufpApi.on("message", this.eventsHandler = (packet) => {
139
+ this.ufpApi.on("message", (packet) => {
145
140
  switch (packet.header.action) {
146
141
  case "add":
147
142
  this.emit("addEvent", packet);
@@ -200,7 +195,7 @@ export class ProtectEvents extends EventEmitter {
200
195
  // If we have a motion trigger switch configured, update it.
201
196
  protectDevice.accessory.getServiceById(this.hap.Service.Switch, ProtectReservedNames.SWITCH_MOTION_TRIGGER)?.updateCharacteristic(this.hap.Characteristic.On, true);
202
197
  // Publish the motion event to MQTT, if the user has configured it.
203
- this.nvr.mqtt?.publish(protectDevice.accessory, "motion", "true");
198
+ this.nvr.mqtt?.publish(protectDevice.ufp.mac, "motion", "true");
204
199
  // Log the event, if configured to do so.
205
200
  if (protectDevice.hints.logMotion) {
206
201
  let logMessage = "";
@@ -218,13 +213,13 @@ export class ProtectEvents extends EventEmitter {
218
213
  protectDevice.accessory.getServiceById(this.hap.Service.ContactSensor, ProtectReservedNames.CONTACT_MOTION_SMARTDETECT + "." + detectedObject)
219
214
  ?.updateCharacteristic(this.hap.Characteristic.ContactSensorState, true);
220
215
  // Publish the smart motion event to MQTT, if the user has configured it.
221
- this.nvr.mqtt?.publish(protectDevice.accessory, "motion/smart/" + detectedObject, "true");
216
+ this.nvr.mqtt?.publish(protectDevice.ufp.mac, "motion/smart/" + detectedObject, "true");
222
217
  // Trigger license plate contact sensors, if configured.
223
218
  if (metadata && ("licensePlate" in metadata) && (detectedObject === "licensePlate") && ("name" in metadata.licensePlate)) {
224
219
  protectDevice.accessory.getServiceById(this.hap.Service.ContactSensor, ProtectReservedNames.CONTACT_MOTION_SMARTDETECT_LICENSE + "." +
225
220
  metadata.licensePlate.name.toUpperCase())?.updateCharacteristic(this.hap.Characteristic.ContactSensorState, true);
226
221
  // Publish the smart motion event to MQTT, if the user has configured it.
227
- this.nvr.mqtt?.publish(protectDevice.accessory, "motion/smart/" + detectedObject + "/metadata", JSON.stringify(metadata));
222
+ this.nvr.mqtt?.publish(protectDevice.ufp.mac, "motion/smart/" + detectedObject + "/metadata", JSON.stringify(metadata));
228
223
  }
229
224
  }
230
225
  // Reset our motion event after motionDuration.
@@ -235,7 +230,7 @@ export class ProtectEvents extends EventEmitter {
235
230
  ?.updateCharacteristic(this.hap.Characteristic.On, false);
236
231
  protectDevice.log.debug("Resetting motion event.");
237
232
  // Publish to MQTT, if the user has configured it.
238
- this.nvr.mqtt?.publish(protectDevice.accessory, "motion", "false");
233
+ this.nvr.mqtt?.publish(protectDevice.ufp.mac, "motion", "false");
239
234
  // Delete the timer from our motion event tracker.
240
235
  delete this.eventTimers[protectDevice.id];
241
236
  }, protectDevice.hints.motionDuration * 1000);
@@ -257,7 +252,7 @@ export class ProtectEvents extends EventEmitter {
257
252
  protectDevice.accessory.getServiceById(this.hap.Service.ContactSensor, ProtectReservedNames.CONTACT_MOTION_SMARTDETECT + "." + detectedObject)
258
253
  ?.updateCharacteristic(this.hap.Characteristic.ContactSensorState, false);
259
254
  // Publish the smart motion event to MQTT, if the user has configured it.
260
- this.nvr.mqtt?.publish(protectDevice.accessory, "motion/smart/" + detectedObject, "false");
255
+ this.nvr.mqtt?.publish(protectDevice.ufp.mac, "motion/smart/" + detectedObject, "false");
261
256
  protectDevice.log.debug("Resetting smart object motion event.");
262
257
  }
263
258
  // Delete the timer from our motion event tracker.
@@ -278,7 +273,7 @@ export class ProtectEvents extends EventEmitter {
278
273
  // Trigger the occupancy event in HomeKit.
279
274
  occupancyService.updateCharacteristic(this.hap.Characteristic.OccupancyDetected, true);
280
275
  // Publish the occupancy event to MQTT, if the user has configured it.
281
- this.nvr.mqtt?.publish(protectDevice.accessory, "occupancy", "true");
276
+ this.nvr.mqtt?.publish(protectDevice.ufp.mac, "occupancy", "true");
282
277
  // Log the event, if configured to do so.
283
278
  if (protectDevice.hints.logMotion) {
284
279
  protectDevice.log.info("Occupancy detected%s.", protectDevice.hints.smartDetect ? ": " + protectDevice.hints.smartOccupancy.filter(x => detectedObjects.includes(x)).join(", ") : "");
@@ -289,7 +284,7 @@ export class ProtectEvents extends EventEmitter {
289
284
  // Reset the occupancy sensor.
290
285
  occupancyService.updateCharacteristic(this.hap.Characteristic.OccupancyDetected, false);
291
286
  // Publish to MQTT, if the user has configured it.
292
- this.nvr.mqtt?.publish(protectDevice.accessory, "occupancy", "false");
287
+ this.nvr.mqtt?.publish(protectDevice.ufp.mac, "occupancy", "false");
293
288
  // Log the event, if configured to do so.
294
289
  if (protectDevice.hints.logMotion) {
295
290
  protectDevice.log.info("Occupancy no longer detected.");
@@ -339,7 +334,7 @@ export class ProtectEvents extends EventEmitter {
339
334
  }, PROTECT_DOORBELL_TRIGGER_DURATION);
340
335
  }
341
336
  // Publish to MQTT, if the user has configured it.
342
- this.nvr.mqtt?.publish(protectDevice.accessory, "doorbell", "true");
337
+ this.nvr.mqtt?.publish(protectDevice.ufp.mac, "doorbell", "true");
343
338
  if (protectDevice.hints.logDoorbell) {
344
339
  protectDevice.log.info("Doorbell ring detected.");
345
340
  }
@@ -350,7 +345,7 @@ export class ProtectEvents extends EventEmitter {
350
345
  }
351
346
  // Fire off our MQTT doorbell ring event.
352
347
  this.eventTimers[protectDevice.id + ".Doorbell.Ring.MQTT"] = setTimeout(() => {
353
- this.nvr.mqtt?.publish(protectDevice.accessory, "doorbell", "false");
348
+ this.nvr.mqtt?.publish(protectDevice.ufp.mac, "doorbell", "false");
354
349
  // Delete the timer from our event tracker.
355
350
  delete this.eventTimers[protectDevice.id + ".Doorbell.Ring.MQTT"];
356
351
  }, PROTECT_DOORBELL_TRIGGER_DURATION);
@@ -1 +1 @@
1
- {"version":3,"file":"protect-events.js","sourceRoot":"","sources":["../src/protect-events.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"protect-events.js","sourceRoot":"","sources":["../src/protect-events.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { ProtectCamera } from "./devices/index.js";
2
+ import { ProtectLivestream } from "unifi-protect";
3
+ export declare class LivestreamManager {
4
+ private livestreams;
5
+ private protectCamera;
6
+ private subscriberCount;
7
+ constructor(protectCamera: ProtectCamera);
8
+ private getIndex;
9
+ acquire(channel: number, lens?: number): ProtectLivestream;
10
+ start(channel: number, lens?: number, segmentLength?: number): Promise<boolean>;
11
+ stop(channel: number, lens?: number): void;
12
+ }
@@ -0,0 +1,63 @@
1
+ /* Copyright(C) 2019-2024, HJD (https://github.com/hjdhjd). All rights reserved.
2
+ *
3
+ * protect-livestream.ts: Protect livestream API manager.
4
+ */
5
+ import { PROTECT_HKSV_SEGMENT_RESOLUTION } from "./settings.js";
6
+ import { retry } from "homebridge-plugin-utils";
7
+ export class LivestreamManager {
8
+ livestreams;
9
+ protectCamera;
10
+ subscriberCount;
11
+ // Create an instance.
12
+ constructor(protectCamera) {
13
+ this.protectCamera = protectCamera;
14
+ this.subscriberCount = {};
15
+ this.livestreams = {};
16
+ }
17
+ // Utility to return an index into our livestream connection pool.
18
+ getIndex(channel, lens) {
19
+ return channel.toString() + ((lens !== undefined) ? "." + lens.toString() : "");
20
+ }
21
+ // Retrieve a connection to the livestream API for a given channel.
22
+ acquire(channel, lens) {
23
+ const index = this.getIndex(channel, lens);
24
+ // Let's see if we have an existing livestream already open and reuse it if we can.
25
+ if (this.livestreams[index]) {
26
+ return this.livestreams[index];
27
+ }
28
+ // Create a new livestream instance.
29
+ this.subscriberCount[index] = 0;
30
+ return this.livestreams[index] = this.protectCamera.nvr.ufpApi.createLivestream();
31
+ }
32
+ // Access the livestream API, registering as a consumer.
33
+ async start(channel, lens, segmentLength = PROTECT_HKSV_SEGMENT_RESOLUTION) {
34
+ const index = this.getIndex(channel, lens);
35
+ // If we don't have a livestream configured for this channel, we're done. We could just create it here, but given we listen to events on livestream listeners, this
36
+ // is a safer option to ensure that we've acquired a livestream endpoint before trying to start it.
37
+ if (!this.livestreams[index]) {
38
+ return false;
39
+ }
40
+ // Start the livestream if this is the first run. We set this to reattempt establishing the livestream up to three times due to occasional controller glitches.
41
+ if (!this.subscriberCount[index] && !(await retry(async () => this.livestreams[index].start(this.protectCamera.ufp.id, channel, lens, segmentLength, this.protectCamera.name + ":" + index), 1000, 3))) {
42
+ this.protectCamera.log.error("Unable to access the Protect livestream API: this is typically due to the Protect controller or camera rebooting.");
43
+ await this.protectCamera.nvr.resetNvrConnection();
44
+ // Something went wrong in communicating with the controller.
45
+ return false;
46
+ }
47
+ // Increment our consumer count.
48
+ this.subscriberCount[index]++;
49
+ return true;
50
+ }
51
+ // End a livestream API connection once all the consumers of the livestream are done.
52
+ stop(channel, lens) {
53
+ const index = this.getIndex(channel, lens);
54
+ // If we have open livestreams, we'll won't close the livestream.
55
+ if (--this.subscriberCount[index] > 0) {
56
+ return;
57
+ }
58
+ // End our livestream API connection.
59
+ this.livestreams[index].stop();
60
+ this.subscriberCount[index] = 0;
61
+ }
62
+ }
63
+ //# sourceMappingURL=protect-livestream.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protect-livestream.js","sourceRoot":"","sources":["../src/protect-livestream.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,9 @@
1
- /// <reference types="node" />
1
+ import { HomebridgePluginLogging, MqttClient } from "homebridge-plugin-utils";
2
2
  import { ProtectApi, ProtectNvrConfig } from "unifi-protect";
3
3
  import { ProtectDevice, ProtectNvrSystemInfo } from "./devices/index.js";
4
- import { ProtectDeviceConfigTypes, ProtectDevices, ProtectLogging } from "./protect-types.js";
5
- import { ProtectNvrOptions } from "./protect-options.js";
4
+ import { ProtectDeviceConfigTypes, ProtectDevices } from "./protect-types.js";
6
5
  import { ProtectEvents } from "./protect-events.js";
7
- import { ProtectMqtt } from "./protect-mqtt.js";
6
+ import { ProtectNvrOptions } from "./protect-options.js";
8
7
  import { ProtectPlatform } from "./protect-platform.js";
9
8
  export declare class ProtectNvr {
10
9
  private api;
@@ -18,8 +17,8 @@ export declare class ProtectNvr {
18
17
  private hap;
19
18
  private liveviews;
20
19
  logApiErrors: boolean;
21
- readonly log: ProtectLogging;
22
- mqtt: ProtectMqtt | null;
20
+ readonly log: HomebridgePluginLogging;
21
+ mqtt: MqttClient | null;
23
22
  private name;
24
23
  nvrHksvErrors: number;
25
24
  platform: ProtectPlatform;
@@ -31,7 +30,6 @@ export declare class ProtectNvr {
31
30
  private bootstrapNvr;
32
31
  login(): Promise<void>;
33
32
  private configureNvr;
34
- private configureDefaultDoorbellMessage;
35
33
  private addProtectDevice;
36
34
  addHomeKitDevice(device: ProtectDeviceConfigTypes): ProtectDevice | null;
37
35
  private discoverAndSyncAccessories;
@@ -45,9 +43,7 @@ export declare class ProtectNvr {
45
43
  deviceLookup(deviceId: string): ProtectDevices | null;
46
44
  getFeatureFloat(option: string): number | undefined;
47
45
  getFeatureNumber(option: string): number | undefined;
48
- isNvrFeature(option: string, device?: ProtectDeviceConfigTypes | ProtectNvrConfig | null): boolean;
49
- hasFeature(option: string, device?: ProtectDeviceConfigTypes | ProtectNvrConfig | null): boolean;
46
+ isNvrFeature(option: string, device?: ProtectDeviceConfigTypes | ProtectNvrConfig): boolean;
47
+ hasFeature(option: string, device?: ProtectDeviceConfigTypes | ProtectNvrConfig): boolean;
50
48
  logFeature(option: string, message: string): void;
51
- sleep(sleepTimer: number): Promise<NodeJS.Timeout>;
52
- private retry;
53
49
  }
@@ -1,10 +1,9 @@
1
+ import { MqttClient, retry, sleep } from "homebridge-plugin-utils";
1
2
  import { PLATFORM_NAME, PLUGIN_NAME, PROTECT_CONTROLLER_REFRESH_INTERVAL, PROTECT_CONTROLLER_RETRY_INTERVAL, PROTECT_M3U_PLAYLIST_PORT } from "./settings.js";
2
3
  import { ProtectApi } from "unifi-protect";
3
4
  import { ProtectCamera, ProtectChime, ProtectDoorbell, ProtectLight, ProtectLiveviews, ProtectNvrSystemInfo, ProtectSensor, ProtectViewer } from "./devices/index.js";
4
5
  import { ProtectDeviceCategories } from "./protect-types.js";
5
- import { getOptionFloat, getOptionNumber, getOptionScope, getOptionValue, isOptionEnabled } from "./protect-options.js";
6
6
  import { ProtectEvents } from "./protect-events.js";
7
- import { ProtectMqtt } from "./protect-mqtt.js";
8
7
  import http from "node:http";
9
8
  import util from "node:util";
10
9
  export class ProtectNvr {
@@ -64,7 +63,7 @@ export class ProtectNvr {
64
63
  // Retrieve the bootstrap configuration from the Protect controller.
65
64
  async bootstrapNvr() {
66
65
  // Attempt to bootstrap the controller until we're successful.
67
- await this.retry(() => this.ufpApi.getBootstrap(), PROTECT_CONTROLLER_RETRY_INTERVAL * 1000);
66
+ await retry(async () => this.ufpApi.getBootstrap(), PROTECT_CONTROLLER_RETRY_INTERVAL * 1000);
68
67
  }
69
68
  // Initialize our connection to the UniFi Protect controller.
70
69
  async login() {
@@ -88,7 +87,7 @@ export class ProtectNvr {
88
87
  this.ufpApi = new ProtectApi(ufpLog);
89
88
  // Attempt to login to the Protect controller, retrying at reasonable intervals. This accounts for cases where the Protect controller or the network connection
90
89
  // may not be fully available when we startup.
91
- await this.retry(() => this.ufpApi.login(this.config.address, this.config.username, this.config.password), PROTECT_CONTROLLER_RETRY_INTERVAL * 1000);
90
+ await retry(async () => this.ufpApi.login(this.config.address, this.config.username, this.config.password), PROTECT_CONTROLLER_RETRY_INTERVAL * 1000);
92
91
  // Now, let's get the bootstrap configuration from the Protect controller.
93
92
  await this.bootstrapNvr();
94
93
  // Save the bootstrap to ease our device initialization below.
@@ -105,7 +104,7 @@ export class ProtectNvr {
105
104
  this.log.info("Disabling this UniFi Protect controller in HomeKit.");
106
105
  // Let's sleep for thirty seconds to give all the accessories a chance to load before disabling everything. Homebridge doesn't have a good mechanism to notify us
107
106
  // when all the cached accessories are loaded at startup.
108
- await this.sleep(30);
107
+ await sleep(30);
109
108
  // Unregister all the accessories for this controller from Homebridge that may have been restored already. Any additional ones will be automatically caught when
110
109
  // they are restored.
111
110
  this.removeHomeKitAccessories(this.platform.accessories.filter(x => x.context.nvr === this.ufp.mac));
@@ -114,14 +113,14 @@ export class ProtectNvr {
114
113
  // Initialize our UniFi Protect event handler.
115
114
  this.events = new ProtectEvents(this);
116
115
  // Configure any NVR-specific settings.
117
- void this.configureNvr();
116
+ this.configureNvr();
118
117
  // Initialize our liveviews.
119
118
  this.liveviews = new ProtectLiveviews(this);
120
119
  // Initialize our NVR system information.
121
120
  this.systemInfo = new ProtectNvrSystemInfo(this);
122
121
  // Initialize MQTT, if needed.
123
122
  if (!this.mqtt && this.config.mqttUrl) {
124
- this.mqtt = new ProtectMqtt(this);
123
+ this.mqtt = new MqttClient(this.config.mqttUrl, this.config.mqttTopic, this.log);
125
124
  }
126
125
  // Initialize our playlist service, if enabled.
127
126
  if (this.getFeatureNumber("Nvr.Service.Playlist") !== undefined) {
@@ -161,32 +160,7 @@ export class ProtectNvr {
161
160
  bootstrapRefresh();
162
161
  }
163
162
  // Configure NVR-specific settings.
164
- async configureNvr() {
165
- // Warn users if they're running versions of UniFi OS below 3.0.
166
- const firmwareVersion = this.ufp.firmwareVersion.split(".");
167
- if (parseInt(firmwareVersion[0]) < 3) {
168
- this.log.error("Warning: your Protect controller firmware version is less than UniFi OS 3.0. Some features may not work correctly.");
169
- }
170
- // Configure the default doorbell message on the NVR.
171
- await this.configureDefaultDoorbellMessage();
172
- return true;
173
- }
174
- // Configure a default doorbell message on the Protect doorbell.
175
- async configureDefaultDoorbellMessage() {
176
- // If we haven't configured a default doorbell message or we aren't an admin user, don't attempt to set the default doorbell message.
177
- if (!this.config.defaultDoorbellMessage || !this.ufpApi.isAdminUser) {
178
- return false;
179
- }
180
- // Set the default message.
181
- const newUfp = await this.ufpApi.updateDevice(this.ufp, { doorbellSettings: { defaultMessageText: this.config.defaultDoorbellMessage } });
182
- if (!newUfp) {
183
- this.log.error("Unable to set the default doorbell message. Please ensure this username has the Administrator role in UniFi Protect.");
184
- return false;
185
- }
186
- // Update our internal view of the NVR configuration.
187
- this.ufp = newUfp;
188
- // Inform the user.
189
- this.log.info("Default doorbell message set to: %s.", this.config.defaultDoorbellMessage);
163
+ configureNvr() {
190
164
  return true;
191
165
  }
192
166
  // Create instances of Protect device types in our plugin.
@@ -204,27 +178,22 @@ export class ProtectNvr {
204
178
  this.configuredDevices[accessory.UUID] = new ProtectCamera(this, device, accessory);
205
179
  }
206
180
  return true;
207
- break;
208
181
  case "chime":
209
182
  // We have a UniFi Protect chime.
210
183
  this.configuredDevices[accessory.UUID] = new ProtectChime(this, device, accessory);
211
184
  return true;
212
- break;
213
185
  case "light":
214
186
  // We have a UniFi Protect light.
215
187
  this.configuredDevices[accessory.UUID] = new ProtectLight(this, device, accessory);
216
188
  return true;
217
- break;
218
189
  case "sensor":
219
190
  // We have a UniFi Protect sensor.
220
191
  this.configuredDevices[accessory.UUID] = new ProtectSensor(this, device, accessory);
221
192
  return true;
222
- break;
223
193
  case "viewer":
224
194
  // We have a UniFi Protect viewer.
225
195
  this.configuredDevices[accessory.UUID] = new ProtectViewer(this, device, accessory);
226
196
  return true;
227
- break;
228
197
  default:
229
198
  this.log.error("Unknown device class %s detected for %s.", device.modelKey, device.name ?? device.marketName);
230
199
  return false;
@@ -526,7 +495,7 @@ export class ProtectNvr {
526
495
  // Reauthenticate with the NVR and reset any HKSV-enabled devices, as needed.
527
496
  async resetNvrConnection() {
528
497
  // Reset our HKSV-enabled devices.
529
- await Promise.all(this.devices("camera").filter(x => x.hasHksv).map(x => x.stream.hksv?.reset()));
498
+ await Promise.all(this.devices("camera").filter(x => x.hasHksv).map(async (x) => x.stream.hksv?.reset()));
530
499
  // Clear our login credentials and error statistics.
531
500
  this.nvrHksvErrors = 0;
532
501
  this.ufpApi.reset();
@@ -539,7 +508,7 @@ export class ProtectNvr {
539
508
  await protectCamera.stream.hksv?.restartTimeshifting();
540
509
  // Put in a short delay between cameras, to alleviate potentially impacts to the Protect controller.
541
510
  // eslint-disable-next-line no-await-in-loop
542
- await this.sleep(1500);
511
+ await sleep(1500);
543
512
  }
544
513
  }
545
514
  // Return all configured devices.
@@ -558,19 +527,19 @@ export class ProtectNvr {
558
527
  }
559
528
  // Utility function to return a floating point configuration parameter on a device.
560
529
  getFeatureFloat(option) {
561
- return getOptionFloat(getOptionValue(this.platform.featureOptions, this.ufp, null, option));
530
+ return this.platform.featureOptions.getFloat(option, this.ufp.mac);
562
531
  }
563
532
  // Utility function to return an integer configuration parameter on a device.
564
533
  getFeatureNumber(option) {
565
- return getOptionNumber(getOptionValue(this.platform.featureOptions, this.ufp, null, option));
534
+ return this.platform.featureOptions.getInteger(option, this.ufp.mac);
566
535
  }
567
536
  // Utility for checking the scope of feature options on the NVR.
568
- isNvrFeature(option, device = null) {
569
- return ["global", "nvr"].includes(getOptionScope(this.platform.featureOptions, this.ufp, device, option, this.platform.featureOptionDefault(option)));
537
+ isNvrFeature(option, device) {
538
+ return ["global", "controller"].includes(this.platform.featureOptions.scope(option, device?.mac, this.ufp.mac));
570
539
  }
571
540
  // Utility for checking feature options on the NVR.
572
- hasFeature(option, device = null) {
573
- return isOptionEnabled(this.platform.featureOptions, this.ufp, device, option, this.platform.featureOptionDefault(option));
541
+ hasFeature(option, device) {
542
+ return this.platform.featureOptions.test(option, device?.mac, this.ufp.mac);
574
543
  }
575
544
  // Utility for logging feature option availability on the NVR.
576
545
  logFeature(option, message) {
@@ -582,20 +551,5 @@ export class ProtectNvr {
582
551
  this.featureLog[option] = true;
583
552
  this.log.info(message);
584
553
  }
585
- // Emulate a sleep function.
586
- sleep(sleepTimer) {
587
- return new Promise(resolve => setTimeout(resolve, sleepTimer));
588
- }
589
- // Retry an operation until we're successful.
590
- async retry(operation, retryInterval) {
591
- // Try the operation that was requested.
592
- if (!(await operation())) {
593
- // If the operation wasn't successful, let's sleep for the requested interval and try again.
594
- await this.sleep(retryInterval);
595
- return this.retry(operation, retryInterval);
596
- }
597
- // We were successful - we're done.
598
- return true;
599
- }
600
554
  }
601
555
  //# sourceMappingURL=protect-nvr.js.map