homebridge-unifi-protect 7.5.1 → 7.6.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.
@@ -16,6 +16,7 @@ export declare enum ProtectReservedNames {
16
16
  CONTACT_MOTION_SMARTDETECT_LICENSE = "ContactMotionSmartDetectLicense",
17
17
  CONTACT_SENSOR = "ContactSensor",
18
18
  CONTACT_SENSOR_ALARM_SOUND = "ContactAlarmSound",
19
+ LIGHTBULB_DOORBELL_VOLUME = "ChimeVolume",
19
20
  LIGHTBULB_NIGHTVISION = "NightVision",
20
21
  SWITCH_DOORBELL_CHIME_BUZZER = "DoorbellChime.buzzer",
21
22
  SWITCH_DOORBELL_CHIME_DIGITAL = "DoorbellChime.digital",
@@ -16,6 +16,7 @@ export var ProtectReservedNames;
16
16
  ProtectReservedNames["CONTACT_SENSOR"] = "ContactSensor";
17
17
  ProtectReservedNames["CONTACT_SENSOR_ALARM_SOUND"] = "ContactAlarmSound";
18
18
  // Manage our lightbulb types.
19
+ ProtectReservedNames["LIGHTBULB_DOORBELL_VOLUME"] = "ChimeVolume";
19
20
  ProtectReservedNames["LIGHTBULB_NIGHTVISION"] = "NightVision";
20
21
  // Manage our switch types.
21
22
  ProtectReservedNames["SWITCH_DOORBELL_CHIME_BUZZER"] = "DoorbellChime.buzzer";
@@ -1 +1 @@
1
- {"version":3,"file":"protect-types.js","sourceRoot":"","sources":["../src/protect-types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,oBAAoB;AACpB,MAAM,UAAU,WAAW,CAAC,KAAa;IAEvC,OAAO,KAAK,CAAC,OAAO,CAAC,cAAc,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;AACrE,CAAC;AAYD,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAE,CAAC;AAI1F,uBAAuB;AACvB,MAAM,CAAN,IAAY,oBAyBX;AAzBD,WAAY,oBAAoB;IAE9B,mCAAmC;IACnC,+EAAuD,CAAA;IACvD,8FAAsE,CAAA;IACtE,wDAAgC,CAAA;IAChC,wEAAgD,CAAA;IAEhD,8BAA8B;IAC9B,6DAAqC,CAAA;IAErC,2BAA2B;IAC3B,6EAAqD,CAAA;IACrD,+EAAuD,CAAA;IACvD,qFAA6D,CAAA;IAC7D,yEAAiD,CAAA;IACjD,+EAAuD,CAAA;IACvD,mEAA2C,CAAA;IAC3C,qEAA6C,CAAA;IAC7C,mEAA2C,CAAA;IAC3C,qEAA6C,CAAA;IAC7C,6DAAqC,CAAA;IACrC,iFAAyD,CAAA;IACzD,yFAAiE,CAAA;IACjE,+EAAuD,CAAA;AACzD,CAAC,EAzBW,oBAAoB,KAApB,oBAAoB,QAyB/B"}
1
+ {"version":3,"file":"protect-types.js","sourceRoot":"","sources":["../src/protect-types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,oBAAoB;AACpB,MAAM,UAAU,WAAW,CAAC,KAAa;IAEvC,OAAO,KAAK,CAAC,OAAO,CAAC,cAAc,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;AACrE,CAAC;AAYD,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAE,CAAC;AAI1F,uBAAuB;AACvB,MAAM,CAAN,IAAY,oBA0BX;AA1BD,WAAY,oBAAoB;IAE9B,mCAAmC;IACnC,+EAAuD,CAAA;IACvD,8FAAsE,CAAA;IACtE,wDAAgC,CAAA;IAChC,wEAAgD,CAAA;IAEhD,8BAA8B;IAC9B,iEAAyC,CAAA;IACzC,6DAAqC,CAAA;IAErC,2BAA2B;IAC3B,6EAAqD,CAAA;IACrD,+EAAuD,CAAA;IACvD,qFAA6D,CAAA;IAC7D,yEAAiD,CAAA;IACjD,+EAAuD,CAAA;IACvD,mEAA2C,CAAA;IAC3C,qEAA6C,CAAA;IAC7C,mEAA2C,CAAA;IAC3C,qEAA6C,CAAA;IAC7C,6DAAqC,CAAA;IACrC,iFAAyD,CAAA;IACzD,yFAAiE,CAAA;IACjE,+EAAuD,CAAA;AACzD,CAAC,EA1BW,oBAAoB,KAApB,oBAAoB,QA0B/B"}
@@ -14,6 +14,7 @@ export declare const PROTECT_LIVESTREAM_API_IDR_INTERVAL = 5;
14
14
  export declare const PROTECT_HKSV_IDR_INTERVAL = 1;
15
15
  export declare const PROTECT_HKSV_FRAGMENT_LENGTH = 4000;
16
16
  export declare const PROTECT_HKSV_SEGMENT_RESOLUTION = 100;
17
+ export declare const PROTECT_HKSV_TIMEOUT = 4500;
17
18
  export declare const PROTECT_HKSV_TIMESHIFT_BUFFER_MAXDURATION: number;
18
19
  export declare const PROTECT_HOMEKIT_IDR_INTERVAL = 5;
19
20
  export declare const PROTECT_HOMEKIT_STREAMING_HEADROOM = 64;
package/dist/settings.js CHANGED
@@ -34,6 +34,8 @@ export const PROTECT_HKSV_IDR_INTERVAL = 1;
34
34
  export const PROTECT_HKSV_FRAGMENT_LENGTH = 4000;
35
35
  // HomeKit Secure Video segment resolution, in milliseconds. This defines the resolution of our buffer. It should never be less than 100ms or greater than 1500ms.
36
36
  export const PROTECT_HKSV_SEGMENT_RESOLUTION = 100;
37
+ // HomeKit Secure Video communication timeout threshold, in milliseconds. HKSV has a strict 5 second threshold for communication, so we set this a little below that.
38
+ export const PROTECT_HKSV_TIMEOUT = 4500;
37
39
  // HomeKit Secure Video timeshift buffer default duration, in milliseconds. This defines how far back in time we can look when we see a motion event.
38
40
  export const PROTECT_HKSV_TIMESHIFT_BUFFER_MAXDURATION = PROTECT_LIVESTREAM_API_IDR_INTERVAL * 1000 * 2;
39
41
  // HomeKit prefers an I-frame interval of 5 seconds when livestreaming.
@@ -1 +1 @@
1
- {"version":3,"file":"settings.js","sourceRoot":"","sources":["../src/settings.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,0BAA0B;AAC1B,MAAM,CAAC,MAAM,WAAW,GAAG,0BAA0B,CAAC;AAEtD,mCAAmC;AACnC,MAAM,CAAC,MAAM,aAAa,GAAG,eAAe,CAAC;AAE7C,yFAAyF;AACzF,MAAM,CAAC,MAAM,mCAAmC,GAAG,GAAG,CAAC;AAEvD,0GAA0G;AAC1G,MAAM,CAAC,MAAM,iCAAiC,GAAG,EAAE,CAAC;AAEpD,mFAAmF;AACnF,MAAM,CAAC,MAAM,qCAAqC,GAAG,EAAE,CAAC;AAExD,6IAA6I;AAC7I,MAAM,CAAC,MAAM,uCAAuC,GAAG,IAAI,CAAC;AAE5D,oHAAoH;AACpH,MAAM,CAAC,MAAM,uCAAuC,GAAG,IAAI,CAAC;AAE5D,sHAAsH;AACtH,MAAM,CAAC,MAAM,iCAAiC,GAAG,IAAI,CAAC;AAEtD,mIAAmI;AACnI,MAAM,CAAC,MAAM,iCAAiC,GAAG,EAAE,CAAC;AAEpD,4GAA4G;AAC5G,MAAM,CAAC,MAAM,oCAAoC,GAAG,GAAG,CAAC;AAExD,2GAA2G;AAC3G,MAAM,CAAC,MAAM,mCAAmC,GAAG,IAAI,CAAC;AAExD,+DAA+D;AAC/D,MAAM,CAAC,MAAM,sBAAsB,GAAG,EAAE,CAAC;AAEzC,0KAA0K;AAC1K,MAAM,CAAC,MAAM,mCAAmC,GAAG,CAAC,CAAC;AAErD,qFAAqF;AACrF,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,CAAC;AAE3C,qGAAqG;AACrG,MAAM,CAAC,MAAM,4BAA4B,GAAG,IAAI,CAAC;AAEjD,kKAAkK;AAClK,MAAM,CAAC,MAAM,+BAA+B,GAAG,GAAG,CAAC;AAEnD,qJAAqJ;AACrJ,MAAM,CAAC,MAAM,yCAAyC,GAAG,mCAAmC,GAAG,IAAI,GAAG,CAAC,CAAC;AAExG,uEAAuE;AACvE,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,CAAC;AAE9C,+IAA+I;AAC/I,MAAM,CAAC,MAAM,kCAAkC,GAAG,EAAE,CAAC;AAErD,wJAAwJ;AACxJ,MAAM,CAAC,MAAM,yBAAyB,GAAG,KAAK,CAAC;AAE/C,0HAA0H;AAC1H,MAAM,CAAC,MAAM,uBAAuB,GAAG,EAAE,CAAC;AAE1C,oGAAoG;AACpG,MAAM,CAAC,MAAM,+BAA+B,GAAG,EAAE,CAAC;AAElD,uGAAuG;AACvG,MAAM,CAAC,MAAM,kBAAkB,GAAG,eAAe,CAAC;AAElD,qDAAqD;AACrD,MAAM,CAAC,MAAM,0BAA0B,GAAG,GAAG,CAAC;AAE9C,2EAA2E;AAC3E,MAAM,CAAC,MAAM,uBAAuB,GAAG,GAAG,CAAC;AAE3C,wCAAwC;AACxC,MAAM,CAAC,MAAM,6BAA6B,GAAG,EAAE,CAAC;AAEhD,6EAA6E;AAC7E,MAAM,CAAC,MAAM,yBAAyB,GAAG,IAAI,CAAC;AAE9C,oFAAoF;AACpF,MAAM,CAAC,MAAM,sCAAsC,GAAG,IAAI,CAAC"}
1
+ {"version":3,"file":"settings.js","sourceRoot":"","sources":["../src/settings.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,0BAA0B;AAC1B,MAAM,CAAC,MAAM,WAAW,GAAG,0BAA0B,CAAC;AAEtD,mCAAmC;AACnC,MAAM,CAAC,MAAM,aAAa,GAAG,eAAe,CAAC;AAE7C,yFAAyF;AACzF,MAAM,CAAC,MAAM,mCAAmC,GAAG,GAAG,CAAC;AAEvD,0GAA0G;AAC1G,MAAM,CAAC,MAAM,iCAAiC,GAAG,EAAE,CAAC;AAEpD,mFAAmF;AACnF,MAAM,CAAC,MAAM,qCAAqC,GAAG,EAAE,CAAC;AAExD,6IAA6I;AAC7I,MAAM,CAAC,MAAM,uCAAuC,GAAG,IAAI,CAAC;AAE5D,oHAAoH;AACpH,MAAM,CAAC,MAAM,uCAAuC,GAAG,IAAI,CAAC;AAE5D,sHAAsH;AACtH,MAAM,CAAC,MAAM,iCAAiC,GAAG,IAAI,CAAC;AAEtD,mIAAmI;AACnI,MAAM,CAAC,MAAM,iCAAiC,GAAG,EAAE,CAAC;AAEpD,4GAA4G;AAC5G,MAAM,CAAC,MAAM,oCAAoC,GAAG,GAAG,CAAC;AAExD,2GAA2G;AAC3G,MAAM,CAAC,MAAM,mCAAmC,GAAG,IAAI,CAAC;AAExD,+DAA+D;AAC/D,MAAM,CAAC,MAAM,sBAAsB,GAAG,EAAE,CAAC;AAEzC,0KAA0K;AAC1K,MAAM,CAAC,MAAM,mCAAmC,GAAG,CAAC,CAAC;AAErD,qFAAqF;AACrF,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,CAAC;AAE3C,qGAAqG;AACrG,MAAM,CAAC,MAAM,4BAA4B,GAAG,IAAI,CAAC;AAEjD,kKAAkK;AAClK,MAAM,CAAC,MAAM,+BAA+B,GAAG,GAAG,CAAC;AAEnD,qKAAqK;AACrK,MAAM,CAAC,MAAM,oBAAoB,GAAG,IAAI,CAAC;AAEzC,qJAAqJ;AACrJ,MAAM,CAAC,MAAM,yCAAyC,GAAG,mCAAmC,GAAG,IAAI,GAAG,CAAC,CAAC;AAExG,uEAAuE;AACvE,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,CAAC;AAE9C,+IAA+I;AAC/I,MAAM,CAAC,MAAM,kCAAkC,GAAG,EAAE,CAAC;AAErD,wJAAwJ;AACxJ,MAAM,CAAC,MAAM,yBAAyB,GAAG,KAAK,CAAC;AAE/C,0HAA0H;AAC1H,MAAM,CAAC,MAAM,uBAAuB,GAAG,EAAE,CAAC;AAE1C,oGAAoG;AACpG,MAAM,CAAC,MAAM,+BAA+B,GAAG,EAAE,CAAC;AAElD,uGAAuG;AACvG,MAAM,CAAC,MAAM,kBAAkB,GAAG,eAAe,CAAC;AAElD,qDAAqD;AACrD,MAAM,CAAC,MAAM,0BAA0B,GAAG,GAAG,CAAC;AAE9C,2EAA2E;AAC3E,MAAM,CAAC,MAAM,uBAAuB,GAAG,GAAG,CAAC;AAE3C,wCAAwC;AACxC,MAAM,CAAC,MAAM,6BAA6B,GAAG,EAAE,CAAC;AAEhD,6EAA6E;AAC7E,MAAM,CAAC,MAAM,yBAAyB,GAAG,IAAI,CAAC;AAE9C,oFAAoF;AACpF,MAAM,CAAC,MAAM,sCAAsC,GAAG,IAAI,CAAC"}
@@ -190,13 +190,67 @@ const validOption = (device, option) => {
190
190
  return false;
191
191
  }
192
192
 
193
+ // Test for the explicit exclusion of a property if it's true.
194
+ if(device && option.isNotProperty?.some(x => device[x] === true)) {
195
+
196
+ return false;
197
+ }
198
+
199
+ // Test for device class-specific features and properties.
200
+ switch(device?.modelKey) {
201
+
202
+ case "camera":
203
+
204
+ if(option.hasCameraFeature && !option.hasCameraFeature.some(x => device.featureFlags[x])) {
205
+
206
+ return false;
207
+ }
208
+
209
+ break;
210
+
211
+ case "light":
212
+
213
+ if(option.hasLightProperty && !option.hasLightProperty.some(x => x in device)) {
214
+
215
+ return false;
216
+ }
217
+
218
+ break;
219
+
220
+ case "sensor":
221
+
222
+ if(option.hasSensorProperty && !option.hasSensorProperty.some(x => x in device)) {
223
+
224
+ return false;
225
+ }
226
+
227
+ break;
228
+
229
+ default:
230
+
231
+ break;
232
+ }
233
+
193
234
  return true;
194
235
  };
195
236
 
196
237
  // Only show feature option categories that are valid for a particular device type.
197
238
  const validOptionCategory = (device, category) => {
198
239
 
199
- if(device && (device.modelKey !== "nvr") && !category.modelKey.some(model => ["all", device.modelKey].includes(model))) {
240
+ // Always show all options at the global and controller level.
241
+ if(!device || (device?.modelKey === "nvr")) {
242
+
243
+ return true;
244
+ }
245
+
246
+ // Only show device categories we're explicitly interested in.
247
+ if(!category.modelKey?.some(model => ["all", device.modelKey].includes(model))) {
248
+
249
+ return false;
250
+ }
251
+
252
+ // Test for the explicit exclusion of a property if it's true.
253
+ if(category.isNotProperty?.some(x => device[x] === true)) {
200
254
 
201
255
  return false;
202
256
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "homebridge-unifi-protect",
3
- "version": "7.5.1",
3
+ "version": "7.6.0",
4
4
  "displayName": "Homebridge UniFi Protect",
5
5
  "description": "Homebridge UniFi Protect plugin providing complete HomeKit integration for the UniFi Protect ecosystem with full support for most features including autoconfiguration, motion detection, multiple controllers, and realtime updates.",
6
6
  "author": {
@@ -78,12 +78,12 @@
78
78
  "@homebridge/plugin-ui-utils": "1.0.3",
79
79
  "ffmpeg-for-homebridge": "2.1.1",
80
80
  "homebridge-plugin-utils": "^1.8.2",
81
- "unifi-protect": "^4.15.0",
81
+ "unifi-protect": "^4.15.1",
82
82
  "ws": "8.18.0"
83
83
  },
84
84
  "devDependencies": {
85
85
  "@stylistic/eslint-plugin": "2.8.0",
86
- "@types/node": "22.7.2",
86
+ "@types/node": "22.7.4",
87
87
  "@types/readable-stream": "4.0.15",
88
88
  "@types/ws": "8.5.12",
89
89
  "eslint": "9.11.1",