@camstack/addon-export-google 0.1.36 → 0.1.38
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.
|
@@ -6523,6 +6523,21 @@ var CameraStreamSchema = object({
|
|
|
6523
6523
|
*/
|
|
6524
6524
|
autoEligible: boolean().optional(),
|
|
6525
6525
|
/**
|
|
6526
|
+
* The profile slot the PUBLISHER says this stream is: `low` for a stream
|
|
6527
|
+
* whose only sensible role is the low-bandwidth one, `high` for a main
|
|
6528
|
+
* stream. Consulted by the broker's automatic ranking
|
|
6529
|
+
* (`rankInitialAssignment`) BEFORE the pixel-count heuristic, and only there:
|
|
6530
|
+
* an operator's manual assignment still wins, and an absent hint is the
|
|
6531
|
+
* pixel-ranked default every camera had before this field existed.
|
|
6532
|
+
*
|
|
6533
|
+
* Why it exists: a camera with ONE stream ranked to `mid` — the slot no
|
|
6534
|
+
* storage class is written for on its own (`recordings` is high|mid,
|
|
6535
|
+
* `recordingsLow` is low) and the one profile scrub does not read. The robot
|
|
6536
|
+
* camera's single 720p relay is a `low` in every respect except the slot the
|
|
6537
|
+
* heuristic put it in.
|
|
6538
|
+
*/
|
|
6539
|
+
profileHint: CamProfileSchema.optional(),
|
|
6540
|
+
/**
|
|
6526
6541
|
* Transport-specific opaque metadata. The broker passes it through to
|
|
6527
6542
|
* the source reader without inspecting it. Currently used by
|
|
6528
6543
|
* `pull-rfc4571` streams to carry the upstream SDP (so the reader can
|
|
@@ -8087,7 +8102,22 @@ var RecordingTriggersSchema = object({
|
|
|
8087
8102
|
* il livello: un contatto trovato già aperto al riavvio del runner non fa
|
|
8088
8103
|
* registrare.
|
|
8089
8104
|
*/
|
|
8090
|
-
sensorDeviceIds: array(number().int().positive()).min(1).max(16).refine(noDuplicates, { message: "sensorDeviceIds must not repeat a device" }).optional()
|
|
8105
|
+
sensorDeviceIds: array(number().int().positive()).min(1).max(16).refine(noDuplicates, { message: "sensorDeviceIds must not repeat a device" }).optional(),
|
|
8106
|
+
/**
|
|
8107
|
+
* La camera registra per tutta la durata del SEGNALE che lei stessa
|
|
8108
|
+
* pubblica — la cap `recording-signal` (`active: true` mentre il device è in
|
|
8109
|
+
* funzione: un robot che pulisce). È un LIVELLO, non un fronte: la finestra
|
|
8110
|
+
* resta aperta finché il segnale è alto e si chiude `postBufferSec` dopo la
|
|
8111
|
+
* caduta, così una pulizia di quaranta minuti è UNA clip.
|
|
8112
|
+
*
|
|
8113
|
+
* Non nomina un device: il segnale è della camera stessa, tenuto fresco dal
|
|
8114
|
+
* suo provider (D224); il recorder lo ascolta su `DeviceStateChanged` e lo
|
|
8115
|
+
* riconcilia leggendo la slice via RPC, con un tetto oltre il quale un
|
|
8116
|
+
* segnale mai abbassato (un evento perso) non può tenere aperta una
|
|
8117
|
+
* registrazione (D11). Vedi `recorder/addon/band-decision.ts`
|
|
8118
|
+
* (`holdTrigger` / `releaseTrigger`).
|
|
8119
|
+
*/
|
|
8120
|
+
deviceSignal: boolean().optional()
|
|
8091
8121
|
});
|
|
8092
8122
|
/**
|
|
8093
8123
|
* Mode of a single recording band — the recorder per-band vocabulary.
|
|
@@ -11577,6 +11607,8 @@ method(object({
|
|
|
11577
11607
|
label: string().optional(),
|
|
11578
11608
|
deviceFeatures: array(string()).optional(),
|
|
11579
11609
|
autoEligible: boolean().optional(),
|
|
11610
|
+
/** The slot the publisher says this stream IS — see `CameraStreamSchema.profileHint`. */
|
|
11611
|
+
profileHint: CamProfileSchema.optional(),
|
|
11580
11612
|
metadata: record(string(), unknown()).optional(),
|
|
11581
11613
|
/** Required when kind === 'derived' — the source camStreamId the
|
|
11582
11614
|
* derived broker reads its encoded plane from.
|
|
@@ -27961,6 +27993,47 @@ method(object({
|
|
|
27961
27993
|
auth: "protected"
|
|
27962
27994
|
});
|
|
27963
27995
|
/**
|
|
27996
|
+
* A camera's own "record me NOW" LEVEL — a signal the device raises while
|
|
27997
|
+
* something it knows about is happening (a robot vacuum cleaning, a machine
|
|
27998
|
+
* running, a gate open) and lowers when it stops.
|
|
27999
|
+
*
|
|
28000
|
+
* It is a level, not an edge. The sensor triggers the recorder already listens
|
|
28001
|
+
* to (`SOURCE_CAP_ACTIVE_FIELD`) fire on a rising edge and record for a fixed
|
|
28002
|
+
* post-buffer; a cleaning lasts forty minutes, and forty minutes of "this is
|
|
28003
|
+
* still happening" cannot be expressed as an edge plus a post-buffer without
|
|
28004
|
+
* either re-triggering on a timer (polling — D224 forbids the consumer keeping
|
|
28005
|
+
* the fact fresh) or picking a post-buffer long enough to cover every job,
|
|
28006
|
+
* which records the dock for that long after every short one. So the recorder
|
|
28007
|
+
* reads the LEVEL: it records for as long as `active` is true, plus the band's
|
|
28008
|
+
* own post-buffer once it falls.
|
|
28009
|
+
*
|
|
28010
|
+
* Who owns the fact: the PROVIDER of the device, which already reads the state
|
|
28011
|
+
* the signal is derived from (the vacuum's lifecycle state, for Dreame). It
|
|
28012
|
+
* writes this slice on every change; consumers subscribe to the kernel's
|
|
28013
|
+
* `DeviceStateChanged` for it and read it back through
|
|
28014
|
+
* `deviceState.getCapSlice` to reconcile — never a second copy, never a poll
|
|
28015
|
+
* against the device (D224, D8/D11).
|
|
28016
|
+
*
|
|
28017
|
+
* Deliberately NOT a `binary` sensor on the camera: a binary sensor is exported
|
|
28018
|
+
* to Home Assistant, HomeKit and the sensor picker as a thing an operator can
|
|
28019
|
+
* bind, and "the camera wants to record" is not a room sensor. It is a fact
|
|
28020
|
+
* about the camera, on the camera.
|
|
28021
|
+
*/
|
|
28022
|
+
var RecordingSignalStatusSchema = object({
|
|
28023
|
+
/** True while the device asks to be recorded. */
|
|
28024
|
+
active: boolean(),
|
|
28025
|
+
/**
|
|
28026
|
+
* Why, in the provider's own vocabulary (a vacuum's `cleaning` / `docked`,
|
|
28027
|
+
* …). Free text for the log line and the UI badge; the recorder never
|
|
28028
|
+
* branches on it.
|
|
28029
|
+
*/
|
|
28030
|
+
reason: string(),
|
|
28031
|
+
/** Ms epoch of the last `active` transition. 0 if never observed. */
|
|
28032
|
+
lastChangedAt: number()
|
|
28033
|
+
});
|
|
28034
|
+
RecordingSignalStatusSchema.extend({ lastFetchedAt: number() });
|
|
28035
|
+
DeviceType.Camera, method(object({ deviceId: number() }), RecordingSignalStatusSchema);
|
|
28036
|
+
/**
|
|
27964
28037
|
* scene-monitor — device-scoped reference-region state cap. An operator marks
|
|
27965
28038
|
* a rect ROI on a camera frame and names one or more states; the engine
|
|
27966
28039
|
* (pipeline-analytics, designated post-processing node) reports which state is
|
|
@@ -28333,6 +28406,8 @@ var CamStreamDescriptorSchema = object({
|
|
|
28333
28406
|
deviceFeatures: array(string()).optional(),
|
|
28334
28407
|
/** Eligible for automatic profile assignment. Absent = `true`. */
|
|
28335
28408
|
autoEligible: boolean().optional(),
|
|
28409
|
+
/** The slot the publisher says this stream IS — see `CameraStreamSchema.profileHint`. */
|
|
28410
|
+
profileHint: CamProfileSchema.optional(),
|
|
28336
28411
|
/** Transport-specific opaque metadata (e.g. rfc4571 SDP). */
|
|
28337
28412
|
metadata: record(string(), unknown()).optional()
|
|
28338
28413
|
});
|
|
@@ -34285,6 +34360,12 @@ Object.freeze({
|
|
|
34285
34360
|
addonId: null,
|
|
34286
34361
|
access: "view"
|
|
34287
34362
|
},
|
|
34363
|
+
"recordingSignal.getStatus": {
|
|
34364
|
+
capName: "recording-signal",
|
|
34365
|
+
capScope: "device",
|
|
34366
|
+
addonId: null,
|
|
34367
|
+
access: "view"
|
|
34368
|
+
},
|
|
34288
34369
|
"sceneMonitor.captureReference": {
|
|
34289
34370
|
capName: "scene-monitor",
|
|
34290
34371
|
capScope: "device",
|
|
@@ -37277,6 +37358,11 @@ Object.freeze({
|
|
|
37277
37358
|
form: "single",
|
|
37278
37359
|
optional: true
|
|
37279
37360
|
}],
|
|
37361
|
+
"recordingSignal.getStatus": [{
|
|
37362
|
+
name: "deviceId",
|
|
37363
|
+
form: "single",
|
|
37364
|
+
optional: false
|
|
37365
|
+
}],
|
|
37280
37366
|
"sceneMonitor.captureReference": [{
|
|
37281
37367
|
name: "deviceId",
|
|
37282
37368
|
form: "single",
|
|
@@ -6519,6 +6519,21 @@ var CameraStreamSchema = object({
|
|
|
6519
6519
|
*/
|
|
6520
6520
|
autoEligible: boolean().optional(),
|
|
6521
6521
|
/**
|
|
6522
|
+
* The profile slot the PUBLISHER says this stream is: `low` for a stream
|
|
6523
|
+
* whose only sensible role is the low-bandwidth one, `high` for a main
|
|
6524
|
+
* stream. Consulted by the broker's automatic ranking
|
|
6525
|
+
* (`rankInitialAssignment`) BEFORE the pixel-count heuristic, and only there:
|
|
6526
|
+
* an operator's manual assignment still wins, and an absent hint is the
|
|
6527
|
+
* pixel-ranked default every camera had before this field existed.
|
|
6528
|
+
*
|
|
6529
|
+
* Why it exists: a camera with ONE stream ranked to `mid` — the slot no
|
|
6530
|
+
* storage class is written for on its own (`recordings` is high|mid,
|
|
6531
|
+
* `recordingsLow` is low) and the one profile scrub does not read. The robot
|
|
6532
|
+
* camera's single 720p relay is a `low` in every respect except the slot the
|
|
6533
|
+
* heuristic put it in.
|
|
6534
|
+
*/
|
|
6535
|
+
profileHint: CamProfileSchema.optional(),
|
|
6536
|
+
/**
|
|
6522
6537
|
* Transport-specific opaque metadata. The broker passes it through to
|
|
6523
6538
|
* the source reader without inspecting it. Currently used by
|
|
6524
6539
|
* `pull-rfc4571` streams to carry the upstream SDP (so the reader can
|
|
@@ -8083,7 +8098,22 @@ var RecordingTriggersSchema = object({
|
|
|
8083
8098
|
* il livello: un contatto trovato già aperto al riavvio del runner non fa
|
|
8084
8099
|
* registrare.
|
|
8085
8100
|
*/
|
|
8086
|
-
sensorDeviceIds: array(number().int().positive()).min(1).max(16).refine(noDuplicates, { message: "sensorDeviceIds must not repeat a device" }).optional()
|
|
8101
|
+
sensorDeviceIds: array(number().int().positive()).min(1).max(16).refine(noDuplicates, { message: "sensorDeviceIds must not repeat a device" }).optional(),
|
|
8102
|
+
/**
|
|
8103
|
+
* La camera registra per tutta la durata del SEGNALE che lei stessa
|
|
8104
|
+
* pubblica — la cap `recording-signal` (`active: true` mentre il device è in
|
|
8105
|
+
* funzione: un robot che pulisce). È un LIVELLO, non un fronte: la finestra
|
|
8106
|
+
* resta aperta finché il segnale è alto e si chiude `postBufferSec` dopo la
|
|
8107
|
+
* caduta, così una pulizia di quaranta minuti è UNA clip.
|
|
8108
|
+
*
|
|
8109
|
+
* Non nomina un device: il segnale è della camera stessa, tenuto fresco dal
|
|
8110
|
+
* suo provider (D224); il recorder lo ascolta su `DeviceStateChanged` e lo
|
|
8111
|
+
* riconcilia leggendo la slice via RPC, con un tetto oltre il quale un
|
|
8112
|
+
* segnale mai abbassato (un evento perso) non può tenere aperta una
|
|
8113
|
+
* registrazione (D11). Vedi `recorder/addon/band-decision.ts`
|
|
8114
|
+
* (`holdTrigger` / `releaseTrigger`).
|
|
8115
|
+
*/
|
|
8116
|
+
deviceSignal: boolean().optional()
|
|
8087
8117
|
});
|
|
8088
8118
|
/**
|
|
8089
8119
|
* Mode of a single recording band — the recorder per-band vocabulary.
|
|
@@ -11573,6 +11603,8 @@ method(object({
|
|
|
11573
11603
|
label: string().optional(),
|
|
11574
11604
|
deviceFeatures: array(string()).optional(),
|
|
11575
11605
|
autoEligible: boolean().optional(),
|
|
11606
|
+
/** The slot the publisher says this stream IS — see `CameraStreamSchema.profileHint`. */
|
|
11607
|
+
profileHint: CamProfileSchema.optional(),
|
|
11576
11608
|
metadata: record(string(), unknown()).optional(),
|
|
11577
11609
|
/** Required when kind === 'derived' — the source camStreamId the
|
|
11578
11610
|
* derived broker reads its encoded plane from.
|
|
@@ -27957,6 +27989,47 @@ method(object({
|
|
|
27957
27989
|
auth: "protected"
|
|
27958
27990
|
});
|
|
27959
27991
|
/**
|
|
27992
|
+
* A camera's own "record me NOW" LEVEL — a signal the device raises while
|
|
27993
|
+
* something it knows about is happening (a robot vacuum cleaning, a machine
|
|
27994
|
+
* running, a gate open) and lowers when it stops.
|
|
27995
|
+
*
|
|
27996
|
+
* It is a level, not an edge. The sensor triggers the recorder already listens
|
|
27997
|
+
* to (`SOURCE_CAP_ACTIVE_FIELD`) fire on a rising edge and record for a fixed
|
|
27998
|
+
* post-buffer; a cleaning lasts forty minutes, and forty minutes of "this is
|
|
27999
|
+
* still happening" cannot be expressed as an edge plus a post-buffer without
|
|
28000
|
+
* either re-triggering on a timer (polling — D224 forbids the consumer keeping
|
|
28001
|
+
* the fact fresh) or picking a post-buffer long enough to cover every job,
|
|
28002
|
+
* which records the dock for that long after every short one. So the recorder
|
|
28003
|
+
* reads the LEVEL: it records for as long as `active` is true, plus the band's
|
|
28004
|
+
* own post-buffer once it falls.
|
|
28005
|
+
*
|
|
28006
|
+
* Who owns the fact: the PROVIDER of the device, which already reads the state
|
|
28007
|
+
* the signal is derived from (the vacuum's lifecycle state, for Dreame). It
|
|
28008
|
+
* writes this slice on every change; consumers subscribe to the kernel's
|
|
28009
|
+
* `DeviceStateChanged` for it and read it back through
|
|
28010
|
+
* `deviceState.getCapSlice` to reconcile — never a second copy, never a poll
|
|
28011
|
+
* against the device (D224, D8/D11).
|
|
28012
|
+
*
|
|
28013
|
+
* Deliberately NOT a `binary` sensor on the camera: a binary sensor is exported
|
|
28014
|
+
* to Home Assistant, HomeKit and the sensor picker as a thing an operator can
|
|
28015
|
+
* bind, and "the camera wants to record" is not a room sensor. It is a fact
|
|
28016
|
+
* about the camera, on the camera.
|
|
28017
|
+
*/
|
|
28018
|
+
var RecordingSignalStatusSchema = object({
|
|
28019
|
+
/** True while the device asks to be recorded. */
|
|
28020
|
+
active: boolean(),
|
|
28021
|
+
/**
|
|
28022
|
+
* Why, in the provider's own vocabulary (a vacuum's `cleaning` / `docked`,
|
|
28023
|
+
* …). Free text for the log line and the UI badge; the recorder never
|
|
28024
|
+
* branches on it.
|
|
28025
|
+
*/
|
|
28026
|
+
reason: string(),
|
|
28027
|
+
/** Ms epoch of the last `active` transition. 0 if never observed. */
|
|
28028
|
+
lastChangedAt: number()
|
|
28029
|
+
});
|
|
28030
|
+
RecordingSignalStatusSchema.extend({ lastFetchedAt: number() });
|
|
28031
|
+
DeviceType.Camera, method(object({ deviceId: number() }), RecordingSignalStatusSchema);
|
|
28032
|
+
/**
|
|
27960
28033
|
* scene-monitor — device-scoped reference-region state cap. An operator marks
|
|
27961
28034
|
* a rect ROI on a camera frame and names one or more states; the engine
|
|
27962
28035
|
* (pipeline-analytics, designated post-processing node) reports which state is
|
|
@@ -28329,6 +28402,8 @@ var CamStreamDescriptorSchema = object({
|
|
|
28329
28402
|
deviceFeatures: array(string()).optional(),
|
|
28330
28403
|
/** Eligible for automatic profile assignment. Absent = `true`. */
|
|
28331
28404
|
autoEligible: boolean().optional(),
|
|
28405
|
+
/** The slot the publisher says this stream IS — see `CameraStreamSchema.profileHint`. */
|
|
28406
|
+
profileHint: CamProfileSchema.optional(),
|
|
28332
28407
|
/** Transport-specific opaque metadata (e.g. rfc4571 SDP). */
|
|
28333
28408
|
metadata: record(string(), unknown()).optional()
|
|
28334
28409
|
});
|
|
@@ -34281,6 +34356,12 @@ Object.freeze({
|
|
|
34281
34356
|
addonId: null,
|
|
34282
34357
|
access: "view"
|
|
34283
34358
|
},
|
|
34359
|
+
"recordingSignal.getStatus": {
|
|
34360
|
+
capName: "recording-signal",
|
|
34361
|
+
capScope: "device",
|
|
34362
|
+
addonId: null,
|
|
34363
|
+
access: "view"
|
|
34364
|
+
},
|
|
34284
34365
|
"sceneMonitor.captureReference": {
|
|
34285
34366
|
capName: "scene-monitor",
|
|
34286
34367
|
capScope: "device",
|
|
@@ -37273,6 +37354,11 @@ Object.freeze({
|
|
|
37273
37354
|
form: "single",
|
|
37274
37355
|
optional: true
|
|
37275
37356
|
}],
|
|
37357
|
+
"recordingSignal.getStatus": [{
|
|
37358
|
+
name: "deviceId",
|
|
37359
|
+
form: "single",
|
|
37360
|
+
optional: false
|
|
37361
|
+
}],
|
|
37276
37362
|
"sceneMonitor.captureReference": [{
|
|
37277
37363
|
name: "deviceId",
|
|
37278
37364
|
form: "single",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@camstack/addon-export-google",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.38",
|
|
4
4
|
"description": "Google Home export — hub-side smart-home fulfillment (SYNC / QUERY / EXECUTE / DISCONNECT) for the non-camera fleet, served over the hub's own OAuth account link. No Google credential is stored, sent or required.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"camstack",
|