@camstack/addon-provider-homematic 1.2.51 → 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
@@ -15950,6 +15950,8 @@ var NcSystemEventKindSchema = _enum([
15950
15950
  "device-offline",
15951
15951
  "device-disabled",
15952
15952
  "device-enabled",
15953
+ "device-battery-low",
15954
+ "device-battery-normal",
15953
15955
  "stream-online",
15954
15956
  "stream-offline",
15955
15957
  "node-online",
@@ -19264,6 +19266,34 @@ var KeyEventsForDeviceSchema = object({
19264
19266
  deviceId: number(),
19265
19267
  events: array(KeyEventSchema).readonly()
19266
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
+ });
19267
19297
  object({
19268
19298
  trackId: string(),
19269
19299
  className: string(),
@@ -19574,12 +19604,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19574
19604
  since: number(),
19575
19605
  until: number(),
19576
19606
  bucketMs: number().int().positive()
19577
- }), array(object({
19578
- bucketStart: number(),
19579
- motion: number().int(),
19580
- object: number().int(),
19581
- audio: number().int()
19582
- })).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({
19583
19613
  deviceId: number(),
19584
19614
  cutoffMs: number()
19585
19615
  }), object({
@@ -28604,6 +28634,39 @@ var RecordingDaysSchema = object({
28604
28634
  /** Local-midnight epochs (UTC ms) of days that have ≥1 recorded segment. */
28605
28635
  days: array(number())
28606
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
+ });
28607
28670
  var RecordingManifestSchema = object({
28608
28671
  deviceId: number(),
28609
28672
  /** Local filesystem path to the master playlist; null when no recording exists for the requested range. */
@@ -28838,6 +28901,13 @@ method(object({
28838
28901
  }), RecordingAvailabilitySchema, {
28839
28902
  kind: "query",
28840
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"
28841
28911
  }), method(object({
28842
28912
  deviceId: number(),
28843
28913
  fromMs: number(),
@@ -28846,6 +28916,14 @@ method(object({
28846
28916
  }), RecordingDaysSchema, {
28847
28917
  kind: "query",
28848
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"
28849
28927
  }), method(object({
28850
28928
  deviceId: number(),
28851
28929
  fromMs: number(),
@@ -35742,6 +35820,12 @@ Object.freeze({
35742
35820
  addonId: null,
35743
35821
  access: "view"
35744
35822
  },
35823
+ "pipelineAnalytics.getEventDensityBatch": {
35824
+ capName: "pipeline-analytics",
35825
+ capScope: "device",
35826
+ addonId: null,
35827
+ access: "view"
35828
+ },
35745
35829
  "pipelineAnalytics.getEventMedia": {
35746
35830
  capName: "pipeline-analytics",
35747
35831
  capScope: "device",
@@ -36864,12 +36948,24 @@ Object.freeze({
36864
36948
  addonId: null,
36865
36949
  access: "view"
36866
36950
  },
36951
+ "recording.getAvailabilityBatch": {
36952
+ capName: "recording",
36953
+ capScope: "system",
36954
+ addonId: null,
36955
+ access: "view"
36956
+ },
36867
36957
  "recording.getDaysWithRecordings": {
36868
36958
  capName: "recording",
36869
36959
  capScope: "system",
36870
36960
  addonId: null,
36871
36961
  access: "view"
36872
36962
  },
36963
+ "recording.getDaysWithRecordingsBatch": {
36964
+ capName: "recording",
36965
+ capScope: "system",
36966
+ addonId: null,
36967
+ access: "view"
36968
+ },
36873
36969
  "recording.getDeviceConfig": {
36874
36970
  capName: "recording",
36875
36971
  capScope: "system",
@@ -39474,6 +39570,11 @@ Object.freeze({
39474
39570
  form: "single",
39475
39571
  optional: false
39476
39572
  }],
39573
+ "pipelineAnalytics.getEventDensityBatch": [{
39574
+ name: "deviceIds",
39575
+ form: "array",
39576
+ optional: false
39577
+ }],
39477
39578
  "pipelineAnalytics.getEventMedia": [{
39478
39579
  name: "deviceId",
39479
39580
  form: "single",
@@ -39889,11 +39990,21 @@ Object.freeze({
39889
39990
  form: "single",
39890
39991
  optional: false
39891
39992
  }],
39993
+ "recording.getAvailabilityBatch": [{
39994
+ name: "deviceIds",
39995
+ form: "array",
39996
+ optional: false
39997
+ }],
39892
39998
  "recording.getDaysWithRecordings": [{
39893
39999
  name: "deviceId",
39894
40000
  form: "single",
39895
40001
  optional: false
39896
40002
  }],
40003
+ "recording.getDaysWithRecordingsBatch": [{
40004
+ name: "deviceIds",
40005
+ form: "array",
40006
+ optional: false
40007
+ }],
39897
40008
  "recording.getDeviceConfig": [{
39898
40009
  name: "deviceId",
39899
40010
  form: "single",
package/dist/addon.mjs CHANGED
@@ -15951,6 +15951,8 @@ var NcSystemEventKindSchema = _enum([
15951
15951
  "device-offline",
15952
15952
  "device-disabled",
15953
15953
  "device-enabled",
15954
+ "device-battery-low",
15955
+ "device-battery-normal",
15954
15956
  "stream-online",
15955
15957
  "stream-offline",
15956
15958
  "node-online",
@@ -19265,6 +19267,34 @@ var KeyEventsForDeviceSchema = object({
19265
19267
  deviceId: number(),
19266
19268
  events: array(KeyEventSchema).readonly()
19267
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
+ });
19268
19298
  object({
19269
19299
  trackId: string(),
19270
19300
  className: string(),
@@ -19575,12 +19605,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19575
19605
  since: number(),
19576
19606
  until: number(),
19577
19607
  bucketMs: number().int().positive()
19578
- }), array(object({
19579
- bucketStart: number(),
19580
- motion: number().int(),
19581
- object: number().int(),
19582
- audio: number().int()
19583
- })).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({
19584
19614
  deviceId: number(),
19585
19615
  cutoffMs: number()
19586
19616
  }), object({
@@ -28605,6 +28635,39 @@ var RecordingDaysSchema = object({
28605
28635
  /** Local-midnight epochs (UTC ms) of days that have ≥1 recorded segment. */
28606
28636
  days: array(number())
28607
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
+ });
28608
28671
  var RecordingManifestSchema = object({
28609
28672
  deviceId: number(),
28610
28673
  /** Local filesystem path to the master playlist; null when no recording exists for the requested range. */
@@ -28839,6 +28902,13 @@ method(object({
28839
28902
  }), RecordingAvailabilitySchema, {
28840
28903
  kind: "query",
28841
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"
28842
28912
  }), method(object({
28843
28913
  deviceId: number(),
28844
28914
  fromMs: number(),
@@ -28847,6 +28917,14 @@ method(object({
28847
28917
  }), RecordingDaysSchema, {
28848
28918
  kind: "query",
28849
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"
28850
28928
  }), method(object({
28851
28929
  deviceId: number(),
28852
28930
  fromMs: number(),
@@ -35743,6 +35821,12 @@ Object.freeze({
35743
35821
  addonId: null,
35744
35822
  access: "view"
35745
35823
  },
35824
+ "pipelineAnalytics.getEventDensityBatch": {
35825
+ capName: "pipeline-analytics",
35826
+ capScope: "device",
35827
+ addonId: null,
35828
+ access: "view"
35829
+ },
35746
35830
  "pipelineAnalytics.getEventMedia": {
35747
35831
  capName: "pipeline-analytics",
35748
35832
  capScope: "device",
@@ -36865,12 +36949,24 @@ Object.freeze({
36865
36949
  addonId: null,
36866
36950
  access: "view"
36867
36951
  },
36952
+ "recording.getAvailabilityBatch": {
36953
+ capName: "recording",
36954
+ capScope: "system",
36955
+ addonId: null,
36956
+ access: "view"
36957
+ },
36868
36958
  "recording.getDaysWithRecordings": {
36869
36959
  capName: "recording",
36870
36960
  capScope: "system",
36871
36961
  addonId: null,
36872
36962
  access: "view"
36873
36963
  },
36964
+ "recording.getDaysWithRecordingsBatch": {
36965
+ capName: "recording",
36966
+ capScope: "system",
36967
+ addonId: null,
36968
+ access: "view"
36969
+ },
36874
36970
  "recording.getDeviceConfig": {
36875
36971
  capName: "recording",
36876
36972
  capScope: "system",
@@ -39475,6 +39571,11 @@ Object.freeze({
39475
39571
  form: "single",
39476
39572
  optional: false
39477
39573
  }],
39574
+ "pipelineAnalytics.getEventDensityBatch": [{
39575
+ name: "deviceIds",
39576
+ form: "array",
39577
+ optional: false
39578
+ }],
39478
39579
  "pipelineAnalytics.getEventMedia": [{
39479
39580
  name: "deviceId",
39480
39581
  form: "single",
@@ -39890,11 +39991,21 @@ Object.freeze({
39890
39991
  form: "single",
39891
39992
  optional: false
39892
39993
  }],
39994
+ "recording.getAvailabilityBatch": [{
39995
+ name: "deviceIds",
39996
+ form: "array",
39997
+ optional: false
39998
+ }],
39893
39999
  "recording.getDaysWithRecordings": [{
39894
40000
  name: "deviceId",
39895
40001
  form: "single",
39896
40002
  optional: false
39897
40003
  }],
40004
+ "recording.getDaysWithRecordingsBatch": [{
40005
+ name: "deviceIds",
40006
+ form: "array",
40007
+ optional: false
40008
+ }],
39898
40009
  "recording.getDeviceConfig": [{
39899
40010
  name: "deviceId",
39900
40011
  form: "single",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-homematic",
3
- "version": "1.2.51",
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",