@camera.ui/sdk 0.0.3 → 0.0.4
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/LICENSE.md +1 -1
- package/README.md +2 -2
- package/dist/camera/events.js +2 -0
- package/dist/camera/index.js +3 -1
- package/dist/external.js +7 -0
- package/dist/index.d.ts +7132 -4248
- package/dist/index.js +3 -11
- package/dist/internal/contract-validators.js +21 -0
- package/dist/internal/index.d.ts +915 -0
- package/dist/internal/index.js +9 -0
- package/dist/internal/sensor-triggers.js +2 -0
- package/dist/internal/shared-utils.js +86 -0
- package/dist/internal/streaming-internal.js +1 -0
- package/dist/manager/index.js +1 -1
- package/dist/observable/index.js +419 -0
- package/dist/plugin/api.js +21 -0
- package/dist/plugin/contract.js +101 -114
- package/dist/plugin/helper.js +277 -0
- package/dist/plugin/index.js +4 -1
- package/dist/plugin/interfaces.js +51 -1
- package/dist/plugin/notifier.js +23 -0
- package/dist/plugin/oauth.js +1 -0
- package/dist/sensor/audio.js +103 -81
- package/dist/sensor/base.js +350 -318
- package/dist/sensor/battery.js +73 -59
- package/dist/sensor/classifier.js +117 -0
- package/dist/sensor/clip.js +30 -0
- package/dist/sensor/contact.js +37 -18
- package/dist/sensor/detection.js +4 -0
- package/dist/sensor/doorbell.js +52 -38
- package/dist/sensor/face.js +71 -86
- package/dist/sensor/garage.js +121 -0
- package/dist/sensor/humidity.js +52 -0
- package/dist/sensor/index.js +17 -11
- package/dist/sensor/leak.js +52 -0
- package/dist/sensor/licensePlate.js +70 -79
- package/dist/sensor/light.js +82 -38
- package/dist/sensor/lock.js +99 -0
- package/dist/sensor/motion.js +85 -70
- package/dist/sensor/object.js +73 -94
- package/dist/sensor/occupancy.js +52 -0
- package/dist/sensor/ptz.js +114 -100
- package/dist/sensor/securitySystem.js +98 -0
- package/dist/sensor/siren.js +75 -43
- package/dist/sensor/smoke.js +52 -0
- package/dist/sensor/spec.js +1 -0
- package/dist/sensor/switch.js +72 -0
- package/dist/sensor/temperature.js +52 -0
- package/dist/storage/index.js +1 -2
- package/dist/types.js +1 -0
- package/docs/.vitepress/config.ts +77 -0
- package/docs/.vitepress/theme/index.ts +5 -0
- package/docs/.vitepress/theme/style.css +117 -0
- package/docs/index.md +16 -0
- package/docs/logo.png +0 -0
- package/docs/public/apple-touch-icon.png +0 -0
- package/docs/public/favicon-16.ico +0 -0
- package/docs/public/favicon.ico +0 -0
- package/docs/public/logo.svg +1 -0
- package/examples/README.md +7 -0
- package/examples/getting-started.md +535 -0
- package/package.json +36 -23
- package/scripts/build-example-docs.mjs +62 -0
- package/tsconfig.node.json +3 -2
- package/typedoc.json +42 -0
- package/dist/sensor/guards.js +0 -133
- package/dist/sensor/types.js +0 -46
- package/dist/service/base.js +0 -96
- package/dist/service/index.js +0 -3
- /package/dist/camera/{types.js → enums.js} +0 -0
- /package/dist/{manager/types.js → camera/frames.js} +0 -0
- /package/dist/{plugin/types.js → internal/camera-config-internal.js} +0 -0
- /package/dist/{service/services.js → internal/camera-enums.js} +0 -0
- /package/dist/{service/types.js → internal/camera-wire.js} +0 -0
- /package/dist/{storage/schema.js → internal/manager-rpc.js} +0 -0
- /package/dist/{storage/storages.js → internal/sensor-rpc.js} +0 -0
package/dist/sensor/audio.js
CHANGED
|
@@ -1,118 +1,140 @@
|
|
|
1
|
-
import { Sensor } from './base.js';
|
|
2
|
-
|
|
1
|
+
import { Sensor, SensorType, SensorCategory } from './base.js';
|
|
2
|
+
/** Built-in audio label types recognized across the system. */
|
|
3
|
+
export const BASE_AUDIO_LABELS = [
|
|
4
|
+
'doorbell',
|
|
5
|
+
'glass_break',
|
|
6
|
+
'siren',
|
|
7
|
+
'speaking',
|
|
8
|
+
'gunshot',
|
|
9
|
+
'dog_bark',
|
|
10
|
+
'baby_cry',
|
|
11
|
+
'alarm',
|
|
12
|
+
'scream',
|
|
13
|
+
'cat',
|
|
14
|
+
'car_alarm',
|
|
15
|
+
'smoke_alarm',
|
|
16
|
+
];
|
|
3
17
|
/**
|
|
4
|
-
*
|
|
18
|
+
* Property names of an audio detection sensor.
|
|
19
|
+
*
|
|
20
|
+
* @internal
|
|
5
21
|
*/
|
|
6
22
|
export var AudioProperty;
|
|
7
23
|
(function (AudioProperty) {
|
|
24
|
+
/** Whether an audio event is currently detected. */
|
|
8
25
|
AudioProperty["Detected"] = "detected";
|
|
26
|
+
/** List of detected audio events (e.g. glass break, scream). */
|
|
9
27
|
AudioProperty["Detections"] = "detections";
|
|
28
|
+
/** Current audio level in decibels. */
|
|
10
29
|
AudioProperty["Decibels"] = "decibels";
|
|
30
|
+
/** Timestamp in milliseconds of the last detection trigger, set by the backend. */
|
|
31
|
+
AudioProperty["LastTriggered"] = "lastTriggered";
|
|
11
32
|
})(AudioProperty || (AudioProperty = {}));
|
|
12
33
|
/**
|
|
13
|
-
* Audio
|
|
14
|
-
*
|
|
15
|
-
* Base class for external audio detection (Ring, ONVIF events, etc.)
|
|
16
|
-
* Properties can be set directly: `sensor.detected = true`
|
|
34
|
+
* Audio sensor that reports audio events and decibel levels.
|
|
17
35
|
*
|
|
18
|
-
*
|
|
36
|
+
* Plugin authors call `reportDetections(list)` to push detected audio events
|
|
37
|
+
* (auto-derives `detected`) and `setDecibels(value)` to update the audio level.
|
|
19
38
|
*/
|
|
20
39
|
export class AudioSensor extends Sensor {
|
|
21
40
|
type = SensorType.Audio;
|
|
22
41
|
category = SensorCategory.Sensor;
|
|
23
|
-
name;
|
|
24
|
-
/**
|
|
25
|
-
* External audio sensors don't require audio frames.
|
|
26
|
-
* They receive detection events from external sources (APIs, ONVIF, etc.)
|
|
27
|
-
*/
|
|
28
42
|
_requiresFrames = false;
|
|
29
43
|
constructor(name = 'Audio Sensor') {
|
|
30
|
-
super();
|
|
31
|
-
this.
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
44
|
+
super(name);
|
|
45
|
+
this._writeState({
|
|
46
|
+
[AudioProperty.Detected]: false,
|
|
47
|
+
[AudioProperty.Detections]: [],
|
|
48
|
+
[AudioProperty.Decibels]: 0,
|
|
49
|
+
});
|
|
36
50
|
}
|
|
37
|
-
/** Whether audio event is currently detected */
|
|
51
|
+
/** Whether an audio event is currently detected. */
|
|
38
52
|
get detected() {
|
|
39
|
-
return this.
|
|
53
|
+
return this.props.detected;
|
|
40
54
|
}
|
|
41
|
-
/**
|
|
42
|
-
set detected(value) {
|
|
43
|
-
this.props.detected = value;
|
|
44
|
-
}
|
|
45
|
-
/** Current audio detections */
|
|
55
|
+
/** Current detection list. */
|
|
46
56
|
get detections() {
|
|
47
|
-
return this.
|
|
48
|
-
}
|
|
49
|
-
/** Set audio detections */
|
|
50
|
-
set detections(value) {
|
|
51
|
-
this.props.detections = value;
|
|
57
|
+
return this.props.detections;
|
|
52
58
|
}
|
|
53
|
-
/** Current
|
|
59
|
+
/** Current audio level in decibels. */
|
|
54
60
|
get decibels() {
|
|
55
|
-
return this.
|
|
61
|
+
return this.props.decibels;
|
|
56
62
|
}
|
|
57
|
-
/**
|
|
58
|
-
|
|
59
|
-
|
|
63
|
+
/**
|
|
64
|
+
* Report detected audio events.
|
|
65
|
+
*
|
|
66
|
+
* - `reportDetections(true)` — audio detected without specifics. The SDK
|
|
67
|
+
* synthesizes a single full-frame `'audio'` detection.
|
|
68
|
+
* - `reportDetections(true, [...])` — audio detected with explicit detections.
|
|
69
|
+
* - `reportDetections(false)` — clear.
|
|
70
|
+
*
|
|
71
|
+
* @param detected - Whether an audio event is currently detected.
|
|
72
|
+
*
|
|
73
|
+
* @param detections - Optional explicit detections produced for this event.
|
|
74
|
+
*
|
|
75
|
+
* @example
|
|
76
|
+
* ```ts
|
|
77
|
+
* import type { Detection } from '@camera.ui/sdk';
|
|
78
|
+
* sensor.reportDetections(true, [
|
|
79
|
+
* { label: 'glass_break', confidence: 0.91, box: { x: 0, y: 0, width: 1, height: 1 } } satisfies Detection,
|
|
80
|
+
* ]);
|
|
81
|
+
* sensor.reportDetections(false);
|
|
82
|
+
* ```
|
|
83
|
+
*/
|
|
84
|
+
reportDetections(detected, detections) {
|
|
85
|
+
const list = this._normalizeReportedDetections(detected, detections, 'audio');
|
|
86
|
+
this._writeState({
|
|
87
|
+
[AudioProperty.Detected]: detected,
|
|
88
|
+
[AudioProperty.Detections]: list,
|
|
89
|
+
});
|
|
60
90
|
}
|
|
61
91
|
/**
|
|
62
|
-
*
|
|
92
|
+
* Explicitly clear audio detection state (detected = false, detections = []).
|
|
63
93
|
*
|
|
64
|
-
* @
|
|
94
|
+
* @example
|
|
95
|
+
* ```ts
|
|
96
|
+
* sensor.clearDetections();
|
|
97
|
+
* ```
|
|
98
|
+
*/
|
|
99
|
+
clearDetections() {
|
|
100
|
+
this.reportDetections(false);
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Update the current audio level (in decibels).
|
|
65
104
|
*
|
|
66
|
-
* @param
|
|
105
|
+
* @param value - Audio level in decibels.
|
|
67
106
|
*
|
|
68
|
-
* @
|
|
107
|
+
* @example
|
|
108
|
+
* ```ts
|
|
109
|
+
* sensor.setDecibels(72);
|
|
110
|
+
* ```
|
|
69
111
|
*/
|
|
70
|
-
|
|
71
|
-
this.
|
|
72
|
-
this.props.detections = detections;
|
|
73
|
-
if (decibels !== undefined) {
|
|
74
|
-
this.props.decibels = decibels;
|
|
75
|
-
}
|
|
112
|
+
setDecibels(value) {
|
|
113
|
+
this._writeState({ [AudioProperty.Decibels]: value });
|
|
76
114
|
}
|
|
77
|
-
/**
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
115
|
+
/**
|
|
116
|
+
* Read-only sensor: external writes are ignored. State is reported via `reportDetections`/`setDecibels`.
|
|
117
|
+
*
|
|
118
|
+
* Called by the cross-process plugin host when a generic property write is received.
|
|
119
|
+
* Audio sensors have no externally writable properties, so the parameters are
|
|
120
|
+
* unused (underscore-prefixed) and the call is a no-op.
|
|
121
|
+
*
|
|
122
|
+
* @param _property - Unused — audio sensors expose no writable properties.
|
|
123
|
+
*
|
|
124
|
+
* @param _value - Unused — audio sensors expose no writable properties.
|
|
125
|
+
*
|
|
126
|
+
* @internal
|
|
127
|
+
*/
|
|
128
|
+
updateValue(_property, _value) {
|
|
129
|
+
// No-op — audio state is reported by the plugin, not set externally.
|
|
82
130
|
}
|
|
83
131
|
}
|
|
84
132
|
/**
|
|
85
|
-
* Audio
|
|
86
|
-
*
|
|
87
|
-
*
|
|
88
|
-
*
|
|
89
|
-
*
|
|
90
|
-
* @example
|
|
91
|
-
* ```typescript
|
|
92
|
-
* class GlassBreakDetector extends AudioDetectorSensor {
|
|
93
|
-
* get inputProperties(): AudioInputProperties {
|
|
94
|
-
* return { sampleRate: 16000, channels: 1, format: 'pcm16' };
|
|
95
|
-
* }
|
|
96
|
-
*
|
|
97
|
-
* async detectAudio(audio: AudioData): Promise<AudioResult> {
|
|
98
|
-
* const events = await this.classifier.classify(audio.data);
|
|
99
|
-
* return {
|
|
100
|
-
* detected: events.some(e => e.label === 'glass_break'),
|
|
101
|
-
* detections: events.map(e => ({
|
|
102
|
-
* label: e.label,
|
|
103
|
-
* confidence: e.score,
|
|
104
|
-
* box: { x: 0, y: 0, width: 1, height: 1 },
|
|
105
|
-
* })),
|
|
106
|
-
* decibels: audio.decibels,
|
|
107
|
-
* };
|
|
108
|
-
* }
|
|
109
|
-
* }
|
|
110
|
-
* ```
|
|
133
|
+
* Audio detector that receives audio frames from the backend pipeline.
|
|
134
|
+
* Extend this class and implement {@link detectAudio} to classify audio events.
|
|
135
|
+
* The backend resamples and buffers audio to match {@link modelSpec} before
|
|
136
|
+
* each call.
|
|
111
137
|
*/
|
|
112
138
|
export class AudioDetectorSensor extends AudioSensor {
|
|
113
|
-
/**
|
|
114
|
-
* Indicates this sensor requires audio frames for detection.
|
|
115
|
-
* Used by the backend to determine streaming requirements.
|
|
116
|
-
*/
|
|
117
139
|
_requiresFrames = true;
|
|
118
140
|
}
|