@camstack/addon-provider-velux 0.2.50 → 0.2.52

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
@@ -15875,6 +15875,8 @@ var NcSystemEventKindSchema = _enum([
15875
15875
  "device-offline",
15876
15876
  "device-disabled",
15877
15877
  "device-enabled",
15878
+ "device-battery-low",
15879
+ "device-battery-normal",
15878
15880
  "stream-online",
15879
15881
  "stream-offline",
15880
15882
  "node-online",
@@ -19189,6 +19191,34 @@ var KeyEventsForDeviceSchema = object({
19189
19191
  deviceId: number(),
19190
19192
  events: array(KeyEventSchema).readonly()
19191
19193
  });
19194
+ /** One non-empty bucket of the timeline histogram. */
19195
+ var EventDensityBucketSchema = object({
19196
+ bucketStart: number(),
19197
+ motion: number().int(),
19198
+ object: number().int(),
19199
+ audio: number().int()
19200
+ });
19201
+ /**
19202
+ * One camera's row in a `getEventDensityBatch` answer.
19203
+ *
19204
+ * TWO facts, and the timeline draws them differently:
19205
+ *
19206
+ * - `read: 'read'` — the histogram for this camera. `buckets: []` is a real
19207
+ * claim: read, and nothing happened in the window.
19208
+ * - `read: 'unreadable'` — nobody could answer for this camera. `buckets` is
19209
+ * empty and that emptiness means NOTHING; the timeline must render unknown,
19210
+ * not quiet.
19211
+ *
19212
+ * Fanned out per camera the difference was free — one query rejected while the
19213
+ * others resolved — and collapsing to a batch is the exact moment it is lost
19214
+ * silently. Every requested id gets a row: a caller that asked for twelve and
19215
+ * got eleven cannot tell which one is missing, or that any is.
19216
+ */
19217
+ var EventDensityForDeviceSchema = object({
19218
+ deviceId: number(),
19219
+ read: _enum(["read", "unreadable"]),
19220
+ buckets: array(EventDensityBucketSchema).readonly()
19221
+ });
19192
19222
  object({
19193
19223
  trackId: string(),
19194
19224
  className: string(),
@@ -19499,12 +19529,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19499
19529
  since: number(),
19500
19530
  until: number(),
19501
19531
  bucketMs: number().int().positive()
19502
- }), array(object({
19503
- bucketStart: number(),
19504
- motion: number().int(),
19505
- object: number().int(),
19506
- audio: number().int()
19507
- })).readonly()), method(object({
19532
+ }), array(EventDensityBucketSchema).readonly()), method(object({
19533
+ deviceIds: array(number()).min(1).max(200),
19534
+ since: number(),
19535
+ until: number(),
19536
+ bucketMs: number().int().positive()
19537
+ }), array(EventDensityForDeviceSchema).readonly()), method(object({
19508
19538
  deviceId: number(),
19509
19539
  cutoffMs: number()
19510
19540
  }), object({
@@ -28529,6 +28559,39 @@ var RecordingDaysSchema = object({
28529
28559
  /** Local-midnight epochs (UTC ms) of days that have ≥1 recorded segment. */
28530
28560
  days: array(number())
28531
28561
  });
28562
+ /**
28563
+ * One camera's row in a `getAvailabilityBatch` answer.
28564
+ *
28565
+ * `ranges` is EXACTLY what `getAvailability` returns for that camera — the
28566
+ * batch collapses the transport, not the work — plus the one thing the singular
28567
+ * method never had to say:
28568
+ *
28569
+ * - `read: 'read'` — answered. `ranges: []` means "read, and this camera has
28570
+ * no footage in the window", which is a real claim.
28571
+ * - `read: 'unreadable'` — the recorder could not answer for this camera (its
28572
+ * calendar rung threw, its location is unmounted). `ranges` is empty and
28573
+ * that emptiness means NOTHING.
28574
+ *
28575
+ * A timeline that renders the second as the first tells an operator there is no
28576
+ * footage when the truth is that nobody looked.
28577
+ */
28578
+ var RecordingAvailabilityForDeviceSchema = object({
28579
+ deviceId: number(),
28580
+ read: _enum(["read", "unreadable"]),
28581
+ ranges: array(RecordingRangeSchema).readonly()
28582
+ });
28583
+ /**
28584
+ * One camera's row in a `getDaysWithRecordingsBatch` answer. Same rule as
28585
+ * {@link RecordingAvailabilityForDeviceSchema}: `days: []` on a `'read'` row is
28586
+ * "no footage in this month", `read: 'unreadable'` is "nobody could look", and
28587
+ * the date-picker's day dots must not spell them the same.
28588
+ */
28589
+ var RecordingDaysForDeviceSchema = object({
28590
+ deviceId: number(),
28591
+ read: _enum(["read", "unreadable"]),
28592
+ /** Local-midnight epochs (UTC ms) of days that have ≥1 recorded segment. */
28593
+ days: array(number()).readonly()
28594
+ });
28532
28595
  var RecordingManifestSchema = object({
28533
28596
  deviceId: number(),
28534
28597
  /** Local filesystem path to the master playlist; null when no recording exists for the requested range. */
@@ -28763,6 +28826,13 @@ method(object({
28763
28826
  }), RecordingAvailabilitySchema, {
28764
28827
  kind: "query",
28765
28828
  auth: "protected"
28829
+ }), method(object({
28830
+ deviceIds: array(number()).min(1).max(200),
28831
+ fromMs: number(),
28832
+ toMs: number()
28833
+ }), array(RecordingAvailabilityForDeviceSchema).readonly(), {
28834
+ kind: "query",
28835
+ auth: "protected"
28766
28836
  }), method(object({
28767
28837
  deviceId: number(),
28768
28838
  fromMs: number(),
@@ -28771,6 +28841,14 @@ method(object({
28771
28841
  }), RecordingDaysSchema, {
28772
28842
  kind: "query",
28773
28843
  auth: "protected"
28844
+ }), method(object({
28845
+ deviceIds: array(number()).min(1).max(200),
28846
+ fromMs: number(),
28847
+ toMs: number(),
28848
+ tzOffsetMinutes: number()
28849
+ }), array(RecordingDaysForDeviceSchema).readonly(), {
28850
+ kind: "query",
28851
+ auth: "protected"
28774
28852
  }), method(object({
28775
28853
  deviceId: number(),
28776
28854
  fromMs: number(),
@@ -35667,6 +35745,12 @@ Object.freeze({
35667
35745
  addonId: null,
35668
35746
  access: "view"
35669
35747
  },
35748
+ "pipelineAnalytics.getEventDensityBatch": {
35749
+ capName: "pipeline-analytics",
35750
+ capScope: "device",
35751
+ addonId: null,
35752
+ access: "view"
35753
+ },
35670
35754
  "pipelineAnalytics.getEventMedia": {
35671
35755
  capName: "pipeline-analytics",
35672
35756
  capScope: "device",
@@ -36789,12 +36873,24 @@ Object.freeze({
36789
36873
  addonId: null,
36790
36874
  access: "view"
36791
36875
  },
36876
+ "recording.getAvailabilityBatch": {
36877
+ capName: "recording",
36878
+ capScope: "system",
36879
+ addonId: null,
36880
+ access: "view"
36881
+ },
36792
36882
  "recording.getDaysWithRecordings": {
36793
36883
  capName: "recording",
36794
36884
  capScope: "system",
36795
36885
  addonId: null,
36796
36886
  access: "view"
36797
36887
  },
36888
+ "recording.getDaysWithRecordingsBatch": {
36889
+ capName: "recording",
36890
+ capScope: "system",
36891
+ addonId: null,
36892
+ access: "view"
36893
+ },
36798
36894
  "recording.getDeviceConfig": {
36799
36895
  capName: "recording",
36800
36896
  capScope: "system",
@@ -39399,6 +39495,11 @@ Object.freeze({
39399
39495
  form: "single",
39400
39496
  optional: false
39401
39497
  }],
39498
+ "pipelineAnalytics.getEventDensityBatch": [{
39499
+ name: "deviceIds",
39500
+ form: "array",
39501
+ optional: false
39502
+ }],
39402
39503
  "pipelineAnalytics.getEventMedia": [{
39403
39504
  name: "deviceId",
39404
39505
  form: "single",
@@ -39814,11 +39915,21 @@ Object.freeze({
39814
39915
  form: "single",
39815
39916
  optional: false
39816
39917
  }],
39918
+ "recording.getAvailabilityBatch": [{
39919
+ name: "deviceIds",
39920
+ form: "array",
39921
+ optional: false
39922
+ }],
39817
39923
  "recording.getDaysWithRecordings": [{
39818
39924
  name: "deviceId",
39819
39925
  form: "single",
39820
39926
  optional: false
39821
39927
  }],
39928
+ "recording.getDaysWithRecordingsBatch": [{
39929
+ name: "deviceIds",
39930
+ form: "array",
39931
+ optional: false
39932
+ }],
39822
39933
  "recording.getDeviceConfig": [{
39823
39934
  name: "deviceId",
39824
39935
  form: "single",
package/dist/addon.mjs CHANGED
@@ -15874,6 +15874,8 @@ var NcSystemEventKindSchema = _enum([
15874
15874
  "device-offline",
15875
15875
  "device-disabled",
15876
15876
  "device-enabled",
15877
+ "device-battery-low",
15878
+ "device-battery-normal",
15877
15879
  "stream-online",
15878
15880
  "stream-offline",
15879
15881
  "node-online",
@@ -19188,6 +19190,34 @@ var KeyEventsForDeviceSchema = object({
19188
19190
  deviceId: number(),
19189
19191
  events: array(KeyEventSchema).readonly()
19190
19192
  });
19193
+ /** One non-empty bucket of the timeline histogram. */
19194
+ var EventDensityBucketSchema = object({
19195
+ bucketStart: number(),
19196
+ motion: number().int(),
19197
+ object: number().int(),
19198
+ audio: number().int()
19199
+ });
19200
+ /**
19201
+ * One camera's row in a `getEventDensityBatch` answer.
19202
+ *
19203
+ * TWO facts, and the timeline draws them differently:
19204
+ *
19205
+ * - `read: 'read'` — the histogram for this camera. `buckets: []` is a real
19206
+ * claim: read, and nothing happened in the window.
19207
+ * - `read: 'unreadable'` — nobody could answer for this camera. `buckets` is
19208
+ * empty and that emptiness means NOTHING; the timeline must render unknown,
19209
+ * not quiet.
19210
+ *
19211
+ * Fanned out per camera the difference was free — one query rejected while the
19212
+ * others resolved — and collapsing to a batch is the exact moment it is lost
19213
+ * silently. Every requested id gets a row: a caller that asked for twelve and
19214
+ * got eleven cannot tell which one is missing, or that any is.
19215
+ */
19216
+ var EventDensityForDeviceSchema = object({
19217
+ deviceId: number(),
19218
+ read: _enum(["read", "unreadable"]),
19219
+ buckets: array(EventDensityBucketSchema).readonly()
19220
+ });
19191
19221
  object({
19192
19222
  trackId: string(),
19193
19223
  className: string(),
@@ -19498,12 +19528,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19498
19528
  since: number(),
19499
19529
  until: number(),
19500
19530
  bucketMs: number().int().positive()
19501
- }), array(object({
19502
- bucketStart: number(),
19503
- motion: number().int(),
19504
- object: number().int(),
19505
- audio: number().int()
19506
- })).readonly()), method(object({
19531
+ }), array(EventDensityBucketSchema).readonly()), method(object({
19532
+ deviceIds: array(number()).min(1).max(200),
19533
+ since: number(),
19534
+ until: number(),
19535
+ bucketMs: number().int().positive()
19536
+ }), array(EventDensityForDeviceSchema).readonly()), method(object({
19507
19537
  deviceId: number(),
19508
19538
  cutoffMs: number()
19509
19539
  }), object({
@@ -28528,6 +28558,39 @@ var RecordingDaysSchema = object({
28528
28558
  /** Local-midnight epochs (UTC ms) of days that have ≥1 recorded segment. */
28529
28559
  days: array(number())
28530
28560
  });
28561
+ /**
28562
+ * One camera's row in a `getAvailabilityBatch` answer.
28563
+ *
28564
+ * `ranges` is EXACTLY what `getAvailability` returns for that camera — the
28565
+ * batch collapses the transport, not the work — plus the one thing the singular
28566
+ * method never had to say:
28567
+ *
28568
+ * - `read: 'read'` — answered. `ranges: []` means "read, and this camera has
28569
+ * no footage in the window", which is a real claim.
28570
+ * - `read: 'unreadable'` — the recorder could not answer for this camera (its
28571
+ * calendar rung threw, its location is unmounted). `ranges` is empty and
28572
+ * that emptiness means NOTHING.
28573
+ *
28574
+ * A timeline that renders the second as the first tells an operator there is no
28575
+ * footage when the truth is that nobody looked.
28576
+ */
28577
+ var RecordingAvailabilityForDeviceSchema = object({
28578
+ deviceId: number(),
28579
+ read: _enum(["read", "unreadable"]),
28580
+ ranges: array(RecordingRangeSchema).readonly()
28581
+ });
28582
+ /**
28583
+ * One camera's row in a `getDaysWithRecordingsBatch` answer. Same rule as
28584
+ * {@link RecordingAvailabilityForDeviceSchema}: `days: []` on a `'read'` row is
28585
+ * "no footage in this month", `read: 'unreadable'` is "nobody could look", and
28586
+ * the date-picker's day dots must not spell them the same.
28587
+ */
28588
+ var RecordingDaysForDeviceSchema = object({
28589
+ deviceId: number(),
28590
+ read: _enum(["read", "unreadable"]),
28591
+ /** Local-midnight epochs (UTC ms) of days that have ≥1 recorded segment. */
28592
+ days: array(number()).readonly()
28593
+ });
28531
28594
  var RecordingManifestSchema = object({
28532
28595
  deviceId: number(),
28533
28596
  /** Local filesystem path to the master playlist; null when no recording exists for the requested range. */
@@ -28762,6 +28825,13 @@ method(object({
28762
28825
  }), RecordingAvailabilitySchema, {
28763
28826
  kind: "query",
28764
28827
  auth: "protected"
28828
+ }), method(object({
28829
+ deviceIds: array(number()).min(1).max(200),
28830
+ fromMs: number(),
28831
+ toMs: number()
28832
+ }), array(RecordingAvailabilityForDeviceSchema).readonly(), {
28833
+ kind: "query",
28834
+ auth: "protected"
28765
28835
  }), method(object({
28766
28836
  deviceId: number(),
28767
28837
  fromMs: number(),
@@ -28770,6 +28840,14 @@ method(object({
28770
28840
  }), RecordingDaysSchema, {
28771
28841
  kind: "query",
28772
28842
  auth: "protected"
28843
+ }), method(object({
28844
+ deviceIds: array(number()).min(1).max(200),
28845
+ fromMs: number(),
28846
+ toMs: number(),
28847
+ tzOffsetMinutes: number()
28848
+ }), array(RecordingDaysForDeviceSchema).readonly(), {
28849
+ kind: "query",
28850
+ auth: "protected"
28773
28851
  }), method(object({
28774
28852
  deviceId: number(),
28775
28853
  fromMs: number(),
@@ -35666,6 +35744,12 @@ Object.freeze({
35666
35744
  addonId: null,
35667
35745
  access: "view"
35668
35746
  },
35747
+ "pipelineAnalytics.getEventDensityBatch": {
35748
+ capName: "pipeline-analytics",
35749
+ capScope: "device",
35750
+ addonId: null,
35751
+ access: "view"
35752
+ },
35669
35753
  "pipelineAnalytics.getEventMedia": {
35670
35754
  capName: "pipeline-analytics",
35671
35755
  capScope: "device",
@@ -36788,12 +36872,24 @@ Object.freeze({
36788
36872
  addonId: null,
36789
36873
  access: "view"
36790
36874
  },
36875
+ "recording.getAvailabilityBatch": {
36876
+ capName: "recording",
36877
+ capScope: "system",
36878
+ addonId: null,
36879
+ access: "view"
36880
+ },
36791
36881
  "recording.getDaysWithRecordings": {
36792
36882
  capName: "recording",
36793
36883
  capScope: "system",
36794
36884
  addonId: null,
36795
36885
  access: "view"
36796
36886
  },
36887
+ "recording.getDaysWithRecordingsBatch": {
36888
+ capName: "recording",
36889
+ capScope: "system",
36890
+ addonId: null,
36891
+ access: "view"
36892
+ },
36797
36893
  "recording.getDeviceConfig": {
36798
36894
  capName: "recording",
36799
36895
  capScope: "system",
@@ -39398,6 +39494,11 @@ Object.freeze({
39398
39494
  form: "single",
39399
39495
  optional: false
39400
39496
  }],
39497
+ "pipelineAnalytics.getEventDensityBatch": [{
39498
+ name: "deviceIds",
39499
+ form: "array",
39500
+ optional: false
39501
+ }],
39401
39502
  "pipelineAnalytics.getEventMedia": [{
39402
39503
  name: "deviceId",
39403
39504
  form: "single",
@@ -39813,11 +39914,21 @@ Object.freeze({
39813
39914
  form: "single",
39814
39915
  optional: false
39815
39916
  }],
39917
+ "recording.getAvailabilityBatch": [{
39918
+ name: "deviceIds",
39919
+ form: "array",
39920
+ optional: false
39921
+ }],
39816
39922
  "recording.getDaysWithRecordings": [{
39817
39923
  name: "deviceId",
39818
39924
  form: "single",
39819
39925
  optional: false
39820
39926
  }],
39927
+ "recording.getDaysWithRecordingsBatch": [{
39928
+ name: "deviceIds",
39929
+ form: "array",
39930
+ optional: false
39931
+ }],
39821
39932
  "recording.getDeviceConfig": [{
39822
39933
  name: "deviceId",
39823
39934
  form: "single",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-velux",
3
- "version": "0.2.50",
3
+ "version": "0.2.52",
4
4
  "description": "Velux KLF-200 device-provider addon for CamStack — local-gateway window + shutter covers (positional, no tilt)",
5
5
  "keywords": [
6
6
  "camstack",