@camstack/addon-provider-gree 0.2.50 → 0.2.51

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
@@ -19194,6 +19194,34 @@ var KeyEventsForDeviceSchema = object({
19194
19194
  deviceId: number(),
19195
19195
  events: array(KeyEventSchema).readonly()
19196
19196
  });
19197
+ /** One non-empty bucket of the timeline histogram. */
19198
+ var EventDensityBucketSchema = object({
19199
+ bucketStart: number(),
19200
+ motion: number().int(),
19201
+ object: number().int(),
19202
+ audio: number().int()
19203
+ });
19204
+ /**
19205
+ * One camera's row in a `getEventDensityBatch` answer.
19206
+ *
19207
+ * TWO facts, and the timeline draws them differently:
19208
+ *
19209
+ * - `read: 'read'` — the histogram for this camera. `buckets: []` is a real
19210
+ * claim: read, and nothing happened in the window.
19211
+ * - `read: 'unreadable'` — nobody could answer for this camera. `buckets` is
19212
+ * empty and that emptiness means NOTHING; the timeline must render unknown,
19213
+ * not quiet.
19214
+ *
19215
+ * Fanned out per camera the difference was free — one query rejected while the
19216
+ * others resolved — and collapsing to a batch is the exact moment it is lost
19217
+ * silently. Every requested id gets a row: a caller that asked for twelve and
19218
+ * got eleven cannot tell which one is missing, or that any is.
19219
+ */
19220
+ var EventDensityForDeviceSchema = object({
19221
+ deviceId: number(),
19222
+ read: _enum(["read", "unreadable"]),
19223
+ buckets: array(EventDensityBucketSchema).readonly()
19224
+ });
19197
19225
  object({
19198
19226
  trackId: string(),
19199
19227
  className: string(),
@@ -19504,12 +19532,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19504
19532
  since: number(),
19505
19533
  until: number(),
19506
19534
  bucketMs: number().int().positive()
19507
- }), array(object({
19508
- bucketStart: number(),
19509
- motion: number().int(),
19510
- object: number().int(),
19511
- audio: number().int()
19512
- })).readonly()), method(object({
19535
+ }), array(EventDensityBucketSchema).readonly()), method(object({
19536
+ deviceIds: array(number()).min(1).max(200),
19537
+ since: number(),
19538
+ until: number(),
19539
+ bucketMs: number().int().positive()
19540
+ }), array(EventDensityForDeviceSchema).readonly()), method(object({
19513
19541
  deviceId: number(),
19514
19542
  cutoffMs: number()
19515
19543
  }), object({
@@ -28534,6 +28562,39 @@ var RecordingDaysSchema = object({
28534
28562
  /** Local-midnight epochs (UTC ms) of days that have ≥1 recorded segment. */
28535
28563
  days: array(number())
28536
28564
  });
28565
+ /**
28566
+ * One camera's row in a `getAvailabilityBatch` answer.
28567
+ *
28568
+ * `ranges` is EXACTLY what `getAvailability` returns for that camera — the
28569
+ * batch collapses the transport, not the work — plus the one thing the singular
28570
+ * method never had to say:
28571
+ *
28572
+ * - `read: 'read'` — answered. `ranges: []` means "read, and this camera has
28573
+ * no footage in the window", which is a real claim.
28574
+ * - `read: 'unreadable'` — the recorder could not answer for this camera (its
28575
+ * calendar rung threw, its location is unmounted). `ranges` is empty and
28576
+ * that emptiness means NOTHING.
28577
+ *
28578
+ * A timeline that renders the second as the first tells an operator there is no
28579
+ * footage when the truth is that nobody looked.
28580
+ */
28581
+ var RecordingAvailabilityForDeviceSchema = object({
28582
+ deviceId: number(),
28583
+ read: _enum(["read", "unreadable"]),
28584
+ ranges: array(RecordingRangeSchema).readonly()
28585
+ });
28586
+ /**
28587
+ * One camera's row in a `getDaysWithRecordingsBatch` answer. Same rule as
28588
+ * {@link RecordingAvailabilityForDeviceSchema}: `days: []` on a `'read'` row is
28589
+ * "no footage in this month", `read: 'unreadable'` is "nobody could look", and
28590
+ * the date-picker's day dots must not spell them the same.
28591
+ */
28592
+ var RecordingDaysForDeviceSchema = object({
28593
+ deviceId: number(),
28594
+ read: _enum(["read", "unreadable"]),
28595
+ /** Local-midnight epochs (UTC ms) of days that have ≥1 recorded segment. */
28596
+ days: array(number()).readonly()
28597
+ });
28537
28598
  var RecordingManifestSchema = object({
28538
28599
  deviceId: number(),
28539
28600
  /** Local filesystem path to the master playlist; null when no recording exists for the requested range. */
@@ -28768,6 +28829,13 @@ method(object({
28768
28829
  }), RecordingAvailabilitySchema, {
28769
28830
  kind: "query",
28770
28831
  auth: "protected"
28832
+ }), method(object({
28833
+ deviceIds: array(number()).min(1).max(200),
28834
+ fromMs: number(),
28835
+ toMs: number()
28836
+ }), array(RecordingAvailabilityForDeviceSchema).readonly(), {
28837
+ kind: "query",
28838
+ auth: "protected"
28771
28839
  }), method(object({
28772
28840
  deviceId: number(),
28773
28841
  fromMs: number(),
@@ -28776,6 +28844,14 @@ method(object({
28776
28844
  }), RecordingDaysSchema, {
28777
28845
  kind: "query",
28778
28846
  auth: "protected"
28847
+ }), method(object({
28848
+ deviceIds: array(number()).min(1).max(200),
28849
+ fromMs: number(),
28850
+ toMs: number(),
28851
+ tzOffsetMinutes: number()
28852
+ }), array(RecordingDaysForDeviceSchema).readonly(), {
28853
+ kind: "query",
28854
+ auth: "protected"
28779
28855
  }), method(object({
28780
28856
  deviceId: number(),
28781
28857
  fromMs: number(),
@@ -35672,6 +35748,12 @@ Object.freeze({
35672
35748
  addonId: null,
35673
35749
  access: "view"
35674
35750
  },
35751
+ "pipelineAnalytics.getEventDensityBatch": {
35752
+ capName: "pipeline-analytics",
35753
+ capScope: "device",
35754
+ addonId: null,
35755
+ access: "view"
35756
+ },
35675
35757
  "pipelineAnalytics.getEventMedia": {
35676
35758
  capName: "pipeline-analytics",
35677
35759
  capScope: "device",
@@ -36794,12 +36876,24 @@ Object.freeze({
36794
36876
  addonId: null,
36795
36877
  access: "view"
36796
36878
  },
36879
+ "recording.getAvailabilityBatch": {
36880
+ capName: "recording",
36881
+ capScope: "system",
36882
+ addonId: null,
36883
+ access: "view"
36884
+ },
36797
36885
  "recording.getDaysWithRecordings": {
36798
36886
  capName: "recording",
36799
36887
  capScope: "system",
36800
36888
  addonId: null,
36801
36889
  access: "view"
36802
36890
  },
36891
+ "recording.getDaysWithRecordingsBatch": {
36892
+ capName: "recording",
36893
+ capScope: "system",
36894
+ addonId: null,
36895
+ access: "view"
36896
+ },
36803
36897
  "recording.getDeviceConfig": {
36804
36898
  capName: "recording",
36805
36899
  capScope: "system",
@@ -39404,6 +39498,11 @@ Object.freeze({
39404
39498
  form: "single",
39405
39499
  optional: false
39406
39500
  }],
39501
+ "pipelineAnalytics.getEventDensityBatch": [{
39502
+ name: "deviceIds",
39503
+ form: "array",
39504
+ optional: false
39505
+ }],
39407
39506
  "pipelineAnalytics.getEventMedia": [{
39408
39507
  name: "deviceId",
39409
39508
  form: "single",
@@ -39819,11 +39918,21 @@ Object.freeze({
39819
39918
  form: "single",
39820
39919
  optional: false
39821
39920
  }],
39921
+ "recording.getAvailabilityBatch": [{
39922
+ name: "deviceIds",
39923
+ form: "array",
39924
+ optional: false
39925
+ }],
39822
39926
  "recording.getDaysWithRecordings": [{
39823
39927
  name: "deviceId",
39824
39928
  form: "single",
39825
39929
  optional: false
39826
39930
  }],
39931
+ "recording.getDaysWithRecordingsBatch": [{
39932
+ name: "deviceIds",
39933
+ form: "array",
39934
+ optional: false
39935
+ }],
39827
39936
  "recording.getDeviceConfig": [{
39828
39937
  name: "deviceId",
39829
39938
  form: "single",
package/dist/addon.mjs CHANGED
@@ -19193,6 +19193,34 @@ var KeyEventsForDeviceSchema = object({
19193
19193
  deviceId: number(),
19194
19194
  events: array(KeyEventSchema).readonly()
19195
19195
  });
19196
+ /** One non-empty bucket of the timeline histogram. */
19197
+ var EventDensityBucketSchema = object({
19198
+ bucketStart: number(),
19199
+ motion: number().int(),
19200
+ object: number().int(),
19201
+ audio: number().int()
19202
+ });
19203
+ /**
19204
+ * One camera's row in a `getEventDensityBatch` answer.
19205
+ *
19206
+ * TWO facts, and the timeline draws them differently:
19207
+ *
19208
+ * - `read: 'read'` — the histogram for this camera. `buckets: []` is a real
19209
+ * claim: read, and nothing happened in the window.
19210
+ * - `read: 'unreadable'` — nobody could answer for this camera. `buckets` is
19211
+ * empty and that emptiness means NOTHING; the timeline must render unknown,
19212
+ * not quiet.
19213
+ *
19214
+ * Fanned out per camera the difference was free — one query rejected while the
19215
+ * others resolved — and collapsing to a batch is the exact moment it is lost
19216
+ * silently. Every requested id gets a row: a caller that asked for twelve and
19217
+ * got eleven cannot tell which one is missing, or that any is.
19218
+ */
19219
+ var EventDensityForDeviceSchema = object({
19220
+ deviceId: number(),
19221
+ read: _enum(["read", "unreadable"]),
19222
+ buckets: array(EventDensityBucketSchema).readonly()
19223
+ });
19196
19224
  object({
19197
19225
  trackId: string(),
19198
19226
  className: string(),
@@ -19503,12 +19531,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19503
19531
  since: number(),
19504
19532
  until: number(),
19505
19533
  bucketMs: number().int().positive()
19506
- }), array(object({
19507
- bucketStart: number(),
19508
- motion: number().int(),
19509
- object: number().int(),
19510
- audio: number().int()
19511
- })).readonly()), method(object({
19534
+ }), array(EventDensityBucketSchema).readonly()), method(object({
19535
+ deviceIds: array(number()).min(1).max(200),
19536
+ since: number(),
19537
+ until: number(),
19538
+ bucketMs: number().int().positive()
19539
+ }), array(EventDensityForDeviceSchema).readonly()), method(object({
19512
19540
  deviceId: number(),
19513
19541
  cutoffMs: number()
19514
19542
  }), object({
@@ -28533,6 +28561,39 @@ var RecordingDaysSchema = object({
28533
28561
  /** Local-midnight epochs (UTC ms) of days that have ≥1 recorded segment. */
28534
28562
  days: array(number())
28535
28563
  });
28564
+ /**
28565
+ * One camera's row in a `getAvailabilityBatch` answer.
28566
+ *
28567
+ * `ranges` is EXACTLY what `getAvailability` returns for that camera — the
28568
+ * batch collapses the transport, not the work — plus the one thing the singular
28569
+ * method never had to say:
28570
+ *
28571
+ * - `read: 'read'` — answered. `ranges: []` means "read, and this camera has
28572
+ * no footage in the window", which is a real claim.
28573
+ * - `read: 'unreadable'` — the recorder could not answer for this camera (its
28574
+ * calendar rung threw, its location is unmounted). `ranges` is empty and
28575
+ * that emptiness means NOTHING.
28576
+ *
28577
+ * A timeline that renders the second as the first tells an operator there is no
28578
+ * footage when the truth is that nobody looked.
28579
+ */
28580
+ var RecordingAvailabilityForDeviceSchema = object({
28581
+ deviceId: number(),
28582
+ read: _enum(["read", "unreadable"]),
28583
+ ranges: array(RecordingRangeSchema).readonly()
28584
+ });
28585
+ /**
28586
+ * One camera's row in a `getDaysWithRecordingsBatch` answer. Same rule as
28587
+ * {@link RecordingAvailabilityForDeviceSchema}: `days: []` on a `'read'` row is
28588
+ * "no footage in this month", `read: 'unreadable'` is "nobody could look", and
28589
+ * the date-picker's day dots must not spell them the same.
28590
+ */
28591
+ var RecordingDaysForDeviceSchema = object({
28592
+ deviceId: number(),
28593
+ read: _enum(["read", "unreadable"]),
28594
+ /** Local-midnight epochs (UTC ms) of days that have ≥1 recorded segment. */
28595
+ days: array(number()).readonly()
28596
+ });
28536
28597
  var RecordingManifestSchema = object({
28537
28598
  deviceId: number(),
28538
28599
  /** Local filesystem path to the master playlist; null when no recording exists for the requested range. */
@@ -28767,6 +28828,13 @@ method(object({
28767
28828
  }), RecordingAvailabilitySchema, {
28768
28829
  kind: "query",
28769
28830
  auth: "protected"
28831
+ }), method(object({
28832
+ deviceIds: array(number()).min(1).max(200),
28833
+ fromMs: number(),
28834
+ toMs: number()
28835
+ }), array(RecordingAvailabilityForDeviceSchema).readonly(), {
28836
+ kind: "query",
28837
+ auth: "protected"
28770
28838
  }), method(object({
28771
28839
  deviceId: number(),
28772
28840
  fromMs: number(),
@@ -28775,6 +28843,14 @@ method(object({
28775
28843
  }), RecordingDaysSchema, {
28776
28844
  kind: "query",
28777
28845
  auth: "protected"
28846
+ }), method(object({
28847
+ deviceIds: array(number()).min(1).max(200),
28848
+ fromMs: number(),
28849
+ toMs: number(),
28850
+ tzOffsetMinutes: number()
28851
+ }), array(RecordingDaysForDeviceSchema).readonly(), {
28852
+ kind: "query",
28853
+ auth: "protected"
28778
28854
  }), method(object({
28779
28855
  deviceId: number(),
28780
28856
  fromMs: number(),
@@ -35671,6 +35747,12 @@ Object.freeze({
35671
35747
  addonId: null,
35672
35748
  access: "view"
35673
35749
  },
35750
+ "pipelineAnalytics.getEventDensityBatch": {
35751
+ capName: "pipeline-analytics",
35752
+ capScope: "device",
35753
+ addonId: null,
35754
+ access: "view"
35755
+ },
35674
35756
  "pipelineAnalytics.getEventMedia": {
35675
35757
  capName: "pipeline-analytics",
35676
35758
  capScope: "device",
@@ -36793,12 +36875,24 @@ Object.freeze({
36793
36875
  addonId: null,
36794
36876
  access: "view"
36795
36877
  },
36878
+ "recording.getAvailabilityBatch": {
36879
+ capName: "recording",
36880
+ capScope: "system",
36881
+ addonId: null,
36882
+ access: "view"
36883
+ },
36796
36884
  "recording.getDaysWithRecordings": {
36797
36885
  capName: "recording",
36798
36886
  capScope: "system",
36799
36887
  addonId: null,
36800
36888
  access: "view"
36801
36889
  },
36890
+ "recording.getDaysWithRecordingsBatch": {
36891
+ capName: "recording",
36892
+ capScope: "system",
36893
+ addonId: null,
36894
+ access: "view"
36895
+ },
36802
36896
  "recording.getDeviceConfig": {
36803
36897
  capName: "recording",
36804
36898
  capScope: "system",
@@ -39403,6 +39497,11 @@ Object.freeze({
39403
39497
  form: "single",
39404
39498
  optional: false
39405
39499
  }],
39500
+ "pipelineAnalytics.getEventDensityBatch": [{
39501
+ name: "deviceIds",
39502
+ form: "array",
39503
+ optional: false
39504
+ }],
39406
39505
  "pipelineAnalytics.getEventMedia": [{
39407
39506
  name: "deviceId",
39408
39507
  form: "single",
@@ -39818,11 +39917,21 @@ Object.freeze({
39818
39917
  form: "single",
39819
39918
  optional: false
39820
39919
  }],
39920
+ "recording.getAvailabilityBatch": [{
39921
+ name: "deviceIds",
39922
+ form: "array",
39923
+ optional: false
39924
+ }],
39821
39925
  "recording.getDaysWithRecordings": [{
39822
39926
  name: "deviceId",
39823
39927
  form: "single",
39824
39928
  optional: false
39825
39929
  }],
39930
+ "recording.getDaysWithRecordingsBatch": [{
39931
+ name: "deviceIds",
39932
+ form: "array",
39933
+ optional: false
39934
+ }],
39826
39935
  "recording.getDeviceConfig": [{
39827
39936
  name: "deviceId",
39828
39937
  form: "single",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-gree",
3
- "version": "0.2.50",
3
+ "version": "0.2.51",
4
4
  "description": "Gree air-conditioner device-provider addon for CamStack — wraps the @apocaliss92/nodegree local-UDP client (LAN discovery + AES control), exposing climate-control and fan-control",
5
5
  "keywords": [
6
6
  "camstack",