hap-nodejs 1.1.1-beta.4 → 1.1.1-beta.6
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/@types/bonjour-hap.d.ts +53 -50
- package/@types/simple-plist.d.ts +4 -0
- package/README.md +19 -16
- package/dist/accessories/AirConditioner_accessory.js +30 -28
- package/dist/accessories/AirConditioner_accessory.js.map +1 -1
- package/dist/accessories/AppleTVRemote_accessory.js +81 -69
- package/dist/accessories/AppleTVRemote_accessory.js.map +1 -1
- package/dist/accessories/Camera_accessory.js +136 -141
- package/dist/accessories/Camera_accessory.js.map +1 -1
- package/dist/accessories/Fan_accessory.js +22 -18
- package/dist/accessories/Fan_accessory.js.map +1 -1
- package/dist/accessories/GarageDoorOpener_accessory.js +35 -33
- package/dist/accessories/GarageDoorOpener_accessory.js.map +1 -1
- package/dist/accessories/Light-AdaptiveLighting_accessory.js +44 -42
- package/dist/accessories/Light-AdaptiveLighting_accessory.js.map +1 -1
- package/dist/accessories/Light_accessory.js +34 -32
- package/dist/accessories/Light_accessory.js.map +1 -1
- package/dist/accessories/Lock_accessory.js +26 -25
- package/dist/accessories/Lock_accessory.js.map +1 -1
- package/dist/accessories/MotionSensor_accessory.js +16 -13
- package/dist/accessories/MotionSensor_accessory.js.map +1 -1
- package/dist/accessories/Outlet_accessory.js +22 -20
- package/dist/accessories/Outlet_accessory.js.map +1 -1
- package/dist/accessories/SmartSpeaker_accessory.js +20 -18
- package/dist/accessories/SmartSpeaker_accessory.js.map +1 -1
- package/dist/accessories/Sprinkler_accessory.js +37 -34
- package/dist/accessories/Sprinkler_accessory.js.map +1 -1
- package/dist/accessories/TV_accessory.js +45 -43
- package/dist/accessories/TV_accessory.js.map +1 -1
- package/dist/accessories/TemperatureSensor_accessory.js +15 -12
- package/dist/accessories/TemperatureSensor_accessory.js.map +1 -1
- package/dist/accessories/Wi-FiRouter_accessory.d.ts +1 -1
- package/dist/accessories/Wi-FiRouter_accessory.d.ts.map +1 -1
- package/dist/accessories/Wi-FiRouter_accessory.js +12 -9
- package/dist/accessories/Wi-FiRouter_accessory.js.map +1 -1
- package/dist/accessories/Wi-FiSatellite_accessory.d.ts +1 -1
- package/dist/accessories/Wi-FiSatellite_accessory.d.ts.map +1 -1
- package/dist/accessories/Wi-FiSatellite_accessory.js +14 -11
- package/dist/accessories/Wi-FiSatellite_accessory.js.map +1 -1
- package/dist/accessories/gstreamer-audioProducer.d.ts +3 -3
- package/dist/accessories/gstreamer-audioProducer.d.ts.map +1 -1
- package/dist/accessories/gstreamer-audioProducer.js +38 -37
- package/dist/accessories/gstreamer-audioProducer.js.map +1 -1
- package/dist/accessories/types.d.ts +63 -63
- package/dist/accessories/types.d.ts.map +1 -1
- package/dist/accessories/types.js +87 -83
- package/dist/accessories/types.js.map +1 -1
- package/dist/index.d.ts +28 -26
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +34 -40
- package/dist/index.js.map +1 -1
- package/dist/internal-types.d.ts +1 -1
- package/dist/internal-types.d.ts.map +1 -1
- package/dist/internal-types.js +21 -19
- package/dist/internal-types.js.map +1 -1
- package/dist/lib/Accessory.d.ts +37 -38
- package/dist/lib/Accessory.d.ts.map +1 -1
- package/dist/lib/Accessory.js +296 -286
- package/dist/lib/Accessory.js.map +1 -1
- package/dist/lib/Advertiser.d.ts +7 -7
- package/dist/lib/Advertiser.d.ts.map +1 -1
- package/dist/lib/Advertiser.js +136 -128
- package/dist/lib/Advertiser.js.map +1 -1
- package/dist/lib/Bridge.d.ts +1 -1
- package/dist/lib/Bridge.d.ts.map +1 -1
- package/dist/lib/Bridge.js +6 -2
- package/dist/lib/Bridge.js.map +1 -1
- package/dist/lib/Characteristic.d.ts +41 -40
- package/dist/lib/Characteristic.d.ts.map +1 -1
- package/dist/lib/Characteristic.js +208 -204
- package/dist/lib/Characteristic.js.map +1 -1
- package/dist/lib/HAPServer.d.ts +30 -31
- package/dist/lib/HAPServer.d.ts.map +1 -1
- package/dist/lib/HAPServer.js +229 -220
- package/dist/lib/HAPServer.js.map +1 -1
- package/dist/lib/Service.d.ts +22 -22
- package/dist/lib/Service.d.ts.map +1 -1
- package/dist/lib/Service.js +67 -63
- package/dist/lib/Service.js.map +1 -1
- package/dist/lib/camera/RTPProxy.d.ts +1 -2
- package/dist/lib/camera/RTPProxy.d.ts.map +1 -1
- package/dist/lib/camera/RTPProxy.js +44 -28
- package/dist/lib/camera/RTPProxy.js.map +1 -1
- package/dist/lib/camera/RTPStreamManagement.d.ts +33 -34
- package/dist/lib/camera/RTPStreamManagement.d.ts.map +1 -1
- package/dist/lib/camera/RTPStreamManagement.js +149 -181
- package/dist/lib/camera/RTPStreamManagement.js.map +1 -1
- package/dist/lib/camera/RecordingManagement.d.ts +17 -19
- package/dist/lib/camera/RecordingManagement.d.ts.map +1 -1
- package/dist/lib/camera/RecordingManagement.js +151 -160
- package/dist/lib/camera/RecordingManagement.js.map +1 -1
- package/dist/lib/camera/index.d.ts +3 -3
- package/dist/lib/camera/index.d.ts.map +1 -1
- package/dist/lib/camera/index.js +6 -3
- package/dist/lib/camera/index.js.map +1 -1
- package/dist/lib/controller/AdaptiveLightingController.d.ts +33 -33
- package/dist/lib/controller/AdaptiveLightingController.d.ts.map +1 -1
- package/dist/lib/controller/AdaptiveLightingController.js +144 -152
- package/dist/lib/controller/AdaptiveLightingController.js.map +1 -1
- package/dist/lib/controller/CameraController.d.ts +20 -22
- package/dist/lib/controller/CameraController.d.ts.map +1 -1
- package/dist/lib/controller/CameraController.js +78 -74
- package/dist/lib/controller/CameraController.js.map +1 -1
- package/dist/lib/controller/Controller.d.ts +4 -4
- package/dist/lib/controller/Controller.d.ts.map +1 -1
- package/dist/lib/controller/Controller.js +8 -5
- package/dist/lib/controller/Controller.js.map +1 -1
- package/dist/lib/controller/DoorbellController.d.ts +4 -5
- package/dist/lib/controller/DoorbellController.d.ts.map +1 -1
- package/dist/lib/controller/DoorbellController.js +13 -9
- package/dist/lib/controller/DoorbellController.js.map +1 -1
- package/dist/lib/controller/RemoteController.d.ts +37 -39
- package/dist/lib/controller/RemoteController.d.ts.map +1 -1
- package/dist/lib/controller/RemoteController.js +197 -208
- package/dist/lib/controller/RemoteController.js.map +1 -1
- package/dist/lib/controller/index.d.ts +5 -5
- package/dist/lib/controller/index.d.ts.map +1 -1
- package/dist/lib/controller/index.js +8 -5
- package/dist/lib/controller/index.js.map +1 -1
- package/dist/lib/datastream/DataStreamManagement.d.ts +2 -2
- package/dist/lib/datastream/DataStreamManagement.d.ts.map +1 -1
- package/dist/lib/datastream/DataStreamManagement.js +39 -39
- package/dist/lib/datastream/DataStreamManagement.js.map +1 -1
- package/dist/lib/datastream/DataStreamParser.d.ts +0 -1
- package/dist/lib/datastream/DataStreamParser.d.ts.map +1 -1
- package/dist/lib/datastream/DataStreamParser.js +77 -57
- package/dist/lib/datastream/DataStreamParser.js.map +1 -1
- package/dist/lib/datastream/DataStreamServer.d.ts +22 -23
- package/dist/lib/datastream/DataStreamServer.d.ts.map +1 -1
- package/dist/lib/datastream/DataStreamServer.js +164 -154
- package/dist/lib/datastream/DataStreamServer.js.map +1 -1
- package/dist/lib/datastream/index.d.ts +3 -3
- package/dist/lib/datastream/index.d.ts.map +1 -1
- package/dist/lib/datastream/index.js +6 -3
- package/dist/lib/datastream/index.js.map +1 -1
- package/dist/lib/definitions/CharacteristicDefinitions.d.ts +11 -1
- package/dist/lib/definitions/CharacteristicDefinitions.d.ts.map +1 -1
- package/dist/lib/definitions/CharacteristicDefinitions.js +1218 -957
- package/dist/lib/definitions/CharacteristicDefinitions.js.map +1 -1
- package/dist/lib/definitions/ServiceDefinitions.d.ts +1 -1
- package/dist/lib/definitions/ServiceDefinitions.d.ts.map +1 -1
- package/dist/lib/definitions/ServiceDefinitions.js +695 -620
- package/dist/lib/definitions/ServiceDefinitions.js.map +1 -1
- package/dist/lib/definitions/generate-definitions.d.ts +3 -3
- package/dist/lib/definitions/generate-definitions.d.ts.map +1 -1
- package/dist/lib/definitions/generate-definitions.js +256 -244
- package/dist/lib/definitions/generate-definitions.js.map +1 -1
- package/dist/lib/definitions/generator-configuration.d.ts +1 -1
- package/dist/lib/definitions/generator-configuration.d.ts.map +1 -1
- package/dist/lib/definitions/generator-configuration.js +170 -160
- package/dist/lib/definitions/generator-configuration.js.map +1 -1
- package/dist/lib/definitions/index.d.ts +2 -2
- package/dist/lib/definitions/index.d.ts.map +1 -1
- package/dist/lib/definitions/index.js +5 -2
- package/dist/lib/definitions/index.js.map +1 -1
- package/dist/lib/gen/HomeKit.d.ts +7 -0
- package/dist/lib/gen/HomeKit.d.ts.map +1 -0
- package/dist/lib/gen/HomeKit.js +8 -0
- package/dist/lib/gen/HomeKit.js.map +1 -0
- package/dist/lib/model/AccessoryInfo.d.ts +3 -4
- package/dist/lib/model/AccessoryInfo.d.ts.map +1 -1
- package/dist/lib/model/AccessoryInfo.js +53 -50
- package/dist/lib/model/AccessoryInfo.js.map +1 -1
- package/dist/lib/model/ControllerStorage.d.ts +3 -3
- package/dist/lib/model/ControllerStorage.d.ts.map +1 -1
- package/dist/lib/model/ControllerStorage.js +23 -18
- package/dist/lib/model/ControllerStorage.js.map +1 -1
- package/dist/lib/model/HAPStorage.d.ts +2 -2
- package/dist/lib/model/HAPStorage.d.ts.map +1 -1
- package/dist/lib/model/HAPStorage.js +11 -4
- package/dist/lib/model/HAPStorage.js.map +1 -1
- package/dist/lib/model/IdentifierCache.d.ts +1 -1
- package/dist/lib/model/IdentifierCache.d.ts.map +1 -1
- package/dist/lib/model/IdentifierCache.js +27 -19
- package/dist/lib/model/IdentifierCache.js.map +1 -1
- package/dist/lib/tv/AccessControlManagement.d.ts +9 -9
- package/dist/lib/tv/AccessControlManagement.d.ts.map +1 -1
- package/dist/lib/tv/AccessControlManagement.js +29 -27
- package/dist/lib/tv/AccessControlManagement.js.map +1 -1
- package/dist/lib/util/checkName.d.ts +2 -2
- package/dist/lib/util/checkName.d.ts.map +1 -1
- package/dist/lib/util/checkName.js +9 -6
- package/dist/lib/util/checkName.js.map +1 -1
- package/dist/lib/util/clone.d.ts.map +1 -1
- package/dist/lib/util/clone.js +5 -1
- package/dist/lib/util/clone.js.map +1 -1
- package/dist/lib/util/color-utils.d.ts +1 -1
- package/dist/lib/util/color-utils.d.ts.map +1 -1
- package/dist/lib/util/color-utils.js +9 -4
- package/dist/lib/util/color-utils.js.map +1 -1
- package/dist/lib/util/eventedhttp.d.ts +22 -23
- package/dist/lib/util/eventedhttp.d.ts.map +1 -1
- package/dist/lib/util/eventedhttp.js +116 -109
- package/dist/lib/util/eventedhttp.js.map +1 -1
- package/dist/lib/util/hapCrypto.d.ts +2 -3
- package/dist/lib/util/hapCrypto.d.ts.map +1 -1
- package/dist/lib/util/hapCrypto.js +40 -31
- package/dist/lib/util/hapCrypto.js.map +1 -1
- package/dist/lib/util/hapStatusError.d.ts +1 -1
- package/dist/lib/util/hapStatusError.d.ts.map +1 -1
- package/dist/lib/util/hapStatusError.js +8 -4
- package/dist/lib/util/hapStatusError.js.map +1 -1
- package/dist/lib/util/net-utils.d.ts +1 -1
- package/dist/lib/util/net-utils.js +23 -17
- package/dist/lib/util/net-utils.js.map +1 -1
- package/dist/lib/util/once.d.ts.map +1 -1
- package/dist/lib/util/once.js +6 -2
- package/dist/lib/util/once.js.map +1 -1
- package/dist/lib/util/promise-utils.d.ts +1 -1
- package/dist/lib/util/promise-utils.d.ts.map +1 -1
- package/dist/lib/util/promise-utils.js +10 -3
- package/dist/lib/util/promise-utils.js.map +1 -1
- package/dist/lib/util/request-util.d.ts +2 -3
- package/dist/lib/util/request-util.d.ts.map +1 -1
- package/dist/lib/util/request-util.js +19 -11
- package/dist/lib/util/request-util.js.map +1 -1
- package/dist/lib/util/time.d.ts +0 -1
- package/dist/lib/util/time.d.ts.map +1 -1
- package/dist/lib/util/time.js +11 -6
- package/dist/lib/util/time.js.map +1 -1
- package/dist/lib/util/tlv.d.ts +0 -1
- package/dist/lib/util/tlv.d.ts.map +1 -1
- package/dist/lib/util/tlv.js +43 -28
- package/dist/lib/util/tlv.js.map +1 -1
- package/dist/lib/util/uuid.d.ts +0 -1
- package/dist/lib/util/uuid.d.ts.map +1 -1
- package/dist/lib/util/uuid.js +38 -26
- package/dist/lib/util/uuid.js.map +1 -1
- package/dist/types.d.ts +24 -24
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +5 -3
- package/dist/types.js.map +1 -1
- package/package.json +45 -50
- package/dist/lib/dbus/align.d.ts +0 -2
- package/dist/lib/dbus/align.d.ts.map +0 -1
- package/dist/lib/dbus/align.js +0 -12
- package/dist/lib/dbus/align.js.map +0 -1
- package/dist/lib/dbus/bus.d.ts +0 -38
- package/dist/lib/dbus/bus.d.ts.map +0 -1
- package/dist/lib/dbus/bus.js +0 -222
- package/dist/lib/dbus/bus.js.map +0 -1
- package/dist/lib/dbus/constants.d.ts +0 -43
- package/dist/lib/dbus/constants.d.ts.map +0 -1
- package/dist/lib/dbus/constants.js +0 -53
- package/dist/lib/dbus/constants.js.map +0 -1
- package/dist/lib/dbus/dbus-buffer.d.ts +0 -30
- package/dist/lib/dbus/dbus-buffer.d.ts.map +0 -1
- package/dist/lib/dbus/dbus-buffer.js +0 -175
- package/dist/lib/dbus/dbus-buffer.js.map +0 -1
- package/dist/lib/dbus/handshake.d.ts +0 -2
- package/dist/lib/dbus/handshake.d.ts.map +0 -1
- package/dist/lib/dbus/handshake.js +0 -130
- package/dist/lib/dbus/handshake.js.map +0 -1
- package/dist/lib/dbus/index.d.ts +0 -3
- package/dist/lib/dbus/index.d.ts.map +0 -1
- package/dist/lib/dbus/index.js +0 -123
- package/dist/lib/dbus/index.js.map +0 -1
- package/dist/lib/dbus/introspect.d.ts +0 -30
- package/dist/lib/dbus/introspect.d.ts.map +0 -1
- package/dist/lib/dbus/introspect.js +0 -208
- package/dist/lib/dbus/introspect.js.map +0 -1
- package/dist/lib/dbus/marshall.d.ts +0 -2
- package/dist/lib/dbus/marshall.d.ts.map +0 -1
- package/dist/lib/dbus/marshall.js +0 -97
- package/dist/lib/dbus/marshall.js.map +0 -1
- package/dist/lib/dbus/marshallers.d.ts +0 -10
- package/dist/lib/dbus/marshallers.d.ts.map +0 -1
- package/dist/lib/dbus/marshallers.js +0 -329
- package/dist/lib/dbus/marshallers.js.map +0 -1
- package/dist/lib/dbus/message.d.ts +0 -4
- package/dist/lib/dbus/message.d.ts.map +0 -1
- package/dist/lib/dbus/message.js +0 -116
- package/dist/lib/dbus/message.js.map +0 -1
- package/dist/lib/dbus/put.d.ts +0 -21
- package/dist/lib/dbus/put.d.ts.map +0 -1
- package/dist/lib/dbus/put.js +0 -120
- package/dist/lib/dbus/put.js.map +0 -1
- package/dist/lib/dbus/readline.d.ts +0 -2
- package/dist/lib/dbus/readline.d.ts.map +0 -1
- package/dist/lib/dbus/readline.js +0 -27
- package/dist/lib/dbus/readline.js.map +0 -1
- package/dist/lib/dbus/signature.d.ts +0 -2
- package/dist/lib/dbus/signature.d.ts.map +0 -1
- package/dist/lib/dbus/signature.js +0 -59
- package/dist/lib/dbus/signature.js.map +0 -1
- package/dist/lib/dbus/stdifaces.d.ts +0 -3
- package/dist/lib/dbus/stdifaces.d.ts.map +0 -1
- package/dist/lib/dbus/stdifaces.js +0 -206
- package/dist/lib/dbus/stdifaces.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AppleTVRemote_accessory.js","sourceRoot":"","sources":["../../src/accessories/AppleTVRemote_accessory.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"AppleTVRemote_accessory.js","sourceRoot":"","sources":["../../src/accessories/AppleTVRemote_accessory.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,26 +1,27 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
const
|
|
9
|
-
const
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const tslib_1 = require("tslib");
|
|
4
|
+
const assert_1 = tslib_1.__importDefault(require("assert"));
|
|
5
|
+
const child_process_1 = require("child_process");
|
|
6
|
+
const events_1 = require("events");
|
|
7
|
+
const net_1 = require("net");
|
|
8
|
+
const __1 = require("..");
|
|
9
|
+
const cameraUUID = __1.uuid.generate("hap-nodejs:accessories:ip-camera");
|
|
10
|
+
const camera = exports.accessory = new __1.Accessory("IPCamera", cameraUUID);
|
|
10
11
|
// @ts-expect-error: Core/BridgeCore API
|
|
11
|
-
camera.username =
|
|
12
|
+
camera.username = "9F:B2:46:0C:40:DB";
|
|
12
13
|
// @ts-expect-error: Core/BridgeCore API
|
|
13
|
-
camera.pincode =
|
|
14
|
+
camera.pincode = "948-23-459";
|
|
14
15
|
camera.category = 17 /* Categories.IP_CAMERA */;
|
|
15
16
|
const FFMPEGH264ProfileNames = [
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
17
|
+
"baseline",
|
|
18
|
+
"main",
|
|
19
|
+
"high",
|
|
19
20
|
];
|
|
20
21
|
const FFMPEGH264LevelNames = [
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
22
|
+
"3.1",
|
|
23
|
+
"3.2",
|
|
24
|
+
"4.0",
|
|
24
25
|
];
|
|
25
26
|
const ports = new Set();
|
|
26
27
|
function getPort() {
|
|
@@ -43,26 +44,26 @@ class ExampleCamera {
|
|
|
43
44
|
server;
|
|
44
45
|
handleSnapshotRequest(request, callback) {
|
|
45
46
|
const ffmpegCommand = `-f lavfi -i testsrc=s=${request.width}x${request.height} -vframes 1 -f mjpeg -`;
|
|
46
|
-
const ffmpeg = spawn(
|
|
47
|
+
const ffmpeg = (0, child_process_1.spawn)("ffmpeg", ffmpegCommand.split(" "), { env: process.env });
|
|
47
48
|
const snapshotBuffers = [];
|
|
48
|
-
ffmpeg.stdout.on(
|
|
49
|
-
ffmpeg.stderr.on(
|
|
49
|
+
ffmpeg.stdout.on("data", data => snapshotBuffers.push(data));
|
|
50
|
+
ffmpeg.stderr.on("data", data => {
|
|
50
51
|
if (this.ffmpegDebugOutput) {
|
|
51
|
-
console.log(
|
|
52
|
+
console.log("SNAPSHOT: " + String(data));
|
|
52
53
|
}
|
|
53
54
|
});
|
|
54
|
-
ffmpeg.on(
|
|
55
|
+
ffmpeg.on("exit", (code, signal) => {
|
|
55
56
|
if (signal) {
|
|
56
|
-
console.log(
|
|
57
|
-
callback(new Error(
|
|
57
|
+
console.log("Snapshot process was killed with signal: " + signal);
|
|
58
|
+
callback(new Error("killed with signal " + signal));
|
|
58
59
|
}
|
|
59
60
|
else if (code === 0) {
|
|
60
61
|
console.log(`Successfully captured snapshot at ${request.width}x${request.height}`);
|
|
61
62
|
callback(undefined, Buffer.concat(snapshotBuffers));
|
|
62
63
|
}
|
|
63
64
|
else {
|
|
64
|
-
console.log(
|
|
65
|
-
callback(new Error(
|
|
65
|
+
console.log("Snapshot process exited with code " + code);
|
|
66
|
+
callback(new Error("Snapshot process exited with code " + code));
|
|
66
67
|
}
|
|
67
68
|
});
|
|
68
69
|
}
|
|
@@ -74,15 +75,15 @@ class ExampleCamera {
|
|
|
74
75
|
const videoCryptoSuite = video.srtpCryptoSuite; // could be used to support multiple crypto suite (or support no suite for debugging)
|
|
75
76
|
const videoSrtpKey = video.srtp_key;
|
|
76
77
|
const videoSrtpSalt = video.srtp_salt;
|
|
77
|
-
const videoSSRC = CameraController.generateSynchronisationSource();
|
|
78
|
+
const videoSSRC = __1.CameraController.generateSynchronisationSource();
|
|
78
79
|
const localPort = getPort();
|
|
79
80
|
const sessionInfo = {
|
|
80
81
|
address: targetAddress,
|
|
81
82
|
videoPort: video.port,
|
|
82
83
|
localVideoPort: localPort,
|
|
83
|
-
videoCryptoSuite,
|
|
84
|
+
videoCryptoSuite: videoCryptoSuite,
|
|
84
85
|
videoSRTP: Buffer.concat([videoSrtpKey, videoSrtpSalt]),
|
|
85
|
-
videoSSRC,
|
|
86
|
+
videoSSRC: videoSSRC,
|
|
86
87
|
};
|
|
87
88
|
const response = {
|
|
88
89
|
video: {
|
|
@@ -110,6 +111,7 @@ class ExampleCamera {
|
|
|
110
111
|
const fps = video.fps;
|
|
111
112
|
const payloadType = video.pt;
|
|
112
113
|
const maxBitrate = video.max_bit_rate;
|
|
114
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
113
115
|
const rtcpInterval = video.rtcp_interval; // usually 0.5
|
|
114
116
|
const mtu = video.mtu; // maximum transmission unit
|
|
115
117
|
const address = sessionInfo.address;
|
|
@@ -117,52 +119,52 @@ class ExampleCamera {
|
|
|
117
119
|
const localVideoPort = sessionInfo.localVideoPort;
|
|
118
120
|
const ssrc = sessionInfo.videoSSRC;
|
|
119
121
|
const cryptoSuite = sessionInfo.videoCryptoSuite;
|
|
120
|
-
const videoSRTP = sessionInfo.videoSRTP.toString(
|
|
122
|
+
const videoSRTP = sessionInfo.videoSRTP.toString("base64");
|
|
121
123
|
console.log(`Starting video stream (${width}x${height}, ${fps} fps, ${maxBitrate} kbps, ${mtu} mtu)...`);
|
|
122
|
-
let videoffmpegCommand = `-re -f lavfi -i testsrc=s=${width}x${height}:r=${fps} -map 0:0 `
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
124
|
+
let videoffmpegCommand = `-re -f lavfi -i testsrc=s=${width}x${height}:r=${fps} -map 0:0 ` +
|
|
125
|
+
`-c:v h264 -pix_fmt yuv420p -r ${fps} -an -sn -dn -b:v ${maxBitrate}k ` +
|
|
126
|
+
`-profile:v ${profile} -level:v ${level} ` +
|
|
127
|
+
`-payload_type ${payloadType} -ssrc ${ssrc} -f rtp `;
|
|
126
128
|
if (cryptoSuite !== 2 /* SRTPCryptoSuites.NONE */) {
|
|
127
129
|
let suite;
|
|
128
130
|
switch (cryptoSuite) {
|
|
129
131
|
case 0 /* SRTPCryptoSuites.AES_CM_128_HMAC_SHA1_80 */: // actually ffmpeg just supports AES_CM_128_HMAC_SHA1_80
|
|
130
|
-
suite =
|
|
132
|
+
suite = "AES_CM_128_HMAC_SHA1_80";
|
|
131
133
|
break;
|
|
132
134
|
case 1 /* SRTPCryptoSuites.AES_CM_256_HMAC_SHA1_80 */:
|
|
133
|
-
suite =
|
|
135
|
+
suite = "AES_CM_256_HMAC_SHA1_80";
|
|
134
136
|
break;
|
|
135
137
|
}
|
|
136
138
|
videoffmpegCommand += `-srtp_out_suite ${suite} -srtp_out_params ${videoSRTP} s`;
|
|
137
139
|
}
|
|
138
140
|
videoffmpegCommand += `rtp://${address}:${videoPort}?rtcpport=${videoPort}&localrtcpport=${localVideoPort}&pkt_size=${mtu}`;
|
|
139
141
|
if (this.ffmpegDebugOutput) {
|
|
140
|
-
console.log(
|
|
142
|
+
console.log("FFMPEG command: ffmpeg " + videoffmpegCommand);
|
|
141
143
|
}
|
|
142
|
-
const ffmpegVideo = spawn(
|
|
144
|
+
const ffmpegVideo = (0, child_process_1.spawn)("ffmpeg", videoffmpegCommand.split(" "), { env: process.env });
|
|
143
145
|
let started = false;
|
|
144
|
-
ffmpegVideo.stderr.on(
|
|
145
|
-
console.log(data.toString(
|
|
146
|
+
ffmpegVideo.stderr.on("data", (data) => {
|
|
147
|
+
console.log(data.toString("utf8"));
|
|
146
148
|
if (!started) {
|
|
147
149
|
started = true;
|
|
148
|
-
console.log(
|
|
150
|
+
console.log("FFMPEG: received first frame");
|
|
149
151
|
callback(); // do not forget to execute callback once set up
|
|
150
152
|
}
|
|
151
153
|
if (this.ffmpegDebugOutput) {
|
|
152
|
-
console.log(
|
|
154
|
+
console.log("VIDEO: " + String(data));
|
|
153
155
|
}
|
|
154
156
|
});
|
|
155
|
-
ffmpegVideo.on(
|
|
156
|
-
console.log(
|
|
157
|
-
callback(new Error(
|
|
157
|
+
ffmpegVideo.on("error", error => {
|
|
158
|
+
console.log("[Video] Failed to start video stream: " + error.message);
|
|
159
|
+
callback(new Error("ffmpeg process creation failed!"));
|
|
158
160
|
});
|
|
159
|
-
ffmpegVideo.on(
|
|
160
|
-
const message =
|
|
161
|
+
ffmpegVideo.on("exit", (code, signal) => {
|
|
162
|
+
const message = "[Video] ffmpeg exited with code: " + code + " and signal: " + signal;
|
|
161
163
|
if (code == null || code === 255) {
|
|
162
|
-
console.log(
|
|
164
|
+
console.log(message + " (Video stream stopped!)");
|
|
163
165
|
}
|
|
164
166
|
else {
|
|
165
|
-
console.log(
|
|
167
|
+
console.log(message + " (error)");
|
|
166
168
|
if (!started) {
|
|
167
169
|
callback(new Error(message));
|
|
168
170
|
}
|
|
@@ -172,7 +174,7 @@ class ExampleCamera {
|
|
|
172
174
|
}
|
|
173
175
|
});
|
|
174
176
|
this.ongoingSessions[sessionId] = {
|
|
175
|
-
localVideoPort,
|
|
177
|
+
localVideoPort: localVideoPort,
|
|
176
178
|
process: ffmpegVideo,
|
|
177
179
|
};
|
|
178
180
|
delete this.pendingSessions[sessionId];
|
|
@@ -180,7 +182,7 @@ class ExampleCamera {
|
|
|
180
182
|
}
|
|
181
183
|
case "reconfigure" /* StreamRequestTypes.RECONFIGURE */:
|
|
182
184
|
// not supported by this example
|
|
183
|
-
console.log(
|
|
185
|
+
console.log("Received (unsupported) request to reconfigure to: " + JSON.stringify(request.video));
|
|
184
186
|
callback();
|
|
185
187
|
break;
|
|
186
188
|
case "stop" /* StreamRequestTypes.STOP */: {
|
|
@@ -191,14 +193,14 @@ class ExampleCamera {
|
|
|
191
193
|
}
|
|
192
194
|
ports.delete(ongoingSession.localVideoPort);
|
|
193
195
|
try {
|
|
194
|
-
ongoingSession.process.kill(
|
|
196
|
+
ongoingSession.process.kill("SIGKILL");
|
|
195
197
|
}
|
|
196
198
|
catch (e) {
|
|
197
|
-
console.log(
|
|
199
|
+
console.log("Error occurred terminating the video process!");
|
|
198
200
|
console.log(e);
|
|
199
201
|
}
|
|
200
202
|
delete this.ongoingSessions[sessionId];
|
|
201
|
-
console.log(
|
|
203
|
+
console.log("Stopped streaming session!");
|
|
202
204
|
callback();
|
|
203
205
|
break;
|
|
204
206
|
}
|
|
@@ -206,7 +208,7 @@ class ExampleCamera {
|
|
|
206
208
|
}
|
|
207
209
|
updateRecordingActive(active) {
|
|
208
210
|
// we haven't implemented a prebuffer
|
|
209
|
-
console.log(
|
|
211
|
+
console.log("Recording active set to " + active);
|
|
210
212
|
}
|
|
211
213
|
updateRecordingConfiguration(configuration) {
|
|
212
214
|
this.configuration = configuration;
|
|
@@ -217,12 +219,13 @@ class ExampleCamera {
|
|
|
217
219
|
* CameraController supporting HomeKit Secure Video.
|
|
218
220
|
*
|
|
219
221
|
* An ideal implementation would diverge from this in the following ways:
|
|
220
|
-
* It would implement a prebuffer and respect the recording `active` characteristic for that.
|
|
221
|
-
* It would start to immediately record after a trigger event occurred and not just
|
|
222
|
+
* * It would implement a prebuffer and respect the recording `active` characteristic for that.
|
|
223
|
+
* * It would start to immediately record after a trigger event occurred and not just
|
|
222
224
|
* when the HomeKit Controller requests it (see the documentation of `CameraRecordingDelegate`).
|
|
223
225
|
*/
|
|
226
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
224
227
|
async *handleRecordingStreamRequest(streamId) {
|
|
225
|
-
|
|
228
|
+
(0, assert_1.default)(!!this.configuration);
|
|
226
229
|
/**
|
|
227
230
|
* With this flag you can control how the generator reacts to a reset to the motion trigger.
|
|
228
231
|
* If set to true, the generator will send a proper endOfStream if the motion stops.
|
|
@@ -232,73 +235,62 @@ class ExampleCamera {
|
|
|
232
235
|
*/
|
|
233
236
|
const STOP_AFTER_MOTION_STOP = false;
|
|
234
237
|
this.handlingStreamingRequest = true;
|
|
235
|
-
|
|
236
|
-
const profile = this.configuration.videoCodec.parameters.profile === 2 /* H264Profile.HIGH */
|
|
237
|
-
?
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
? '4.0'
|
|
241
|
-
: this.configuration.videoCodec.parameters.level === 1 /* H264Level.LEVEL3_2 */ ? '3.2' : '3.1';
|
|
238
|
+
(0, assert_1.default)(this.configuration.videoCodec.type === 0 /* VideoCodecType.H264 */);
|
|
239
|
+
const profile = this.configuration.videoCodec.parameters.profile === 2 /* H264Profile.HIGH */ ? "high"
|
|
240
|
+
: this.configuration.videoCodec.parameters.profile === 1 /* H264Profile.MAIN */ ? "main" : "baseline";
|
|
241
|
+
const level = this.configuration.videoCodec.parameters.level === 2 /* H264Level.LEVEL4_0 */ ? "4.0"
|
|
242
|
+
: this.configuration.videoCodec.parameters.level === 1 /* H264Level.LEVEL3_2 */ ? "3.2" : "3.1";
|
|
242
243
|
const videoArgs = [
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
`${this.configuration.videoCodec.parameters.bitRate}k`,
|
|
256
|
-
'-force_key_frames',
|
|
257
|
-
`expr:eq(t,n_forced*${this.configuration.videoCodec.parameters.iFrameInterval / 1000})`,
|
|
258
|
-
'-r',
|
|
259
|
-
this.configuration.videoCodec.resolution[2].toString(),
|
|
244
|
+
"-an",
|
|
245
|
+
"-sn",
|
|
246
|
+
"-dn",
|
|
247
|
+
"-codec:v",
|
|
248
|
+
"libx264",
|
|
249
|
+
"-pix_fmt",
|
|
250
|
+
"yuv420p",
|
|
251
|
+
"-profile:v", profile,
|
|
252
|
+
"-level:v", level,
|
|
253
|
+
"-b:v", `${this.configuration.videoCodec.parameters.bitRate}k`,
|
|
254
|
+
"-force_key_frames", `expr:eq(t,n_forced*${this.configuration.videoCodec.parameters.iFrameInterval / 1000})`,
|
|
255
|
+
"-r", this.configuration.videoCodec.resolution[2].toString(),
|
|
260
256
|
];
|
|
261
257
|
let samplerate;
|
|
262
258
|
switch (this.configuration.audioCodec.samplerate) {
|
|
263
259
|
case 0 /* AudioRecordingSamplerate.KHZ_8 */:
|
|
264
|
-
samplerate =
|
|
260
|
+
samplerate = "8";
|
|
265
261
|
break;
|
|
266
262
|
case 1 /* AudioRecordingSamplerate.KHZ_16 */:
|
|
267
|
-
samplerate =
|
|
263
|
+
samplerate = "16";
|
|
268
264
|
break;
|
|
269
265
|
case 2 /* AudioRecordingSamplerate.KHZ_24 */:
|
|
270
|
-
samplerate =
|
|
266
|
+
samplerate = "24";
|
|
271
267
|
break;
|
|
272
268
|
case 3 /* AudioRecordingSamplerate.KHZ_32 */:
|
|
273
|
-
samplerate =
|
|
269
|
+
samplerate = "32";
|
|
274
270
|
break;
|
|
275
271
|
case 4 /* AudioRecordingSamplerate.KHZ_44_1 */:
|
|
276
|
-
samplerate =
|
|
272
|
+
samplerate = "44.1";
|
|
277
273
|
break;
|
|
278
274
|
case 5 /* AudioRecordingSamplerate.KHZ_48 */:
|
|
279
|
-
samplerate =
|
|
275
|
+
samplerate = "48";
|
|
280
276
|
break;
|
|
281
277
|
default:
|
|
282
|
-
throw new Error(
|
|
278
|
+
throw new Error("Unsupported audio samplerate: " + this.configuration.audioCodec.samplerate);
|
|
283
279
|
}
|
|
284
|
-
const audioArgs = this.controller?.recordingManagement?.recordingManagementService.getCharacteristic(Characteristic.RecordingAudioActive)
|
|
280
|
+
const audioArgs = this.controller?.recordingManagement?.recordingManagementService.getCharacteristic(__1.Characteristic.RecordingAudioActive)
|
|
285
281
|
? [
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
`${
|
|
293
|
-
'-b:a',
|
|
294
|
-
`${this.configuration.audioCodec.bitrate}k`,
|
|
295
|
-
'-ac',
|
|
296
|
-
`${this.configuration.audioCodec.audioChannels}`,
|
|
282
|
+
"-acodec", "libfdk_aac",
|
|
283
|
+
...(this.configuration.audioCodec.type === 0 /* AudioRecordingCodecType.AAC_LC */ ?
|
|
284
|
+
["-profile:a", "aac_low"] :
|
|
285
|
+
["-profile:a", "aac_eld"]),
|
|
286
|
+
"-ar", `${samplerate}k`,
|
|
287
|
+
"-b:a", `${this.configuration.audioCodec.bitrate}k`,
|
|
288
|
+
"-ac", `${this.configuration.audioCodec.audioChannels}`,
|
|
297
289
|
]
|
|
298
290
|
: [];
|
|
299
|
-
this.server = new MP4StreamingServer(
|
|
291
|
+
this.server = new MP4StreamingServer("ffmpeg", `-f lavfi -i \
|
|
300
292
|
testsrc=s=${this.configuration.videoCodec.resolution[0]}x${this.configuration.videoCodec.resolution[1]}:r=${this.configuration.videoCodec.resolution[2]}`
|
|
301
|
-
.split(/ /), audioArgs, videoArgs);
|
|
293
|
+
.split(/ /g), audioArgs, videoArgs);
|
|
302
294
|
await this.server.start();
|
|
303
295
|
if (!this.server || this.server.destroyed) {
|
|
304
296
|
return; // early exit
|
|
@@ -307,29 +299,30 @@ class ExampleCamera {
|
|
|
307
299
|
try {
|
|
308
300
|
for await (const box of this.server.generator()) {
|
|
309
301
|
pending.push(box.header, box.data);
|
|
310
|
-
const motionDetected = camera.getService(Service.MotionSensor)?.getCharacteristic(Characteristic.MotionDetected).value;
|
|
311
|
-
console.log(
|
|
312
|
-
if (box.type ===
|
|
302
|
+
const motionDetected = camera.getService(__1.Service.MotionSensor)?.getCharacteristic(__1.Characteristic.MotionDetected).value;
|
|
303
|
+
console.log("mp4 box type " + box.type + " and length " + box.length);
|
|
304
|
+
if (box.type === "moov" || box.type === "mdat") {
|
|
313
305
|
const fragment = Buffer.concat(pending);
|
|
314
306
|
pending.splice(0, pending.length);
|
|
315
307
|
const isLast = STOP_AFTER_MOTION_STOP && !motionDetected;
|
|
316
308
|
yield {
|
|
317
309
|
data: fragment,
|
|
318
|
-
isLast,
|
|
310
|
+
isLast: isLast,
|
|
319
311
|
};
|
|
320
312
|
if (isLast) {
|
|
321
|
-
console.log(
|
|
313
|
+
console.log("Ending session due to motion stopped!");
|
|
322
314
|
break;
|
|
323
315
|
}
|
|
324
316
|
}
|
|
325
317
|
}
|
|
326
318
|
}
|
|
327
319
|
catch (error) {
|
|
328
|
-
if (!error.message.startsWith(
|
|
329
|
-
console.error(
|
|
320
|
+
if (!error.message.startsWith("FFMPEG")) { // cheap way of identifying our own emitted errors
|
|
321
|
+
console.error("Encountered unexpected error on generator " + error.stack);
|
|
330
322
|
}
|
|
331
323
|
}
|
|
332
324
|
}
|
|
325
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
333
326
|
closeRecordingStream(streamId, reason) {
|
|
334
327
|
if (this.server) {
|
|
335
328
|
this.server.destroy();
|
|
@@ -356,33 +349,33 @@ class MP4StreamingServer {
|
|
|
356
349
|
connectResolve;
|
|
357
350
|
constructor(ffmpegPath, ffmpegInput, audioOutputArgs, videoOutputArgs) {
|
|
358
351
|
this.connectPromise = new Promise(resolve => this.connectResolve = resolve);
|
|
359
|
-
this.server = createServer(this.handleConnection.bind(this));
|
|
352
|
+
this.server = (0, net_1.createServer)(this.handleConnection.bind(this));
|
|
360
353
|
this.ffmpegPath = ffmpegPath;
|
|
361
354
|
this.args = [];
|
|
362
355
|
this.args.push(...ffmpegInput);
|
|
363
356
|
this.args.push(...audioOutputArgs);
|
|
364
|
-
this.args.push(
|
|
357
|
+
this.args.push("-f", "mp4");
|
|
365
358
|
this.args.push(...videoOutputArgs);
|
|
366
|
-
this.args.push(
|
|
367
|
-
this.args.push(
|
|
359
|
+
this.args.push("-fflags", "+genpts", "-reset_timestamps", "1");
|
|
360
|
+
this.args.push("-movflags", "frag_keyframe+empty_moov+default_base_moof");
|
|
368
361
|
}
|
|
369
362
|
async start() {
|
|
370
|
-
const promise = once(this.server,
|
|
363
|
+
const promise = (0, events_1.once)(this.server, "listening");
|
|
371
364
|
this.server.listen(); // listen on random port
|
|
372
365
|
await promise;
|
|
373
366
|
if (this.destroyed) {
|
|
374
367
|
return;
|
|
375
368
|
}
|
|
376
369
|
const port = this.server.address().port;
|
|
377
|
-
this.args.push(
|
|
378
|
-
console.log(
|
|
379
|
-
this.childProcess = spawn(this.ffmpegPath, this.args, { env: process.env, stdio: this.debugMode ?
|
|
370
|
+
this.args.push("tcp://127.0.0.1:" + port);
|
|
371
|
+
console.log(this.ffmpegPath + " " + this.args.join(" "));
|
|
372
|
+
this.childProcess = (0, child_process_1.spawn)(this.ffmpegPath, this.args, { env: process.env, stdio: this.debugMode ? "pipe" : "ignore" });
|
|
380
373
|
if (!this.childProcess || !this.childProcess.stdout || !this.childProcess.stderr) {
|
|
381
|
-
throw new Error(
|
|
374
|
+
throw new Error("ChildProcess or its streams is undefined directly after the init!");
|
|
382
375
|
}
|
|
383
376
|
if (this.debugMode) {
|
|
384
|
-
this.childProcess.stdout?.on(
|
|
385
|
-
this.childProcess.stderr?.on(
|
|
377
|
+
this.childProcess.stdout?.on("data", data => console.log(data.toString()));
|
|
378
|
+
this.childProcess.stderr?.on("data", data => console.log(data.toString()));
|
|
386
379
|
}
|
|
387
380
|
}
|
|
388
381
|
destroy() {
|
|
@@ -404,8 +397,8 @@ class MP4StreamingServer {
|
|
|
404
397
|
async *generator() {
|
|
405
398
|
await this.connectPromise;
|
|
406
399
|
if (!this.socket || !this.childProcess) {
|
|
407
|
-
console.log(
|
|
408
|
-
throw new Error(
|
|
400
|
+
console.log("Socket undefined " + !!this.socket + " childProcess undefined " + !!this.childProcess);
|
|
401
|
+
throw new Error("Unexpected state!");
|
|
409
402
|
}
|
|
410
403
|
while (true) {
|
|
411
404
|
const header = await this.read(8);
|
|
@@ -413,16 +406,16 @@ class MP4StreamingServer {
|
|
|
413
406
|
const type = header.slice(4).toString();
|
|
414
407
|
const data = await this.read(length);
|
|
415
408
|
yield {
|
|
416
|
-
header,
|
|
417
|
-
length,
|
|
418
|
-
type,
|
|
419
|
-
data,
|
|
409
|
+
header: header,
|
|
410
|
+
length: length,
|
|
411
|
+
type: type,
|
|
412
|
+
data: data,
|
|
420
413
|
};
|
|
421
414
|
}
|
|
422
415
|
}
|
|
423
416
|
async read(length) {
|
|
424
417
|
if (!this.socket) {
|
|
425
|
-
throw
|
|
418
|
+
throw Error("FFMPEG tried reading from closed socket!");
|
|
426
419
|
}
|
|
427
420
|
if (!length) {
|
|
428
421
|
return Buffer.alloc(0);
|
|
@@ -435,28 +428,30 @@ class MP4StreamingServer {
|
|
|
435
428
|
const readHandler = () => {
|
|
436
429
|
const value = this.socket.read(length);
|
|
437
430
|
if (value) {
|
|
438
|
-
|
|
431
|
+
// eslint-disable-next-line @typescript-eslint/no-use-before-define
|
|
432
|
+
cleanup();
|
|
439
433
|
resolve(value);
|
|
440
434
|
}
|
|
441
435
|
};
|
|
442
436
|
const endHandler = () => {
|
|
443
|
-
|
|
437
|
+
// eslint-disable-next-line @typescript-eslint/no-use-before-define
|
|
438
|
+
cleanup();
|
|
444
439
|
reject(new Error(`FFMPEG socket closed during read for ${length} bytes!`));
|
|
445
440
|
};
|
|
446
441
|
const cleanup = () => {
|
|
447
|
-
this.socket?.removeListener(
|
|
448
|
-
this.socket?.removeListener(
|
|
442
|
+
this.socket?.removeListener("readable", readHandler);
|
|
443
|
+
this.socket?.removeListener("close", endHandler);
|
|
449
444
|
};
|
|
450
445
|
if (!this.socket) {
|
|
451
|
-
throw new Error(
|
|
446
|
+
throw new Error("FFMPEG socket is closed now!");
|
|
452
447
|
}
|
|
453
|
-
this.socket.on(
|
|
454
|
-
this.socket.on(
|
|
448
|
+
this.socket.on("readable", readHandler);
|
|
449
|
+
this.socket.on("close", endHandler);
|
|
455
450
|
});
|
|
456
451
|
}
|
|
457
452
|
}
|
|
458
453
|
const streamDelegate = new ExampleCamera();
|
|
459
|
-
const cameraController = new CameraController({
|
|
454
|
+
const cameraController = new __1.CameraController({
|
|
460
455
|
cameraStreamCount: 2, // HomeKit requires at least 2 streams, but 1 is also just fine
|
|
461
456
|
delegate: streamDelegate,
|
|
462
457
|
streamingOptions: {
|
|
@@ -541,10 +536,10 @@ const cameraController = new CameraController({
|
|
|
541
536
|
streamDelegate.controller = cameraController;
|
|
542
537
|
camera.configureController(cameraController);
|
|
543
538
|
// a service to trigger the motion sensor!
|
|
544
|
-
camera.addService(Service.Switch,
|
|
545
|
-
.getCharacteristic(Characteristic.On)
|
|
546
|
-
.onSet(
|
|
547
|
-
camera.getService(Service.MotionSensor)
|
|
548
|
-
?.updateCharacteristic(Characteristic.MotionDetected, value);
|
|
539
|
+
camera.addService(__1.Service.Switch, "MOTION TRIGGER")
|
|
540
|
+
.getCharacteristic(__1.Characteristic.On)
|
|
541
|
+
.onSet(value => {
|
|
542
|
+
camera.getService(__1.Service.MotionSensor)
|
|
543
|
+
?.updateCharacteristic(__1.Characteristic.MotionDetected, value);
|
|
549
544
|
});
|
|
550
545
|
//# sourceMappingURL=Camera_accessory.js.map
|