@camstack/addon-provider-homematic 1.2.48 → 1.2.49

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
@@ -19170,6 +19170,50 @@ var EventStoreFootprintSchema = object({
19170
19170
  totalBytes: number().int(),
19171
19171
  devices: array(EventStoreDeviceFootprintSchema).readonly()
19172
19172
  });
19173
+ /** Event-media footprint for one {@link MediaFileKind}. */
19174
+ var EventMediaKindFootprintSchema = object({
19175
+ kind: MediaFileKindEnum,
19176
+ /** Media rows of this kind. */
19177
+ rows: number().int(),
19178
+ /** Bytes on disk held by those rows. */
19179
+ bytes: number().int()
19180
+ });
19181
+ /**
19182
+ * The media footprint broken down by KIND — the axis a deletion decision
19183
+ * actually turns on.
19184
+ *
19185
+ * A byte total says how much there is; it cannot say what is safe to remove.
19186
+ * The deletable set (the periodic `snapshot` filmstrip, the surplus per-edge
19187
+ * motion stills) and the keep set (`firstFrame`, rolling `lastFrame`,
19188
+ * `thumbnail`/`thumbnailSmall`, `keyFrame`/`keyFrameSmall`, the face/plate
19189
+ * buffers, gallery media, the CLIP `crop`) are distinguished by `kind` and by
19190
+ * nothing else, so sizing a deletion means summing per kind.
19191
+ *
19192
+ * ## Why `unaccounted*` exists
19193
+ *
19194
+ * `kinds` is enumerated from {@link MediaFileKindEnum} — the closed set the
19195
+ * writers use — and summed one kind at a time. `totalRows` / `totalBytes` come
19196
+ * from a SEPARATE unfiltered aggregate over the same rows, never from adding
19197
+ * `kinds` up. A row whose stored `kind` is not in the enum (written by a
19198
+ * retired code path, or by a version that knew a kind this one does not) would
19199
+ * otherwise vanish from the total silently, and an operator would delete
19200
+ * against a denominator smaller than the disk.
19201
+ *
19202
+ * `unaccountedRows` / `unaccountedBytes` are the difference. They are normally
19203
+ * zero; a non-zero value is a real finding and must be shown, not rounded away.
19204
+ */
19205
+ var EventMediaKindBreakdownSchema = object({
19206
+ /** Every media row in scope, from one unfiltered aggregate. */
19207
+ totalRows: number().int(),
19208
+ /** Every media byte in scope, from that same aggregate. */
19209
+ totalBytes: number().int(),
19210
+ /** Per-kind footprint, ordered by bytes descending. */
19211
+ kinds: array(EventMediaKindFootprintSchema).readonly(),
19212
+ /** `totalRows` minus the summed `kinds` rows — see the schema note. */
19213
+ unaccountedRows: number().int(),
19214
+ /** `totalBytes` minus the summed `kinds` bytes — see the schema note. */
19215
+ unaccountedBytes: number().int()
19216
+ });
19173
19217
  /** Per-kind counts returned by the event-prune / device-delete mutations. */
