@camstack/addon-provider-homematic 1.2.52 → 1.2.53

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
@@ -19266,6 +19266,34 @@ var KeyEventsForDeviceSchema = object({
19266
19266
  deviceId: number(),
19267
19267
  events: array(KeyEventSchema).readonly()
19268
19268
  });
19269
+ /** One non-empty bucket of the timeline histogram. */
19270
+ var EventDensityBucketSchema = object({
19271
+ bucketStart: number(),
19272
+ motion: number().int(),
19273
+ object: number().int(),
19274
+ audio: number().int()
19275
+ });
19276
+ /**
19277
+ * One camera's row in a `getEventDensityBatch` answer.
19278
+ *
19279
+ * TWO facts, and the timeline draws them differently:
19280
+ *
19281
+ * - `read: 'read'` — the histogram for this camera. `buckets: []` is a real
19282
+ * claim: read, and nothing happened in the window.
19283
+ * - `read: 'unreadable'` — nobody could answer for this camera. `buckets` is
19284
+ * empty and that emptiness means NOTHING; the timeline must render unknown,
19285
+ * not quiet.
19286
+ *
19287
+ * Fanned out per camera the difference was free — one query rejected while the
19288
+ * others resolved — and collapsing to a batch is the exact moment it is lost
19289
+ * silently. Every requested id gets a row: a caller that asked for twelve and
19290
+ * got eleven cannot tell which one is missing, or that any is.
19291
+ */
19292
+ var EventDensityForDeviceSchema = object({
19293
+ deviceId: number(),
19294
+ read: _enum(["read", "unreadable"]),
19295
+ buckets: array(EventDensityBucketSchema).readonly()
19296
+ });
19269
19297
  object({
19270
19298
  trackId: string(),
19271
19299
  className: string(),
@@ -19576,12 +19604,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19576
19604
  since: number(),
19577
19605
  until: number(),
19578
19606
  bucketMs: number().int().positive()
19579
- }), array(object({
19580
- bucketStart: number(),
19581
- motion: number().int(),
19582
- object: number().int(),
19583
- audio: number().int()
19584
- })).readonly()), method(object({
19607
+ }), array(EventDensityBucketSchema).readonly()), method(object({
19608
+ deviceIds: array(number()).min(1).max(200),
19609
+ since: number(),
19610
+ until: number(),
19611
+ bucketMs: number().int().positive()
19612
+ }), array(EventDensityForDeviceSchema).readonly()), method(object({
19585
19613
  deviceId: number(),
19586
19614
  cutoffMs: number()
19587
19615
  }), object({
@@ -28606,6 +28634,39 @@ var RecordingDaysSchema = object({
28606
28634
  /** Local-midnight epochs (UTC ms) of days that have ≥1 recorded segment. */
28607
28635
  days: array(number())
28608
28636
  });
28637
+ /**
28638
+ * One camera's row in a `getAvailabilityBatch` answer.
28639
+ *
28640
+ * `ranges` is EXACTLY what `getAvailability` returns for that camera — the
28641
+ * batch collapses the transport, not the work — plus the one thing the singular
28642
+ * method never had to say:
28643
+ *
28644
+ * - `read: 'read'` — answered. `ranges: []` means "read, and this camera has
28645
+ * no footage in the window", which is a real claim.
28646
+ * - `read: 'unreadable'` — the recorder could not answer for this camera (its
28647
+ * calendar rung threw, its location is unmounted). `ranges` is empty and
28648
+ * that emptiness means NOTHING.
28649
+ *
28650
+ * A timeline that renders the second as the first tells an operator there is no
28651
+ * footage when the truth is that nobody looked.
28652
+ */
28653
+ var RecordingAvailabilityForDeviceSchema = object({
28654
+ deviceId: number(),
28655
+ read: _enum(["read", "unreadable"]),
28656
+ ranges: array(RecordingRangeSchema).readonly()
28657
+ });
28658
+ /**
28659
+ * One camera's row in a `getDaysWithRecordingsBatch` answer. Same rule as
28660
+ * {@link RecordingAvailabilityForDeviceSchema}: `days: []` on a `'read'` row is
28661
+ * "no footage in this month", `read: 'unreadable'` is "nobody could look", and
28662
+ * the date-picker's day dots must not spell them the same.
28663
+ */
28664
+ var RecordingDaysForDeviceSchema = object({
28665
+ deviceId: number(),
28666
+ read: _enum(["read", "unreadable"]),
28667
+ /** Local-midnight epochs (UTC ms) of days that have ≥1 recorded segment. */
28668
+ days: array(number()).readonly()
28669
+ });
28609
28670
  var RecordingManifestSchema = object({
28610
28671
  deviceId: number(),
28611
28672
  /** Local filesystem path to the master playlist; null when no recording exists for the requested range. */
@@ -28840,6 +28901,13 @@ method(object({
28840
28901
  }), RecordingAvailabilitySchema, {
28841
28902
  kind: "query",
28842
28903
  auth: "protected"
28904
+ }), method(object({
28905
+ deviceIds: array(number()).min(1).max(200),
28906
+ fromMs: number(),
28907
+ toMs: number()
28908
+ }), array(RecordingAvailabilityForDeviceSchema).readonly(), {
28909
+ kind: "query",
28910
+ auth: "protected"
28843
28911
  }), method(object({
28844
28912
  deviceId: number(),
28845
28913
  fromMs: number(),
@@ -28848,6 +28916,14 @@ method(object({
28848
28916
  }), RecordingDaysSchema, {
28849
28917
  kind: "query",
28850
28918
  auth: "protected"
28919
+ }), method(object({
28920
+ deviceIds: array(number()).min(1).max(200),
28921
+ fromMs: number(),
28922
+ toMs: number(),
28923
+ tzOffsetMinutes: number()
28924
+ }), array(RecordingDaysForDeviceSchema).readonly(), {
28925
+ kind: "query",
28926
+ auth: "protected"
28851
28927
  }), method(object({
28852
28928
  deviceId: number(),
28853
28929
  fromMs: number(),
@@ -35744,6 +35820,12 @@ Object.freeze({
35744
35820
  addonId: null,
35745
35821
  access: "view"
35746
35822
  },
35823
+ "pipelineAnalytics.getEventDensityBatch": {
35824
+ capName: "pipeline-analytics",
35825
+ capScope: "device",
35826
+ addonId: null,
35827
+ access: "view"
35828
+ },
35747
35829
  "pipelineAnalytics.getEventMedia": {
35748
35830
  capName: "pipeline-analytics",
35749
35831
  capScope: "device",
@@ -36866,12 +36948,24 @@ Object.freeze({
36866
36948
  addonId: null,
36867
36949
  access: "view"
36868
36950
  },
36951
+ "recording.getAvailabilityBatch": {
36952
+ capName: "recording",
36953
+ capScope: "system",
36954
+ addonId: null,
36955
+ access: "view"
36956
+ },
36869
36957
  "recording.getDaysWithRecordings": {
36870
36958
  capName: "recording",
36871
36959
  capScope: "system",
36872
36960
  addonId: null,
36873
36961
  access: "view"
36874
36962
  },
36963
+ "recording.getDaysWithRecordingsBatch": {
36964
+ capName: "recording",
36965
+ capScope: "system",
36966
+ addonId: null,
36967
+ access: "view"
36968
+ },
36875
36969
  "recording.getDeviceConfig": {
36876
36970
  capName: "recording",
36877
36971
  capScope: "system",
@@ -39476,6 +39570,11 @@ Object.freeze({
39476
39570
  form: "single",
39477
39571
  optional: false
39478
39572
  }],
39573
+ "pipelineAnalytics.getEventDensityBatch": [{
39574
+ name: "deviceIds",
39575
+ form: "array",
39576
+ optional: false
39577
+ }],
39479
39578
  "pipelineAnalytics.getEventMedia": [{
39480
39579
  name: "deviceId",
39481
39580
  form: "single",
@@ -39891,11 +39990,21 @@ Object.freeze({
39891
39990
  form: "single",
39892
39991
  optional: false
39893
39992
  }],
39993
+ "recording.getAvailabilityBatch": [{
39994
+ name: "deviceIds",
39995
+ form: "array",
39996
+ optional: false
39997
+ }],
39894
39998
  "recording.getDaysWithRecordings": [{
39895
39999
  name: "deviceId",
39896
40000
  form: "single",
39897
40001
  optional: false
39898
40002
  }],
40003
+ "recording.getDaysWithRecordingsBatch": [{
40004
+ name: "deviceIds",
40005
+ form: "array",
40006
+ optional: false
40007
+ }],
39899
40008
  "recording.getDeviceConfig": [{
39900
40009
  name: "deviceId",
39901
40010
  form: "single",
package/dist/addon.mjs CHANGED
@@ -19267,6 +19267,34 @@ var KeyEventsForDeviceSchema = object({
19267
19267
  deviceId: number(),
19268
19268
  events: array(KeyEventSchema).readonly()
19269
19269
  });
19270
+ /** One non-empty bucket of the timeline histogram. */
19271
+ var EventDensityBucketSchema = object({
19272
+ bucketStart: number(),
19273
+ motion: number().int(),
19274
+ object: number().int(),
19275
+ audio: number().int()
19276
+ });
19277
+ /**
19278
+ * One camera's row in a `getEventDensityBatch` answer.
19279
+ *
19280
+ * TWO facts, and the timeline draws them differently:
19281
+ *
19282
+ * - `read: 'read'` — the histogram for this camera. `buckets: []` is a real
19283
+ * claim: read, and nothing happened in the window.
19284
+ * - `read: 'unreadable'` — nobody could answer for this camera. `buckets` is
19285
+ * empty and that emptiness means NOTHING; the timeline must render unknown,
19286
+ * not quiet.
19287
+ *
19288
+ * Fanned out per camera the difference was free — one query rejected while the
19289
+ * others resolved — and collapsing to a batch is the exact moment it is lost
19290
+ * silently. Every requested id gets a row: a caller that asked for twelve and
19291
+ * got eleven cannot tell which one is missing, or that any is.
19292
+ */
19293
+ var EventDensityForDeviceSchema = object({
19294
+ deviceId: number(),
19295
+ read: _enum(["read", "unreadable"]),
19296
+ buckets: array(EventDensityBucketSchema).readonly()
19297
+ });
19270
19298
  object({
19271
19299
  trackId: string(),
19272
19300
  className: string(),
@@ -19577,12 +19605,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19577
19605
  since: number(),
19578
19606
  until: number(),
19579
19607
  bucketMs: number().int().positive()
19580
- }), array(object({
19581
- bucketStart: number(),
19582
- motion: number().int(),
19583
- object: number().int(),
19584
- audio: number().int()
19585
- })).readonly()), method(object({
19608
+ }), array(EventDensityBucketSchema).readonly()), method(object({
19609
+ deviceIds: array(number()).min(1).max(200),
19610
+ since: number(),
19611
+ until: number(),
19612
+ bucketMs: number().int().positive()
19613
+ }), array(EventDensityForDeviceSchema).readonly()), method(object({
19586
19614
  deviceId: number(),
19587
19615
  cutoffMs: number()
19588
19616
  }), object({
@@ -28607,6 +28635,39 @@ var RecordingDaysSchema = object({
28607
28635
  /** Local-midnight epochs (UTC ms) of days that have ≥1 recorded segment. */
28608
28636
  days: array(number())
28609
28637
  });
28638
+ /**
28639
+ * One camera's row in a `getAvailabilityBatch` answer.
28640
+ *
28641
+ * `ranges` is EXACTLY what `getAvailability` returns for that camera — the
28642
+ * batch collapses the transport, not the work — plus the one thing the singular
28643
+ * method never had to say:
28644
+ *
28645
+ * - `read: 'read'` — answered. `ranges: []` means "read, and this camera has
28646
+ * no footage in the window", which is a real claim.
28647
+ * - `read: 'unreadable'` — the recorder could not answer for this camera (its
28648
+ * calendar rung threw, its location is unmounted). `ranges` is empty and
28649
+ * that emptiness means NOTHING.
28650
+ *
28651
+ * A timeline that renders the second as the first tells an operator there is no
28652
+ * footage when the truth is that nobody looked.
28653
+ */
28654
+ var RecordingAvailabilityForDeviceSchema = object({
28655
+ deviceId: number(),
28656
+ read: _enum(["read", "unreadable"]),
28657
+ ranges: array(RecordingRangeSchema).readonly()
28658
+ });
28659
+ /**
28660
+ * One camera's row in a `getDaysWithRecordingsBatch` answer. Same rule as
28661
+ * {@link RecordingAvailabilityForDeviceSchema}: `days: []` on a `'read'` row is
28662
+ * "no footage in this month", `read: 'unreadable'` is "nobody could look", and
28663
+ * the date-picker's day dots must not spell them the same.
28664
+ */
28665
+ var RecordingDaysForDeviceSchema = object({
28666
+ deviceId: number(),
28667
+ read: _enum(["read", "unreadable"]),
28668
+ /** Local-midnight epochs (UTC ms) of days that have ≥1 recorded segment. */
28669
+ days: array(number()).readonly()
28670
+ });
28610
28671
  var RecordingManifestSchema = object({
28611
28672
  deviceId: number(),
28612
28673
  /** Local filesystem path to the master playlist; null when no recording exists for the requested range. */
@@ -28841,6 +28902,13 @@ method(object({
28841
28902
  }), RecordingAvailabilitySchema, {
28842
28903
  kind: "query",
28843
28904
  auth: "protected"
28905
+ }), method(object({
28906
+ deviceIds: array(number()).min(1).max(200),
28907
+ fromMs: number(),
28908
+ toMs: number()
28909
+ }), array(RecordingAvailabilityForDeviceSchema).readonly(), {
28910
+ kind: "query",
28911
+ auth: "protected"
28844
28912
  }), method(object({
28845
28913
  deviceId: number(),
28846
28914
  fromMs: number(),
@@ -28849,6 +28917,14 @@ method(object({
28849
28917
  }), RecordingDaysSchema, {
28850
28918
  kind: "query",
28851
28919
  auth: "protected"
28920
+ }), method(object({
28921
+ deviceIds: array(number()).min(1).max(200),
28922
+ fromMs: number(),
28923
+ toMs: number(),
28924
+ tzOffsetMinutes: number()
28925
+ }), array(RecordingDaysForDeviceSchema).readonly(), {
28926
+ kind: "query",
28927
+ auth: "protected"
28852
28928
  }), method(object({
28853
28929
  deviceId: number(),
28854
28930
  fromMs: number(),
@@ -35745,6 +35821,12 @@ Object.freeze({
35745
35821
  addonId: null,
35746
35822
  access: "view"
35747
35823
  },
35824
+ "pipelineAnalytics.getEventDensityBatch": {
35825
+ capName: "pipeline-analytics",
35826
+ capScope: "device",
35827
+ addonId: null,
35828
+ access: "view"
35829
+ },
35748
35830
  "pipelineAnalytics.getEventMedia": {
35749
35831
  capName: "pipeline-analytics",
35750
35832
  capScope: "device",
@@ -36867,12 +36949,24 @@ Object.freeze({
36867
36949
  addonId: null,
36868
36950
  access: "view"
36869
36951
  },
36952
+ "recording.getAvailabilityBatch": {
36953
+ capName: "recording",
36954
+ capScope: "system",
36955
+ addonId: null,
36956
+ access: "view"
36957
+ },
36870
36958
  "recording.getDaysWithRecordings": {
36871
36959
  capName: "recording",
36872
36960
  capScope: "system",
36873
36961
  addonId: null,
36874
36962
  access: "view"
36875
36963
  },
36964
+ "recording.getDaysWithRecordingsBatch": {
36965
+ capName: "recording",
36966
+ capScope: "system",
36967
+ addonId: null,
36968
+ access: "view"
36969
+ },
36876
36970
  "recording.getDeviceConfig": {
36877
36971
  capName: "recording",
36878
36972
  capScope: "system",
@@ -39477,6 +39571,11 @@ Object.freeze({
39477
39571
  form: "single",
39478
39572
  optional: false
39479
39573
  }],
39574
+ "pipelineAnalytics.getEventDensityBatch": [{
39575
+ name: "deviceIds",
39576
+ form: "array",
39577
+ optional: false
39578
+ }],
39480
39579
  "pipelineAnalytics.getEventMedia": [{
39481
39580
  name: "deviceId",
39482
39581
  form: "single",
@@ -39892,11 +39991,21 @@ Object.freeze({
39892
39991
  form: "single",
39893
39992
  optional: false
39894
39993
  }],
39994
+ "recording.getAvailabilityBatch": [{
39995
+ name: "deviceIds",
39996
+ form: "array",
39997
+ optional: false
39998
+ }],
39895
39999
  "recording.getDaysWithRecordings": [{
39896
40000
  name: "deviceId",
39897
40001
  form: "single",
39898
40002
  optional: false
39899
40003
  }],
40004
+ "recording.getDaysWithRecordingsBatch": [{
40005
+ name: "deviceIds",
40006
+ form: "array",
40007
+ optional: false
40008
+ }],
39900
40009
  "recording.getDeviceConfig": [{
39901
40010
  name: "deviceId",
39902
40011
  form: "single",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-homematic",
3
- "version": "1.2.52",
3
+ "version": "1.2.53",
4
4
  "description": "Homematic / HomematicIP (CCU3 / RaspberryMatic) device-provider addon for CamStack — wraps the nodehomematic library",
5
5
  "keywords": [
6
6
  "camstack",