@camstack/addon-export-hap 1.2.61 → 1.2.63

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.
@@ -16374,6 +16374,8 @@ var NcSystemEventKindSchema = _enum([
16374
16374
  "device-offline",
16375
16375
  "device-disabled",
16376
16376
  "device-enabled",
16377
+ "device-battery-low",
16378
+ "device-battery-normal",
16377
16379
  "stream-online",
16378
16380
  "stream-offline",
16379
16381
  "node-online",
@@ -19648,6 +19650,34 @@ var KeyEventsForDeviceSchema = object({
19648
19650
  deviceId: number(),
19649
19651
  events: array(KeyEventSchema).readonly()
19650
19652
  });
19653
+ /** One non-empty bucket of the timeline histogram. */
19654
+ var EventDensityBucketSchema = object({
19655
+ bucketStart: number(),
19656
+ motion: number().int(),
19657
+ object: number().int(),
19658
+ audio: number().int()
19659
+ });
19660
+ /**
19661
+ * One camera's row in a `getEventDensityBatch` answer.
19662
+ *
19663
+ * TWO facts, and the timeline draws them differently:
19664
+ *
19665
+ * - `read: 'read'` — the histogram for this camera. `buckets: []` is a real
19666
+ * claim: read, and nothing happened in the window.
19667
+ * - `read: 'unreadable'` — nobody could answer for this camera. `buckets` is
19668
+ * empty and that emptiness means NOTHING; the timeline must render unknown,
19669
+ * not quiet.
19670
+ *
19671
+ * Fanned out per camera the difference was free — one query rejected while the
19672
+ * others resolved — and collapsing to a batch is the exact moment it is lost
19673
+ * silently. Every requested id gets a row: a caller that asked for twelve and
19674
+ * got eleven cannot tell which one is missing, or that any is.
19675
+ */
19676
+ var EventDensityForDeviceSchema = object({
19677
+ deviceId: number(),
19678
+ read: _enum(["read", "unreadable"]),
19679
+ buckets: array(EventDensityBucketSchema).readonly()
19680
+ });
19651
19681
  object({
19652
19682
  trackId: string(),
19653
19683
  className: string(),
@@ -19958,12 +19988,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19958
19988
  since: number(),
19959
19989
  until: number(),
19960
19990
  bucketMs: number().int().positive()
19961
- }), array(object({
19962
- bucketStart: number(),
19963
- motion: number().int(),
19964
- object: number().int(),
19965
- audio: number().int()
19966
- })).readonly()), method(object({
19991
+ }), array(EventDensityBucketSchema).readonly()), method(object({
19992
+ deviceIds: array(number()).min(1).max(200),
19993
+ since: number(),
19994
+ until: number(),
19995
+ bucketMs: number().int().positive()
19996
+ }), array(EventDensityForDeviceSchema).readonly()), method(object({
19967
19997
  deviceId: number(),
19968
19998
  cutoffMs: number()
19969
19999
  }), object({
@@ -27321,6 +27351,39 @@ var RecordingDaysSchema = object({
27321
27351
  /** Local-midnight epochs (UTC ms) of days that have ≥1 recorded segment. */
27322
27352
  days: array(number())
27323
27353
  });
27354
+ /**
27355
+ * One camera's row in a `getAvailabilityBatch` answer.
27356
+ *
27357
+ * `ranges` is EXACTLY what `getAvailability` returns for that camera — the
27358
+ * batch collapses the transport, not the work — plus the one thing the singular
27359
+ * method never had to say:
27360
+ *
27361
+ * - `read: 'read'` — answered. `ranges: []` means "read, and this camera has
27362
+ * no footage in the window", which is a real claim.
27363
+ * - `read: 'unreadable'` — the recorder could not answer for this camera (its
27364
+ * calendar rung threw, its location is unmounted). `ranges` is empty and
27365
+ * that emptiness means NOTHING.
27366
+ *
27367
+ * A timeline that renders the second as the first tells an operator there is no
27368
+ * footage when the truth is that nobody looked.
27369
+ */
27370
+ var RecordingAvailabilityForDeviceSchema = object({
27371
+ deviceId: number(),
27372
+ read: _enum(["read", "unreadable"]),
27373
+ ranges: array(RecordingRangeSchema).readonly()
27374
+ });
27375
+ /**
27376
+ * One camera's row in a `getDaysWithRecordingsBatch` answer. Same rule as
27377
+ * {@link RecordingAvailabilityForDeviceSchema}: `days: []` on a `'read'` row is
27378
+ * "no footage in this month", `read: 'unreadable'` is "nobody could look", and
27379
+ * the date-picker's day dots must not spell them the same.
27380
+ */
27381
+ var RecordingDaysForDeviceSchema = object({
27382
+ deviceId: number(),
27383
+ read: _enum(["read", "unreadable"]),
27384
+ /** Local-midnight epochs (UTC ms) of days that have ≥1 recorded segment. */
27385
+ days: array(number()).readonly()
27386
+ });
27324
27387
  var RecordingManifestSchema = object({
27325
27388
  deviceId: number(),
27326
27389
  /** Local filesystem path to the master playlist; null when no recording exists for the requested range. */
@@ -27555,6 +27618,13 @@ method(object({
27555
27618
  }), RecordingAvailabilitySchema, {
27556
27619
  kind: "query",
27557
27620
  auth: "protected"
27621
+ }), method(object({
27622
+ deviceIds: array(number()).min(1).max(200),
27623
+ fromMs: number(),
27624
+ toMs: number()
27625
+ }), array(RecordingAvailabilityForDeviceSchema).readonly(), {
27626
+ kind: "query",
27627
+ auth: "protected"
27558
27628
  }), method(object({
27559
27629
  deviceId: number(),
27560
27630
  fromMs: number(),
@@ -27563,6 +27633,14 @@ method(object({
27563
27633
  }), RecordingDaysSchema, {
27564
27634
  kind: "query",
27565
27635
  auth: "protected"
27636
+ }), method(object({
27637
+ deviceIds: array(number()).min(1).max(200),
27638
+ fromMs: number(),
27639
+ toMs: number(),
27640
+ tzOffsetMinutes: number()
27641
+ }), array(RecordingDaysForDeviceSchema).readonly(), {
27642
+ kind: "query",
27643
+ auth: "protected"
27566
27644
  }), method(object({
27567
27645
  deviceId: number(),
27568
27646
  fromMs: number(),
@@ -32785,6 +32863,12 @@ Object.freeze({
32785
32863
  addonId: null,
32786
32864
  access: "view"
32787
32865
  },
32866
+ "pipelineAnalytics.getEventDensityBatch": {
32867
+ capName: "pipeline-analytics",
32868
+ capScope: "device",
32869
+ addonId: null,
32870
+ access: "view"
32871
+ },
32788
32872
  "pipelineAnalytics.getEventMedia": {
32789
32873
  capName: "pipeline-analytics",
32790
32874
  capScope: "device",
@@ -33907,12 +33991,24 @@ Object.freeze({
33907
33991
  addonId: null,
33908
33992
  access: "view"
33909
33993
  },
33994
+ "recording.getAvailabilityBatch": {
33995
+ capName: "recording",
33996
+ capScope: "system",
33997
+ addonId: null,
33998
+ access: "view"
33999
+ },
33910
34000
  "recording.getDaysWithRecordings": {
33911
34001
  capName: "recording",
33912
34002
  capScope: "system",
33913
34003
  addonId: null,
33914
34004
  access: "view"
33915
34005
  },
34006
+ "recording.getDaysWithRecordingsBatch": {
34007
+ capName: "recording",
34008
+ capScope: "system",
34009
+ addonId: null,
34010
+ access: "view"
34011
+ },
33916
34012
  "recording.getDeviceConfig": {
33917
34013
  capName: "recording",
33918
34014
  capScope: "system",
@@ -36517,6 +36613,11 @@ Object.freeze({
36517
36613
  form: "single",
36518
36614
  optional: false
36519
36615
  }],
36616
+ "pipelineAnalytics.getEventDensityBatch": [{
36617
+ name: "deviceIds",
36618
+ form: "array",
36619
+ optional: false
36620
+ }],
36520
36621
  "pipelineAnalytics.getEventMedia": [{
36521
36622
  name: "deviceId",
36522
36623
  form: "single",
@@ -36932,11 +37033,21 @@ Object.freeze({
36932
37033
  form: "single",
36933
37034
  optional: false
36934
37035
  }],
37036
+ "recording.getAvailabilityBatch": [{
37037
+ name: "deviceIds",
37038
+ form: "array",
37039
+ optional: false
37040
+ }],
36935
37041
  "recording.getDaysWithRecordings": [{
36936
37042
  name: "deviceId",
36937
37043
  form: "single",
36938
37044
  optional: false
36939
37045
  }],
37046
+ "recording.getDaysWithRecordingsBatch": [{
37047
+ name: "deviceIds",
37048
+ form: "array",
37049
+ optional: false
37050
+ }],
36940
37051
  "recording.getDeviceConfig": [{
36941
37052
  name: "deviceId",
36942
37053
  form: "single",
@@ -16362,6 +16362,8 @@ var NcSystemEventKindSchema = _enum([
16362
16362
  "device-offline",
16363
16363
  "device-disabled",
16364
16364
  "device-enabled",
16365
+ "device-battery-low",
16366
+ "device-battery-normal",
16365
16367
  "stream-online",
16366
16368
  "stream-offline",
16367
16369
  "node-online",
@@ -19636,6 +19638,34 @@ var KeyEventsForDeviceSchema = object({
19636
19638
  deviceId: number(),
19637
19639
  events: array(KeyEventSchema).readonly()
19638
19640
  });
19641
+ /** One non-empty bucket of the timeline histogram. */
19642
+ var EventDensityBucketSchema = object({
19643
+ bucketStart: number(),
19644
+ motion: number().int(),
19645
+ object: number().int(),
19646
+ audio: number().int()
19647
+ });
19648
+ /**
19649
+ * One camera's row in a `getEventDensityBatch` answer.
19650
+ *
19651
+ * TWO facts, and the timeline draws them differently:
19652
+ *
19653
+ * - `read: 'read'` — the histogram for this camera. `buckets: []` is a real
19654
+ * claim: read, and nothing happened in the window.
19655
+ * - `read: 'unreadable'` — nobody could answer for this camera. `buckets` is
19656
+ * empty and that emptiness means NOTHING; the timeline must render unknown,
19657
+ * not quiet.
19658
+ *
19659
+ * Fanned out per camera the difference was free — one query rejected while the
19660
+ * others resolved — and collapsing to a batch is the exact moment it is lost
19661
+ * silently. Every requested id gets a row: a caller that asked for twelve and
19662
+ * got eleven cannot tell which one is missing, or that any is.
19663
+ */
19664
+ var EventDensityForDeviceSchema = object({
19665
+ deviceId: number(),
19666
+ read: _enum(["read", "unreadable"]),
19667
+ buckets: array(EventDensityBucketSchema).readonly()
19668
+ });
19639
19669
  object({
19640
19670
  trackId: string(),
19641
19671
  className: string(),
@@ -19946,12 +19976,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19946
19976
  since: number(),
19947
19977
  until: number(),
19948
19978
  bucketMs: number().int().positive()
19949
- }), array(object({
19950
- bucketStart: number(),
19951
- motion: number().int(),
19952
- object: number().int(),
19953
- audio: number().int()
19954
- })).readonly()), method(object({
19979
+ }), array(EventDensityBucketSchema).readonly()), method(object({
19980
+ deviceIds: array(number()).min(1).max(200),
19981
+ since: number(),
19982
+ until: number(),
19983
+ bucketMs: number().int().positive()
19984
+ }), array(EventDensityForDeviceSchema).readonly()), method(object({
19955
19985
  deviceId: number(),
19956
19986
  cutoffMs: number()
19957
19987
  }), object({
@@ -27309,6 +27339,39 @@ var RecordingDaysSchema = object({
27309
27339
  /** Local-midnight epochs (UTC ms) of days that have ≥1 recorded segment. */
27310
27340
  days: array(number())
27311
27341
  });
27342
+ /**
27343
+ * One camera's row in a `getAvailabilityBatch` answer.
27344
+ *
27345
+ * `ranges` is EXACTLY what `getAvailability` returns for that camera — the
27346
+ * batch collapses the transport, not the work — plus the one thing the singular
27347
+ * method never had to say:
27348
+ *
27349
+ * - `read: 'read'` — answered. `ranges: []` means "read, and this camera has
27350
+ * no footage in the window", which is a real claim.
27351
+ * - `read: 'unreadable'` — the recorder could not answer for this camera (its
27352
+ * calendar rung threw, its location is unmounted). `ranges` is empty and
27353
+ * that emptiness means NOTHING.
27354
+ *
27355
+ * A timeline that renders the second as the first tells an operator there is no
27356
+ * footage when the truth is that nobody looked.
27357
+ */
27358
+ var RecordingAvailabilityForDeviceSchema = object({
27359
+ deviceId: number(),
27360
+ read: _enum(["read", "unreadable"]),
27361
+ ranges: array(RecordingRangeSchema).readonly()
27362
+ });
27363
+ /**
27364
+ * One camera's row in a `getDaysWithRecordingsBatch` answer. Same rule as
27365
+ * {@link RecordingAvailabilityForDeviceSchema}: `days: []` on a `'read'` row is
27366
+ * "no footage in this month", `read: 'unreadable'` is "nobody could look", and
27367
+ * the date-picker's day dots must not spell them the same.
27368
+ */
27369
+ var RecordingDaysForDeviceSchema = object({
27370
+ deviceId: number(),
27371
+ read: _enum(["read", "unreadable"]),
27372
+ /** Local-midnight epochs (UTC ms) of days that have ≥1 recorded segment. */
27373
+ days: array(number()).readonly()
27374
+ });
27312
27375
  var RecordingManifestSchema = object({
27313
27376
  deviceId: number(),
27314
27377
  /** Local filesystem path to the master playlist; null when no recording exists for the requested range. */
@@ -27543,6 +27606,13 @@ method(object({
27543
27606
  }), RecordingAvailabilitySchema, {
27544
27607
  kind: "query",
27545
27608
  auth: "protected"
27609
+ }), method(object({
27610
+ deviceIds: array(number()).min(1).max(200),
27611
+ fromMs: number(),
27612
+ toMs: number()
27613
+ }), array(RecordingAvailabilityForDeviceSchema).readonly(), {
27614
+ kind: "query",
27615
+ auth: "protected"
27546
27616
  }), method(object({
27547
27617
  deviceId: number(),
27548
27618
  fromMs: number(),
@@ -27551,6 +27621,14 @@ method(object({
27551
27621
  }), RecordingDaysSchema, {
27552
27622
  kind: "query",
27553
27623
  auth: "protected"
27624
+ }), method(object({
27625
+ deviceIds: array(number()).min(1).max(200),
27626
+ fromMs: number(),
27627
+ toMs: number(),
27628
+ tzOffsetMinutes: number()
27629
+ }), array(RecordingDaysForDeviceSchema).readonly(), {
27630
+ kind: "query",
27631
+ auth: "protected"
27554
27632
  }), method(object({
27555
27633
  deviceId: number(),
27556
27634
  fromMs: number(),
@@ -32773,6 +32851,12 @@ Object.freeze({
32773
32851
  addonId: null,
32774
32852
  access: "view"
32775
32853
  },
32854
+ "pipelineAnalytics.getEventDensityBatch": {
32855
+ capName: "pipeline-analytics",
32856
+ capScope: "device",
32857
+ addonId: null,
32858
+ access: "view"
32859
+ },
32776
32860
  "pipelineAnalytics.getEventMedia": {
32777
32861
  capName: "pipeline-analytics",
32778
32862
  capScope: "device",
@@ -33895,12 +33979,24 @@ Object.freeze({
33895
33979
  addonId: null,
33896
33980
  access: "view"
33897
33981
  },
33982
+ "recording.getAvailabilityBatch": {
33983
+ capName: "recording",
33984
+ capScope: "system",
33985
+ addonId: null,
33986
+ access: "view"
33987
+ },
33898
33988
  "recording.getDaysWithRecordings": {
33899
33989
  capName: "recording",
33900
33990
  capScope: "system",
33901
33991
  addonId: null,
33902
33992
  access: "view"
33903
33993
  },
33994
+ "recording.getDaysWithRecordingsBatch": {
33995
+ capName: "recording",
33996
+ capScope: "system",
33997
+ addonId: null,
33998
+ access: "view"
33999
+ },
33904
34000
  "recording.getDeviceConfig": {
33905
34001
  capName: "recording",
33906
34002
  capScope: "system",
@@ -36505,6 +36601,11 @@ Object.freeze({
36505
36601
  form: "single",
36506
36602
  optional: false
36507
36603
  }],
36604
+ "pipelineAnalytics.getEventDensityBatch": [{
36605
+ name: "deviceIds",
36606
+ form: "array",
36607
+ optional: false
36608
+ }],
36508
36609
  "pipelineAnalytics.getEventMedia": [{
36509
36610
  name: "deviceId",
36510
36611
  form: "single",
@@ -36920,11 +37021,21 @@ Object.freeze({
36920
37021
  form: "single",
36921
37022
  optional: false
36922
37023
  }],
37024
+ "recording.getAvailabilityBatch": [{
37025
+ name: "deviceIds",
37026
+ form: "array",
37027
+ optional: false
37028
+ }],
36923
37029
  "recording.getDaysWithRecordings": [{
36924
37030
  name: "deviceId",
36925
37031
  form: "single",
36926
37032
  optional: false
36927
37033
  }],
37034
+ "recording.getDaysWithRecordingsBatch": [{
37035
+ name: "deviceIds",
37036
+ form: "array",
37037
+ optional: false
37038
+ }],
36928
37039
  "recording.getDeviceConfig": [{
36929
37040
  name: "deviceId",
36930
37041
  form: "single",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-export-hap",
3
- "version": "1.2.61",
3
+ "version": "1.2.63",
4
4
  "description": "HomeKit (HAP) exporter for CamStack devices. Publishes each exposed device as its own HomeKit accessory: cameras and doorbells with SRTP streaming, HomeKit Secure Video, motion, two-way audio, PTZ and battery; switches, lights, locks and sensors through a capability→service table.",
5
5
  "keywords": [
6
6
  "camstack",