19174
19218
  var EventPruneCountsSchema = object({
19175
19219
  motion: number().int(),
@@ -19373,6 +19417,9 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19373
19417
  }), TrackFlagsSchema, { kind: "mutation" }), method(object({}), EventStoreFootprintSchema, {
19374
19418
  kind: "query",
19375
19419
  auth: "admin"
19420
+ }), method(object({ deviceId: number().int().optional() }), EventMediaKindBreakdownSchema, {
19421
+ kind: "query",
19422
+ auth: "admin"
19376
19423
  }), method(object({
19377
19424
  olderThanMs: number(),
19378
19425
  reason: OpsLogReasonSchema.optional()
@@ -21324,6 +21371,20 @@ method(object({
21324
21371
  error: string().optional()
21325
21372
  }), { auth: "admin" }), method(_void(), array(ProviderListEntrySchema).readonly()), method(object({
21326
21373
  providerId: string(),
21374
+ /**
21375
+ * The location this config is an UNSAVED edit of, when there is one.
21376
+ *
21377
+ * `listLocations` replaces every declared secret with the redaction
21378
+ * sentinel, so the edit modal's form state holds the sentinel for any
21379
+ * credential the operator did not retype — and posting that here
21380
+ * without a way to resolve it makes the provider try to authenticate
21381
+ * as `__camstack_redacted__` and report the operator's own working
21382
+ * password as wrong. Given this id, the orchestrator restores each
21383
+ * sentinel from the stored config (same rule as `upsertLocation`)
21384
+ * before dispatching. Omitted by the "Add location" wizard, where
21385
+ * every value was typed just now and nothing is stored yet.
21386
+ */
21387
+ locationId: string().optional(),
21327
21388
  config: record(string(), unknown())
21328
21389
  }), object({
21329
21390
  ok: boolean(),
@@ -35362,6 +35423,12 @@ Object.freeze({
35362
35423
  addonId: null,
35363
35424
  access: "view"
35364
35425
  },
35426
+ "pipelineAnalytics.getEventMediaFootprintByKind": {
35427
+ capName: "pipeline-analytics",
35428
+ capScope: "device",
35429
+ addonId: null,
35430
+ access: "view"
35431
+ },
35365
35432
  "pipelineAnalytics.getEventStoreFootprint": {
35366
35433
  capName: "pipeline-analytics",
35367
35434
  capScope: "device",
@@ -39027,6 +39094,11 @@ Object.freeze({
39027
39094
  form: "single",
39028
39095
  optional: false
39029
39096
  }],
39097
+ "pipelineAnalytics.getEventMediaFootprintByKind": [{
39098
+ name: "deviceId",
39099
+ form: "single",
39100
+ optional: true
39101
+ }],
39030
39102
  "pipelineAnalytics.getGroup": [{
39031
39103
  name: "deviceId",
39032
39104
  form: "single",
package/dist/addon.mjs CHANGED
@@ -19171,6 +19171,50 @@ var EventStoreFootprintSchema = object({
19171
19171
  totalBytes: number().int(),
19172
19172
  devices: array(EventStoreDeviceFootprintSchema).readonly()
19173
19173
  });
19174
+ /** Event-media footprint for one {@link MediaFileKind}. */
19175
+ var EventMediaKindFootprintSchema = object({
19176
+ kind: MediaFileKindEnum,
19177
+ /** Media rows of this kind. */
19178
+ rows: number().int(),
19179
+ /** Bytes on disk held by those rows. */
19180
+ bytes: number().int()
19181
+ });
19182
+ /**
19183
+ * The media footprint broken down by KIND — the axis a deletion decision
19184
+ * actually turns on.
19185
+ *
19186
+ * A byte total says how much there is; it cannot say what is safe to remove.
19187
+ * The deletable set (the periodic `snapshot` filmstrip, the surplus per-edge
19188
+ * motion stills) and the keep set (`firstFrame`, rolling `lastFrame`,
19189
+ * `thumbnail`/`thumbnailSmall`, `keyFrame`/`keyFrameSmall`, the face/plate
19190
+ * buffers, gallery media, the CLIP `crop`) are distinguished by `kind` and by
19191
+ * nothing else, so sizing a deletion means summing per kind.
19192
+ *
19193
+ * ## Why `unaccounted*` exists
19194
+ *
19195
+ * `kinds` is enumerated from {@link MediaFileKindEnum} — the closed set the
19196
+ * writers use — and summed one kind at a time. `totalRows` / `totalBytes` come
19197
+ * from a SEPARATE unfiltered aggregate over the same rows, never from adding
19198
+ * `kinds` up. A row whose stored `kind` is not in the enum (written by a
19199
+ * retired code path, or by a version that knew a kind this one does not) would
19200
+ * otherwise vanish from the total silently, and an operator would delete
19201
+ * against a denominator smaller than the disk.
19202
+ *
19203
+ * `unaccountedRows` / `unaccountedBytes` are the difference. They are normally
19204
+ * zero; a non-zero value is a real finding and must be shown, not rounded away.
19205
+ */
19206
+ var EventMediaKindBreakdownSchema = object({
19207
+ /** Every media row in scope, from one unfiltered aggregate. */
19208
+ totalRows: number().int(),
19209
+ /** Every media byte in scope, from that same aggregate. */
19210
+ totalBytes: number().int(),
19211
+ /** Per-kind footprint, ordered by bytes descending. */
19212
+ kinds: array(EventMediaKindFootprintSchema).readonly(),
19213
+ /** `totalRows` minus the summed `kinds` rows — see the schema note. */
19214
+ unaccountedRows: number().int(),
19215
+ /** `totalBytes` minus the summed `kinds` bytes — see the schema note. */
19216
+ unaccountedBytes: number().int()
19217
+ });
19174
19218
  /** Per-kind counts returned by the event-prune / device-delete mutations. */
19175
19219
  var EventPruneCountsSchema = object({
19176
19220
  motion: number().int(),
@@ -19374,6 +19418,9 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19374
19418
  }), TrackFlagsSchema, { kind: "mutation" }), method(object({}), EventStoreFootprintSchema, {
19375
19419
  kind: "query",
19376
19420
  auth: "admin"
19421
+ }), method(object({ deviceId: number().int().optional() }), EventMediaKindBreakdownSchema, {
19422
+ kind: "query",
19423
+ auth: "admin"
19377
19424
  }), method(object({
19378
19425
  olderThanMs: number(),
19379
19426
  reason: OpsLogReasonSchema.optional()
@@ -21325,6 +21372,20 @@ method(object({
21325
21372
  error: string().optional()
21326
21373
  }), { auth: "admin" }), method(_void(), array(ProviderListEntrySchema).readonly()), method(object({
21327
21374
  providerId: string(),
21375
+ /**
21376
+ * The location this config is an UNSAVED edit of, when there is one.
21377
+ *
21378
+ * `listLocations` replaces every declared secret with the redaction
21379
+ * sentinel, so the edit modal's form state holds the sentinel for any
21380
+ * credential the operator did not retype — and posting that here
21381
+ * without a way to resolve it makes the provider try to authenticate
21382
+ * as `__camstack_redacted__` and report the operator's own working
21383
+ * password as wrong. Given this id, the orchestrator restores each
21384
+ * sentinel from the stored config (same rule as `upsertLocation`)
21385
+ * before dispatching. Omitted by the "Add location" wizard, where
21386
+ * every value was typed just now and nothing is stored yet.
21387
+ */
21388
+ locationId: string().optional(),
21328
21389
  config: record(string(), unknown())
21329
21390
  }), object({
21330
21391
  ok: boolean(),
@@ -35363,6 +35424,12 @@ Object.freeze({
35363
35424
  addonId: null,
35364
35425
  access: "view"
35365
35426
  },
35427
+ "pipelineAnalytics.getEventMediaFootprintByKind": {
35428
+ capName: "pipeline-analytics",
35429
+ capScope: "device",
35430
+ addonId: null,
35431
+ access: "view"
35432
+ },
35366
35433
  "pipelineAnalytics.getEventStoreFootprint": {
35367
35434
  capName: "pipeline-analytics",
35368
35435
  capScope: "device",
@@ -39028,6 +39095,11 @@ Object.freeze({
39028
39095
  form: "single",
39029
39096
  optional: false
39030
39097
  }],
39098
+ "pipelineAnalytics.getEventMediaFootprintByKind": [{
39099
+ name: "deviceId",
39100
+ form: "single",
39101
+ optional: true
39102
+ }],
39031
39103
  "pipelineAnalytics.getGroup": [{
39032
39104
  name: "deviceId",
39033
39105
  form: "single",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-homematic",
3
- "version": "1.2.48",
3
+ "version": "1.2.49",
4
4
  "description": "Homematic / HomematicIP (CCU3 / RaspberryMatic) device-provider addon for CamStack — wraps the nodehomematic library",
5
5
  "keywords": [
6
6
  "camstack",