homebridge-unifi-protect 5.0.3 → 5.1.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.
- package/README.md +2 -1
- package/config.schema.json +3 -3
- package/dist/protect-camera.js +113 -19
- package/dist/protect-camera.js.map +1 -1
- package/dist/protect-doorbell.js +5 -6
- package/dist/protect-doorbell.js.map +1 -1
- package/dist/protect-ffmpeg.js +350 -81
- package/dist/protect-ffmpeg.js.map +1 -1
- package/dist/protect-liveviews.js +5 -14
- package/dist/protect-liveviews.js.map +1 -1
- package/dist/protect-nvr-events.js +101 -54
- package/dist/protect-nvr-events.js.map +1 -1
- package/dist/protect-nvr.js +1 -1
- package/dist/protect-nvr.js.map +1 -1
- package/dist/protect-platform.js +3 -3
- package/dist/protect-platform.js.map +1 -1
- package/dist/protect-record.js +230 -0
- package/dist/protect-record.js.map +1 -0
- package/dist/protect-securitysystem.js +14 -20
- package/dist/protect-securitysystem.js.map +1 -1
- package/dist/protect-stream.js +190 -115
- package/dist/protect-stream.js.map +1 -1
- package/dist/protect-timeshift.js +137 -0
- package/dist/protect-timeshift.js.map +1 -0
- package/dist/settings.js +9 -3
- package/dist/settings.js.map +1 -1
- package/package.json +10 -10
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ProtectTimeshiftBuffer = void 0;
|
|
4
|
+
const unifi_protect_1 = require("unifi-protect");
|
|
5
|
+
const events_1 = require("events");
|
|
6
|
+
const settings_1 = require("./settings");
|
|
7
|
+
// UniFi Protect livestream timeshift buffer.
|
|
8
|
+
class ProtectTimeshiftBuffer extends events_1.EventEmitter {
|
|
9
|
+
constructor(protectCamera) {
|
|
10
|
+
// Initialize the event emitter.
|
|
11
|
+
super();
|
|
12
|
+
this.accessory = protectCamera.accessory;
|
|
13
|
+
this.buffer = [];
|
|
14
|
+
this.bufferSize = 1;
|
|
15
|
+
this.livestream = new unifi_protect_1.ProtectLivestream(protectCamera.nvr.nvrApi, protectCamera.platform.log);
|
|
16
|
+
this.log = protectCamera.platform.log;
|
|
17
|
+
this.name = protectCamera.name.bind(protectCamera);
|
|
18
|
+
// We use 100ms in segment resolution for our timeshift buffer to ensure we provide an optimal
|
|
19
|
+
// timeshifting experience. It's a very small amount of additional overhead, but the result is
|
|
20
|
+
// a much better HKSV event recording.
|
|
21
|
+
this._segmentLength = 100;
|
|
22
|
+
this._isTransmitting = false;
|
|
23
|
+
this.configureTimeshiftBuffer();
|
|
24
|
+
}
|
|
25
|
+
// Configure the timeshift buffer.
|
|
26
|
+
configureTimeshiftBuffer() {
|
|
27
|
+
let seenFtyp = false;
|
|
28
|
+
let seenMoov = false;
|
|
29
|
+
// First, we need to listen for any segments sent by the UniFi Protect livestream in order
|
|
30
|
+
// to create our timeshift buffer.
|
|
31
|
+
this.livestream.on("message", (segment) => {
|
|
32
|
+
var _a, _b;
|
|
33
|
+
// Crucially, we don't want to keep any FTYP or MOOV atoms in our timeshift buffer. The
|
|
34
|
+
// reason for this is that these atoms are special in the MP4 world and must be transmitted
|
|
35
|
+
// at the beginning of any new MP4 stream. So what do we do? The livestream saves these atoms
|
|
36
|
+
// for us, so all we need to do is ensure we don't include them in our timeshift buffer. There
|
|
37
|
+
// should only ever be a single FTYP or MOOV atom, so once we've seen one, we don't need to
|
|
38
|
+
// worry about it again.
|
|
39
|
+
if (!seenFtyp && ((_a = this.livestream.ftyp) === null || _a === void 0 ? void 0 : _a.equals(segment))) {
|
|
40
|
+
seenFtyp = true;
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
if (!seenMoov && ((_b = this.livestream.moov) === null || _b === void 0 ? void 0 : _b.equals(segment))) {
|
|
44
|
+
seenMoov = true;
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
// Add the livestream segment to the end of the timeshift buffer.
|
|
48
|
+
this.buffer.push(segment);
|
|
49
|
+
// At a minimum we always want to maintain a single segment buffer.
|
|
50
|
+
if (this.bufferSize <= 0) {
|
|
51
|
+
this.bufferSize = 1;
|
|
52
|
+
}
|
|
53
|
+
// Trim the beginning of the buffer to our configured size unless we are transmitting
|
|
54
|
+
// to HomeKit, in which case, we queue up all the segments for consumption.
|
|
55
|
+
if (!this.isTransmitting && (this.buffer.length > this.bufferSize)) {
|
|
56
|
+
this.buffer.splice(0, this.buffer.length - this.bufferSize);
|
|
57
|
+
}
|
|
58
|
+
// If we're transmitting, we want to send all the segments we can so FFmpeg can consume it.
|
|
59
|
+
if (this.isTransmitting) {
|
|
60
|
+
for (let nextOne = this.buffer.shift(); nextOne; nextOne = this.buffer.shift()) {
|
|
61
|
+
this.emit("segment", nextOne);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
// Start the livestream and begin creating our timeshift buffer.
|
|
67
|
+
async start(channelId) {
|
|
68
|
+
// Clear out the timeshift buffer, if it's been previously filled, and then fire up the timeshift buffer.
|
|
69
|
+
this.buffer = [];
|
|
70
|
+
// Start the livestream and start buffering.
|
|
71
|
+
if (!(await this.livestream.start(this.accessory.context.device.id, channelId, settings_1.PROTECT_HKSV_LIVESTREAM_SEGMENT))) {
|
|
72
|
+
return false;
|
|
73
|
+
}
|
|
74
|
+
return true;
|
|
75
|
+
}
|
|
76
|
+
// Stop timeshifting the livestream.
|
|
77
|
+
stop() {
|
|
78
|
+
this.livestream.stop();
|
|
79
|
+
this.buffer = [];
|
|
80
|
+
return true;
|
|
81
|
+
}
|
|
82
|
+
// Start or stop transmitting our timeshift buffer.
|
|
83
|
+
transmitStream(transmitState) {
|
|
84
|
+
// If we're done transmitting, flag it, and allow our buffer to resume maintaining itself.
|
|
85
|
+
if (!transmitState) {
|
|
86
|
+
this._isTransmitting = false;
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
// Add the FTYP and MOOV atoms to the beginning of the timeshift buffer, if we have them.
|
|
90
|
+
// If we don't, FFmpeg will still be able to generate a valid fMP4 stream, albeit a slightly
|
|
91
|
+
// less elegantly.
|
|
92
|
+
if (this.livestream.ftyp && this.livestream.moov) {
|
|
93
|
+
this.buffer.unshift(this.livestream.ftyp, this.livestream.moov);
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
this.log.debug("%s: Warning: no MP4 stream headers found. This error can be largely ignored - FFmpeg will compensate.", this.name());
|
|
97
|
+
}
|
|
98
|
+
// Signal our livestream listener that it's time to start transmitting our queued segments and timeshift.
|
|
99
|
+
this._isTransmitting = true;
|
|
100
|
+
}
|
|
101
|
+
// Check if a segment is the FTYP box.
|
|
102
|
+
isFtyp(segment) {
|
|
103
|
+
var _a;
|
|
104
|
+
if ((_a = this.livestream.ftyp) === null || _a === void 0 ? void 0 : _a.equals(segment)) {
|
|
105
|
+
return true;
|
|
106
|
+
}
|
|
107
|
+
return false;
|
|
108
|
+
}
|
|
109
|
+
// Check if a segment is the MOOV box.
|
|
110
|
+
isMoov(segment) {
|
|
111
|
+
var _a;
|
|
112
|
+
if ((_a = this.livestream.moov) === null || _a === void 0 ? void 0 : _a.equals(segment)) {
|
|
113
|
+
return true;
|
|
114
|
+
}
|
|
115
|
+
return false;
|
|
116
|
+
}
|
|
117
|
+
// Return whether we are transmitting our timeshift buffer or not.
|
|
118
|
+
get isTransmitting() {
|
|
119
|
+
return this._isTransmitting;
|
|
120
|
+
}
|
|
121
|
+
// Retrieve the current size of the timeshift buffer, in milliseconds.
|
|
122
|
+
get length() {
|
|
123
|
+
return (this.bufferSize * this.segmentLength);
|
|
124
|
+
}
|
|
125
|
+
// Set the size of the timeshift buffer, in milliseconds.
|
|
126
|
+
set length(bufferMillis) {
|
|
127
|
+
// Calculate how many segments we need to keep in order to have the appropriate number of seconds in
|
|
128
|
+
// our buffer.
|
|
129
|
+
this.bufferSize = bufferMillis / this.segmentLength;
|
|
130
|
+
}
|
|
131
|
+
// Return the recording length, in milliseconds, of an individual segment.
|
|
132
|
+
get segmentLength() {
|
|
133
|
+
return this._segmentLength;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
exports.ProtectTimeshiftBuffer = ProtectTimeshiftBuffer;
|
|
137
|
+
//# sourceMappingURL=protect-timeshift.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protect-timeshift.js","sourceRoot":"","sources":["../src/protect-timeshift.ts"],"names":[],"mappings":"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"}
|
package/dist/settings.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.PROTECT_TWOWAY_HEARTBEAT_INTERVAL = exports.PROTECT_RING_DURATION = exports.PROTECT_NVR_UNIFIOS_REFRESH_INTERVAL = exports.PROTECT_MQTT_TOPIC = exports.PROTECT_MQTT_RECONNECT_INTERVAL = exports.PROTECT_MOTION_DURATION = exports.PROTECT_LOGIN_REFRESH_INTERVAL = exports.PROTECT_HOMEKIT_IDR_INTERVAL = exports.PROTECT_FFMPEG_VERBOSE_DURATION = exports.PROTECT_FFMPEG_OPTIONS = exports.PROTECT_FFMPEG_AUDIO_FILTER_LOWPASS = exports.PROTECT_FFMPEG_AUDIO_FILTER_HIGHPASS = exports.PROTECT_EVENTS_HEARTBEAT_INTERVAL = exports.PROTECT_API_TIMEOUT = exports.PROTECT_API_RETRY_INTERVAL = exports.PROTECT_API_ERROR_LIMIT = exports.PLATFORM_NAME = exports.PLUGIN_NAME = void 0;
|
|
3
|
+
exports.PROTECT_HKSV_BUFFER_LENGTH = exports.PROTECT_HKSV_SEGMENT_LENGTH = exports.PROTECT_HKSV_LIVESTREAM_SEGMENT = exports.PROTECT_TWOWAY_HEARTBEAT_INTERVAL = exports.PROTECT_RING_DURATION = exports.PROTECT_NVR_UNIFIOS_REFRESH_INTERVAL = exports.PROTECT_MQTT_TOPIC = exports.PROTECT_MQTT_RECONNECT_INTERVAL = exports.PROTECT_MOTION_DURATION = exports.PROTECT_LOGIN_REFRESH_INTERVAL = exports.PROTECT_HOMEKIT_IDR_INTERVAL = exports.PROTECT_FFMPEG_VERBOSE_DURATION = exports.PROTECT_FFMPEG_OPTIONS = exports.PROTECT_FFMPEG_AUDIO_FILTER_LOWPASS = exports.PROTECT_FFMPEG_AUDIO_FILTER_HIGHPASS = exports.PROTECT_EVENTS_HEARTBEAT_INTERVAL = exports.PROTECT_API_TIMEOUT = exports.PROTECT_API_RETRY_INTERVAL = exports.PROTECT_API_ERROR_LIMIT = exports.PLATFORM_NAME = exports.PLUGIN_NAME = void 0;
|
|
4
4
|
/* Copyright(C) 2017-2022, HJD (https://github.com/hjdhjd). All rights reserved.
|
|
5
5
|
*
|
|
6
6
|
* settings.ts: Settings and constants for homebridge-unifi-protect.
|
|
@@ -26,7 +26,7 @@ exports.PROTECT_FFMPEG_AUDIO_FILTER_LOWPASS = 1000;
|
|
|
26
26
|
exports.PROTECT_FFMPEG_OPTIONS = [];
|
|
27
27
|
// Duration, in minutes, to increase the level of logging for FFmpeg when we encounter errors.
|
|
28
28
|
exports.PROTECT_FFMPEG_VERBOSE_DURATION = 5;
|
|
29
|
-
// HomeKit
|
|
29
|
+
// HomeKit prefers a video streaming I-frame interval of 4 seconds.
|
|
30
30
|
exports.PROTECT_HOMEKIT_IDR_INTERVAL = 4;
|
|
31
31
|
// How often, in seconds, should we refresh our Protect login credentials.
|
|
32
32
|
exports.PROTECT_LOGIN_REFRESH_INTERVAL = 1800;
|
|
@@ -40,8 +40,14 @@ exports.PROTECT_MQTT_TOPIC = "unifi/protect";
|
|
|
40
40
|
// This will NOT impact motion or doorbell event detection on UniFi OS devices.
|
|
41
41
|
exports.PROTECT_NVR_UNIFIOS_REFRESH_INTERVAL = 10;
|
|
42
42
|
// Default duration, in seconds, of ring events.
|
|
43
|
-
exports.PROTECT_RING_DURATION =
|
|
43
|
+
exports.PROTECT_RING_DURATION = 3;
|
|
44
44
|
// How often, in seconds, should we heartbeat FFmpeg in two-way audio sessions. This should be less than 5 seconds, which is
|
|
45
45
|
// FFmpeg's input timeout interval.
|
|
46
46
|
exports.PROTECT_TWOWAY_HEARTBEAT_INTERVAL = 3.5;
|
|
47
|
+
// HomeKit Secure Video segment resolution, in milliseconds. This defines the resolution of our buffer.
|
|
48
|
+
exports.PROTECT_HKSV_LIVESTREAM_SEGMENT = 100;
|
|
49
|
+
// HomeKit Secure Video segment length, in milliseconds. HomeKit only supports this value currently.
|
|
50
|
+
exports.PROTECT_HKSV_SEGMENT_LENGTH = 4000;
|
|
51
|
+
// HomeKit Secure Video buffer length, in milliseconds. This defines how far back in time we can look when we see a motion event.
|
|
52
|
+
exports.PROTECT_HKSV_BUFFER_LENGTH = exports.PROTECT_HKSV_SEGMENT_LENGTH * 2;
|
|
47
53
|
//# sourceMappingURL=settings.js.map
|
package/dist/settings.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../src/settings.ts"],"names":[],"mappings":";;;AAAA;;;GAGG;AACH,0BAA0B;AACb,QAAA,WAAW,GAAG,0BAA0B,CAAC;AAEtD,mCAAmC;AACtB,QAAA,aAAa,GAAG,eAAe,CAAC;AAE7C,oGAAoG;AACvF,QAAA,uBAAuB,GAAG,EAAE,CAAC;AAE1C,4HAA4H;AAC/G,QAAA,0BAA0B,GAAG,GAAG,CAAC;AAE9C,yFAAyF;AAC5E,QAAA,mBAAmB,GAAG,GAAG,CAAC;AAEvC,oFAAoF;AACpF,qDAAqD;AACxC,QAAA,iCAAiC,GAAG,EAAE,CAAC;AAEpD,4GAA4G;AAC/F,QAAA,oCAAoC,GAAG,GAAG,CAAC;AAExD,2GAA2G;AAC9F,QAAA,mCAAmC,GAAG,IAAI,CAAC;AAExD,+DAA+D;AAClD,QAAA,sBAAsB,GAAG,EAAE,CAAC;AAEzC,8FAA8F;AACjF,QAAA,+BAA+B,GAAG,CAAC,CAAC;AAEjD,
|
|
1
|
+
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../src/settings.ts"],"names":[],"mappings":";;;AAAA;;;GAGG;AACH,0BAA0B;AACb,QAAA,WAAW,GAAG,0BAA0B,CAAC;AAEtD,mCAAmC;AACtB,QAAA,aAAa,GAAG,eAAe,CAAC;AAE7C,oGAAoG;AACvF,QAAA,uBAAuB,GAAG,EAAE,CAAC;AAE1C,4HAA4H;AAC/G,QAAA,0BAA0B,GAAG,GAAG,CAAC;AAE9C,yFAAyF;AAC5E,QAAA,mBAAmB,GAAG,GAAG,CAAC;AAEvC,oFAAoF;AACpF,qDAAqD;AACxC,QAAA,iCAAiC,GAAG,EAAE,CAAC;AAEpD,4GAA4G;AAC/F,QAAA,oCAAoC,GAAG,GAAG,CAAC;AAExD,2GAA2G;AAC9F,QAAA,mCAAmC,GAAG,IAAI,CAAC;AAExD,+DAA+D;AAClD,QAAA,sBAAsB,GAAG,EAAE,CAAC;AAEzC,8FAA8F;AACjF,QAAA,+BAA+B,GAAG,CAAC,CAAC;AAEjD,mEAAmE;AACtD,QAAA,4BAA4B,GAAG,CAAC,CAAC;AAE9C,0EAA0E;AAC7D,QAAA,8BAA8B,GAAG,IAAI,CAAC;AAEnD,0HAA0H;AAC7G,QAAA,uBAAuB,GAAG,EAAE,CAAC;AAE1C,oGAAoG;AACvF,QAAA,+BAA+B,GAAG,EAAE,CAAC;AAElD,uGAAuG;AAC1F,QAAA,kBAAkB,GAAG,eAAe,CAAC;AAElD,yFAAyF;AACzF,+EAA+E;AAClE,QAAA,oCAAoC,GAAG,EAAE,CAAC;AAEvD,gDAAgD;AACnC,QAAA,qBAAqB,GAAG,CAAC,CAAC;AAEvC,4HAA4H;AAC5H,mCAAmC;AACtB,QAAA,iCAAiC,GAAG,GAAG,CAAC;AAErD,uGAAuG;AAC1F,QAAA,+BAA+B,GAAG,GAAG,CAAC;AAEnD,oGAAoG;AACvF,QAAA,2BAA2B,GAAG,IAAI,CAAC;AAEhD,iIAAiI;AACpH,QAAA,0BAA0B,GAAG,mCAA2B,GAAG,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "homebridge-unifi-protect",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.1.1",
|
|
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": {
|
|
@@ -67,20 +67,20 @@
|
|
|
67
67
|
"@homebridge/camera-utils": "^2.0.4",
|
|
68
68
|
"execa": "=5.1.1",
|
|
69
69
|
"ffmpeg-for-homebridge": "^0.0.9",
|
|
70
|
-
"mqtt": "4.3.
|
|
71
|
-
"unifi-protect": "^
|
|
72
|
-
"ws": "^8.
|
|
70
|
+
"mqtt": "4.3.5",
|
|
71
|
+
"unifi-protect": "^3.0.0",
|
|
72
|
+
"ws": "^8.5.0"
|
|
73
73
|
},
|
|
74
74
|
"devDependencies": {
|
|
75
75
|
"@types/ip": "^1.1.0",
|
|
76
|
-
"@types/node": "^17.0.
|
|
76
|
+
"@types/node": "^17.0.17",
|
|
77
77
|
"@types/ws": "^8.2.2",
|
|
78
|
-
"@typescript-eslint/eslint-plugin": "^5.
|
|
79
|
-
"@typescript-eslint/parser": "^5.
|
|
80
|
-
"eslint": "^8.
|
|
81
|
-
"homebridge": "^1.
|
|
78
|
+
"@typescript-eslint/eslint-plugin": "^5.11.0",
|
|
79
|
+
"@typescript-eslint/parser": "^5.11.0",
|
|
80
|
+
"eslint": "^8.9.0",
|
|
81
|
+
"homebridge": "^1.4.0",
|
|
82
82
|
"nodemon": "^2.0.15",
|
|
83
83
|
"rimraf": "^3.0.2",
|
|
84
|
-
"typescript": "^4.5.
|
|
84
|
+
"typescript": "^4.5.5"
|
|
85
85
|
}
|
|
86
86
|
}
|