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