@camstack/addon-provider-reolink 1.2.94 → 1.2.96

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/dist/addon.js CHANGED
@@ -5433,6 +5433,12 @@ Object.fromEntries([
5433
5433
  icon: "move",
5434
5434
  order: 40
5435
5435
  },
5436
+ {
5437
+ id: "navigation",
5438
+ label: "Navigation",
5439
+ icon: "compass",
5440
+ order: 41
5441
+ },
5436
5442
  {
5437
5443
  id: "consumables",
5438
5444
  label: "Consumables",
@@ -6466,6 +6472,21 @@ var CameraStreamSchema = object({
6466
6472
  */
6467
6473
  autoEligible: boolean().optional(),
6468
6474
  /**
6475
+ * The profile slot the PUBLISHER says this stream is: `low` for a stream
6476
+ * whose only sensible role is the low-bandwidth one, `high` for a main
6477
+ * stream. Consulted by the broker's automatic ranking
6478
+ * (`rankInitialAssignment`) BEFORE the pixel-count heuristic, and only there:
6479
+ * an operator's manual assignment still wins, and an absent hint is the
6480
+ * pixel-ranked default every camera had before this field existed.
6481
+ *
6482
+ * Why it exists: a camera with ONE stream ranked to `mid` — the slot no
6483
+ * storage class is written for on its own (`recordings` is high|mid,
6484
+ * `recordingsLow` is low) and the one profile scrub does not read. The robot
6485
+ * camera's single 720p relay is a `low` in every respect except the slot the
6486
+ * heuristic put it in.
6487
+ */
6488
+ profileHint: CamProfileSchema.optional(),
6489
+ /**
6469
6490
  * Transport-specific opaque metadata. The broker passes it through to
6470
6491
  * the source reader without inspecting it. Currently used by
6471
6492
  * `pull-rfc4571` streams to carry the upstream SDP (so the reader can
@@ -8178,7 +8199,22 @@ var RecordingTriggersSchema = object({
8178
8199
  * il livello: un contatto trovato già aperto al riavvio del runner non fa
8179
8200
  * registrare.
8180
8201
  */
8181
- sensorDeviceIds: array(number().int().positive()).min(1).max(16).refine(noDuplicates, { message: "sensorDeviceIds must not repeat a device" }).optional()
8202
+ sensorDeviceIds: array(number().int().positive()).min(1).max(16).refine(noDuplicates, { message: "sensorDeviceIds must not repeat a device" }).optional(),
8203
+ /**
8204
+ * La camera registra per tutta la durata del SEGNALE che lei stessa
8205
+ * pubblica — la cap `recording-signal` (`active: true` mentre il device è in
8206
+ * funzione: un robot che pulisce). È un LIVELLO, non un fronte: la finestra
8207
+ * resta aperta finché il segnale è alto e si chiude `postBufferSec` dopo la
8208
+ * caduta, così una pulizia di quaranta minuti è UNA clip.
8209
+ *
8210
+ * Non nomina un device: il segnale è della camera stessa, tenuto fresco dal
8211
+ * suo provider (D224); il recorder lo ascolta su `DeviceStateChanged` e lo
8212
+ * riconcilia leggendo la slice via RPC, con un tetto oltre il quale un
8213
+ * segnale mai abbassato (un evento perso) non può tenere aperta una
8214
+ * registrazione (D11). Vedi `recorder/addon/band-decision.ts`
8215
+ * (`holdTrigger` / `releaseTrigger`).
8216
+ */
8217
+ deviceSignal: boolean().optional()
8182
8218
  });
8183
8219
  /**
8184
8220
  * Mode of a single recording band — the recorder per-band vocabulary.
@@ -11923,6 +11959,8 @@ method(object({
11923
11959
  label: string().optional(),
11924
11960
  deviceFeatures: array(string()).optional(),
11925
11961
  autoEligible: boolean().optional(),
11962
+ /** The slot the publisher says this stream IS — see `CameraStreamSchema.profileHint`. */
11963
+ profileHint: CamProfileSchema.optional(),
11926
11964
  metadata: record(string(), unknown()).optional(),
11927
11965
  /** Required when kind === 'derived' — the source camStreamId the
11928
11966
  * derived broker reads its encoded plane from.
@@ -30733,6 +30771,77 @@ method(object({
30733
30771
  auth: "protected"
30734
30772
  });
30735
30773
  /**
30774
+ * A camera's own "record me NOW" LEVEL — a signal the device raises while
30775
+ * something it knows about is happening (a robot vacuum cleaning, a machine
30776
+ * running, a gate open) and lowers when it stops.
30777
+ *
30778
+ * It is a level, not an edge. The sensor triggers the recorder already listens
30779
+ * to (`SOURCE_CAP_ACTIVE_FIELD`) fire on a rising edge and record for a fixed
30780
+ * post-buffer; a cleaning lasts forty minutes, and forty minutes of "this is
30781
+ * still happening" cannot be expressed as an edge plus a post-buffer without
30782
+ * either re-triggering on a timer (polling — D224 forbids the consumer keeping
30783
+ * the fact fresh) or picking a post-buffer long enough to cover every job,
30784
+ * which records the dock for that long after every short one. So the recorder
30785
+ * reads the LEVEL: it records for as long as `active` is true, plus the band's
30786
+ * own post-buffer once it falls.
30787
+ *
30788
+ * Who owns the fact: the PROVIDER of the device, which already reads the state
30789
+ * the signal is derived from (the vacuum's lifecycle state, for Dreame). It
30790
+ * writes this slice on every change; consumers subscribe to the kernel's
30791
+ * `DeviceStateChanged` for it and read it back through
30792
+ * `deviceState.getCapSlice` to reconcile — never a second copy, never a poll
30793
+ * against the device (D224, D8/D11).
30794
+ *
30795
+ * Deliberately NOT a `binary` sensor on the camera: a binary sensor is exported
30796
+ * to Home Assistant, HomeKit and the sensor picker as a thing an operator can
30797
+ * bind, and "the camera wants to record" is not a room sensor. It is a fact
30798
+ * about the camera, on the camera.
30799
+ */
30800
+ var RecordingSignalStatusSchema = object({
30801
+ /** True while the device asks to be recorded. */
30802
+ active: boolean(),
30803
+ /**
30804
+ * Why, in the provider's own vocabulary (a vacuum's `cleaning` / `docked`,
30805
+ * …). Free text for the log line and the UI badge; the recorder never
30806
+ * branches on it.
30807
+ */
30808
+ reason: string(),
30809
+ /** Ms epoch of the last `active` transition. 0 if never observed. */
30810
+ lastChangedAt: number()
30811
+ });
30812
+ /** The runtime-state slice: the status plus the clock every slice carries. */
30813
+ var RecordingSignalRuntimeStateSchema = RecordingSignalStatusSchema.extend({ lastFetchedAt: number() });
30814
+ var recordingSignalCapability = {
30815
+ name: "recording-signal",
30816
+ scope: "device",
30817
+ deviceNative: true,
30818
+ mode: "singleton",
30819
+ deviceTypes: [DeviceType.Camera],
30820
+ methods: {
30821
+ /** The current level, straight from the slice the provider keeps fresh. */
30822
+ getStatus: method(object({ deviceId: number() }), RecordingSignalStatusSchema) },
30823
+ status: {
30824
+ schema: RecordingSignalStatusSchema,
30825
+ kind: "push",
30826
+ empty: {
30827
+ active: false,
30828
+ reason: "unknown",
30829
+ lastChangedAt: 0
30830
+ }
30831
+ },
30832
+ runtimeState: RecordingSignalRuntimeStateSchema,
30833
+ /**
30834
+ * Runtime-state durability: **session** — a restored `active: true` from
30835
+ * before a restart is exactly the stale level the recorder's reconcile bound
30836
+ * exists to end, and the provider re-derives the true level on activation
30837
+ * anyway. Nothing is lost by forgetting it; a lie is avoided.
30838
+ *
30839
+ * See `RuntimeStateDurability`. Enforced by
30840
+ * `scripts/check-runtime-state-durability.ts`.
30841
+ */
30842
+ durability: "session"
30843
+ };
30844
+ /**
30736
30845
  * scene-monitor — device-scoped reference-region state cap. An operator marks
30737
30846
  * a rect ROI on a camera frame and names one or more states; the engine
30738
30847
  * (pipeline-analytics, designated post-processing node) reports which state is
@@ -31230,6 +31339,8 @@ var CamStreamDescriptorSchema = object({
31230
31339
  deviceFeatures: array(string()).optional(),
31231
31340
  /** Eligible for automatic profile assignment. Absent = `true`. */
31232
31341
  autoEligible: boolean().optional(),
31342
+ /** The slot the publisher says this stream IS — see `CameraStreamSchema.profileHint`. */
31343
+ profileHint: CamProfileSchema.optional(),
31233
31344
  /** Transport-specific opaque metadata (e.g. rfc4571 SDP). */
31234
31345
  metadata: record(string(), unknown()).optional()
31235
31346
  });
