@camstack/addon-provider-velux 0.2.143 → 0.2.145

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 +255 -120
  2. package/dist/addon.mjs +255 -120
  3. package/package.json +1 -1
package/dist/addon.js 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
  });
@@ -13270,7 +13274,11 @@ var ConfigSectionWithValuesSchema = object({
13270
13274
  literal(4)
13271
13275
  ]).optional(),
13272
13276
  tab: string().optional(),
13273
- location: _enum(["settings", "top-tab"]).optional(),
13277
+ location: _enum([
13278
+ "settings",
13279
+ "top-tab",
13280
+ "hero"
13281
+ ]).optional(),
13274
13282
  order: number().optional(),
13275
13283
  fields: array(any())
13276
13284
  });
@@ -17150,6 +17158,52 @@ var TierStatusSchema = object({
17150
17158
  countedAt: number().nullable()
17151
17159
  });
17152
17160
  /** Operator/diagnostic view: rows per tier, last runs, refusals and drops since boot. */
17161
+ /**
17162
+ * Why a series is orphan. `device-gone`: its device is absent from the
17163
+ * successful device listings (the departure clock). `undeclared`: its `cap:`
17164
+ * key is declared by no capability any more (a field a cap removed).
17165
+ */
17166
+ var DeviceHistoryOrphanReasonSchema = _enum(["device-gone", "undeclared"]);
17167
+ /** Rows held per stored tier. */
17168
+ var TierRowsSchema = object({
17169
+ raw: number().int(),
17170
+ "5m": number().int(),
17171
+ "1h": number().int(),
17172
+ "1d": number().int()
17173
+ });
17174
+ var OrphanSeriesSchema = object({
17175
+ seriesId: number().int(),
17176
+ deviceId: number().int(),
17177
+ key: string(),
17178
+ scope: string(),
17179
+ /** The metric's display name; `null` when its metric row is gone too. */
17180
+ displayName: string().nullable(),
17181
+ reason: DeviceHistoryOrphanReasonSchema,
17182
+ /** `device-gone`: since when the device has been absent; `null` otherwise. */
17183
+ missingSince: number().nullable(),
17184
+ firstTs: number(),
17185
+ lastTs: number(),
17186
+ rows: TierRowsSchema
17187
+ });
17188
+ var DeviceHistoryOrphanDeleteRefusalSchema = _enum([
17189
+ "not-found",
17190
+ "not-orphan",
17191
+ "failed"
17192
+ ]);
17193
+ var OrphanDeleteEntrySchema = discriminatedUnion("ok", [object({
17194
+ seriesId: number().int(),
17195
+ ok: literal(true),
17196
+ deleted: TierRowsSchema
17197
+ }), object({
17198
+ seriesId: number().int(),
17199
+ ok: literal(false),
17200
+ reason: DeviceHistoryOrphanDeleteRefusalSchema
17201
+ })]);
17202
+ var OrphanListSchema = object({
17203
+ series: array(OrphanSeriesSchema).readonly(),
17204
+ /** More orphans exist than {@link DEVICE_HISTORY_ORPHAN_LIST_MAX}. */
17205
+ truncated: boolean()
17206
+ });
17153
17207
  var DeviceHistoryStatusSchema = object({
17154
17208
  startedAt: number(),
17155
17209
  /** The store is declared, series loaded and the first reconcile has answered. */
@@ -17247,7 +17301,10 @@ method(object({ deviceId: number().int() }), array(SeriesInfoSchema).readonly())
17247
17301
  }), object({ enabled: boolean() }), {
17248
17302
  kind: "mutation",
17249
17303
  auth: "admin"
17250
- }), method(object({}), DeviceHistoryStatusSchema, { auth: "admin" });
17304
+ }), 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() }), {
17305
+ kind: "mutation",
17306
+ auth: "admin"
17307
+ });
17251
17308
  var DeviceCaStatusSchema = discriminatedUnion("state", [
17252
17309
  object({ state: literal("absent") }),
17253
17310
  object({
@@ -50314,6 +50371,19 @@ var NodeInferenceDeviceSchema = object({
50314
50371
  /** Whether the node's live probe reports the device as usable right now. */
50315
50372
  available: boolean(),
50316
50373
  /**
50374
+ * Is the device on the node at all (D919)? `present` — the live probe
50375
+ * reported it; `absent` — the probe ANSWERED and did not report it, so only
50376
+ * its stored settings remain (unplugged, moved to another node): never
50377
+ * eligible, whatever its stored `enabled`, and forgettable with
50378
+ * `forgetInferenceDevice`; `unknown` — the probe did not answer, nothing is
50379
+ * claimed (D315). Optional only for an orchestrator older than the field.
50380
+ */
50381
+ presence: _enum([
50382
+ "present",
50383
+ "absent",
50384
+ "unknown"
50385
+ ]).optional(),
50386
+ /**
50317
50387
  * Whether this device participates in dispatch. AUTO default (spec C2):
50318
50388
  * accelerators are opt-OUT (a discovered NPU/iGPU/Coral/ANE with no stored
50319
50389
  * entry is `true`); CPU is opt-IN (`false` by default — the fallback pool,
@@ -50539,7 +50609,13 @@ method(object({
50539
50609
  }), object({ success: literal(true) }), {
50540
50610
  kind: "mutation",
50541
50611
  auth: "admin"
50542
- }), method(object({ nodeId: string() }), NodeInferenceDevicesSchema), method(object({ agentNodeId: string() }), object({
50612
+ }), method(object({ nodeId: string() }), NodeInferenceDevicesSchema), method(object({
50613
+ agentNodeId: string(),
50614
+ deviceKey: string()
50615
+ }), object({ success: literal(true) }), {
50616
+ kind: "mutation",
50617
+ auth: "admin"
50618
+ }), method(object({ agentNodeId: string() }), object({
50543
50619
  success: literal(true),
50544
50620
  /** Hardware-aware default detection model now in effect on the node (null when unresolvable). */
50545
50621
  effectiveModelId: string().nullable(),
@@ -55203,17 +55279,69 @@ var connectivityCapability = {
55203
55279
  volatileStateFields: ["lastChangedAt"]
55204
55280
  };
55205
55281
  /**
55206
- * Generic device-consumables capability — surfaces a device's
55207
- * maintenance items (vacuum filters/brushes, replaceable cartridges,
55208
- * descaling cycles, …) with their remaining life and an optional
55209
- * "Replaced" reset action. Device-agnostic: any provider that knows its
55210
- * device tracks consumables can register it; the cap declares no
55211
- * vocabulary of its own — the provider names each item verbatim.
55282
+ * Generic device-consumables capability — the ONE place a device reports what
55283
+ * it uses up or fills: wear parts (vacuum filters/brushes, cartridges,
55284
+ * descaling cycles), supplies it draws from (a vacuum's clean-water tank and
55285
+ * detergent, a dishwasher's salt and rinse aid) and waste it collects (a dirty
55286
+ * water tank, a dust bin). Each item carries its remaining life or fill and an
55287
+ * optional "Replaced" reset action. Device-agnostic: any provider that knows
55288
+ * its device tracks consumables registers it; the provider names each item
55289
+ * verbatim and says which `kind` it is.
55290
+ *
55291
+ * The admin UI renders it as ONE collapsible section directly under the
55292
+ * device page's hero card (`placement: 'hero'`), for every device bound to
55293
+ * this cap — never drawn by a device type's hero card itself (D915).
55212
55294
  *
55213
55295
  * Like `childLayout`, the cap is INERT until a provider sets items: no
55214
55296
  * provider populates it by guessing (no HA inference). The UI renders a
55215
55297
  * "No consumables reported" placeholder when `items` is empty.
55216
55298
  */
55299
+ /**
55300
+ * What an item IS, which decides which direction is bad:
55301
+ * - `wear` — a part that wears out (a brush, a filter); low life is bad.
55302
+ * - `supply` — something the device draws from (clean water, detergent,
55303
+ * salt, rinse aid); low or empty is bad.
55304
+ * - `waste` — something the device fills (dirty water, a dust bin); full is
55305
+ * bad.
55306
+ * Absent = `wear`.
55307
+ */
55308
+ var ConsumableKindSchema = _enum([
55309
+ "wear",
55310
+ "supply",
55311
+ "waste"
55312
+ ]);
55313
+ /**
55314
+ * What an item LOOKS like, which decides how a client draws it — independent
55315
+ * of `kind`, which decides which direction is bad:
55316
+ * - `part` — a part that wears (a brush, a filter, a mop pad): a wear bar,
55317
+ * remaining time and a reset.
55318
+ * - `tank` — a container of liquid (clean water, dirty water): a fill gauge.
55319
+ * - `product` — something bought and refilled (detergent, salt, rinse aid):
55320
+ * a stepped level and "refill".
55321
+ * - `bin` — a container that collects waste (a dust bin): a fill gauge
55322
+ * that warns when full.
55323
+ * Absent = derived from the kind ({@link consumableFormOf}).
55324
+ */
55325
+ var ConsumableFormSchema = _enum([
55326
+ "part",
55327
+ "tank",
55328
+ "product",
55329
+ "bin"
55330
+ ]);
55331
+ /** The provider's own discrete verdict on an item. */
55332
+ var ConsumableStatusSchema = _enum([
55333
+ "ok",
55334
+ "low",
55335
+ "empty",
55336
+ "full",
55337
+ "replace"
55338
+ ]);
55339
+ _enum([
55340
+ "ok",
55341
+ "low",
55342
+ "empty",
55343
+ "full"
55344
+ ]);
55217
55345
  /** Units a remaining-life counter is reported in. Closed: the panel renders
55218
55346
  * each. */
55219
55347
  var ConsumableRemainingUnitSchema = _enum([
@@ -55228,18 +55356,23 @@ var ConsumableRemainingSchema = object({
55228
55356
  unit: ConsumableRemainingUnitSchema
55229
55357
  });
55230
55358
  /** A single consumable item. Either a continuous `level` (remaining
55231
- * life %) or a discrete `status` may be known — both may be null when a
55232
- * provider only knows the item exists. `level` and `status` are not
55233
- * mutually exclusive; a provider may report both. */
55359
+ * life %, or fill % for a `supply` / `waste` item) or a discrete `status`
55360
+ * may be known — both may be null when a provider only knows the item
55361
+ * exists. `level` and `status` are not mutually exclusive; a provider may
55362
+ * report both. */
55234
55363
  var ConsumableItemSchema = object({
55235
55364
  /** Stable id, e.g. 'main-brush'. */
55236
55365
  key: string().min(1),
55237
55366
  /** Display name. */
55238
55367
  label: string().min(1),
55239
- /** Remaining life % when known (0..100). */
55368
+ /** Remaining life % (`wear`) or fill % (`supply`, `waste`) when known (0..100). */
55240
55369
  level: number().min(0).max(100).nullable(),
55241
- /** Discrete state when known (binary mode). */
55242
- status: _enum(["ok", "replace"]).nullable(),
55370
+ /** The provider's discrete verdict when known (binary mode). */
55371
+ status: ConsumableStatusSchema.nullable(),
55372
+ /** What the item is — decides whether low or full is bad. Absent = `wear`. */
55373
+ kind: ConsumableKindSchema.optional(),
55374
+ /** How the item is drawn (part, tank, product, bin). Absent = derived from `kind`. */
55375
+ form: ConsumableFormSchema.optional(),
55243
55376
  /** Ms epoch of the last replace, when known. */
55244
55377
  lastResetAt: number().nullable(),
55245
55378
  /** Whether `reset()` is meaningful for this item. */
@@ -55262,7 +55395,7 @@ var consumablesCapability = {
55262
55395
  kind: "widget",
55263
55396
  widgetId: "host/consumables-panel",
55264
55397
  tab: "consumables",
55265
- topTab: true,
55398
+ placement: "hero",
55266
55399
  label: "Consumables",
55267
55400
  order: 5
55268
55401
  } },
@@ -55323,9 +55456,37 @@ reset: method(object({
55323
55456
  */
55324
55457
  durability: "restored",
55325
55458
  /**
55326
- * History (D850): none — `items` is an array keyed by runtime ids; a history path never enters it.
55459
+ * History (D850, D917): one series per (item field, item `key`) — the item key
55460
+ * is the series scope, the item `label` names it. A vacuum tank's fill, a
55461
+ * brush's remaining life and a dishwasher's salt are each recorded the moment
55462
+ * their provider reports them; an item that appears later gets its series.
55327
55463
  */
55328
- history: "none",
55464
+ history: {
55465
+ fields: {},
55466
+ items: {
55467
+ path: "items",
55468
+ key: "key",
55469
+ label: "label",
55470
+ fields: {
55471
+ level: {
55472
+ kind: "gauge",
55473
+ unit: "%",
55474
+ deadband: 2,
55475
+ displayName: "Level"
55476
+ },
55477
+ status: {
55478
+ kind: "enum",
55479
+ displayName: "Status"
55480
+ },
55481
+ "remaining.value": {
55482
+ kind: "gauge",
55483
+ unitFrom: "remaining.unit",
55484
+ deadband: 1,
55485
+ displayName: "Remaining"
55486
+ }
55487
+ }
55488
+ }
55489
+ },
55329
55490
  /** Clocks, not content: a re-read that changed no item costs no commit. */
55330
55491
  volatileStateFields: ["lastChangedAt", "lastFetchedAt"]
55331
55492
  };
@@ -55740,8 +55901,9 @@ onStatusChanged: { data: object({
55740
55901
  volatileStateFields: ["lastChangedAt"]
55741
55902
  };
55742
55903
  /**
55743
- * Smart-dishwasher cap — program lifecycle, door / remote-start gates,
55744
- * consumable levels (salt, rinse aid) and common program options.
55904
+ * Smart-dishwasher cap — program lifecycle, door / remote-start gates and
55905
+ * common program options. Salt and rinse aid are NOT here: they are items of
55906
+ * the device's `consumables` cap, like every other device's (D915).
55745
55907
  *
55746
55908
  * Sources: native Bosch Home Connect (`dishwasher` device type). Reusable
55747
55909
  * by any integration that exposes the same program / option surface.
@@ -55789,11 +55951,6 @@ var DishwasherAvailabilitySchema = _enum([
55789
55951
  "offline",
55790
55952
  "description-missing"
55791
55953
  ]);
55792
- var DishwasherConsumableLevelSchema = _enum([
55793
- "ok",
55794
- "low",
55795
- "empty"
55796
- ]);
55797
55954
  var DishwasherStatusSchema = object({
55798
55955
  availability: DishwasherAvailabilitySchema,
55799
55956
  /** Coarse state for compact surfaces; `unavailable` whenever the appliance state is not known. */
@@ -55826,8 +55983,6 @@ var DishwasherStatusSchema = object({
55826
55983
  powerOn: boolean().nullable(),
55827
55984
  /** The raw power state (`On`, `Off`, `Standby`, …); null when not known. */
55828
55985
  powerState: string().nullable(),
55829
- saltLevel: DishwasherConsumableLevelSchema.nullable(),
55830
- rinseAidLevel: DishwasherConsumableLevelSchema.nullable(),
55831
55986
  /**
55832
55987
  * True while the appliance asks for its filter to be cleaned (smart-filter, filter-system or
55833
55988
  * combined care-and-filter reminder raised); false when every such reminder reads clear; null
@@ -58703,7 +58858,7 @@ var motionTriggerCapability = {
58703
58858
  enabled: boolean()
58704
58859
  }), _void(), {
58705
58860
  kind: "mutation",
58706
- auth: "admin"
58861
+ auth: "protected"
58707
58862
  }) },
58708
58863
  events: { onMotionTriggerChanged: { data: object({
58709
58864
  deviceId: number(),
@@ -59433,6 +59588,13 @@ var TopologyNodeSchema = object({
59433
59588
  cpuModel: string().nullable(),
59434
59589
  cpuCores: number(),
59435
59590
  memoryMB: number(),
59591
+ /**
59592
+ * The inference RUNTIMES installed on the node (`pythonRuntimes`: onnx,
59593
+ * openvino, edgetpu …) — not its devices. An installed runtime says nothing
59594
+ * about whether its hardware is there (a Coral delegate stays installed
59595
+ * after the stick leaves, D919); the live device set is
59596
+ * `pipelineOrchestrator.getNodeInferenceDevices`.
59597
+ */
59436
59598
  engines: array(string()).readonly(),
59437
59599
  isHub: boolean(),
59438
59600
  isOnline: boolean(),
@@ -60550,7 +60712,28 @@ var ResolvedInferenceConfigSchema = object({
60550
60712
  format: ModelFormatSchema,
60551
60713
  reason: string()
60552
60714
  });
60553
- method(_void(), PlatformCapabilitiesSchema), method(_void(), HardwareInfoSchema), method(object({ requirements: array(ModelRequirementSchema).readonly() }), ResolvedInferenceConfigSchema), method(object({ prefer: HwAccelBackendInputSchema }), HwAccelResolutionSchema);
60715
+ /**
60716
+ * The answer of an accelerator rescan (D919): the node's device list after
60717
+ * the re-probe, what changed, and the evidence that decided the Coral answer
60718
+ * (`usbBus` — could the USB bus be read at all; `decidedBy` — USB ids, the PCI
60719
+ * bus, the installed-delegate fallback, or nothing).
60720
+ */
60721
+ var AcceleratorRescanSchema = object({
60722
+ devices: array(InferenceDeviceDescriptorSchema).readonly(),
60723
+ appeared: array(string()).readonly(),
60724
+ disappeared: array(string()).readonly(),
60725
+ usbBus: _enum(["observed", "unobservable"]),
60726
+ decidedBy: _enum([
60727
+ "usb-ids",
60728
+ "pci",
60729
+ "delegate-fallback",
60730
+ "none"
60731
+ ])
60732
+ });
60733
+ method(_void(), PlatformCapabilitiesSchema), method(_void(), HardwareInfoSchema), method(object({ requirements: array(ModelRequirementSchema).readonly() }), ResolvedInferenceConfigSchema), method(object({ prefer: HwAccelBackendInputSchema }), HwAccelResolutionSchema), method(_void(), AcceleratorRescanSchema, {
60734
+ kind: "mutation",
60735
+ auth: "admin"
60736
+ });
60554
60737
  /**
60555
60738
  * Multi-metric electrical meter. One slice can carry any combination
60556
60739
  * of instantaneous power (W), cumulative energy (kWh), voltage (V),
@@ -64643,60 +64826,17 @@ method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserI
64643
64826
  auth: "admin",
64644
64827
  access: "delete"
64645
64828
  });
64646
- /**
64647
- * Robot-vacuum cap. Models HA `vacuum.*` entities — anything with a
64648
- * cleaning lifecycle plus a return-to-base / locate surface and an
64649
- * optional fan-speed selector.
64650
- *
64651
- * State follows HA's canonical vacuum lifecycle: `idle` / `cleaning` /
64652
- * `paused` / `returning` / `docked` / `error`. `batteryLevel`
64653
- * (0..100) is nullable — some vacuums don't report a battery
64654
- * percentage. `fanSpeed` is the current speed token (provider-verbatim,
64655
- * e.g. `'standard'` / `'turbo'`) and `availableFanSpeeds` lists the
64656
- * tokens the hardware accepts so the UI renders only supported choices.
64657
- *
64658
- * The `setFanSpeed` method takes the bare `speed` token — the provider
64659
- * validates it against the vacuum's own list. `locate` triggers the
64660
- * find-me chirp; `returnToBase` sends it home.
64661
- *
64662
- * Consumable / waste tanks: `cleanWater` / `dirtyWater` / `detergent` /
64663
- * `dustBin` each carry a nullable `{ level (0..100 %), status ('ok' |
64664
- * 'low' | 'full') }` reading. Native providers (e.g. Dreame, Roborock)
64665
- * SHOULD populate whichever tanks the hardware has — leave a field `null`
64666
- * only when the device has no such tank at all, and use a `TankStatus`
64667
- * with both inner fields `null` when the tank exists but its level is
64668
- * currently unknown. HA `vacuum.*` entities expose no per-tank telemetry,
64669
- * so the HA provider leaves all four `null`.
64670
- */
64671
- var VacuumStateSchema = _enum([
64672
- "idle",
64673
- "cleaning",
64674
- "paused",
64675
- "returning",
64676
- "docked",
64677
- "drying",
64678
- "error"
64679
- ]);
64680
- /**
64681
- * One consumable / waste tank on a robot vacuum (clean-water, dirty-water,
64682
- * detergent or dust-bin). A tank can report a numeric fill `level` (0..100),
64683
- * a discrete `status` (binary-style hardware), or both. Both `null` means the
64684
- * level is currently unknown; the OWNING field being `null` means the
64685
- * hardware has no such tank at all.
64686
- */
64687
- var TankStatusSchema = object({
64688
- /** Numeric fill 0..100 when the hardware reports a percentage; null otherwise. */
64689
- level: number().min(0).max(100).nullable(),
64690
- /** Discrete state when the hardware is binary-mode; null otherwise. */
64691
- status: _enum([
64692
- "ok",
64693
- "low",
64694
- "full"
64695
- ]).nullable()
64696
- });
64697
64829
  var VacuumControlStatusSchema = object({
64698
64830
  /** Lifecycle state of the vacuum. */
64699
- state: VacuumStateSchema,
64831
+ state: _enum([
64832
+ "idle",
64833
+ "cleaning",
64834
+ "paused",
64835
+ "returning",
64836
+ "docked",
64837
+ "drying",
64838
+ "error"
64839
+ ]),
64700
64840
  /** 0..100 battery percentage. Null when the device has no battery
64701
64841
  * reading. */
64702
64842
  batteryLevel: number().min(0).max(100).nullable(),
@@ -64705,14 +64845,6 @@ var VacuumControlStatusSchema = object({
64705
64845
  fanSpeed: string().nullable(),
64706
64846
  /** Speed tokens the hardware accepts — drives the UI selector. */
64707
64847
  availableFanSpeeds: array(string()),
64708
- /** Clean-water (mop) tank. Null when the hardware has no clean-water tank. */
64709
- cleanWater: TankStatusSchema.nullable(),
64710
- /** Dirty-water (recovery) tank. Null when the hardware has no dirty-water tank. */
64711
- dirtyWater: TankStatusSchema.nullable(),
64712
- /** Detergent tank. Null when the hardware has no detergent tank. */
64713
- detergent: TankStatusSchema.nullable(),
64714
- /** Dust bin. Null when the hardware has no dust bin. */
64715
- dustBin: TankStatusSchema.nullable(),
64716
64848
  /** 0..100 cleaning-completion percentage of the current task, or null. */
64717
64849
  progressPercent: number().min(0).max(100).nullable(),
64718
64850
  /** Current error code (0 / null = no error). */
@@ -64774,35 +64906,14 @@ var vacuumControlCapability = {
64774
64906
  */
64775
64907
  durability: "session",
64776
64908
  /**
64777
- * History (D850): recorded series. Tank levels are fixed-object paths (`cleanWater.level`, ...).
64909
+ * History (D850): recorded series. The tanks moved to `consumables` (D915), whose
64910
+ * items are keyed by runtime ids and record no history.
64778
64911
  */
64779
- history: { fields: {
64780
- batteryLevel: {
64781
- kind: "gauge",
64782
- unit: "%",
64783
- deadband: 2
64784
- },
64785
- "cleanWater.level": {
64786
- kind: "gauge",
64787
- unit: "%",
64788
- deadband: 2
64789
- },
64790
- "dirtyWater.level": {
64791
- kind: "gauge",
64792
- unit: "%",
64793
- deadband: 2
64794
- },
64795
- "detergent.level": {
64796
- kind: "gauge",
64797
- unit: "%",
64798
- deadband: 2
64799
- },
64800
- "dustBin.level": {
64801
- kind: "gauge",
64802
- unit: "%",
64803
- deadband: 2
64804
- }
64805
- } }
64912
+ history: { fields: { batteryLevel: {
64913
+ kind: "gauge",
64914
+ unit: "%",
64915
+ deadband: 2
64916
+ } } }
64806
64917
  };
64807
64918
  var ValveStatusSchema = object({
64808
64919
  /** Lifecycle state of the valve. */
@@ -69196,6 +69307,12 @@ Object.freeze({
69196
69307
  addonId: null,
69197
69308
  access: "create"
69198
69309
  },
69310
+ "deviceHistory.deleteOrphanSeries": {
69311
+ capName: "device-history",
69312
+ capScope: "system",
69313
+ addonId: null,
69314
+ access: "delete"
69315
+ },
69199
69316
  "deviceHistory.getDeviceEnabled": {
69200
69317
  capName: "device-history",
69201
69318
  capScope: "system",
@@ -69214,6 +69331,12 @@ Object.freeze({
69214
69331
  addonId: null,
69215
69332
  access: "view"
69216
69333
  },
69334
+ "deviceHistory.listOrphanSeries": {
69335
+ capName: "device-history",
69336
+ capScope: "system",
69337
+ addonId: null,
69338
+ access: "view"
69339
+ },
69217
69340
  "deviceHistory.listSeries": {
69218
69341
  capName: "device-history",
69219
69342
  capScope: "system",
@@ -72838,6 +72961,12 @@ Object.freeze({
72838
72961
  addonId: null,
72839
72962
  access: "delete"
72840
72963
  },
72964
+ "pipelineOrchestrator.forgetInferenceDevice": {
72965
+ capName: "pipeline-orchestrator",
72966
+ capScope: "system",
72967
+ addonId: null,
72968
+ access: "delete"
72969
+ },
72841
72970
  "pipelineOrchestrator.getAgentLoad": {
72842
72971
  capName: "pipeline-orchestrator",
72843
72972
  capScope: "system",
@@ -73414,6 +73543,12 @@ Object.freeze({
73414
73543
  addonId: null,
73415
73544
  access: "view"
73416
73545
  },
73546
+ "platformProbe.rescanAccelerators": {
73547
+ capName: "platform-probe",
73548
+ capScope: "system",
73549
+ addonId: null,
73550
+ access: "create"
73551
+ },
73417
73552
  "platformProbe.resolveHwAccel": {
73418
73553
  capName: "platform-probe",
73419
73554
  capScope: "system",
@@ -79219,7 +79354,7 @@ var STATE_SUMMARY_VARS = [
79219
79354
  ([...RULE_TEXT], [...COMBINED_ALARM]),
79220
79355
  ([...RULE_TEXT], [...DEVICE_EVENTS]),
79221
79356
  ([...RULE_TEXT], [...BATTERY, ...CONSUMABLE]),
79222
- ([...RULE_TEXT], [...CONSUMABLE]),
79357
+ ([...RULE_TEXT], [...CONSUMABLE, ...TANK]),
79223
79358
  ([...RULE_TEXT], [...TANK]),
79224
79359
  [...RULE_TEXT],
79225
79360
  ([...RULE_TEXT], [...UPDATES, ...ALERT_EPISODE]),
package/dist/addon.mjs CHANGED
@@ -5430,7 +5430,7 @@ var ZodIssueCode = {
5430
5430
  var ZodFirstPartyTypeKind;
5431
5431
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5432
5432
  //#endregion
5433
- //#region ../types/dist/sleep-DJFUfKvA.mjs
5433
+ //#region ../types/dist/sleep-CUp20JkO.mjs
5434
5434
  /**
5435
5435
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5436
5436
  * window to float samples (D455).
@@ -8322,7 +8322,11 @@ var ContributionSectionSchema = object({
8322
8322
  literal(4)
8323
8323
  ]).optional(),
8324
8324
  tab: string().optional(),
8325
- location: _enum(["settings", "top-tab"]).optional(),
8325
+ location: _enum([
8326
+ "settings",
8327
+ "top-tab",
8328
+ "hero"
8329
+ ]).optional(),
8326
8330
  order: number().optional(),
8327
8331
  fields: array(any())
8328
8332
  });
@@ -13269,7 +13273,11 @@ var ConfigSectionWithValuesSchema = object({
13269
13273
  literal(4)
13270
13274
  ]).optional(),
13271
13275
  tab: string().optional(),
13272
- location: _enum(["settings", "top-tab"]).optional(),
13276
+ location: _enum([
13277
+ "settings",
13278
+ "top-tab",
13279
+ "hero"
13280
+ ]).optional(),
13273
13281
  order: number().optional(),
13274
13282
  fields: array(any())
13275
13283
  });
@@ -17149,6 +17157,52 @@ var TierStatusSchema = object({
17149
17157
  countedAt: number().nullable()
17150
17158
  });
17151
17159
  /** Operator/diagnostic view: rows per tier, last runs, refusals and drops since boot. */
17160
+ /**
17161
+ * Why a series is orphan. `device-gone`: its device is absent from the
17162
+ * successful device listings (the departure clock). `undeclared`: its `cap:`
17163
+ * key is declared by no capability any more (a field a cap removed).
17164
+ */
17165
+ var DeviceHistoryOrphanReasonSchema = _enum(["device-gone", "undeclared"]);
17166
+ /** Rows held per stored tier. */
17167
+ var TierRowsSchema = object({
17168
+ raw: number().int(),
17169
+ "5m": number().int(),
17170
+ "1h": number().int(),
17171
+ "1d": number().int()
17172
+ });
17173
+ var OrphanSeriesSchema = object({
17174
+ seriesId: number().int(),
17175
+ deviceId: number().int(),
17176
+ key: string(),
17177
+ scope: string(),
17178
+ /** The metric's display name; `null` when its metric row is gone too. */
17179
+ displayName: string().nullable(),
17180
+ reason: DeviceHistoryOrphanReasonSchema,
17181
+ /** `device-gone`: since when the device has been absent; `null` otherwise. */
17182
+ missingSince: number().nullable(),
17183
+ firstTs: number(),
17184
+ lastTs: number(),
17185
+ rows: TierRowsSchema
17186
+ });
17187
+ var DeviceHistoryOrphanDeleteRefusalSchema = _enum([
17188
+ "not-found",
17189
+ "not-orphan",
17190
+ "failed"
17191
+ ]);
17192
+ var OrphanDeleteEntrySchema = discriminatedUnion("ok", [object({
17193
+ seriesId: number().int(),
17194
+ ok: literal(true),
17195
+ deleted: TierRowsSchema
17196
+ }), object({
17197
+ seriesId: number().int(),
17198
+ ok: literal(false),
17199
+ reason: DeviceHistoryOrphanDeleteRefusalSchema
17200
+ })]);
17201
+ var OrphanListSchema = object({
17202
+ series: array(OrphanSeriesSchema).readonly(),
17203
+ /** More orphans exist than {@link DEVICE_HISTORY_ORPHAN_LIST_MAX}. */
17204
+ truncated: boolean()
17205
+ });
17152
17206
  var DeviceHistoryStatusSchema = object({
17153
17207
  startedAt: number(),
17154
17208
  /** The store is declared, series loaded and the first reconcile has answered. */
@@ -17246,7 +17300,10 @@ method(object({ deviceId: number().int() }), array(SeriesInfoSchema).readonly())
17246
17300
  }), object({ enabled: boolean() }), {
17247
17301
  kind: "mutation",
17248
17302
  auth: "admin"
17249
- }), method(object({}), DeviceHistoryStatusSchema, { auth: "admin" });
17303
+ }), 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() }), {
17304
+ kind: "mutation",
17305
+ auth: "admin"
17306
+ });
17250
17307
  var DeviceCaStatusSchema = discriminatedUnion("state", [
17251
17308
  object({ state: literal("absent") }),
17252
17309
  object({
@@ -50313,6 +50370,19 @@ var NodeInferenceDeviceSchema = object({
50313
50370
  /** Whether the node's live probe reports the device as usable right now. */
50314
50371
  available: boolean(),
50315
50372
  /**
50373
+ * Is the device on the node at all (D919)? `present` — the live probe
50374
+ * reported it; `absent` — the probe ANSWERED and did not report it, so only
50375
+ * its stored settings remain (unplugged, moved to another node): never
50376
+ * eligible, whatever its stored `enabled`, and forgettable with
50377
+ * `forgetInferenceDevice`; `unknown` — the probe did not answer, nothing is
50378
+ * claimed (D315). Optional only for an orchestrator older than the field.
50379
+ */
50380
+ presence: _enum([
50381
+ "present",
50382
+ "absent",
50383
+ "unknown"
50384
+ ]).optional(),
50385
+ /**
50316
50386
  * Whether this device participates in dispatch. AUTO default (spec C2):
50317
50387
  * accelerators are opt-OUT (a discovered NPU/iGPU/Coral/ANE with no stored
50318
50388
  * entry is `true`); CPU is opt-IN (`false` by default — the fallback pool,
@@ -50538,7 +50608,13 @@ method(object({
50538
50608
  }), object({ success: literal(true) }), {
50539
50609
  kind: "mutation",
50540
50610
  auth: "admin"
50541
- }), method(object({ nodeId: string() }), NodeInferenceDevicesSchema), method(object({ agentNodeId: string() }), object({
50611
+ }), method(object({ nodeId: string() }), NodeInferenceDevicesSchema), method(object({
50612
+ agentNodeId: string(),
50613
+ deviceKey: string()
50614
+ }), object({ success: literal(true) }), {
50615
+ kind: "mutation",
50616
+ auth: "admin"
50617
+ }), method(object({ agentNodeId: string() }), object({
50542
50618
  success: literal(true),
50543
50619
  /** Hardware-aware default detection model now in effect on the node (null when unresolvable). */
50544
50620
  effectiveModelId: string().nullable(),
@@ -55202,17 +55278,69 @@ var connectivityCapability = {
55202
55278
  volatileStateFields: ["lastChangedAt"]
55203
55279
  };
55204
55280
  /**
55205
- * Generic device-consumables capability — surfaces a device's
55206
- * maintenance items (vacuum filters/brushes, replaceable cartridges,
55207
- * descaling cycles, …) with their remaining life and an optional
55208
- * "Replaced" reset action. Device-agnostic: any provider that knows its
55209
- * device tracks consumables can register it; the cap declares no
55210
- * vocabulary of its own — the provider names each item verbatim.
55281
+ * Generic device-consumables capability — the ONE place a device reports what
55282
+ * it uses up or fills: wear parts (vacuum filters/brushes, cartridges,
55283
+ * descaling cycles), supplies it draws from (a vacuum's clean-water tank and
55284
+ * detergent, a dishwasher's salt and rinse aid) and waste it collects (a dirty
55285
+ * water tank, a dust bin). Each item carries its remaining life or fill and an
55286
+ * optional "Replaced" reset action. Device-agnostic: any provider that knows
55287
+ * its device tracks consumables registers it; the provider names each item
55288
+ * verbatim and says which `kind` it is.
55289
+ *
55290
+ * The admin UI renders it as ONE collapsible section directly under the
55291
+ * device page's hero card (`placement: 'hero'`), for every device bound to
55292
+ * this cap — never drawn by a device type's hero card itself (D915).
55211
55293
  *
55212
55294
  * Like `childLayout`, the cap is INERT until a provider sets items: no
55213
55295
  * provider populates it by guessing (no HA inference). The UI renders a
55214
55296
  * "No consumables reported" placeholder when `items` is empty.
55215
55297
  */
55298
+ /**
55299
+ * What an item IS, which decides which direction is bad:
55300
+ * - `wear` — a part that wears out (a brush, a filter); low life is bad.
55301
+ * - `supply` — something the device draws from (clean water, detergent,
55302
+ * salt, rinse aid); low or empty is bad.
55303
+ * - `waste` — something the device fills (dirty water, a dust bin); full is
55304
+ * bad.
55305
+ * Absent = `wear`.
55306
+ */
55307
+ var ConsumableKindSchema = _enum([
55308
+ "wear",
55309
+ "supply",
55310
+ "waste"
55311
+ ]);
55312
+ /**
55313
+ * What an item LOOKS like, which decides how a client draws it — independent
55314
+ * of `kind`, which decides which direction is bad:
55315
+ * - `part` — a part that wears (a brush, a filter, a mop pad): a wear bar,
55316
+ * remaining time and a reset.
55317
+ * - `tank` — a container of liquid (clean water, dirty water): a fill gauge.
55318
+ * - `product` — something bought and refilled (detergent, salt, rinse aid):
55319
+ * a stepped level and "refill".
55320
+ * - `bin` — a container that collects waste (a dust bin): a fill gauge
55321
+ * that warns when full.
55322
+ * Absent = derived from the kind ({@link consumableFormOf}).
55323
+ */
55324
+ var ConsumableFormSchema = _enum([
55325
+ "part",
55326
+ "tank",
55327
+ "product",
55328
+ "bin"
55329
+ ]);
55330
+ /** The provider's own discrete verdict on an item. */
55331
+ var ConsumableStatusSchema = _enum([
55332
+ "ok",
55333
+ "low",
55334
+ "empty",
55335
+ "full",
55336
+ "replace"
55337
+ ]);
55338
+ _enum([
55339
+ "ok",
55340
+ "low",
55341
+ "empty",
55342
+ "full"
55343
+ ]);
55216
55344
  /** Units a remaining-life counter is reported in. Closed: the panel renders
55217
55345
  * each. */
55218
55346
  var ConsumableRemainingUnitSchema = _enum([
@@ -55227,18 +55355,23 @@ var ConsumableRemainingSchema = object({
55227
55355
  unit: ConsumableRemainingUnitSchema
55228
55356
  });
55229
55357
  /** A single consumable item. Either a continuous `level` (remaining
55230
- * life %) or a discrete `status` may be known — both may be null when a
55231
- * provider only knows the item exists. `level` and `status` are not
55232
- * mutually exclusive; a provider may report both. */
55358
+ * life %, or fill % for a `supply` / `waste` item) or a discrete `status`
55359
+ * may be known — both may be null when a provider only knows the item
55360
+ * exists. `level` and `status` are not mutually exclusive; a provider may
55361
+ * report both. */
55233
55362
  var ConsumableItemSchema = object({
55234
55363
  /** Stable id, e.g. 'main-brush'. */
55235
55364
  key: string().min(1),
55236
55365
  /** Display name. */
55237
55366
  label: string().min(1),
55238
- /** Remaining life % when known (0..100). */
55367
+ /** Remaining life % (`wear`) or fill % (`supply`, `waste`) when known (0..100). */
55239
55368
  level: number().min(0).max(100).nullable(),
55240
- /** Discrete state when known (binary mode). */
55241
- status: _enum(["ok", "replace"]).nullable(),
55369
+ /** The provider's discrete verdict when known (binary mode). */
55370
+ status: ConsumableStatusSchema.nullable(),
55371
+ /** What the item is — decides whether low or full is bad. Absent = `wear`. */
55372
+ kind: ConsumableKindSchema.optional(),
55373
+ /** How the item is drawn (part, tank, product, bin). Absent = derived from `kind`. */
55374
+ form: ConsumableFormSchema.optional(),
55242
55375
  /** Ms epoch of the last replace, when known. */
55243
55376
  lastResetAt: number().nullable(),
55244
55377
  /** Whether `reset()` is meaningful for this item. */
@@ -55261,7 +55394,7 @@ var consumablesCapability = {
55261
55394
  kind: "widget",
55262
55395
  widgetId: "host/consumables-panel",
55263
55396
  tab: "consumables",
55264
- topTab: true,
55397
+ placement: "hero",
55265
55398
  label: "Consumables",
55266
55399
  order: 5
55267
55400
  } },
@@ -55322,9 +55455,37 @@ reset: method(object({
55322
55455
  */
55323
55456
  durability: "restored",
55324
55457
  /**
55325
- * History (D850): none — `items` is an array keyed by runtime ids; a history path never enters it.
55458
+ * History (D850, D917): one series per (item field, item `key`) — the item key
55459
+ * is the series scope, the item `label` names it. A vacuum tank's fill, a
55460
+ * brush's remaining life and a dishwasher's salt are each recorded the moment
55461
+ * their provider reports them; an item that appears later gets its series.
55326
55462
  */
55327
- history: "none",
55463
+ history: {
55464
+ fields: {},
55465
+ items: {
55466
+ path: "items",
55467
+ key: "key",
55468
+ label: "label",
55469
+ fields: {
55470
+ level: {
55471
+ kind: "gauge",
55472
+ unit: "%",
55473
+ deadband: 2,
55474
+ displayName: "Level"
55475
+ },
55476
+ status: {
55477
+ kind: "enum",
55478
+ displayName: "Status"
55479
+ },
55480
+ "remaining.value": {
55481
+ kind: "gauge",
55482
+ unitFrom: "remaining.unit",
55483
+ deadband: 1,
55484
+ displayName: "Remaining"
55485
+ }
55486
+ }
55487
+ }
55488
+ },
55328
55489
  /** Clocks, not content: a re-read that changed no item costs no commit. */
55329
55490
  volatileStateFields: ["lastChangedAt", "lastFetchedAt"]
55330
55491
  };
@@ -55739,8 +55900,9 @@ onStatusChanged: { data: object({
55739
55900
  volatileStateFields: ["lastChangedAt"]
55740
55901
  };
55741
55902
  /**
55742
- * Smart-dishwasher cap — program lifecycle, door / remote-start gates,
55743
- * consumable levels (salt, rinse aid) and common program options.
55903
+ * Smart-dishwasher cap — program lifecycle, door / remote-start gates and
55904
+ * common program options. Salt and rinse aid are NOT here: they are items of
55905
+ * the device's `consumables` cap, like every other device's (D915).
55744
55906
  *
55745
55907
  * Sources: native Bosch Home Connect (`dishwasher` device type). Reusable
55746
55908
  * by any integration that exposes the same program / option surface.
@@ -55788,11 +55950,6 @@ var DishwasherAvailabilitySchema = _enum([
55788
55950
  "offline",
55789
55951
  "description-missing"
55790
55952
  ]);
55791
- var DishwasherConsumableLevelSchema = _enum([
55792
- "ok",
55793
- "low",
55794
- "empty"
55795
- ]);
55796
55953
  var DishwasherStatusSchema = object({
55797
55954
  availability: DishwasherAvailabilitySchema,
55798
55955
  /** Coarse state for compact surfaces; `unavailable` whenever the appliance state is not known. */
@@ -55825,8 +55982,6 @@ var DishwasherStatusSchema = object({
55825
55982
  powerOn: boolean().nullable(),
55826
55983
  /** The raw power state (`On`, `Off`, `Standby`, …); null when not known. */
55827
55984
  powerState: string().nullable(),
55828
- saltLevel: DishwasherConsumableLevelSchema.nullable(),
55829
- rinseAidLevel: DishwasherConsumableLevelSchema.nullable(),
55830
55985
  /**
55831
55986
  * True while the appliance asks for its filter to be cleaned (smart-filter, filter-system or
55832
55987
  * combined care-and-filter reminder raised); false when every such reminder reads clear; null
@@ -58702,7 +58857,7 @@ var motionTriggerCapability = {
58702
58857
  enabled: boolean()
58703
58858
  }), _void(), {
58704
58859
  kind: "mutation",
58705
- auth: "admin"
58860
+ auth: "protected"
58706
58861
  }) },
58707
58862
  events: { onMotionTriggerChanged: { data: object({
58708
58863
  deviceId: number(),
@@ -59432,6 +59587,13 @@ var TopologyNodeSchema = object({
59432
59587
  cpuModel: string().nullable(),
59433
59588
  cpuCores: number(),
59434
59589
  memoryMB: number(),
59590
+ /**
59591
+ * The inference RUNTIMES installed on the node (`pythonRuntimes`: onnx,
59592
+ * openvino, edgetpu …) — not its devices. An installed runtime says nothing
59593
+ * about whether its hardware is there (a Coral delegate stays installed
59594
+ * after the stick leaves, D919); the live device set is
59595
+ * `pipelineOrchestrator.getNodeInferenceDevices`.
59596
+ */
59435
59597
  engines: array(string()).readonly(),
59436
59598
  isHub: boolean(),
59437
59599
  isOnline: boolean(),
@@ -60549,7 +60711,28 @@ var ResolvedInferenceConfigSchema = object({
60549
60711
  format: ModelFormatSchema,
60550
60712
  reason: string()
60551
60713
  });
60552
- method(_void(), PlatformCapabilitiesSchema), method(_void(), HardwareInfoSchema), method(object({ requirements: array(ModelRequirementSchema).readonly() }), ResolvedInferenceConfigSchema), method(object({ prefer: HwAccelBackendInputSchema }), HwAccelResolutionSchema);
60714
+ /**
60715
+ * The answer of an accelerator rescan (D919): the node's device list after
60716
+ * the re-probe, what changed, and the evidence that decided the Coral answer
60717
+ * (`usbBus` — could the USB bus be read at all; `decidedBy` — USB ids, the PCI
60718
+ * bus, the installed-delegate fallback, or nothing).
60719
+ */
60720
+ var AcceleratorRescanSchema = object({
60721
+ devices: array(InferenceDeviceDescriptorSchema).readonly(),
60722
+ appeared: array(string()).readonly(),
60723
+ disappeared: array(string()).readonly(),
60724
+ usbBus: _enum(["observed", "unobservable"]),
60725
+ decidedBy: _enum([
60726
+ "usb-ids",
60727
+ "pci",
60728
+ "delegate-fallback",
60729
+ "none"
60730
+ ])
60731
+ });
60732
+ method(_void(), PlatformCapabilitiesSchema), method(_void(), HardwareInfoSchema), method(object({ requirements: array(ModelRequirementSchema).readonly() }), ResolvedInferenceConfigSchema), method(object({ prefer: HwAccelBackendInputSchema }), HwAccelResolutionSchema), method(_void(), AcceleratorRescanSchema, {
60733
+ kind: "mutation",
60734
+ auth: "admin"
60735
+ });
60553
60736
  /**
60554
60737
  * Multi-metric electrical meter. One slice can carry any combination
60555
60738
  * of instantaneous power (W), cumulative energy (kWh), voltage (V),
@@ -64642,60 +64825,17 @@ method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserI
64642
64825
  auth: "admin",
64643
64826
  access: "delete"
64644
64827
  });
64645
- /**
64646
- * Robot-vacuum cap. Models HA `vacuum.*` entities — anything with a
64647
- * cleaning lifecycle plus a return-to-base / locate surface and an
64648
- * optional fan-speed selector.
64649
- *
64650
- * State follows HA's canonical vacuum lifecycle: `idle` / `cleaning` /
64651
- * `paused` / `returning` / `docked` / `error`. `batteryLevel`
64652
- * (0..100) is nullable — some vacuums don't report a battery
64653
- * percentage. `fanSpeed` is the current speed token (provider-verbatim,
64654
- * e.g. `'standard'` / `'turbo'`) and `availableFanSpeeds` lists the
64655
- * tokens the hardware accepts so the UI renders only supported choices.
64656
- *
64657
- * The `setFanSpeed` method takes the bare `speed` token — the provider
64658
- * validates it against the vacuum's own list. `locate` triggers the
64659
- * find-me chirp; `returnToBase` sends it home.
64660
- *
64661
- * Consumable / waste tanks: `cleanWater` / `dirtyWater` / `detergent` /
64662
- * `dustBin` each carry a nullable `{ level (0..100 %), status ('ok' |
64663
- * 'low' | 'full') }` reading. Native providers (e.g. Dreame, Roborock)
64664
- * SHOULD populate whichever tanks the hardware has — leave a field `null`
64665
- * only when the device has no such tank at all, and use a `TankStatus`
64666
- * with both inner fields `null` when the tank exists but its level is
64667
- * currently unknown. HA `vacuum.*` entities expose no per-tank telemetry,
64668
- * so the HA provider leaves all four `null`.
64669
- */
64670
- var VacuumStateSchema = _enum([
64671
- "idle",
64672
- "cleaning",
64673
- "paused",
64674
- "returning",
64675
- "docked",
64676
- "drying",
64677
- "error"
64678
- ]);
64679
- /**
64680
- * One consumable / waste tank on a robot vacuum (clean-water, dirty-water,
64681
- * detergent or dust-bin). A tank can report a numeric fill `level` (0..100),
64682
- * a discrete `status` (binary-style hardware), or both. Both `null` means the
64683
- * level is currently unknown; the OWNING field being `null` means the
64684
- * hardware has no such tank at all.
64685
- */
64686
- var TankStatusSchema = object({
64687
- /** Numeric fill 0..100 when the hardware reports a percentage; null otherwise. */
64688
- level: number().min(0).max(100).nullable(),
64689
- /** Discrete state when the hardware is binary-mode; null otherwise. */
64690
- status: _enum([
64691
- "ok",
64692
- "low",
64693
- "full"
64694
- ]).nullable()
64695
- });
64696
64828
  var VacuumControlStatusSchema = object({
64697
64829
  /** Lifecycle state of the vacuum. */
64698
- state: VacuumStateSchema,
64830
+ state: _enum([
64831
+ "idle",
64832
+ "cleaning",
64833
+ "paused",
64834
+ "returning",
64835
+ "docked",
64836
+ "drying",
64837
+ "error"
64838
+ ]),
64699
64839
  /** 0..100 battery percentage. Null when the device has no battery
64700
64840
  * reading. */
64701
64841
  batteryLevel: number().min(0).max(100).nullable(),
@@ -64704,14 +64844,6 @@ var VacuumControlStatusSchema = object({
64704
64844
  fanSpeed: string().nullable(),
64705
64845
  /** Speed tokens the hardware accepts — drives the UI selector. */
64706
64846
  availableFanSpeeds: array(string()),
64707
- /** Clean-water (mop) tank. Null when the hardware has no clean-water tank. */
64708
- cleanWater: TankStatusSchema.nullable(),
64709
- /** Dirty-water (recovery) tank. Null when the hardware has no dirty-water tank. */
64710
- dirtyWater: TankStatusSchema.nullable(),
64711
- /** Detergent tank. Null when the hardware has no detergent tank. */
64712
- detergent: TankStatusSchema.nullable(),
64713
- /** Dust bin. Null when the hardware has no dust bin. */
64714
- dustBin: TankStatusSchema.nullable(),
64715
64847
  /** 0..100 cleaning-completion percentage of the current task, or null. */
64716
64848
  progressPercent: number().min(0).max(100).nullable(),
64717
64849
  /** Current error code (0 / null = no error). */
@@ -64773,35 +64905,14 @@ var vacuumControlCapability = {
64773
64905
  */
64774
64906
  durability: "session",
64775
64907
  /**
64776
- * History (D850): recorded series. Tank levels are fixed-object paths (`cleanWater.level`, ...).
64908
+ * History (D850): recorded series. The tanks moved to `consumables` (D915), whose
64909
+ * items are keyed by runtime ids and record no history.
64777
64910
  */
64778
- history: { fields: {
64779
- batteryLevel: {
64780
- kind: "gauge",
64781
- unit: "%",
64782
- deadband: 2
64783
- },
64784
- "cleanWater.level": {
64785
- kind: "gauge",
64786
- unit: "%",
64787
- deadband: 2
64788
- },
64789
- "dirtyWater.level": {
64790
- kind: "gauge",
64791
- unit: "%",
64792
- deadband: 2
64793
- },
64794
- "detergent.level": {
64795
- kind: "gauge",
64796
- unit: "%",
64797
- deadband: 2
64798
- },
64799
- "dustBin.level": {
64800
- kind: "gauge",
64801
- unit: "%",
64802
- deadband: 2
64803
- }
64804
- } }
64911
+ history: { fields: { batteryLevel: {
64912
+ kind: "gauge",
64913
+ unit: "%",
64914
+ deadband: 2
64915
+ } } }
64805
64916
  };
64806
64917
  var ValveStatusSchema = object({
64807
64918
  /** Lifecycle state of the valve. */
@@ -69195,6 +69306,12 @@ Object.freeze({
69195
69306
  addonId: null,
69196
69307
  access: "create"
69197
69308
  },
69309
+ "deviceHistory.deleteOrphanSeries": {
69310
+ capName: "device-history",
69311
+ capScope: "system",
69312
+ addonId: null,
69313
+ access: "delete"
69314
+ },
69198
69315
  "deviceHistory.getDeviceEnabled": {
69199
69316
  capName: "device-history",
69200
69317
  capScope: "system",
@@ -69213,6 +69330,12 @@ Object.freeze({
69213
69330
  addonId: null,
69214
69331
  access: "view"
69215
69332
  },
69333
+ "deviceHistory.listOrphanSeries": {
69334
+ capName: "device-history",
69335
+ capScope: "system",
69336
+ addonId: null,
69337
+ access: "view"
69338
+ },
69216
69339
  "deviceHistory.listSeries": {
69217
69340
  capName: "device-history",
69218
69341
  capScope: "system",
@@ -72837,6 +72960,12 @@ Object.freeze({
72837
72960
  addonId: null,
72838
72961
  access: "delete"
72839
72962
  },
72963
+ "pipelineOrchestrator.forgetInferenceDevice": {
72964
+ capName: "pipeline-orchestrator",
72965
+ capScope: "system",
72966
+ addonId: null,
72967
+ access: "delete"
72968
+ },
72840
72969
  "pipelineOrchestrator.getAgentLoad": {
72841
72970
  capName: "pipeline-orchestrator",
72842
72971
  capScope: "system",
@@ -73413,6 +73542,12 @@ Object.freeze({
73413
73542
  addonId: null,
73414
73543
  access: "view"
73415
73544
  },
73545
+ "platformProbe.rescanAccelerators": {
73546
+ capName: "platform-probe",
73547
+ capScope: "system",
73548
+ addonId: null,
73549
+ access: "create"
73550
+ },
73416
73551
  "platformProbe.resolveHwAccel": {
73417
73552
  capName: "platform-probe",
73418
73553
  capScope: "system",
@@ -79218,7 +79353,7 @@ var STATE_SUMMARY_VARS = [
79218
79353
  ([...RULE_TEXT], [...COMBINED_ALARM]),
79219
79354
  ([...RULE_TEXT], [...DEVICE_EVENTS]),
79220
79355
  ([...RULE_TEXT], [...BATTERY, ...CONSUMABLE]),
79221
- ([...RULE_TEXT], [...CONSUMABLE]),
79356
+ ([...RULE_TEXT], [...CONSUMABLE, ...TANK]),
79222
79357
  ([...RULE_TEXT], [...TANK]),
79223
79358
  [...RULE_TEXT],
79224
79359
  ([...RULE_TEXT], [...UPDATES, ...ALERT_EPISODE]),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-velux",
3
- "version": "0.2.143",
3
+ "version": "0.2.145",
4
4
  "description": "Velux KLF-200 device-provider addon for CamStack — local-gateway window + shutter covers (positional, no tilt)",
5
5
  "keywords": [
6
6
  "camstack",