homebridge-unifi-protect 7.1.1 → 7.2.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 (62) hide show
  1. package/dist/devices/protect-camera-package.js +1 -2
  2. package/dist/devices/protect-camera-package.js.map +1 -1
  3. package/dist/devices/protect-camera.d.ts +3 -0
  4. package/dist/devices/protect-camera.js +103 -41
  5. package/dist/devices/protect-camera.js.map +1 -1
  6. package/dist/devices/protect-device.d.ts +7 -2
  7. package/dist/devices/protect-device.js +67 -66
  8. package/dist/devices/protect-device.js.map +1 -1
  9. package/dist/devices/protect-light.d.ts +2 -0
  10. package/dist/devices/protect-light.js +22 -4
  11. package/dist/devices/protect-light.js.map +1 -1
  12. package/dist/devices/protect-liveviews.js +2 -2
  13. package/dist/devices/protect-liveviews.js.map +1 -1
  14. package/dist/devices/protect-sensor.js +4 -0
  15. package/dist/devices/protect-sensor.js.map +1 -1
  16. package/dist/ffmpeg/protect-ffmpeg-exec.d.ts +0 -2
  17. package/dist/ffmpeg/protect-ffmpeg-options.js +9 -9
  18. package/dist/ffmpeg/protect-ffmpeg-options.js.map +1 -1
  19. package/dist/ffmpeg/protect-ffmpeg-record.d.ts +2 -3
  20. package/dist/ffmpeg/protect-ffmpeg-record.js +56 -56
  21. package/dist/ffmpeg/protect-ffmpeg-record.js.map +1 -1
  22. package/dist/ffmpeg/protect-ffmpeg-stream.d.ts +0 -2
  23. package/dist/ffmpeg/protect-ffmpeg-stream.js +17 -9
  24. package/dist/ffmpeg/protect-ffmpeg-stream.js.map +1 -1
  25. package/dist/ffmpeg/protect-ffmpeg.d.ts +2 -6
  26. package/dist/ffmpeg/protect-ffmpeg.js +0 -1
  27. package/dist/ffmpeg/protect-ffmpeg.js.map +1 -1
  28. package/dist/protect-events.d.ts +0 -1
  29. package/dist/protect-events.js +75 -59
  30. package/dist/protect-events.js.map +1 -1
  31. package/dist/protect-livestream.d.ts +3 -0
  32. package/dist/protect-livestream.js +61 -5
  33. package/dist/protect-livestream.js.map +1 -1
  34. package/dist/protect-nvr.d.ts +2 -3
  35. package/dist/protect-nvr.js +31 -50
  36. package/dist/protect-nvr.js.map +1 -1
  37. package/dist/protect-options.js +6 -6
  38. package/dist/protect-options.js.map +1 -1
  39. package/dist/protect-platform.js +1 -1
  40. package/dist/protect-platform.js.map +1 -1
  41. package/dist/protect-record.d.ts +7 -8
  42. package/dist/protect-record.js +127 -124
  43. package/dist/protect-record.js.map +1 -1
  44. package/dist/protect-snapshot.d.ts +0 -1
  45. package/dist/protect-snapshot.js +2 -2
  46. package/dist/protect-snapshot.js.map +1 -1
  47. package/dist/protect-stream.d.ts +2 -2
  48. package/dist/protect-stream.js +59 -30
  49. package/dist/protect-stream.js.map +1 -1
  50. package/dist/protect-timeshift.d.ts +5 -6
  51. package/dist/protect-timeshift.js +36 -33
  52. package/dist/protect-timeshift.js.map +1 -1
  53. package/dist/protect-types.d.ts +1 -0
  54. package/dist/protect-types.js +1 -0
  55. package/dist/protect-types.js.map +1 -1
  56. package/dist/settings.d.ts +1 -3
  57. package/dist/settings.js +1 -5
  58. package/dist/settings.js.map +1 -1
  59. package/homebridge-ui/public/lib/webUi-featureoptions.mjs +70 -70
  60. package/homebridge-ui/public/lib/webUi.mjs +7 -7
  61. package/homebridge-ui/public/ui.mjs +6 -5
  62. package/package.json +16 -16
@@ -65,36 +65,41 @@ export class ProtectEvents extends EventEmitter {
65
65
  }
66
66
  // Process Protect API update events.
