@camstack/addon-provider-rtsp 1.2.143 → 1.2.144

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.
Files changed (3) hide show
  1. package/dist/addon.js +193 -117
  2. package/dist/addon.mjs +193 -117
  3. package/package.json +1 -1
package/dist/addon.js CHANGED
@@ -5455,7 +5455,7 @@ var ZodIssueCode = {
5455
5455
  var ZodFirstPartyTypeKind;
5456
5456
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5457
5457
  //#endregion
5458
- //#region ../types/dist/sleep-DJFUfKvA.mjs
5458
+ //#region ../types/dist/sleep-CUp20JkO.mjs
5459
5459
  /**
5460
5460
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5461
5461
  * window to float samples (D455).
@@ -8347,7 +8347,11 @@ var ContributionSectionSchema = object({
8347
8347
  literal(4)
8348
8348
  ]).optional(),
8349
8349
  tab: string().optional(),
8350
- location: _enum(["settings", "top-tab"]).optional(),
8350
+ location: _enum([
8351
+ "settings",
8352
+ "top-tab",
8353
+ "hero"
8354
+ ]).optional(),
8351
8355
  order: number().optional(),
8352
8356
  fields: array(any())
8353
8357
  });
@@ -13401,7 +13405,11 @@ var ConfigSectionWithValuesSchema = object({
13401
13405
  literal(4)
13402
13406
  ]).optional(),
13403
13407
  tab: string().optional(),
13404
- location: _enum(["settings", "top-tab"]).optional(),
13408
+ location: _enum([
13409
+ "settings",
13410
+ "top-tab",
13411
+ "hero"
13412
+ ]).optional(),
13405
13413
  order: number().optional(),
13406
13414
  fields: array(any())
13407
13415
  });
@@ -17281,6 +17289,52 @@ var TierStatusSchema = object({
17281
17289
  countedAt: number().nullable()
17282
17290
  });
17283
17291
  /** Operator/diagnostic view: rows per tier, last runs, refusals and drops since boot. */
17292
+ /**
17293
+ * Why a series is orphan. `device-gone`: its device is absent from the
17294
+ * successful device listings (the departure clock). `undeclared`: its `cap:`
17295
+ * key is declared by no capability any more (a field a cap removed).
17296
+ */
17297
+ var DeviceHistoryOrphanReasonSchema = _enum(["device-gone", "undeclared"]);
17298
+ /** Rows held per stored tier. */
17299
+ var TierRowsSchema = object({
17300
+ raw: number().int(),
17301
+ "5m": number().int(),
17302
+ "1h": number().int(),
17303
+ "1d": number().int()
17304
+ });
17305
+ var OrphanSeriesSchema = object({
17306
+ seriesId: number().int(),
17307
+ deviceId: number().int(),
17308
+ key: string(),
17309
+ scope: string(),
17310
+ /** The metric's display name; `null` when its metric row is gone too. */
17311
+ displayName: string().nullable(),
17312
+ reason: DeviceHistoryOrphanReasonSchema,
17313
+ /** `device-gone`: since when the device has been absent; `null` otherwise. */
17314
+ missingSince: number().nullable(),
17315
+ firstTs: number(),
17316
+ lastTs: number(),
17317
+ rows: TierRowsSchema
17318
+ });
17319
+ var DeviceHistoryOrphanDeleteRefusalSchema = _enum([
17320
+ "not-found",
17321
+ "not-orphan",
17322
+ "failed"
17323
+ ]);
17324
+ var OrphanDeleteEntrySchema = discriminatedUnion("ok", [object({
17325
+ seriesId: number().int(),
17326
+ ok: literal(true),
17327
+ deleted: TierRowsSchema
17328
+ }), object({
17329
+ seriesId: number().int(),
17330
+ ok: literal(false),
17331
+ reason: DeviceHistoryOrphanDeleteRefusalSchema
17332
+ })]);
17333
+ var OrphanListSchema = object({
17334
+ series: array(OrphanSeriesSchema).readonly(),
17335
+ /** More orphans exist than {@link DEVICE_HISTORY_ORPHAN_LIST_MAX}. */
17336
+ truncated: boolean()
17337
+ });
17284
17338
  var DeviceHistoryStatusSchema = object({
17285
17339
  startedAt: number(),
17286
17340
  /** The store is declared, series loaded and the first reconcile has answered. */
@@ -17378,7 +17432,10 @@ method(object({ deviceId: number().int() }), array(SeriesInfoSchema).readonly())
17378
17432
  }), object({ enabled: boolean() }), {
17379
17433
  kind: "mutation",
17380
17434
  auth: "admin"
17381
- }), method(object({}), DeviceHistoryStatusSchema, { auth: "admin" });
17435
+ }), method(object({}), DeviceHistoryStatusSchema, { auth: "admin" }), method(object({}), OrphanListSchema, { auth: "admin" }), method(object({ seriesIds: array(number().int()).min(1).max(50) }), object({ results: array(OrphanDeleteEntrySchema).readonly() }), {
17436
+ kind: "mutation",
17437
+ auth: "admin"
17438
+ });
17382
17439
  var DeviceCaStatusSchema = discriminatedUnion("state", [
17383
17440
  object({ state: literal("absent") }),
17384
17441
  object({
@@ -55333,17 +55390,69 @@ var connectivityCapability = {
55333
55390
  volatileStateFields: ["lastChangedAt"]
55334
55391
  };
55335
55392
  /**
55336
- * Generic device-consumables capability — surfaces a device's
55337
- * maintenance items (vacuum filters/brushes, replaceable cartridges,
55338
- * descaling cycles, …) with their remaining life and an optional
55339
- * "Replaced" reset action. Device-agnostic: any provider that knows its
55340
- * device tracks consumables can register it; the cap declares no
55341
- * vocabulary of its own — the provider names each item verbatim.
55393
+ * Generic device-consumables capability — the ONE place a device reports what
55394
+ * it uses up or fills: wear parts (vacuum filters/brushes, cartridges,
55395
+ * descaling cycles), supplies it draws from (a vacuum's clean-water tank and
55396
+ * detergent, a dishwasher's salt and rinse aid) and waste it collects (a dirty
55397
+ * water tank, a dust bin). Each item carries its remaining life or fill and an
55398
+ * optional "Replaced" reset action. Device-agnostic: any provider that knows
55399
+ * its device tracks consumables registers it; the provider names each item
55400
+ * verbatim and says which `kind` it is.
55401
+ *
55402
+ * The admin UI renders it as ONE collapsible section directly under the
55403
+ * device page's hero card (`placement: 'hero'`), for every device bound to
55404
+ * this cap — never drawn by a device type's hero card itself (D915).
55342
55405
  *
55343
55406
  * Like `childLayout`, the cap is INERT until a provider sets items: no
55344
55407
  * provider populates it by guessing (no HA inference). The UI renders a
55345
55408
  * "No consumables reported" placeholder when `items` is empty.
55346
55409
  */
55410
+ /**
55411
+ * What an item IS, which decides which direction is bad:
55412
+ * - `wear` — a part that wears out (a brush, a filter); low life is bad.
55413
+ * - `supply` — something the device draws from (clean water, detergent,
55414
+ * salt, rinse aid); low or empty is bad.
55415
+ * - `waste` — something the device fills (dirty water, a dust bin); full is
55416
+ * bad.
55417
+ * Absent = `wear`.
55418
+ */
55419
+ var ConsumableKindSchema = _enum([
55420
+ "wear",
55421
+ "supply",
55422
+ "waste"
55423
+ ]);
55424
+ /**
55425
+ * What an item LOOKS like, which decides how a client draws it — independent
55426
+ * of `kind`, which decides which direction is bad:
55427
+ * - `part` — a part that wears (a brush, a filter, a mop pad): a wear bar,
55428
+ * remaining time and a reset.
55429
+ * - `tank` — a container of liquid (clean water, dirty water): a fill gauge.
55430
+ * - `product` — something bought and refilled (detergent, salt, rinse aid):
55431
+ * a stepped level and "refill".
55432
+ * - `bin` — a container that collects waste (a dust bin): a fill gauge
55433
+ * that warns when full.
55434
+ * Absent = derived from the kind ({@link consumableFormOf}).
55435
+ */
55436
+ var ConsumableFormSchema = _enum([
55437
+ "part",
55438
+ "tank",
55439
+ "product",
55440
+ "bin"
55441
+ ]);
55442
+ /** The provider's own discrete verdict on an item. */
55443
+ var ConsumableStatusSchema = _enum([
55444
+ "ok",
55445
+ "low",
55446
+ "empty",
55447
+ "full",
55448
+ "replace"
55449
+ ]);
55450
+ _enum([
55451
+ "ok",
55452
+ "low",
55453
+ "empty",
55454
+ "full"
55455
+ ]);
55347
55456
  /** Units a remaining-life counter is reported in. Closed: the panel renders
55348
55457
  * each. */
55349
55458
  var ConsumableRemainingUnitSchema = _enum([
@@ -55358,18 +55467,23 @@ var ConsumableRemainingSchema = object({
55358
55467
  unit: ConsumableRemainingUnitSchema
55359
55468
  });
55360
55469
  /** A single consumable item. Either a continuous `level` (remaining
55361
- * life %) or a discrete `status` may be known — both may be null when a
55362
- * provider only knows the item exists. `level` and `status` are not
55363
- * mutually exclusive; a provider may report both. */
55470
+ * life %, or fill % for a `supply` / `waste` item) or a discrete `status`
55471
+ * may be known — both may be null when a provider only knows the item
55472
+ * exists. `level` and `status` are not mutually exclusive; a provider may
55473
+ * report both. */
55364
55474
  var ConsumableItemSchema = object({
55365
55475
  /** Stable id, e.g. 'main-brush'. */
55366
55476
  key: string().min(1),
55367
55477
  /** Display name. */
55368
55478
  label: string().min(1),
55369
- /** Remaining life % when known (0..100). */
55479
+ /** Remaining life % (`wear`) or fill % (`supply`, `waste`) when known (0..100). */
55370
55480
  level: number().min(0).max(100).nullable(),
55371
- /** Discrete state when known (binary mode). */
55372
- status: _enum(["ok", "replace"]).nullable(),
55481
+ /** The provider's discrete verdict when known (binary mode). */
55482
+ status: ConsumableStatusSchema.nullable(),
55483
+ /** What the item is — decides whether low or full is bad. Absent = `wear`. */
55484
+ kind: ConsumableKindSchema.optional(),
55485
+ /** How the item is drawn (part, tank, product, bin). Absent = derived from `kind`. */
55486
+ form: ConsumableFormSchema.optional(),
55373
55487
  /** Ms epoch of the last replace, when known. */
55374
55488
  lastResetAt: number().nullable(),
55375
55489
  /** Whether `reset()` is meaningful for this item. */
@@ -55392,7 +55506,7 @@ var consumablesCapability = {
55392
55506
  kind: "widget",
55393
55507
  widgetId: "host/consumables-panel",
55394
55508
  tab: "consumables",
55395
- topTab: true,
55509
+ placement: "hero",
55396
55510
  label: "Consumables",
55397
55511
  order: 5
55398
55512
  } },
@@ -55453,9 +55567,37 @@ reset: method(object({
55453
55567
  */
55454
55568
  durability: "restored",
55455
55569
  /**
55456
- * History (D850): none — `items` is an array keyed by runtime ids; a history path never enters it.
55570
+ * History (D850, D917): one series per (item field, item `key`) — the item key
55571
+ * is the series scope, the item `label` names it. A vacuum tank's fill, a
55572
+ * brush's remaining life and a dishwasher's salt are each recorded the moment
55573
+ * their provider reports them; an item that appears later gets its series.
55457
55574
  */
55458
- history: "none",
55575
+ history: {
55576
+ fields: {},
55577
+ items: {
55578
+ path: "items",
55579
+ key: "key",
55580
+ label: "label",
55581
+ fields: {
55582
+ level: {
55583
+ kind: "gauge",
55584
+ unit: "%",
55585
+ deadband: 2,
55586
+ displayName: "Level"
55587
+ },
55588
+ status: {
55589
+ kind: "enum",
55590
+ displayName: "Status"
55591
+ },
55592
+ "remaining.value": {
55593
+ kind: "gauge",
55594
+ unitFrom: "remaining.unit",
55595
+ deadband: 1,
55596
+ displayName: "Remaining"
55597
+ }
55598
+ }
55599
+ }
55600
+ },
55459
55601
  /** Clocks, not content: a re-read that changed no item costs no commit. */
55460
55602
  volatileStateFields: ["lastChangedAt", "lastFetchedAt"]
55461
55603
  };
@@ -55870,8 +56012,9 @@ onStatusChanged: { data: object({
55870
56012
  volatileStateFields: ["lastChangedAt"]
55871
56013
  };
55872
56014
  /**
55873
- * Smart-dishwasher cap — program lifecycle, door / remote-start gates,
55874
- * consumable levels (salt, rinse aid) and common program options.
56015
+ * Smart-dishwasher cap — program lifecycle, door / remote-start gates and
56016
+ * common program options. Salt and rinse aid are NOT here: they are items of
56017
+ * the device's `consumables` cap, like every other device's (D915).
55875
56018
  *
55876
56019
  * Sources: native Bosch Home Connect (`dishwasher` device type). Reusable
55877
56020
  * by any integration that exposes the same program / option surface.
@@ -55919,11 +56062,6 @@ var DishwasherAvailabilitySchema = _enum([
55919
56062
  "offline",
55920
56063
  "description-missing"
55921
56064
  ]);
55922
- var DishwasherConsumableLevelSchema = _enum([
55923
- "ok",
55924
- "low",
55925
- "empty"
55926
- ]);
55927
56065
  var DishwasherStatusSchema = object({
55928
56066
  availability: DishwasherAvailabilitySchema,
55929
56067
  /** Coarse state for compact surfaces; `unavailable` whenever the appliance state is not known. */
@@ -55956,8 +56094,6 @@ var DishwasherStatusSchema = object({
55956
56094
  powerOn: boolean().nullable(),
55957
56095
  /** The raw power state (`On`, `Off`, `Standby`, …); null when not known. */
55958
56096
  powerState: string().nullable(),
55959
- saltLevel: DishwasherConsumableLevelSchema.nullable(),
55960
- rinseAidLevel: DishwasherConsumableLevelSchema.nullable(),
55961
56097
  /**
55962
56098
  * True while the appliance asks for its filter to be cleaned (smart-filter, filter-system or
55963
56099
  * combined care-and-filter reminder raised); false when every such reminder reads clear; null
@@ -64773,60 +64909,17 @@ method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserI
64773
64909
  auth: "admin",
64774
64910
  access: "delete"
64775
64911
  });
64776
- /**
64777
- * Robot-vacuum cap. Models HA `vacuum.*` entities — anything with a
64778
- * cleaning lifecycle plus a return-to-base / locate surface and an
64779
- * optional fan-speed selector.
64780
- *
64781
- * State follows HA's canonical vacuum lifecycle: `idle` / `cleaning` /
64782
- * `paused` / `returning` / `docked` / `error`. `batteryLevel`
64783
- * (0..100) is nullable — some vacuums don't report a battery
64784
- * percentage. `fanSpeed` is the current speed token (provider-verbatim,
64785
- * e.g. `'standard'` / `'turbo'`) and `availableFanSpeeds` lists the
64786
- * tokens the hardware accepts so the UI renders only supported choices.
64787
- *
64788
- * The `setFanSpeed` method takes the bare `speed` token — the provider
64789
- * validates it against the vacuum's own list. `locate` triggers the
64790
- * find-me chirp; `returnToBase` sends it home.
64791
- *
64792
- * Consumable / waste tanks: `cleanWater` / `dirtyWater` / `detergent` /
64793
- * `dustBin` each carry a nullable `{ level (0..100 %), status ('ok' |
64794
- * 'low' | 'full') }` reading. Native providers (e.g. Dreame, Roborock)
64795
- * SHOULD populate whichever tanks the hardware has — leave a field `null`
64796
- * only when the device has no such tank at all, and use a `TankStatus`
64797
- * with both inner fields `null` when the tank exists but its level is
64798
- * currently unknown. HA `vacuum.*` entities expose no per-tank telemetry,
64799
- * so the HA provider leaves all four `null`.
64800
- */
64801
- var VacuumStateSchema = _enum([
64802
- "idle",
64803
- "cleaning",
64804
- "paused",
64805
- "returning",
64806
- "docked",
64807
- "drying",
64808
- "error"
64809
- ]);
64810
- /**
64811
- * One consumable / waste tank on a robot vacuum (clean-water, dirty-water,
64812
- * detergent or dust-bin). A tank can report a numeric fill `level` (0..100),
64813
- * a discrete `status` (binary-style hardware), or both. Both `null` means the
64814
- * level is currently unknown; the OWNING field being `null` means the
64815
- * hardware has no such tank at all.
64816
- */
64817
- var TankStatusSchema = object({
64818
- /** Numeric fill 0..100 when the hardware reports a percentage; null otherwise. */
64819
- level: number().min(0).max(100).nullable(),
64820
- /** Discrete state when the hardware is binary-mode; null otherwise. */
64821
- status: _enum([
64822
- "ok",
64823
- "low",
64824
- "full"
64825
- ]).nullable()
64826
- });
64827
64912
  var VacuumControlStatusSchema = object({
64828
64913
  /** Lifecycle state of the vacuum. */
64829
- state: VacuumStateSchema,
64914
+ state: _enum([
64915
+ "idle",
64916
+ "cleaning",
64917
+ "paused",
64918
+ "returning",
64919
+ "docked",
64920
+ "drying",
64921
+ "error"
64922
+ ]),
64830
64923
  /** 0..100 battery percentage. Null when the device has no battery
64831
64924
  * reading. */
64832
64925
  batteryLevel: number().min(0).max(100).nullable(),
@@ -64835,14 +64928,6 @@ var VacuumControlStatusSchema = object({
64835
64928
  fanSpeed: string().nullable(),
64836
64929
  /** Speed tokens the hardware accepts — drives the UI selector. */
64837
64930
  availableFanSpeeds: array(string()),
64838
- /** Clean-water (mop) tank. Null when the hardware has no clean-water tank. */
64839
- cleanWater: TankStatusSchema.nullable(),
64840
- /** Dirty-water (recovery) tank. Null when the hardware has no dirty-water tank. */
64841
- dirtyWater: TankStatusSchema.nullable(),
64842
- /** Detergent tank. Null when the hardware has no detergent tank. */
64843
- detergent: TankStatusSchema.nullable(),
64844
- /** Dust bin. Null when the hardware has no dust bin. */
64845
- dustBin: TankStatusSchema.nullable(),
64846
64931
  /** 0..100 cleaning-completion percentage of the current task, or null. */
64847
64932
  progressPercent: number().min(0).max(100).nullable(),
64848
64933
  /** Current error code (0 / null = no error). */
@@ -64904,35 +64989,14 @@ var vacuumControlCapability = {
64904
64989
  */
64905
64990
  durability: "session",
64906
64991
  /**
64907
- * History (D850): recorded series. Tank levels are fixed-object paths (`cleanWater.level`, ...).
64992
+ * History (D850): recorded series. The tanks moved to `consumables` (D915), whose
64993
+ * items are keyed by runtime ids and record no history.
64908
64994
  */
64909
- history: { fields: {
64910
- batteryLevel: {
64911
- kind: "gauge",
64912
- unit: "%",
64913
- deadband: 2
64914
- },
64915
- "cleanWater.level": {
64916
- kind: "gauge",
64917
- unit: "%",
64918
- deadband: 2
64919
- },
64920
- "dirtyWater.level": {
64921
- kind: "gauge",
64922
- unit: "%",
64923
- deadband: 2
64924
- },
64925
- "detergent.level": {
64926
- kind: "gauge",
64927
- unit: "%",
64928
- deadband: 2
64929
- },
64930
- "dustBin.level": {
64931
- kind: "gauge",
64932
- unit: "%",
64933
- deadband: 2
64934
- }
64935
- } }
64995
+ history: { fields: { batteryLevel: {
64996
+ kind: "gauge",
64997
+ unit: "%",
64998
+ deadband: 2
64999
+ } } }
64936
65000
  };
64937
65001
  var ValveStatusSchema = object({
64938
65002
  /** Lifecycle state of the valve. */
@@ -69326,6 +69390,12 @@ Object.freeze({
69326
69390
  addonId: null,
69327
69391
  access: "create"
69328
69392
  },
69393
+ "deviceHistory.deleteOrphanSeries": {
69394
+ capName: "device-history",
69395
+ capScope: "system",
69396
+ addonId: null,
69397
+ access: "delete"
69398
+ },
69329
69399
  "deviceHistory.getDeviceEnabled": {
69330
69400
  capName: "device-history",
69331
69401
  capScope: "system",
@@ -69344,6 +69414,12 @@ Object.freeze({
69344
69414
  addonId: null,
69345
69415
  access: "view"
69346
69416
  },
69417
+ "deviceHistory.listOrphanSeries": {
69418
+ capName: "device-history",
69419
+ capScope: "system",
69420
+ addonId: null,
69421
+ access: "view"
69422
+ },
69347
69423
  "deviceHistory.listSeries": {
69348
69424
  capName: "device-history",
69349
69425
  capScope: "system",
@@ -79415,7 +79491,7 @@ var STATE_SUMMARY_VARS = [
79415
79491
  ([...RULE_TEXT], [...COMBINED_ALARM]),
79416
79492
  ([...RULE_TEXT], [...DEVICE_EVENTS]),
79417
79493
  ([...RULE_TEXT], [...BATTERY, ...CONSUMABLE]),
79418
- ([...RULE_TEXT], [...CONSUMABLE]),
79494
+ ([...RULE_TEXT], [...CONSUMABLE, ...TANK]),
79419
79495
  ([...RULE_TEXT], [...TANK]),
79420
79496
  [...RULE_TEXT],
79421
79497
  ([...RULE_TEXT], [...UPDATES, ...ALERT_EPISODE]),
package/dist/addon.mjs CHANGED
@@ -5431,7 +5431,7 @@ var ZodIssueCode = {
5431
5431
  var ZodFirstPartyTypeKind;
5432
5432
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5433
5433
  //#endregion
5434
- //#region ../types/dist/sleep-DJFUfKvA.mjs
5434
+ //#region ../types/dist/sleep-CUp20JkO.mjs
5435
5435
  /**
5436
5436
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5437
5437
  * window to float samples (D455).
@@ -8323,7 +8323,11 @@ var ContributionSectionSchema = object({
8323
8323
  literal(4)
8324
8324
  ]).optional(),
8325
8325
  tab: string().optional(),
8326
- location: _enum(["settings", "top-tab"]).optional(),
8326
+ location: _enum([
8327
+ "settings",
8328
+ "top-tab",
8329
+ "hero"
8330
+ ]).optional(),
8327
8331
  order: number().optional(),
8328
8332
  fields: array(any())
8329
8333
  });
@@ -13377,7 +13381,11 @@ var ConfigSectionWithValuesSchema = object({
13377
13381
  literal(4)
13378
13382
  ]).optional(),
13379
13383
  tab: string().optional(),
13380
- location: _enum(["settings", "top-tab"]).optional(),
13384
+ location: _enum([
13385
+ "settings",
13386
+ "top-tab",
13387
+ "hero"
13388
+ ]).optional(),
13381
13389
  order: number().optional(),
13382
13390
  fields: array(any())
13383
13391
  });
@@ -17257,6 +17265,52 @@ var TierStatusSchema = object({
17257
17265
  countedAt: number().nullable()
17258
17266
  });
17259
17267
  /** Operator/diagnostic view: rows per tier, last runs, refusals and drops since boot. */
17268
+ /**
17269
+ * Why a series is orphan. `device-gone`: its device is absent from the
17270
+ * successful device listings (the departure clock). `undeclared`: its `cap:`
17271
+ * key is declared by no capability any more (a field a cap removed).
17272
+ */
17273
+ var DeviceHistoryOrphanReasonSchema = _enum(["device-gone", "undeclared"]);
17274
+ /** Rows held per stored tier. */
17275
+ var TierRowsSchema = object({
17276
+ raw: number().int(),
17277
+ "5m": number().int(),
17278
+ "1h": number().int(),
17279
+ "1d": number().int()
17280
+ });
17281
+ var OrphanSeriesSchema = object({
17282
+ seriesId: number().int(),
17283
+ deviceId: number().int(),
17284
+ key: string(),
17285
+ scope: string(),
17286
+ /** The metric's display name; `null` when its metric row is gone too. */
17287
+ displayName: string().nullable(),
17288
+ reason: DeviceHistoryOrphanReasonSchema,
17289
+ /** `device-gone`: since when the device has been absent; `null` otherwise. */
17290
+ missingSince: number().nullable(),
17291
+ firstTs: number(),
17292
+ lastTs: number(),
17293
+ rows: TierRowsSchema
17294
+ });
17295
+ var DeviceHistoryOrphanDeleteRefusalSchema = _enum([
17296
+ "not-found",
17297
+ "not-orphan",
17298
+ "failed"
17299
+ ]);
17300
+ var OrphanDeleteEntrySchema = discriminatedUnion("ok", [object({
17301
+ seriesId: number().int(),
17302
+ ok: literal(true),
17303
+ deleted: TierRowsSchema
17304
+ }), object({
17305
+ seriesId: number().int(),
17306
+ ok: literal(false),
17307
+ reason: DeviceHistoryOrphanDeleteRefusalSchema
17308
+ })]);
17309
+ var OrphanListSchema = object({
17310
+ series: array(OrphanSeriesSchema).readonly(),
17311
+ /** More orphans exist than {@link DEVICE_HISTORY_ORPHAN_LIST_MAX}. */
17312
+ truncated: boolean()
17313
+ });
17260
17314
  var DeviceHistoryStatusSchema = object({
17261
17315
  startedAt: number(),
17262
17316
  /** The store is declared, series loaded and the first reconcile has answered. */
@@ -17354,7 +17408,10 @@ method(object({ deviceId: number().int() }), array(SeriesInfoSchema).readonly())
17354
17408
  }), object({ enabled: boolean() }), {
17355
17409
  kind: "mutation",
17356
17410
  auth: "admin"
17357
- }), method(object({}), DeviceHistoryStatusSchema, { auth: "admin" });
17411
+ }), method(object({}), DeviceHistoryStatusSchema, { auth: "admin" }), method(object({}), OrphanListSchema, { auth: "admin" }), method(object({ seriesIds: array(number().int()).min(1).max(50) }), object({ results: array(OrphanDeleteEntrySchema).readonly() }), {
17412
+ kind: "mutation",
17413
+ auth: "admin"
17414
+ });
17358
17415
  var DeviceCaStatusSchema = discriminatedUnion("state", [
17359
17416
  object({ state: literal("absent") }),
17360
17417
  object({
@@ -55309,17 +55366,69 @@ var connectivityCapability = {
55309
55366
  volatileStateFields: ["lastChangedAt"]
55310
55367
  };
55311
55368
  /**
55312
- * Generic device-consumables capability — surfaces a device's
55313
- * maintenance items (vacuum filters/brushes, replaceable cartridges,
55314
- * descaling cycles, …) with their remaining life and an optional
55315
- * "Replaced" reset action. Device-agnostic: any provider that knows its
55316
- * device tracks consumables can register it; the cap declares no
55317
- * vocabulary of its own — the provider names each item verbatim.
55369
+ * Generic device-consumables capability — the ONE place a device reports what
55370
+ * it uses up or fills: wear parts (vacuum filters/brushes, cartridges,
55371
+ * descaling cycles), supplies it draws from (a vacuum's clean-water tank and
55372
+ * detergent, a dishwasher's salt and rinse aid) and waste it collects (a dirty
55373
+ * water tank, a dust bin). Each item carries its remaining life or fill and an
55374
+ * optional "Replaced" reset action. Device-agnostic: any provider that knows
55375
+ * its device tracks consumables registers it; the provider names each item
55376
+ * verbatim and says which `kind` it is.
55377
+ *
55378
+ * The admin UI renders it as ONE collapsible section directly under the
55379
+ * device page's hero card (`placement: 'hero'`), for every device bound to
55380
+ * this cap — never drawn by a device type's hero card itself (D915).
55318
55381
  *
55319
55382
  * Like `childLayout`, the cap is INERT until a provider sets items: no
55320
55383
  * provider populates it by guessing (no HA inference). The UI renders a
55321
55384
  * "No consumables reported" placeholder when `items` is empty.
55322
55385
  */
55386
+ /**
55387
+ * What an item IS, which decides which direction is bad:
55388
+ * - `wear` — a part that wears out (a brush, a filter); low life is bad.
55389
+ * - `supply` — something the device draws from (clean water, detergent,
55390
+ * salt, rinse aid); low or empty is bad.
55391
+ * - `waste` — something the device fills (dirty water, a dust bin); full is
55392
+ * bad.
55393
+ * Absent = `wear`.
55394
+ */
55395
+ var ConsumableKindSchema = _enum([
55396
+ "wear",
55397
+ "supply",
55398
+ "waste"
55399
+ ]);
55400
+ /**
55401
+ * What an item LOOKS like, which decides how a client draws it — independent
55402
+ * of `kind`, which decides which direction is bad:
55403
+ * - `part` — a part that wears (a brush, a filter, a mop pad): a wear bar,
55404
+ * remaining time and a reset.
55405
+ * - `tank` — a container of liquid (clean water, dirty water): a fill gauge.
55406
+ * - `product` — something bought and refilled (detergent, salt, rinse aid):
55407
+ * a stepped level and "refill".
55408
+ * - `bin` — a container that collects waste (a dust bin): a fill gauge
55409
+ * that warns when full.
55410
+ * Absent = derived from the kind ({@link consumableFormOf}).
55411
+ */
55412
+ var ConsumableFormSchema = _enum([
55413
+ "part",
55414
+ "tank",
55415
+ "product",
55416
+ "bin"
55417
+ ]);
55418
+ /** The provider's own discrete verdict on an item. */
55419
+ var ConsumableStatusSchema = _enum([
55420
+ "ok",
55421
+ "low",
55422
+ "empty",
55423
+ "full",
55424
+ "replace"
55425
+ ]);
55426
+ _enum([
55427
+ "ok",
55428
+ "low",
55429
+ "empty",
55430
+ "full"
55431
+ ]);
55323
55432
  /** Units a remaining-life counter is reported in. Closed: the panel renders
55324
55433
  * each. */
55325
55434
  var ConsumableRemainingUnitSchema = _enum([
@@ -55334,18 +55443,23 @@ var ConsumableRemainingSchema = object({
55334
55443
  unit: ConsumableRemainingUnitSchema
55335
55444
  });
55336
55445
  /** A single consumable item. Either a continuous `level` (remaining
55337
- * life %) or a discrete `status` may be known — both may be null when a
55338
- * provider only knows the item exists. `level` and `status` are not
55339
- * mutually exclusive; a provider may report both. */
55446
+ * life %, or fill % for a `supply` / `waste` item) or a discrete `status`
55447
+ * may be known — both may be null when a provider only knows the item
55448
+ * exists. `level` and `status` are not mutually exclusive; a provider may
55449
+ * report both. */
55340
55450
  var ConsumableItemSchema = object({
55341
55451
  /** Stable id, e.g. 'main-brush'. */
55342
55452
  key: string().min(1),
55343
55453
  /** Display name. */
55344
55454
  label: string().min(1),
55345
- /** Remaining life % when known (0..100). */
55455
+ /** Remaining life % (`wear`) or fill % (`supply`, `waste`) when known (0..100). */
55346
55456
  level: number().min(0).max(100).nullable(),
55347
- /** Discrete state when known (binary mode). */
55348
- status: _enum(["ok", "replace"]).nullable(),
55457
+ /** The provider's discrete verdict when known (binary mode). */
55458
+ status: ConsumableStatusSchema.nullable(),
55459
+ /** What the item is — decides whether low or full is bad. Absent = `wear`. */
55460
+ kind: ConsumableKindSchema.optional(),
55461
+ /** How the item is drawn (part, tank, product, bin). Absent = derived from `kind`. */
55462
+ form: ConsumableFormSchema.optional(),
55349
55463
  /** Ms epoch of the last replace, when known. */
55350
55464
  lastResetAt: number().nullable(),
55351
55465
  /** Whether `reset()` is meaningful for this item. */
@@ -55368,7 +55482,7 @@ var consumablesCapability = {
55368
55482
  kind: "widget",
55369
55483
  widgetId: "host/consumables-panel",
55370
55484
  tab: "consumables",
55371
- topTab: true,
55485
+ placement: "hero",
55372
55486
  label: "Consumables",
55373
55487
  order: 5
55374
55488
  } },
@@ -55429,9 +55543,37 @@ reset: method(object({
55429
55543
  */
55430
55544
  durability: "restored",
55431
55545
  /**
55432
- * History (D850): none — `items` is an array keyed by runtime ids; a history path never enters it.
55546
+ * History (D850, D917): one series per (item field, item `key`) — the item key
55547
+ * is the series scope, the item `label` names it. A vacuum tank's fill, a
55548
+ * brush's remaining life and a dishwasher's salt are each recorded the moment
55549
+ * their provider reports them; an item that appears later gets its series.
55433
55550
  */
55434
- history: "none",
55551
+ history: {
55552
+ fields: {},
55553
+ items: {
55554
+ path: "items",
55555
+ key: "key",
55556
+ label: "label",
55557
+ fields: {
55558
+ level: {
55559
+ kind: "gauge",
55560
+ unit: "%",
55561
+ deadband: 2,
55562
+ displayName: "Level"
55563
+ },
55564
+ status: {
55565
+ kind: "enum",
55566
+ displayName: "Status"
55567
+ },
55568
+ "remaining.value": {
55569
+ kind: "gauge",
55570
+ unitFrom: "remaining.unit",
55571
+ deadband: 1,
55572
+ displayName: "Remaining"
55573
+ }
55574
+ }
55575
+ }
55576
+ },
55435
55577
  /** Clocks, not content: a re-read that changed no item costs no commit. */
55436
55578
  volatileStateFields: ["lastChangedAt", "lastFetchedAt"]
55437
55579
  };
@@ -55846,8 +55988,9 @@ onStatusChanged: { data: object({
55846
55988
  volatileStateFields: ["lastChangedAt"]
55847
55989
  };
55848
55990
  /**
55849
- * Smart-dishwasher cap — program lifecycle, door / remote-start gates,
55850
- * consumable levels (salt, rinse aid) and common program options.
55991
+ * Smart-dishwasher cap — program lifecycle, door / remote-start gates and
55992
+ * common program options. Salt and rinse aid are NOT here: they are items of
55993
+ * the device's `consumables` cap, like every other device's (D915).
55851
55994
  *
55852
55995
  * Sources: native Bosch Home Connect (`dishwasher` device type). Reusable
55853
55996
  * by any integration that exposes the same program / option surface.
@@ -55895,11 +56038,6 @@ var DishwasherAvailabilitySchema = _enum([
55895
56038
  "offline",
55896
56039
  "description-missing"
55897
56040
  ]);
55898
- var DishwasherConsumableLevelSchema = _enum([
55899
- "ok",
55900
- "low",
55901
- "empty"
55902
- ]);
55903
56041
  var DishwasherStatusSchema = object({
55904
56042
  availability: DishwasherAvailabilitySchema,
55905
56043
  /** Coarse state for compact surfaces; `unavailable` whenever the appliance state is not known. */
@@ -55932,8 +56070,6 @@ var DishwasherStatusSchema = object({
55932
56070
  powerOn: boolean().nullable(),
55933
56071
  /** The raw power state (`On`, `Off`, `Standby`, …); null when not known. */
55934
56072
  powerState: string().nullable(),
55935
- saltLevel: DishwasherConsumableLevelSchema.nullable(),
55936
- rinseAidLevel: DishwasherConsumableLevelSchema.nullable(),
55937
56073
  /**
55938
56074
  * True while the appliance asks for its filter to be cleaned (smart-filter, filter-system or
55939
56075
  * combined care-and-filter reminder raised); false when every such reminder reads clear; null
@@ -64749,60 +64885,17 @@ method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserI
64749
64885
  auth: "admin",
64750
64886
  access: "delete"
64751
64887
  });
64752
- /**
64753
- * Robot-vacuum cap. Models HA `vacuum.*` entities — anything with a
64754
- * cleaning lifecycle plus a return-to-base / locate surface and an
64755
- * optional fan-speed selector.
64756
- *
64757
- * State follows HA's canonical vacuum lifecycle: `idle` / `cleaning` /
64758
- * `paused` / `returning` / `docked` / `error`. `batteryLevel`
64759
- * (0..100) is nullable — some vacuums don't report a battery
64760
- * percentage. `fanSpeed` is the current speed token (provider-verbatim,
64761
- * e.g. `'standard'` / `'turbo'`) and `availableFanSpeeds` lists the
64762
- * tokens the hardware accepts so the UI renders only supported choices.
64763
- *
64764
- * The `setFanSpeed` method takes the bare `speed` token — the provider
64765
- * validates it against the vacuum's own list. `locate` triggers the
64766
- * find-me chirp; `returnToBase` sends it home.
64767
- *
64768
- * Consumable / waste tanks: `cleanWater` / `dirtyWater` / `detergent` /
64769
- * `dustBin` each carry a nullable `{ level (0..100 %), status ('ok' |
64770
- * 'low' | 'full') }` reading. Native providers (e.g. Dreame, Roborock)
64771
- * SHOULD populate whichever tanks the hardware has — leave a field `null`
64772
- * only when the device has no such tank at all, and use a `TankStatus`
64773
- * with both inner fields `null` when the tank exists but its level is
64774
- * currently unknown. HA `vacuum.*` entities expose no per-tank telemetry,
64775
- * so the HA provider leaves all four `null`.
64776
- */
64777
- var VacuumStateSchema = _enum([
64778
- "idle",
64779
- "cleaning",
64780
- "paused",
64781
- "returning",
64782
- "docked",
64783
- "drying",
64784
- "error"
64785
- ]);
64786
- /**
64787
- * One consumable / waste tank on a robot vacuum (clean-water, dirty-water,
64788
- * detergent or dust-bin). A tank can report a numeric fill `level` (0..100),
64789
- * a discrete `status` (binary-style hardware), or both. Both `null` means the
64790
- * level is currently unknown; the OWNING field being `null` means the
64791
- * hardware has no such tank at all.
64792
- */
64793
- var TankStatusSchema = object({
64794
- /** Numeric fill 0..100 when the hardware reports a percentage; null otherwise. */
64795
- level: number().min(0).max(100).nullable(),
64796
- /** Discrete state when the hardware is binary-mode; null otherwise. */
64797
- status: _enum([
64798
- "ok",
64799
- "low",
64800
- "full"
64801
- ]).nullable()
64802
- });
64803
64888
  var VacuumControlStatusSchema = object({
64804
64889
  /** Lifecycle state of the vacuum. */
64805
- state: VacuumStateSchema,
64890
+ state: _enum([
64891
+ "idle",
64892
+ "cleaning",
64893
+ "paused",
64894
+ "returning",
64895
+ "docked",
64896
+ "drying",
64897
+ "error"
64898
+ ]),
64806
64899
  /** 0..100 battery percentage. Null when the device has no battery
64807
64900
  * reading. */
64808
64901
  batteryLevel: number().min(0).max(100).nullable(),
@@ -64811,14 +64904,6 @@ var VacuumControlStatusSchema = object({
64811
64904
  fanSpeed: string().nullable(),
64812
64905
  /** Speed tokens the hardware accepts — drives the UI selector. */
64813
64906
  availableFanSpeeds: array(string()),
64814
- /** Clean-water (mop) tank. Null when the hardware has no clean-water tank. */
64815
- cleanWater: TankStatusSchema.nullable(),
64816
- /** Dirty-water (recovery) tank. Null when the hardware has no dirty-water tank. */
64817
- dirtyWater: TankStatusSchema.nullable(),
64818
- /** Detergent tank. Null when the hardware has no detergent tank. */
64819
- detergent: TankStatusSchema.nullable(),
64820
- /** Dust bin. Null when the hardware has no dust bin. */
64821
- dustBin: TankStatusSchema.nullable(),
64822
64907
  /** 0..100 cleaning-completion percentage of the current task, or null. */
64823
64908
  progressPercent: number().min(0).max(100).nullable(),
64824
64909
  /** Current error code (0 / null = no error). */
@@ -64880,35 +64965,14 @@ var vacuumControlCapability = {
64880
64965
  */
64881
64966
  durability: "session",
64882
64967
  /**
64883
- * History (D850): recorded series. Tank levels are fixed-object paths (`cleanWater.level`, ...).
64968
+ * History (D850): recorded series. The tanks moved to `consumables` (D915), whose
64969
+ * items are keyed by runtime ids and record no history.
64884
64970
  */
64885
- history: { fields: {
64886
- batteryLevel: {
64887
- kind: "gauge",
64888
- unit: "%",
64889
- deadband: 2
64890
- },
64891
- "cleanWater.level": {
64892
- kind: "gauge",
64893
- unit: "%",
64894
- deadband: 2
64895
- },
64896
- "dirtyWater.level": {
64897
- kind: "gauge",
64898
- unit: "%",
64899
- deadband: 2
64900
- },
64901
- "detergent.level": {
64902
- kind: "gauge",
64903
- unit: "%",
64904
- deadband: 2
64905
- },
64906
- "dustBin.level": {
64907
- kind: "gauge",
64908
- unit: "%",
64909
- deadband: 2
64910
- }
64911
- } }
64971
+ history: { fields: { batteryLevel: {
64972
+ kind: "gauge",
64973
+ unit: "%",
64974
+ deadband: 2
64975
+ } } }
64912
64976
  };
64913
64977
  var ValveStatusSchema = object({
64914
64978
  /** Lifecycle state of the valve. */
@@ -69302,6 +69366,12 @@ Object.freeze({
69302
69366
  addonId: null,
69303
69367
  access: "create"
69304
69368
  },
69369
+ "deviceHistory.deleteOrphanSeries": {
69370
+ capName: "device-history",
69371
+ capScope: "system",
69372
+ addonId: null,
69373
+ access: "delete"
69374
+ },
69305
69375
  "deviceHistory.getDeviceEnabled": {
69306
69376
  capName: "device-history",
69307
69377
  capScope: "system",
@@ -69320,6 +69390,12 @@ Object.freeze({
69320
69390
  addonId: null,
69321
69391
  access: "view"
69322
69392
  },
69393
+ "deviceHistory.listOrphanSeries": {
69394
+ capName: "device-history",
69395
+ capScope: "system",
69396
+ addonId: null,
69397
+ access: "view"
69398
+ },
69323
69399
  "deviceHistory.listSeries": {
69324
69400
  capName: "device-history",
69325
69401
  capScope: "system",
@@ -79391,7 +79467,7 @@ var STATE_SUMMARY_VARS = [
79391
79467
  ([...RULE_TEXT], [...COMBINED_ALARM]),
79392
79468
  ([...RULE_TEXT], [...DEVICE_EVENTS]),
79393
79469
  ([...RULE_TEXT], [...BATTERY, ...CONSUMABLE]),
79394
- ([...RULE_TEXT], [...CONSUMABLE]),
79470
+ ([...RULE_TEXT], [...CONSUMABLE, ...TANK]),
79395
79471
  ([...RULE_TEXT], [...TANK]),
79396
79472
  [...RULE_TEXT],
79397
79473
  ([...RULE_TEXT], [...UPDATES, ...ALERT_EPISODE]),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-rtsp",
3
- "version": "1.2.143",
3
+ "version": "1.2.144",
4
4
  "description": "Generic RTSP camera device provider addon for CamStack",
5
5
  "keywords": [
6
6
  "camstack",