@@ -33582,6 +33693,7 @@ var DEVICE_LOCAL_STATE_CAPS = {
33582
33693
  pressureSensor: pressureSensorCapability,
33583
33694
  privacyMask: privacyMaskCapability,
33584
33695
  ptzAutotrack: ptzAutotrackCapability,
33696
+ recordingSignal: recordingSignalCapability,
33585
33697
  sceneMonitor: sceneMonitorCapability,
33586
33698
  scriptRunner: scriptRunnerCapability,
33587
33699
  smoke: smokeCapability,
@@ -39492,6 +39604,12 @@ Object.freeze({
39492
39604
  addonId: null,
39493
39605
  access: "view"
39494
39606
  },
39607
+ "recordingSignal.getStatus": {
39608
+ capName: "recording-signal",
39609
+ capScope: "device",
39610
+ addonId: null,
39611
+ access: "view"
39612
+ },
39495
39613
  "sceneMonitor.captureReference": {
39496
39614
  capName: "scene-monitor",
39497
39615
  capScope: "device",
@@ -42484,6 +42602,11 @@ Object.freeze({
42484
42602
  form: "single",
42485
42603
  optional: true
42486
42604
  }],
42605
+ "recordingSignal.getStatus": [{
42606
+ name: "deviceId",
42607
+ form: "single",
42608
+ optional: false
42609
+ }],
42487
42610
  "sceneMonitor.captureReference": [{
42488
42611
  name: "deviceId",
42489
42612
  form: "single",
package/dist/addon.mjs CHANGED
@@ -5428,6 +5428,12 @@ Object.fromEntries([
5428
5428
  icon: "move",
5429
5429
  order: 40
5430
5430
  },
5431
+ {
5432
+ id: "navigation",
5433
+ label: "Navigation",
5434
+ icon: "compass",
5435
+ order: 41
5436
+ },
5431
5437
  {
5432
5438
  id: "consumables",
5433
5439
  label: "Consumables",
@@ -6461,6 +6467,21 @@ var CameraStreamSchema = object({
6461
6467
  */
6462
6468
  autoEligible: boolean().optional(),
6463
6469
  /**
6470
+ * The profile slot the PUBLISHER says this stream is: `low` for a stream
6471
+ * whose only sensible role is the low-bandwidth one, `high` for a main
6472
+ * stream. Consulted by the broker's automatic ranking
6473
+ * (`rankInitialAssignment`) BEFORE the pixel-count heuristic, and only there:
6474
+ * an operator's manual assignment still wins, and an absent hint is the
6475
+ * pixel-ranked default every camera had before this field existed.
6476
+ *
6477
+ * Why it exists: a camera with ONE stream ranked to `mid` — the slot no
6478
+ * storage class is written for on its own (`recordings` is high|mid,
6479
+ * `recordingsLow` is low) and the one profile scrub does not read. The robot
6480
+ * camera's single 720p relay is a `low` in every respect except the slot the
6481
+ * heuristic put it in.
6482
+ */
6483
+ profileHint: CamProfileSchema.optional(),
6484
+ /**
6464
6485
  * Transport-specific opaque metadata. The broker passes it through to
6465
6486
  * the source reader without inspecting it. Currently used by
6466
6487
  * `pull-rfc4571` streams to carry the upstream SDP (so the reader can
@@ -8173,7 +8194,22 @@ var RecordingTriggersSchema = object({
8173
8194
  * il livello: un contatto trovato già aperto al riavvio del runner non fa
8174
8195
  * registrare.
8175
8196
  */
8176
- sensorDeviceIds: array(number().int().positive()).min(1).max(16).refine(noDuplicates, { message: "sensorDeviceIds must not repeat a device" }).optional()
8197
+ sensorDeviceIds: array(number().int().positive()).min(1).max(16).refine(noDuplicates, { message: "sensorDeviceIds must not repeat a device" }).optional(),
8198
+ /**
8199
+ * La camera registra per tutta la durata del SEGNALE che lei stessa
8200
+ * pubblica — la cap `recording-signal` (`active: true` mentre il device è in
8201
+ * funzione: un robot che pulisce). È un LIVELLO, non un fronte: la finestra
8202
+ * resta aperta finché il segnale è alto e si chiude `postBufferSec` dopo la
8203
+ * caduta, così una pulizia di quaranta minuti è UNA clip.
8204
+ *
8205
+ * Non nomina un device: il segnale è della camera stessa, tenuto fresco dal
8206
+ * suo provider (D224); il recorder lo ascolta su `DeviceStateChanged` e lo
8207
+ * riconcilia leggendo la slice via RPC, con un tetto oltre il quale un
8208
+ * segnale mai abbassato (un evento perso) non può tenere aperta una
8209
+ * registrazione (D11). Vedi `recorder/addon/band-decision.ts`
8210
+ * (`holdTrigger` / `releaseTrigger`).
8211
+ */
8212
+ deviceSignal: boolean().optional()
8177
8213
  });
8178
8214
  /**
8179
8215
  * Mode of a single recording band — the recorder per-band vocabulary.
@@ -11918,6 +11954,8 @@ method(object({
11918
11954
  label: string().optional(),
11919
11955
  deviceFeatures: array(string()).optional(),
11920
11956
  autoEligible: boolean().optional(),
11957
+ /** The slot the publisher says this stream IS — see `CameraStreamSchema.profileHint`. */
11958
+ profileHint: CamProfileSchema.optional(),
11921
11959
  metadata: record(string(), unknown()).optional(),
11922
11960
  /** Required when kind === 'derived' — the source camStreamId the
11923
11961
  * derived broker reads its encoded plane from.
@@ -30728,6 +30766,77 @@ method(object({
30728
30766
  auth: "protected"
30729
30767
  });
30730
30768
  /**
30769
+ * A camera's own "record me NOW" LEVEL — a signal the device raises while
30770
+ * something it knows about is happening (a robot vacuum cleaning, a machine
30771
+ * running, a gate open) and lowers when it stops.
30772
+ *
30773
+ * It is a level, not an edge. The sensor triggers the recorder already listens
30774
+ * to (`SOURCE_CAP_ACTIVE_FIELD`) fire on a rising edge and record for a fixed
30775
+ * post-buffer; a cleaning lasts forty minutes, and forty minutes of "this is
30776
+ * still happening" cannot be expressed as an edge plus a post-buffer without
30777
+ * either re-triggering on a timer (polling — D224 forbids the consumer keeping
30778
+ * the fact fresh) or picking a post-buffer long enough to cover every job,
30779
+ * which records the dock for that long after every short one. So the recorder
30780
+ * reads the LEVEL: it records for as long as `active` is true, plus the band's
30781
+ * own post-buffer once it falls.
30782
+ *
30783
+ * Who owns the fact: the PROVIDER of the device, which already reads the state
30784
+ * the signal is derived from (the vacuum's lifecycle state, for Dreame). It
30785
+ * writes this slice on every change; consumers subscribe to the kernel's
30786
+ * `DeviceStateChanged` for it and read it back through
30787
+ * `deviceState.getCapSlice` to reconcile — never a second copy, never a poll
30788
+ * against the device (D224, D8/D11).
30789
+ *
30790
+ * Deliberately NOT a `binary` sensor on the camera: a binary sensor is exported
30791
+ * to Home Assistant, HomeKit and the sensor picker as a thing an operator can
30792
+ * bind, and "the camera wants to record" is not a room sensor. It is a fact
30793
+ * about the camera, on the camera.
30794
+ */
30795
+ var RecordingSignalStatusSchema = object({
30796
+ /** True while the device asks to be recorded. */
30797
+ active: boolean(),
30798
+ /**
30799
+ * Why, in the provider's own vocabulary (a vacuum's `cleaning` / `docked`,
30800
+ * …). Free text for the log line and the UI badge; the recorder never
30801
+ * branches on it.
30802
+ */
30803
+ reason: string(),
30804
+ /** Ms epoch of the last `active` transition. 0 if never observed. */
30805
+ lastChangedAt: number()
30806
+ });
30807
+ /** The runtime-state slice: the status plus the clock every slice carries. */
30808
+ var RecordingSignalRuntimeStateSchema = RecordingSignalStatusSchema.extend({ lastFetchedAt: number() });
30809
+ var recordingSignalCapability = {
30810
+ name: "recording-signal",
30811
+ scope: "device",
30812
+ deviceNative: true,
30813
+ mode: "singleton",
30814
+ deviceTypes: [DeviceType.Camera],
30815
+ methods: {
30816
+ /** The current level, straight from the slice the provider keeps fresh. */
30817
+ getStatus: method(object({ deviceId: number() }), RecordingSignalStatusSchema) },
30818
+ status: {
30819
+ schema: RecordingSignalStatusSchema,
30820
+ kind: "push",
30821
+ empty: {
30822
+ active: false,
30823
+ reason: "unknown",
30824
+ lastChangedAt: 0
30825
+ }
30826
+ },
30827
+ runtimeState: RecordingSignalRuntimeStateSchema,
30828
+ /**
30829
+ * Runtime-state durability: **session** — a restored `active: true` from
30830
+ * before a restart is exactly the stale level the recorder's reconcile bound
30831
+ * exists to end, and the provider re-derives the true level on activation
30832
+ * anyway. Nothing is lost by forgetting it; a lie is avoided.
30833
+ *
30834
+ * See `RuntimeStateDurability`. Enforced by
30835
+ * `scripts/check-runtime-state-durability.ts`.
30836
+ */
30837
+ durability: "session"
30838
+ };
30839
+ /**
30731
30840
  * scene-monitor — device-scoped reference-region state cap. An operator marks
30732
30841
  * a rect ROI on a camera frame and names one or more states; the engine
30733
30842
  * (pipeline-analytics, designated post-processing node) reports which state is
@@ -31225,6 +31334,8 @@ var CamStreamDescriptorSchema = object({
31225
31334
  deviceFeatures: array(string()).optional(),
31226
31335
  /** Eligible for automatic profile assignment. Absent = `true`. */
31227
31336
  autoEligible: boolean().optional(),
31337
+ /** The slot the publisher says this stream IS — see `CameraStreamSchema.profileHint`. */
31338
+ profileHint: CamProfileSchema.optional(),
31228
31339
  /** Transport-specific opaque metadata (e.g. rfc4571 SDP). */
31229
31340
  metadata: record(string(), unknown()).optional()
31230
31341
  });
@@ -33577,6 +33688,7 @@ var DEVICE_LOCAL_STATE_CAPS = {
33577
33688
  pressureSensor: pressureSensorCapability,
33578
33689
  privacyMask: privacyMaskCapability,
33579
33690
  ptzAutotrack: ptzAutotrackCapability,
33691
+ recordingSignal: recordingSignalCapability,
33580
33692
  sceneMonitor: sceneMonitorCapability,
33581
33693
  scriptRunner: scriptRunnerCapability,
33582
33694
  smoke: smokeCapability,
@@ -39487,6 +39599,12 @@ Object.freeze({
39487
39599
  addonId: null,
39488
39600
  access: "view"
39489
39601
  },
39602
+ "recordingSignal.getStatus": {
39603
+ capName: "recording-signal",
39604
+ capScope: "device",
39605
+ addonId: null,
39606
+ access: "view"
39607
+ },
39490
39608
  "sceneMonitor.captureReference": {
39491
39609
  capName: "scene-monitor",
39492
39610
  capScope: "device",
@@ -42479,6 +42597,11 @@ Object.freeze({
42479
42597
  form: "single",
42480
42598
  optional: true
42481
42599
  }],
42600
+ "recordingSignal.getStatus": [{
42601
+ name: "deviceId",
42602
+ form: "single",
42603
+ optional: false
42604
+ }],
42482
42605
  "sceneMonitor.captureReference": [{
42483
42606
  name: "deviceId",
42484
42607
  form: "single",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-reolink",
3
- "version": "1.2.94",
3
+ "version": "1.2.96",
4
4
  "description": "Reolink camera device provider addon for CamStack — native Baichuan protocol",
5
5
  "keywords": [
6
6
  "camstack",