67
67
  ufpUpdates(packet) {
68
+ const payload = packet.payload;
68
69
  let protectDevice;
69
70
  switch (packet.header.modelKey) {
70
71
  case "nvr":
71
- this.nvr.ufp = this.updateUfp(this.nvr.ufp, packet.payload);
72
+ this.nvr.ufp = this.updateUfp(this.nvr.ufp, payload);
72
73
  break;
73
74
  default:
74
75
  // Lookup the device.
75
- protectDevice = this.nvr.deviceLookup(packet.header.id);
76
+ protectDevice = this.nvr.getDeviceById(packet.header.id);
76
77
  // No device found, we're done.
77
78
  if (!protectDevice) {
78
79
  break;
79
80
  }
80
- // Update our device state.
81
- protectDevice.ufp = this.updateUfp(protectDevice.ufp, packet.payload);
82
- // Detect device availability changes.
83
- if (packet.payload.state) {
84
- protectDevice.log.debug("State has changed to %s.", protectDevice.isOnline ? "online" : "offline");
81
+ // Update our device state. If we're refreshing the bootstrap, we set it as the full payload rather than update the UFP configuration.
82
+ protectDevice.ufp = packet.header.hbupBootstrap ? payload : this.updateUfp(protectDevice.ufp, payload);
83
+ // Detect device availability changes. This ensures we capture the true availability state of a Protect device since it appears that Protect occasionally fails
84
+ // to send an event out indicating state changes. We catch anything that's been missed dynamically when the bootstrap update occurs.
85
+ if ("isConnected" in payload) {
85
86
  // If we have services on the accessory associated with the Protect device that have a StatusActive characteristic set, update our availability state.
86
87
  protectDevice.accessory.services.filter(x => x.testCharacteristic(this.hap.Characteristic.StatusActive))
87
88
  ?.map(x => x.updateCharacteristic(this.hap.Characteristic.StatusActive, protectDevice?.isOnline ?? true));
88
89
  }
90
+ // If this is a bootstrap-related update, we're done here. Anything beyond this point is intended for dynamic event updates.
91
+ if (packet.header.hbupBootstrap) {
92
+ break;
93
+ }
89
94
  // Sync names, if configured to do so.
90
- if (packet.payload.name && protectDevice.hints.syncName) {
95
+ if (payload.name && protectDevice.hints.syncName) {
91
96
  protectDevice.log.info("Name change detected. A restart of Homebridge may be needed in order to complete name synchronization with HomeKit.");
92
97
  protectDevice.configureInfo();
93
98
  }
94
99
  break;
95
100
  }
96
101
  // Update the internal list we maintain.
97
- this.ufpDeviceState[packet.header.id] = Object.assign(this.ufpDeviceState[packet.header.id] ?? {}, packet.payload);
102
+ this.ufpDeviceState[packet.header.id] = Object.assign(this.ufpDeviceState[packet.header.id] ?? {}, payload);
98
103
  }
99
104
  // Process device additions and removals from the Protect update events API.
100
105
  manageDevices(packet) {
@@ -109,7 +114,7 @@ export class ProtectEvents extends EventEmitter {
109
114
  }
110
115
  // Lookup the device.
111
116
  const deviceId = payload.metadata.deviceId.text;
112
- const protectDevice = this.nvr.deviceLookup(deviceId);
117
+ const protectDevice = this.nvr.getDeviceById(deviceId);
113
118
  // We're adopting.
114
119
  if (payload.type === "deviceAdopted") {
115
120
  if (protectDevice) {
@@ -137,11 +142,13 @@ export class ProtectEvents extends EventEmitter {
137
142
  this.prependListener("addEvent", this.manageDevices.bind(this));
138
143
  // 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.
139
144
  this.ufpApi.on("message", (packet) => {
145
+ let cameraId;
140
146
  switch (packet.header.action) {
141
147
  case "add":
142
148
  this.emit("addEvent", packet);
143
- if (packet.payload.camera) {
144
- this.emit("addEvent." + packet.payload.camera, packet);
149
+ cameraId = packet.payload.camera ?? packet.payload.cameraId;
150
+ if (cameraId) {
151
+ this.emit("addEvent." + cameraId, packet);
145
152
  }
146
153
  this.emit("addEvent." + packet.header.modelKey, packet);
147
154
  break;
@@ -185,42 +192,29 @@ export class ProtectEvents extends EventEmitter {
185
192
  if (("detectMotion" in protectDevice.accessory.context) && !protectDevice.accessory.context.detectMotion) {
186
193
  return;
187
194
  }
188
- // If we have an active motion event inflight, we're done.
189
- if (this.eventTimers[protectDevice.id]) {
190
- return;
191
- }
192
- const protectCamera = protectDevice;
193
- // Trigger the motion event in HomeKit.
194
- motionService.updateCharacteristic(this.hap.Characteristic.MotionDetected, true);
195
- // If we have a motion trigger switch configured, update it.
196
- protectDevice.accessory.getServiceById(this.hap.Service.Switch, ProtectReservedNames.SWITCH_MOTION_TRIGGER)?.updateCharacteristic(this.hap.Characteristic.On, true);
197
- // Publish the motion event to MQTT, if the user has configured it.
198
- this.nvr.mqtt?.publish(protectDevice.ufp.mac, "motion", "true");
199
- // Log the event, if configured to do so.
200
- if (protectDevice.hints.logMotion) {
201
- let logMessage = "";
202
- // If we have license plate telemetry, let's inform the user if we're logging for motion events.
203
- if (metadata?.licensePlate && detectedObjects.includes("licensePlate") && metadata.licensePlate.name) {
204
- logMessage = " (license plate: " + metadata.licensePlate.name + ", " + metadata.licensePlate.confidenceLevel + "% confidence)";
195
+ // Only update HomeKit if we don't have a motion event inflight.
196
+ if (!this.eventTimers[protectDevice.id]) {
197
+ // Trigger the motion event in HomeKit.
198
+ motionService.updateCharacteristic(this.hap.Characteristic.MotionDetected, true);
199
+ // If we have a motion trigger switch configured, update it.
200
+ protectDevice.accessory.getServiceById(this.hap.Service.Switch, ProtectReservedNames.SWITCH_MOTION_TRIGGER)?.updateCharacteristic(this.hap.Characteristic.On, true);
201
+ // Publish the motion event to MQTT, if the user has configured it.
202
+ this.nvr.mqtt?.publish(protectDevice.ufp.mac, "motion", "true");
203
+ // Log the event, if configured to do so.
204
+ if (protectDevice.hints.logMotion) {
205
+ let logMessage = "";
206
+ // If we have license plate telemetry, let's inform the user if we're logging for motion events.
207
+ if (metadata?.licensePlate && detectedObjects.includes("licensePlate") && metadata.licensePlate.name) {
208
+ logMessage = " (license plate: " + metadata.licensePlate.name + ", " + metadata.licensePlate.confidenceLevel + "% confidence)";
209
+ }
210
+ protectDevice.log.info("Motion detected%s.", ((protectDevice.ufp.modelKey === "camera") && detectedObjects.length &&
211
+ (!protectDevice.stream?.hksv?.isRecording ||
212
+ protectDevice.hints.smartDetect || protectDevice.hints.smartDetectSensors)) ? ": " + detectedObjects.sort().join(", ") + logMessage : "");
205
213
  }
206
- protectDevice.log.info("Motion detected%s.", ((protectDevice.ufp.modelKey === "camera") && detectedObjects.length &&
207
- (!protectCamera.stream?.hksv?.isRecording ||
208
- protectCamera.hints.smartDetect || protectDevice.hasFeature("Motion.SmartDetect.ObjectSensors"))) ? ": " + detectedObjects.sort().join(", ") + logMessage : "");
209
214
  }
210
- // Iterate through our detected Protect smart object types.
211
- for (const detectedObject of detectedObjects) {
212
- // Trigger smart motion contact sensor, if configured.
213
- protectDevice.accessory.getServiceById(this.hap.Service.ContactSensor, ProtectReservedNames.CONTACT_MOTION_SMARTDETECT + "." + detectedObject)
214
- ?.updateCharacteristic(this.hap.Characteristic.ContactSensorState, true);
215
- // Publish the smart motion event to MQTT, if the user has configured it.
216
- this.nvr.mqtt?.publish(protectDevice.ufp.mac, "motion/smart/" + detectedObject, "true");
217
- // Trigger license plate contact sensors, if configured.
218
- if (metadata && ("licensePlate" in metadata) && (detectedObject === "licensePlate") && ("name" in metadata.licensePlate)) {
219
- protectDevice.accessory.getServiceById(this.hap.Service.ContactSensor, ProtectReservedNames.CONTACT_MOTION_SMARTDETECT_LICENSE + "." +
220
- metadata.licensePlate.name.toUpperCase())?.updateCharacteristic(this.hap.Characteristic.ContactSensorState, true);
221
- // Publish the smart motion event to MQTT, if the user has configured it.
222
- this.nvr.mqtt?.publish(protectDevice.ufp.mac, "motion/smart/" + detectedObject + "/metadata", JSON.stringify(metadata));
223
- }
215
+ else {
216
+ // Clear out the inflight motion event timer.
217
+ clearTimeout(this.eventTimers[protectDevice.id]);
224
218
  }
225
219
  // Reset our motion event after motionDuration.
226
220
  this.eventTimers[protectDevice.id] = setTimeout(() => {
@@ -235,14 +229,36 @@ export class ProtectEvents extends EventEmitter {
235
229
  delete this.eventTimers[protectDevice.id];
236
230
  }, protectDevice.hints.motionDuration * 1000);
237
231
  // If we have an active smart motion contact sensor reset timer, let's cancel it and create a new one.
238
- if (this.eventTimers[protectDevice.id + ".Motion.SmartDetect.ObjectSensors"]) {
239
- // Clear out the inflight timer from our motion event tracker.
240
- clearTimeout(this.eventTimers[protectDevice.id + ".Motion.SmartDetect.ObjectSensors"]);
232
+ detectedObjects.map(objectSensor => this.eventTimers[protectDevice.id + ".Motion.SmartDetect.ObjectSensors." + objectSensor] &&
233
+ clearTimeout(this.eventTimers[protectDevice.id + ".Motion.SmartDetect.ObjectSensors." + objectSensor]));
234
+ // Iterate through our detected Protect smart object types, if not already triggered.
235
+ for (const detectedObject of detectedObjects.filter(objectSensor => !protectDevice.accessory.getServiceById(this.hap.Service.ContactSensor, ProtectReservedNames.CONTACT_MOTION_SMARTDETECT + "." + objectSensor)?.getCharacteristic(this.hap.Characteristic.ContactSensorState).value)) {
236
+ // Trigger smart motion contact sensor, if configured.
237
+ protectDevice.accessory.getServiceById(this.hap.Service.ContactSensor, ProtectReservedNames.CONTACT_MOTION_SMARTDETECT + "." + detectedObject)
238
+ ?.updateCharacteristic(this.hap.Characteristic.ContactSensorState, true);
239
+ // Publish the smart motion event to MQTT, if the user has configured it.
240
+ this.nvr.mqtt?.publish(protectDevice.ufp.mac, "motion/smart/" + detectedObject, "true");
241
+ // Trigger license plate contact sensors, if configured.
242
+ if (metadata && ("licensePlate" in metadata) && (detectedObject === "licensePlate") && ("name" in metadata.licensePlate)) {
243
+ protectDevice.accessory.getServiceById(this.hap.Service.ContactSensor, ProtectReservedNames.CONTACT_MOTION_SMARTDETECT_LICENSE + "." +
244
+ metadata.licensePlate.name.toUpperCase())?.updateCharacteristic(this.hap.Characteristic.ContactSensorState, true);
245
+ // Publish the smart motion event to MQTT, if the user has configured it.
246
+ this.nvr.mqtt?.publish(protectDevice.ufp.mac, "motion/smart/" + detectedObject + "/metadata", JSON.stringify(metadata));
247
+ }
248
+ // Log the event, if configured to do so.
249
+ if (protectDevice.hints.logMotion) {
250
+ let logMessage = "";
251
+ // If we have license plate telemetry, let's inform the user if we're logging for motion events.
252
+ if (metadata?.licensePlate && (detectedObject === "licensePlate") && metadata.licensePlate.name) {
253
+ logMessage = " (license plate: " + metadata.licensePlate.name + ", " + metadata.licensePlate.confidenceLevel + "% confidence)";
254
+ }
255
+ protectDevice.log.info("Motion detected: %s%s.", detectedObject, logMessage);
256
+ }
241
257
  }
242
- // Reset our smart motion contact sensors after motionDuration.
243
- this.eventTimers[protectDevice.id + ".Motion.SmartDetect.ObjectSensors"] = setTimeout(() => {
244
- // Reset smart motion contact sensors, if configured.
245
- for (const detectedObject of detectedObjects) {
258
+ // Reset smart motion contact sensors, if configured.
259
+ for (const detectedObject of detectedObjects) {
260
+ // Reset our smart motion contact sensors after motionDuration.
261
+ this.eventTimers[protectDevice.id + ".Motion.SmartDetect.ObjectSensors." + detectedObject] = setTimeout(() => {
246
262
  // Reset our license plate contact sensor, if configured.
247
263
  if (metadata && ("licensePlate" in metadata) && (detectedObject === "licensePlate") && ("name" in metadata.licensePlate)) {
248
264
  protectDevice.accessory.getServiceById(this.hap.Service.ContactSensor, ProtectReservedNames.CONTACT_MOTION_SMARTDETECT_LICENSE + "." +
@@ -254,12 +270,12 @@ export class ProtectEvents extends EventEmitter {
254
270
  // Publish the smart motion event to MQTT, if the user has configured it.
255
271
  this.nvr.mqtt?.publish(protectDevice.ufp.mac, "motion/smart/" + detectedObject, "false");
256
272
  protectDevice.log.debug("Resetting smart object motion event.");
257
- }
258
- // Delete the timer from our motion event tracker.
259
- delete this.eventTimers[protectDevice.id + ".Motion.SmartDetect.ObjectSensors"];
260
- }, protectDevice.hints.motionDuration * 1000);
261
- // If we don't have smart motion detection enabled, or if we do have it enabled and we have a smart motion event that's detected a person, let's process our
262
- // occupancy event updates.
273
+ // Delete the timer from our motion event tracker.
274
+ delete this.eventTimers[protectDevice.id + ".Motion.SmartDetect.ObjectSensors"];
275
+ }, protectDevice.hints.motionDuration * 1000);
276
+ }
277
+ // If we don't have smart motion detection enabled, or if we do have it enabled and we have a smart motion event that's detected an object of interest, let's process
278
+ // our occupancy event updates.
263
279
  if (!protectDevice.hints.smartDetect || (protectDevice.hints.smartDetect && detectedObjects.some(x => protectDevice.hints.smartOccupancy.includes(x)))) {
264
280
  // First, let's determine if the user has an occupancy sensor configured, before we process anything.
265
281
  const occupancyService = protectDevice.accessory.getService(this.hap.Service.OccupancySensor);
@@ -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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"}
@@ -1,12 +1,15 @@
1
1
  import { ProtectCamera } from "./devices/index.js";
2
2
  import { ProtectLivestream } from "unifi-protect";
3
3
  export declare class LivestreamManager {
4
+ private eventHandlers;
4
5
  private livestreams;
5
6
  private protectCamera;
6
7
  private subscriberCount;
8
+ private segmentTimers;
7
9
  constructor(protectCamera: ProtectCamera);
8
10
  private getIndex;
9
11
  acquire(channel: number, lens?: number): ProtectLivestream;
12
+ shutdown(): void;
10
13
  start(channel: number, lens?: number, segmentLength?: number): Promise<boolean>;
11
14
  stop(channel: number, lens?: number): void;
12
15
  }
@@ -3,16 +3,21 @@
3
3
  * protect-livestream.ts: Protect livestream API manager.
4
4
  */
5
5
  import { PROTECT_HKSV_SEGMENT_RESOLUTION } from "./settings.js";
6
- import { retry } from "homebridge-plugin-utils";
6
+ import { sleep } from "homebridge-plugin-utils";
7
+ const LIVESTREAM_TIMEOUT = 3500;
7
8
  export class LivestreamManager {
9
+ eventHandlers;
8
10
  livestreams;
9
11
  protectCamera;
10
12
  subscriberCount;
13
+ segmentTimers;
11
14
  // Create an instance.
12
15
  constructor(protectCamera) {
16
+ this.eventHandlers = {};
17
+ this.livestreams = {};
13
18
  this.protectCamera = protectCamera;
19
+ this.segmentTimers = {};
14
20
  this.subscriberCount = {};
15
- this.livestreams = {};
16
21
  }
17
22
  // Utility to return an index into our livestream connection pool.
18
23
  getIndex(channel, lens) {
@@ -33,6 +38,16 @@ export class LivestreamManager {
33
38
  this.subscriberCount[index] = 0;
34
39
  return this.livestreams[index] = this.protectCamera.nvr.ufpApi.createLivestream();
35
40
  }
41
+ // Shutdown all our connections.
42
+ shutdown() {
43
+ // Cleanup all the listeners and shutdown our livestreams.
44
+ Object.values(this.segmentTimers).map(timer => clearTimeout(timer));
45
+ Object.values(this.livestreams).map(livestream => livestream.removeAllListeners() && livestream.stop());
46
+ this.eventHandlers = {};
47
+ this.livestreams = {};
48
+ this.segmentTimers = {};
49
+ this.subscriberCount = {};
50
+ }
36
51
  // Access the livestream API, registering as a consumer.
37
52
  async start(channel, lens, segmentLength = PROTECT_HKSV_SEGMENT_RESOLUTION) {
38
53
  let index;
@@ -43,12 +58,47 @@ export class LivestreamManager {
43
58
  return false;
44
59
  }
45
60
  // 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.
46
- if (!this.subscriberCount[index] && !(await retry(async () => this.livestreams[index].start(this.protectCamera.ufp.id, channel, lens, segmentLength, this.protectCamera.name + ":" + index), 1000, 3))) {
61
+ if (!this.subscriberCount[index] &&
62
+ !(await this.livestreams[index].start(this.protectCamera.ufp.id, channel, lens, segmentLength, this.protectCamera.name + ":" + index))) {
47
63
  this.protectCamera.log.error("Unable to access the Protect livestream API: this is typically due to the Protect controller or camera rebooting.");
48
- await this.protectCamera.nvr.resetNvrConnection();
49
64
  // Something went wrong in communicating with the controller.
50
65
  return false;
51
66
  }
67
+ // Keep track of any issues in the livestream.
68
+ if (!this.subscriberCount[index]) {
69
+ let isRestarting = false;
70
+ // Configure a restart event for the livestream API session so we can restart the session in case of problems.
71
+ this.livestreams[index].on("restart", this.eventHandlers[index + ".restart"] = async () => {
72
+ // If we have a restart inflight, we're done.
73
+ if (isRestarting) {
74
+ return;
75
+ }
76
+ isRestarting = true;
77
+ this.protectCamera.log.warn("Reconnecting to the livestream API.");
78
+ // Clear out any existing timer.
79
+ if (this.segmentTimers[index]) {
80
+ clearTimeout(this.segmentTimers[index]);
81
+ }
82
+ this.livestreams[index].stop();
83
+ // Wait at least a full minute before we try to reconnect to the livestream. This accounts for reboots and other potential connection issues that can occur.
84
+ await sleep((((Math.random() * 10) + 60) * 1000));
85
+ await this.livestreams[index].start(this.protectCamera.ufp.id, channel, lens, segmentLength, this.protectCamera.name + ":" + index);
86
+ // Check on the state of our livestream API session regularly.
87
+ this.segmentTimers[index] = setTimeout(() => this.livestreams[index].emit("restart"), LIVESTREAM_TIMEOUT);
88
+ isRestarting = false;
89
+ });
90
+ // Set a regular heartbeat for the livestream API.
91
+ this.livestreams[index].on("segment", this.eventHandlers[index] = () => {
92
+ // Clear out any existing timer.
93
+ if (this.segmentTimers[index]) {
94
+ clearTimeout(this.segmentTimers[index]);
95
+ }
96
+ // Check on the state of our livestream API session regularly.
97
+ this.segmentTimers[index] = setTimeout(() => this.livestreams[index].emit("restart"), LIVESTREAM_TIMEOUT);
98
+ });
99
+ // Set an initial timer in case we have an issue with the livestream API at startup.
100
+ this.segmentTimers[index] = setTimeout(() => this.livestreams[index].emit("restart"), LIVESTREAM_TIMEOUT);
101
+ }
52
102
  // Increment our consumer count.
53
103
  this.subscriberCount[index]++;
54
104
  return true;
@@ -56,12 +106,18 @@ export class LivestreamManager {
56
106
  // End a livestream API connection once all the consumers of the livestream are done.
57
107
  stop(channel, lens) {
58
108
  const { index } = this.getIndex(channel, lens);
59
- // If we have open livestreams, we'll won't close the livestream.
109
+ // If we have open livestreams, we don't want to close the livestream session.
60
110
  if (--this.subscriberCount[index] > 0) {
61
111
  return;
62
112
  }
63
113
  // End our livestream API connection.
64
114
  this.livestreams[index].stop();
115
+ // Cleanup our listeners.
116
+ this.livestreams[index].off("restart", this.eventHandlers[index + ".restart"]);
117
+ this.livestreams[index].off("segment", this.eventHandlers[index]);
118
+ if (this.segmentTimers[index]) {
119
+ clearTimeout(this.segmentTimers[index]);
120
+ }
65
121
  this.subscriberCount[index] = 0;
66
122
  }
67
123
  }
@@ -1 +1 @@
1
- {"version":3,"file":"protect-livestream.js","sourceRoot":"","sources":["../src/protect-livestream.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"protect-livestream.js","sourceRoot":"","sources":["../src/protect-livestream.ts"],"names":[],"mappings":"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"}
@@ -31,16 +31,15 @@ export declare class ProtectNvr {
31
31
  login(): Promise<void>;
32
32
  private configureNvr;
33
33
  private addProtectDevice;
34
- addHomeKitDevice(device: ProtectDeviceConfigTypes): ProtectDevice | null;
34
+ addHomeKitDevice(device: ProtectDeviceConfigTypes): boolean;
35
35
  private discoverAndSyncAccessories;
36
36
  private cleanupDevices;
37
37
  removeHomeKitDevice(protectDevice: ProtectDevice): void;
38
38
  private removeHomeKitAccessories;
39
39
  private servePlaylist;
40
- resetNvrConnection(): Promise<void>;
41
40
  private get devicelist();
42
41
  private devices;
43
- deviceLookup(deviceId: string): ProtectDevices | null;
42
+ getDeviceById(deviceId: string): ProtectDevices | null;
44
43
  getFeatureFloat(option: string): number | undefined;
45
44
  getFeatureNumber(option: string): number | undefined;
46
45
  isNvrFeature(option: string, device?: ProtectDeviceConfigTypes | ProtectNvrConfig): boolean;
@@ -56,7 +56,7 @@ export class ProtectNvr {
56
56
  this.api.on("shutdown" /* APIEvent.SHUTDOWN */, () => {
57
57
  for (const protectCamera of this.devices("camera")) {
58
58
  protectCamera.log.debug("Shutting down all video stream processes.");
59
- void protectCamera.stream?.shutdown();
59
+ protectCamera.stream?.shutdown();
60
60
  }
61
61
  });
62
62
  }
@@ -97,8 +97,8 @@ export class ProtectNvr {
97
97
  // Assign our name if the user hasn't explicitly specified a preference.
98
98
  this.name = this.config.name ?? (this.ufp.name ?? this.ufp.marketName);
99
99
  // If we are running an unsupported version of UniFi Protect, we're done.
100
- if (!this.ufp.version.startsWith("4.")) {
101
- this.log.error("This version of HBUP requires running UniFi Protect v4.0 or above.");
100
+ if (!this.ufp.version.startsWith("4.") || this.ufp.version.split(".").map(Number).slice(0, 2).join(".") < "4.1") {
101
+ this.log.error("This version of HBUP requires running UniFi Protect v4.1 or above using the official Protect release channel only.");
102
102
  this.ufpApi.logout();
103
103
  return;
104
104
  }
@@ -141,6 +141,11 @@ export class ProtectNvr {
141
141
  }
142
142
  this.log.info("Discovered %s: %s.", device.modelKey, this.ufpApi.getDeviceName(device, device.name ?? device.marketName, true));
143
143
  }
144
+ // Bootstrap refresh loop.
145
+ const bootstrapRefresh = () => {
146
+ // Sleep until it's time to bootstrap again.
147
+ setTimeout(() => void this.bootstrapNvr(), PROTECT_CONTROLLER_REFRESH_INTERVAL * 1000);
148
+ };
144
149
  // Sync the Protect controller's devices with HomeKit.
145
150
  const syncUfpHomeKit = () => {
146
151
  // Sync status and check for any new or removed accessories.
@@ -150,11 +155,6 @@ export class ProtectNvr {
150
155
  };
151
156
  // Initialize our Protect controller device sync.
152
157
  syncUfpHomeKit();
153
- // Bootstrap refresh loop.
154
- const bootstrapRefresh = () => {
155
- // Sleep until it's time to bootstrap again.
156
- setTimeout(() => void this.bootstrapNvr(), PROTECT_CONTROLLER_REFRESH_INTERVAL * 1000);
157
- };
158
158
  // Let's set a listener to wait for bootstrap events to occur so we can keep ourselves in sync with the Protect controller.
159
159
  this.ufpApi.on("bootstrap", () => {
160
160
  // Sync our device view.
@@ -172,7 +172,7 @@ export class ProtectNvr {
172
172
  // Create instances of Protect device types in our plugin.
173
173
  addProtectDevice(accessory, device) {
174
174
  if (!accessory || !device) {
175
- return false;
175
+ return null;
176
176
  }
177
177
  switch (device.modelKey) {
178
178
  case "camera":
@@ -183,48 +183,50 @@ export class ProtectNvr {
183
183
  else {
184
184
  this.configuredDevices[accessory.UUID] = new ProtectCamera(this, device, accessory);
185
185
  }
186
- return true;
186
+ break;
187
187
  case "chime":
188
188
  // We have a UniFi Protect chime.
189
189
  this.configuredDevices[accessory.UUID] = new ProtectChime(this, device, accessory);
190
- return true;
190
+ break;
191
191
  case "light":
192
192
  // We have a UniFi Protect light.
193
193
  this.configuredDevices[accessory.UUID] = new ProtectLight(this, device, accessory);
194
- return true;
194
+ break;
195
195
  case "sensor":
196
196
  // We have a UniFi Protect sensor.
197
197
  this.configuredDevices[accessory.UUID] = new ProtectSensor(this, device, accessory);
198
- return true;
198
+ break;
199
199
  case "viewer":
200
200
  // We have a UniFi Protect viewer.
201
201
  this.configuredDevices[accessory.UUID] = new ProtectViewer(this, device, accessory);
202
- return true;
202
+ break;
203
203
  default:
204
204
  this.log.error("Unknown device class %s detected for %s.", device.modelKey, device.name ?? device.marketName);
205
- return false;
205
+ return null;
206
206
  }
207
+ // Return our newly created device.
208
+ return this.configuredDevices[accessory.UUID];
207
209
  }
208
210
  // Add a newly detected Protect device to HomeKit.
209
211
  addHomeKitDevice(device) {
210
212
  // If we have no MAC address, name, or this camera isn't being managed by this Protect controller, we're done.
211
213
  if (!this.ufp?.mac || !device || !device.mac || device.isAdoptedByOther || !device.isAdopted) {
212
- return null;
214
+ return false;
213
215
  }
214
216
  // We only support certain devices.
215
217
  if (!ProtectDeviceCategories.includes(device.modelKey)) {
216
218
  // If we've already informed the user about this one, we're done.
217
219
  if (this.unsupportedDevices[device.mac]) {
218
- return null;
220
+ return false;
219
221
  }
220
222
  // Notify the user we see this device, but we aren't adding it to HomeKit.
221
223
  this.unsupportedDevices[device.mac] = true;
222
224
  this.log.info("UniFi Protect device type %s is not currently supported, ignoring: %s.", device.modelKey, this.ufpApi.getDeviceName(device));
223
- return null;
225
+ return false;
224
226
  }
225
227
  // Enable or disable certain devices based on configuration parameters.
226
228
  if (!this.hasFeature("Device", device)) {
227
- return null;
229
+ return false;
228
230
  }
229
231
  // Generate this device's unique identifier.
230
232
  const uuid = this.hap.uuid.generate(device.mac);
@@ -243,15 +245,14 @@ export class ProtectNvr {
243
245
  this.platform.accessories.push(accessory);
244
246
  this.api.updatePlatformAccessories(this.platform.accessories);
245
247
  }
246
- // Link the accessory to it's device object and it's hosting NVR.
247
- accessory.context.nvr = this.ufp.mac;
248
- // Locate our existing Protect device instance, if we have one.
249
- const protectDevice = this.configuredDevices[accessory.UUID];
250
- // Setup the Protect device if it hasn't been configured yet.
251
- if (!protectDevice) {
248
+ // Setup the accessory as a new Protect device in HBUP if we haven't configured it yet.
249
+ if (!this.configuredDevices[accessory.UUID]) {
252
250
  this.addProtectDevice(accessory, device);
251
+ return true;
253
252
  }
254
- return protectDevice;
253
+ // Update the configuration on an existing Protect device.
254
+ this.events.emit("updateEvent", { header: { action: "update", hbupBootstrap: true, id: device.id, modelKey: device.modelKey }, payload: device });
255
+ return true;
255
256
  }
256
257
  // Discover and sync UniFi Protect devices between HomeKit and the Protect controller.
257
258
  discoverAndSyncAccessories() {
@@ -498,38 +499,18 @@ export class ProtectNvr {
498
499
  // Listen on the port we've configured.
499
500
  server.listen(port);
500
501
  }
501
- // Reauthenticate with the NVR and reset any HKSV-enabled devices, as needed.
502
- async resetNvrConnection() {
503
- // Reset our HKSV-enabled devices.
504
- await Promise.all(this.devices("camera").filter(x => x.hasHksv).map(async (x) => x.stream.hksv?.reset()));
505
- // Clear our login credentials and error statistics.
506
- this.nvrHksvErrors = 0;
507
- this.ufpApi.reset();
508
- // Bootstrap the Protect NVR.
509
- await this.bootstrapNvr();
510
- // Inform all HKSV-enabled devices that are using a timeshift buffer to reset.
511
- for (const protectCamera of this.devices("camera").filter(x => x.hasHksv)) {
512
- // Restart the timeshift buffer, if configured.
513
- // eslint-disable-next-line no-await-in-loop
514
- await protectCamera.stream.hksv?.restartTimeshifting();
515
- // Put in a short delay between cameras, to alleviate potentially impacts to the Protect controller.
516
- // eslint-disable-next-line no-await-in-loop
517
- await sleep(1500);
518
- }
519
- }
520
502
  // Return all configured devices.
521
503
  get devicelist() {
522
504
  return Object.values(this.configuredDevices);
523
505
  }
524
506
  // Return all devices of a particular modelKey.
525
507
  devices(model) {
526
- return Object.values(this.configuredDevices).filter(x => x.ufp?.modelKey === model);
508
+ return Object.values(this.configuredDevices).filter(device => device.ufp?.modelKey === model);
527
509
  }
528
- // Lookup a device by it's identifier and return it if it exists.
529
- deviceLookup(deviceId) {
510
+ // Return the Protect device object based on it's unique device identifier, if it exists.
511
+ getDeviceById(deviceId) {
530
512
  // Find the device.
531
- const foundDevice = Object.keys(this.configuredDevices).find(x => this.configuredDevices[x].ufp.id === deviceId);
532
- return foundDevice ? this.configuredDevices[foundDevice] : null;
513
+ return Object.values(this.configuredDevices).find(device => device.ufp.id === deviceId) ?? null;
533
514
  }
534
515
  // Utility function to return a floating point configuration parameter on a device.
535
516
  getFeatureFloat(option) {