@camstack/addon-provider-homematic 1.2.153 → 1.2.155

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
@@ -5573,7 +5573,7 @@ var ZodIssueCode = {
5573
5573
  var ZodFirstPartyTypeKind;
5574
5574
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5575
5575
  //#endregion
5576
- //#region ../types/dist/sleep-DJFUfKvA.mjs
5576
+ //#region ../types/dist/sleep-CUp20JkO.mjs
5577
5577
  /**
5578
5578
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5579
5579
  * window to float samples (D455).
@@ -8653,7 +8653,11 @@ var ContributionSectionSchema = object({
8653
8653
  literal(4)
8654
8654
  ]).optional(),
8655
8655
  tab: string().optional(),
8656
- location: _enum(["settings", "top-tab"]).optional(),
8656
+ location: _enum([
8657
+ "settings",
8658
+ "top-tab",
8659
+ "hero"
8660
+ ]).optional(),
8657
8661
  order: number().optional(),
8658
8662
  fields: array(any())
8659
8663
  });
@@ -13586,7 +13590,11 @@ var ConfigSectionWithValuesSchema = object({
13586
13590
  literal(4)
13587
13591
  ]).optional(),
13588
13592
  tab: string().optional(),
13589
- location: _enum(["settings", "top-tab"]).optional(),
13593
+ location: _enum([
13594
+ "settings",
13595
+ "top-tab",
13596
+ "hero"
13597
+ ]).optional(),
13590
13598
  order: number().optional(),
13591
13599
  fields: array(any())
13592
13600
  });
@@ -17515,6 +17523,52 @@ var TierStatusSchema = object({
17515
17523
  countedAt: number().nullable()
17516
17524
  });
17517
17525
  /** Operator/diagnostic view: rows per tier, last runs, refusals and drops since boot. */
17526
+ /**
17527
+ * Why a series is orphan. `device-gone`: its device is absent from the
17528
+ * successful device listings (the departure clock). `undeclared`: its `cap:`
17529
+ * key is declared by no capability any more (a field a cap removed).
17530
+ */
17531
+ var DeviceHistoryOrphanReasonSchema = _enum(["device-gone", "undeclared"]);
17532
+ /** Rows held per stored tier. */
17533
+ var TierRowsSchema = object({
17534
+ raw: number().int(),
17535
+ "5m": number().int(),
17536
+ "1h": number().int(),
17537
+ "1d": number().int()
17538
+ });
17539
+ var OrphanSeriesSchema = object({
17540
+ seriesId: number().int(),
17541
+ deviceId: number().int(),
17542
+ key: string(),
17543
+ scope: string(),
17544
+ /** The metric's display name; `null` when its metric row is gone too. */
17545
+ displayName: string().nullable(),
17546
+ reason: DeviceHistoryOrphanReasonSchema,
17547
+ /** `device-gone`: since when the device has been absent; `null` otherwise. */
17548
+ missingSince: number().nullable(),
17549
+ firstTs: number(),
17550
+ lastTs: number(),
17551
+ rows: TierRowsSchema
17552
+ });
17553
+ var DeviceHistoryOrphanDeleteRefusalSchema = _enum([
17554
+ "not-found",
17555
+ "not-orphan",
17556
+ "failed"
17557
+ ]);
17558
+ var OrphanDeleteEntrySchema = discriminatedUnion("ok", [object({
17559
+ seriesId: number().int(),
17560
+ ok: literal(true),
17561
+ deleted: TierRowsSchema
17562
+ }), object({
17563
+ seriesId: number().int(),
17564
+ ok: literal(false),
17565
+ reason: DeviceHistoryOrphanDeleteRefusalSchema
17566
+ })]);
17567
+ var OrphanListSchema = object({
17568
+ series: array(OrphanSeriesSchema).readonly(),
17569
+ /** More orphans exist than {@link DEVICE_HISTORY_ORPHAN_LIST_MAX}. */
17570
+ truncated: boolean()
17571
+ });
17518
17572
  var DeviceHistoryStatusSchema = object({
17519
17573
  startedAt: number(),
17520
17574
  /** The store is declared, series loaded and the first reconcile has answered. */
@@ -17612,7 +17666,10 @@ method(object({ deviceId: number().int() }), array(SeriesInfoSchema).readonly())
17612
17666
  }), object({ enabled: boolean() }), {
17613
17667
  kind: "mutation",
17614
17668
  auth: "admin"
17615
- }), method(object({}), DeviceHistoryStatusSchema, { auth: "admin" });
17669
+ }), 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() }), {
17670
+ kind: "mutation",
17671
+ auth: "admin"
17672
+ });
17616
17673
  var DeviceCaStatusSchema = discriminatedUnion("state", [
17617
17674
  object({ state: literal("absent") }),
17618
17675
  object({
@@ -50696,6 +50753,19 @@ var NodeInferenceDeviceSchema = object({
50696
50753
  /** Whether the node's live probe reports the device as usable right now. */
50697
50754
  available: boolean(),
50698
50755
  /**
50756
+ * Is the device on the node at all (D919)? `present` — the live probe
50757
+ * reported it; `absent` — the probe ANSWERED and did not report it, so only
50758
+ * its stored settings remain (unplugged, moved to another node): never
50759
+ * eligible, whatever its stored `enabled`, and forgettable with
50760
+ * `forgetInferenceDevice`; `unknown` — the probe did not answer, nothing is
50761
+ * claimed (D315). Optional only for an orchestrator older than the field.
50762
+ */
50763
+ presence: _enum([
50764
+ "present",
50765
+ "absent",
50766
+ "unknown"
50767
+ ]).optional(),
50768
+ /**
50699
50769
  * Whether this device participates in dispatch. AUTO default (spec C2):
50700
50770
  * accelerators are opt-OUT (a discovered NPU/iGPU/Coral/ANE with no stored
50701
50771
  * entry is `true`); CPU is opt-IN (`false` by default — the fallback pool,
@@ -50921,7 +50991,13 @@ method(object({
50921
50991
  }), object({ success: literal(true) }), {
50922
50992
  kind: "mutation",
50923
50993
  auth: "admin"
50924
- }), method(object({ nodeId: string() }), NodeInferenceDevicesSchema), method(object({ agentNodeId: string() }), object({
50994
+ }), method(object({ nodeId: string() }), NodeInferenceDevicesSchema), method(object({
50995
+ agentNodeId: string(),
50996
+ deviceKey: string()
50997
+ }), object({ success: literal(true) }), {
50998
+ kind: "mutation",
50999
+ auth: "admin"
51000
+ }), method(object({ agentNodeId: string() }), object({
50925
51001
  success: literal(true),
50926
51002
  /** Hardware-aware default detection model now in effect on the node (null when unresolvable). */
50927
51003
  effectiveModelId: string().nullable(),
@@ -55585,17 +55661,69 @@ var connectivityCapability = {
55585
55661
  volatileStateFields: ["lastChangedAt"]
55586
55662
  };
55587
55663
  /**
55588
- * Generic device-consumables capability — surfaces a device's
55589
- * maintenance items (vacuum filters/brushes, replaceable cartridges,
55590
- * descaling cycles, …) with their remaining life and an optional
55591
- * "Replaced" reset action. Device-agnostic: any provider that knows its
55592
- * device tracks consumables can register it; the cap declares no
55593
- * vocabulary of its own — the provider names each item verbatim.
55664
+ * Generic device-consumables capability — the ONE place a device reports what
55665
+ * it uses up or fills: wear parts (vacuum filters/brushes, cartridges,
55666
+ * descaling cycles), supplies it draws from (a vacuum's clean-water tank and
55667
+ * detergent, a dishwasher's salt and rinse aid) and waste it collects (a dirty
55668
+ * water tank, a dust bin). Each item carries its remaining life or fill and an
55669
+ * optional "Replaced" reset action. Device-agnostic: any provider that knows
55670
+ * its device tracks consumables registers it; the provider names each item
55671
+ * verbatim and says which `kind` it is.
55672
+ *
55673
+ * The admin UI renders it as ONE collapsible section directly under the
55674
+ * device page's hero card (`placement: 'hero'`), for every device bound to
55675
+ * this cap — never drawn by a device type's hero card itself (D915).
55594
55676
  *
55595
55677
  * Like `childLayout`, the cap is INERT until a provider sets items: no
55596
55678
  * provider populates it by guessing (no HA inference). The UI renders a
55597
55679
  * "No consumables reported" placeholder when `items` is empty.
55598
55680
  */
55681
+ /**
55682
+ * What an item IS, which decides which direction is bad:
55683
+ * - `wear` — a part that wears out (a brush, a filter); low life is bad.
55684
+ * - `supply` — something the device draws from (clean water, detergent,
55685
+ * salt, rinse aid); low or empty is bad.
55686
+ * - `waste` — something the device fills (dirty water, a dust bin); full is
55687
+ * bad.
55688
+ * Absent = `wear`.
55689
+ */
55690
+ var ConsumableKindSchema = _enum([
55691
+ "wear",
55692
+ "supply",
55693
+ "waste"
55694
+ ]);
55695
+ /**
55696
+ * What an item LOOKS like, which decides how a client draws it — independent
55697
+ * of `kind`, which decides which direction is bad:
55698
+ * - `part` — a part that wears (a brush, a filter, a mop pad): a wear bar,
55699
+ * remaining time and a reset.
55700
+ * - `tank` — a container of liquid (clean water, dirty water): a fill gauge.
55701
+ * - `product` — something bought and refilled (detergent, salt, rinse aid):
55702
+ * a stepped level and "refill".
55703
+ * - `bin` — a container that collects waste (a dust bin): a fill gauge
55704
+ * that warns when full.
55705
+ * Absent = derived from the kind ({@link consumableFormOf}).
55706
+ */
55707
+ var ConsumableFormSchema = _enum([
55708
+ "part",
55709
+ "tank",
55710
+ "product",
55711
+ "bin"
55712
+ ]);
55713
+ /** The provider's own discrete verdict on an item. */
55714
+ var ConsumableStatusSchema = _enum([
55715
+ "ok",
55716
+ "low",
55717
+ "empty",
55718
+ "full",
55719
+ "replace"
55720
+ ]);
55721
+ _enum([
55722
+ "ok",
55723
+ "low",
55724
+ "empty",
55725
+ "full"
55726
+ ]);
55599
55727
  /** Units a remaining-life counter is reported in. Closed: the panel renders
55600
55728
  * each. */
55601
55729
  var ConsumableRemainingUnitSchema = _enum([
@@ -55610,18 +55738,23 @@ var ConsumableRemainingSchema = object({
55610
55738
  unit: ConsumableRemainingUnitSchema
55611
55739
  });
55612
55740
  /** A single consumable item. Either a continuous `level` (remaining
55613
- * life %) or a discrete `status` may be known — both may be null when a
55614
- * provider only knows the item exists. `level` and `status` are not
55615
- * mutually exclusive; a provider may report both. */
55741
+ * life %, or fill % for a `supply` / `waste` item) or a discrete `status`
55742
+ * may be known — both may be null when a provider only knows the item
55743
+ * exists. `level` and `status` are not mutually exclusive; a provider may
55744
+ * report both. */
55616
55745
  var ConsumableItemSchema = object({
55617
55746
  /** Stable id, e.g. 'main-brush'. */
55618
55747
  key: string().min(1),
55619
55748
  /** Display name. */
55620
55749
  label: string().min(1),
55621
- /** Remaining life % when known (0..100). */
55750
+ /** Remaining life % (`wear`) or fill % (`supply`, `waste`) when known (0..100). */
55622
55751
  level: number().min(0).max(100).nullable(),
55623
- /** Discrete state when known (binary mode). */
55624
- status: _enum(["ok", "replace"]).nullable(),
55752
+ /** The provider's discrete verdict when known (binary mode). */
55753
+ status: ConsumableStatusSchema.nullable(),
55754
+ /** What the item is — decides whether low or full is bad. Absent = `wear`. */
55755
+ kind: ConsumableKindSchema.optional(),
55756
+ /** How the item is drawn (part, tank, product, bin). Absent = derived from `kind`. */
55757
+ form: ConsumableFormSchema.optional(),
55625
55758
  /** Ms epoch of the last replace, when known. */
55626
55759
  lastResetAt: number().nullable(),
55627
55760
  /** Whether `reset()` is meaningful for this item. */
@@ -55644,7 +55777,7 @@ var consumablesCapability = {
55644
55777
  kind: "widget",
55645
55778
  widgetId: "host/consumables-panel",
55646
55779
  tab: "consumables",
55647
- topTab: true,
55780
+ placement: "hero",
55648
55781
  label: "Consumables",
55649
55782
  order: 5
55650
55783
  } },
@@ -55705,9 +55838,37 @@ reset: method(object({
55705
55838
  */
55706
55839
  durability: "restored",
55707
55840
  /**
55708
- * History (D850): none — `items` is an array keyed by runtime ids; a history path never enters it.
55841
+ * History (D850, D917): one series per (item field, item `key`) — the item key
55842
+ * is the series scope, the item `label` names it. A vacuum tank's fill, a
55843
+ * brush's remaining life and a dishwasher's salt are each recorded the moment
55844
+ * their provider reports them; an item that appears later gets its series.
55709
55845
  */
55710
- history: "none",
55846
+ history: {
55847
+ fields: {},
55848
+ items: {
55849
+ path: "items",
55850
+ key: "key",
55851
+ label: "label",
55852
+ fields: {
55853
+ level: {
55854
+ kind: "gauge",
55855
+ unit: "%",
55856
+ deadband: 2,
55857
+ displayName: "Level"
55858
+ },
55859
+ status: {
55860
+ kind: "enum",
55861
+ displayName: "Status"
55862
+ },
55863
+ "remaining.value": {
55864
+ kind: "gauge",
55865
+ unitFrom: "remaining.unit",
55866
+ deadband: 1,
55867
+ displayName: "Remaining"
55868
+ }
55869
+ }
55870
+ }
55871
+ },
55711
55872
  /** Clocks, not content: a re-read that changed no item costs no commit. */
55712
55873
  volatileStateFields: ["lastChangedAt", "lastFetchedAt"]
55713
55874
  };
@@ -56122,8 +56283,9 @@ onStatusChanged: { data: object({
56122
56283
  volatileStateFields: ["lastChangedAt"]
56123
56284
  };
56124
56285
  /**
56125
- * Smart-dishwasher cap — program lifecycle, door / remote-start gates,
56126
- * consumable levels (salt, rinse aid) and common program options.
56286
+ * Smart-dishwasher cap — program lifecycle, door / remote-start gates and
56287
+ * common program options. Salt and rinse aid are NOT here: they are items of
56288
+ * the device's `consumables` cap, like every other device's (D915).
56127
56289
  *
56128
56290
  * Sources: native Bosch Home Connect (`dishwasher` device type). Reusable
56129
56291
  * by any integration that exposes the same program / option surface.
@@ -56171,11 +56333,6 @@ var DishwasherAvailabilitySchema = _enum([
56171
56333
  "offline",
56172
56334
  "description-missing"
56173
56335
  ]);
56174
- var DishwasherConsumableLevelSchema = _enum([
56175
- "ok",
56176
- "low",
56177
- "empty"
56178
- ]);
56179
56336
  var DishwasherStatusSchema = object({
56180
56337
  availability: DishwasherAvailabilitySchema,
56181
56338
  /** Coarse state for compact surfaces; `unavailable` whenever the appliance state is not known. */
@@ -56208,8 +56365,6 @@ var DishwasherStatusSchema = object({
56208
56365
  powerOn: boolean().nullable(),
56209
56366
  /** The raw power state (`On`, `Off`, `Standby`, …); null when not known. */
56210
56367
  powerState: string().nullable(),
56211
- saltLevel: DishwasherConsumableLevelSchema.nullable(),
56212
- rinseAidLevel: DishwasherConsumableLevelSchema.nullable(),
56213
56368
  /**
56214
56369
  * True while the appliance asks for its filter to be cleaned (smart-filter, filter-system or
56215
56370
  * combined care-and-filter reminder raised); false when every such reminder reads clear; null
@@ -59085,7 +59240,7 @@ var motionTriggerCapability = {
59085
59240
  enabled: boolean()
59086
59241
  }), _void(), {
59087
59242
  kind: "mutation",
59088
- auth: "admin"
59243
+ auth: "protected"
59089
59244
  }) },
59090
59245
  events: { onMotionTriggerChanged: { data: object({
59091
59246
  deviceId: number(),
@@ -59815,6 +59970,13 @@ var TopologyNodeSchema = object({
59815
59970
  cpuModel: string().nullable(),
59816
59971
  cpuCores: number(),
59817
59972
  memoryMB: number(),
59973
+ /**
59974
+ * The inference RUNTIMES installed on the node (`pythonRuntimes`: onnx,
59975
+ * openvino, edgetpu …) — not its devices. An installed runtime says nothing
59976
+ * about whether its hardware is there (a Coral delegate stays installed
59977
+ * after the stick leaves, D919); the live device set is
59978
+ * `pipelineOrchestrator.getNodeInferenceDevices`.
59979
+ */
59818
59980
  engines: array(string()).readonly(),
59819
59981
  isHub: boolean(),
59820
59982
  isOnline: boolean(),
@@ -60932,7 +61094,28 @@ var ResolvedInferenceConfigSchema = object({
60932
61094
  format: ModelFormatSchema,
60933
61095
  reason: string()
60934
61096
  });
60935
- method(_void(), PlatformCapabilitiesSchema), method(_void(), HardwareInfoSchema), method(object({ requirements: array(ModelRequirementSchema).readonly() }), ResolvedInferenceConfigSchema), method(object({ prefer: HwAccelBackendInputSchema }), HwAccelResolutionSchema);
61097
+ /**
61098
+ * The answer of an accelerator rescan (D919): the node's device list after
61099
+ * the re-probe, what changed, and the evidence that decided the Coral answer
61100
+ * (`usbBus` — could the USB bus be read at all; `decidedBy` — USB ids, the PCI
61101
+ * bus, the installed-delegate fallback, or nothing).
61102
+ */
61103
+ var AcceleratorRescanSchema = object({
61104
+ devices: array(InferenceDeviceDescriptorSchema).readonly(),
61105
+ appeared: array(string()).readonly(),
61106
+ disappeared: array(string()).readonly(),
61107
+ usbBus: _enum(["observed", "unobservable"]),
61108
+ decidedBy: _enum([
61109
+ "usb-ids",
61110
+ "pci",
61111
+ "delegate-fallback",
61112
+ "none"
61113
+ ])
61114
+ });
61115
+ method(_void(), PlatformCapabilitiesSchema), method(_void(), HardwareInfoSchema), method(object({ requirements: array(ModelRequirementSchema).readonly() }), ResolvedInferenceConfigSchema), method(object({ prefer: HwAccelBackendInputSchema }), HwAccelResolutionSchema), method(_void(), AcceleratorRescanSchema, {
61116
+ kind: "mutation",
61117
+ auth: "admin"
61118
+ });
60936
61119
  /**
60937
61120
  * Multi-metric electrical meter. One slice can carry any combination
60938
61121
  * of instantaneous power (W), cumulative energy (kWh), voltage (V),
@@ -65025,60 +65208,17 @@ method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserI
65025
65208
  auth: "admin",
65026
65209
  access: "delete"
65027
65210
  });
65028
- /**
65029
- * Robot-vacuum cap. Models HA `vacuum.*` entities — anything with a
65030
- * cleaning lifecycle plus a return-to-base / locate surface and an
65031
- * optional fan-speed selector.
65032
- *
65033
- * State follows HA's canonical vacuum lifecycle: `idle` / `cleaning` /
65034
- * `paused` / `returning` / `docked` / `error`. `batteryLevel`
65035
- * (0..100) is nullable — some vacuums don't report a battery
65036
- * percentage. `fanSpeed` is the current speed token (provider-verbatim,
65037
- * e.g. `'standard'` / `'turbo'`) and `availableFanSpeeds` lists the
65038
- * tokens the hardware accepts so the UI renders only supported choices.
65039
- *
65040
- * The `setFanSpeed` method takes the bare `speed` token — the provider
65041
- * validates it against the vacuum's own list. `locate` triggers the
65042
- * find-me chirp; `returnToBase` sends it home.
65043
- *
65044
- * Consumable / waste tanks: `cleanWater` / `dirtyWater` / `detergent` /
65045
- * `dustBin` each carry a nullable `{ level (0..100 %), status ('ok' |
65046
- * 'low' | 'full') }` reading. Native providers (e.g. Dreame, Roborock)
65047
- * SHOULD populate whichever tanks the hardware has — leave a field `null`
65048
- * only when the device has no such tank at all, and use a `TankStatus`
65049
- * with both inner fields `null` when the tank exists but its level is
65050
- * currently unknown. HA `vacuum.*` entities expose no per-tank telemetry,
65051
- * so the HA provider leaves all four `null`.
65052
- */
65053
- var VacuumStateSchema = _enum([
65054
- "idle",
65055
- "cleaning",
65056
- "paused",
65057
- "returning",
65058
- "docked",
65059
- "drying",
65060
- "error"
65061
- ]);
65062
- /**
65063
- * One consumable / waste tank on a robot vacuum (clean-water, dirty-water,
65064
- * detergent or dust-bin). A tank can report a numeric fill `level` (0..100),
65065
- * a discrete `status` (binary-style hardware), or both. Both `null` means the
65066
- * level is currently unknown; the OWNING field being `null` means the
65067
- * hardware has no such tank at all.
65068
- */
65069
- var TankStatusSchema = object({
65070
- /** Numeric fill 0..100 when the hardware reports a percentage; null otherwise. */
65071
- level: number().min(0).max(100).nullable(),
65072
- /** Discrete state when the hardware is binary-mode; null otherwise. */
65073
- status: _enum([
65074
- "ok",
65075
- "low",
65076
- "full"
65077
- ]).nullable()
65078
- });
65079
65211
  var VacuumControlStatusSchema = object({
65080
65212
  /** Lifecycle state of the vacuum. */
65081
- state: VacuumStateSchema,
65213
+ state: _enum([
65214
+ "idle",
65215
+ "cleaning",
65216
+ "paused",
65217
+ "returning",
65218
+ "docked",
65219
+ "drying",
65220
+ "error"
65221
+ ]),
65082
65222
  /** 0..100 battery percentage. Null when the device has no battery
65083
65223
  * reading. */
65084
65224
  batteryLevel: number().min(0).max(100).nullable(),
@@ -65087,14 +65227,6 @@ var VacuumControlStatusSchema = object({
65087
65227
  fanSpeed: string().nullable(),
65088
65228
  /** Speed tokens the hardware accepts — drives the UI selector. */
65089
65229
  availableFanSpeeds: array(string()),
65090
- /** Clean-water (mop) tank. Null when the hardware has no clean-water tank. */
65091
- cleanWater: TankStatusSchema.nullable(),
65092
- /** Dirty-water (recovery) tank. Null when the hardware has no dirty-water tank. */
65093
- dirtyWater: TankStatusSchema.nullable(),
65094
- /** Detergent tank. Null when the hardware has no detergent tank. */
65095
- detergent: TankStatusSchema.nullable(),
65096
- /** Dust bin. Null when the hardware has no dust bin. */
65097
- dustBin: TankStatusSchema.nullable(),
65098
65230
  /** 0..100 cleaning-completion percentage of the current task, or null. */
65099
65231
  progressPercent: number().min(0).max(100).nullable(),
65100
65232
  /** Current error code (0 / null = no error). */
@@ -65156,35 +65288,14 @@ var vacuumControlCapability = {
65156
65288
  */
65157
65289
  durability: "session",
65158
65290
  /**
65159
- * History (D850): recorded series. Tank levels are fixed-object paths (`cleanWater.level`, ...).
65291
+ * History (D850): recorded series. The tanks moved to `consumables` (D915), whose
65292
+ * items are keyed by runtime ids and record no history.
65160
65293
  */
65161
- history: { fields: {
65162
- batteryLevel: {
65163
- kind: "gauge",
65164
- unit: "%",
65165
- deadband: 2
65166
- },
65167
- "cleanWater.level": {
65168
- kind: "gauge",
65169
- unit: "%",
65170
- deadband: 2
65171
- },
65172
- "dirtyWater.level": {
65173
- kind: "gauge",
65174
- unit: "%",
65175
- deadband: 2
65176
- },
65177
- "detergent.level": {
65178
- kind: "gauge",
65179
- unit: "%",
65180
- deadband: 2
65181
- },
65182
- "dustBin.level": {
65183
- kind: "gauge",
65184
- unit: "%",
65185
- deadband: 2
65186
- }
65187
- } }
65294
+ history: { fields: { batteryLevel: {
65295
+ kind: "gauge",
65296
+ unit: "%",
65297
+ deadband: 2
65298
+ } } }
65188
65299
  };
65189
65300
  var ValveStatusSchema = object({
65190
65301
  /** Lifecycle state of the valve. */
@@ -69578,6 +69689,12 @@ Object.freeze({
69578
69689
  addonId: null,
69579
69690
  access: "create"
69580
69691
  },
69692
+ "deviceHistory.deleteOrphanSeries": {
69693
+ capName: "device-history",
69694
+ capScope: "system",
69695
+ addonId: null,
69696
+ access: "delete"
69697
+ },
69581
69698
  "deviceHistory.getDeviceEnabled": {
69582
69699
  capName: "device-history",
69583
69700
  capScope: "system",
@@ -69596,6 +69713,12 @@ Object.freeze({
69596
69713
  addonId: null,
69597
69714
  access: "view"
69598
69715
  },
69716
+ "deviceHistory.listOrphanSeries": {
69717
+ capName: "device-history",
69718
+ capScope: "system",
69719
+ addonId: null,
69720
+ access: "view"
69721
+ },
69599
69722
  "deviceHistory.listSeries": {
69600
69723
  capName: "device-history",
69601
69724
  capScope: "system",
@@ -73220,6 +73343,12 @@ Object.freeze({
73220
73343
  addonId: null,
73221
73344
  access: "delete"
73222
73345
  },
73346
+ "pipelineOrchestrator.forgetInferenceDevice": {
73347
+ capName: "pipeline-orchestrator",
73348
+ capScope: "system",
73349
+ addonId: null,
73350
+ access: "delete"
73351
+ },
73223
73352
  "pipelineOrchestrator.getAgentLoad": {
73224
73353
  capName: "pipeline-orchestrator",
73225
73354
  capScope: "system",
@@ -73796,6 +73925,12 @@ Object.freeze({
73796
73925
  addonId: null,
73797
73926
  access: "view"
73798
73927
  },
73928
+ "platformProbe.rescanAccelerators": {
73929
+ capName: "platform-probe",
73930
+ capScope: "system",
73931
+ addonId: null,
73932
+ access: "create"
73933
+ },
73799
73934
  "platformProbe.resolveHwAccel": {
73800
73935
  capName: "platform-probe",
73801
73936
  capScope: "system",
@@ -79601,7 +79736,7 @@ var STATE_SUMMARY_VARS = [
79601
79736
  ([...RULE_TEXT], [...COMBINED_ALARM]),
79602
79737
  ([...RULE_TEXT], [...DEVICE_EVENTS]),
79603
79738
  ([...RULE_TEXT], [...BATTERY, ...CONSUMABLE]),
79604
- ([...RULE_TEXT], [...CONSUMABLE]),
79739
+ ([...RULE_TEXT], [...CONSUMABLE, ...TANK]),
79605
79740
  ([...RULE_TEXT], [...TANK]),
79606
79741
  [...RULE_TEXT],
79607
79742
  ([...RULE_TEXT], [...UPDATES, ...ALERT_EPISODE]),
package/dist/addon.mjs CHANGED
@@ -5574,7 +5574,7 @@ var ZodIssueCode = {
5574
5574
  var ZodFirstPartyTypeKind;
5575
5575
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5576
5576
  //#endregion
5577
- //#region ../types/dist/sleep-DJFUfKvA.mjs
5577
+ //#region ../types/dist/sleep-CUp20JkO.mjs
5578
5578
  /**
5579
5579
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5580
5580
  * window to float samples (D455).
@@ -8654,7 +8654,11 @@ var ContributionSectionSchema = object({
8654
8654
  literal(4)
8655
8655
  ]).optional(),
8656
8656
  tab: string().optional(),
8657
- location: _enum(["settings", "top-tab"]).optional(),
8657
+ location: _enum([
8658
+ "settings",
8659
+ "top-tab",
8660
+ "hero"
8661
+ ]).optional(),
8658
8662
  order: number().optional(),
8659
8663
  fields: array(any())
8660
8664
  });
@@ -13587,7 +13591,11 @@ var ConfigSectionWithValuesSchema = object({
13587
13591
  literal(4)
13588
13592
  ]).optional(),
13589
13593
  tab: string().optional(),
13590
- location: _enum(["settings", "top-tab"]).optional(),
13594
+ location: _enum([
13595
+ "settings",
13596
+ "top-tab",
13597
+ "hero"
13598
+ ]).optional(),
13591
13599
  order: number().optional(),
13592
13600
  fields: array(any())
13593
13601
  });
@@ -17516,6 +17524,52 @@ var TierStatusSchema = object({
17516
17524
  countedAt: number().nullable()
17517
17525
  });
17518
17526
  /** Operator/diagnostic view: rows per tier, last runs, refusals and drops since boot. */
17527
+ /**
17528
+ * Why a series is orphan. `device-gone`: its device is absent from the
17529
+ * successful device listings (the departure clock). `undeclared`: its `cap:`
17530
+ * key is declared by no capability any more (a field a cap removed).
17531
+ */
17532
+ var DeviceHistoryOrphanReasonSchema = _enum(["device-gone", "undeclared"]);
17533
+ /** Rows held per stored tier. */
17534
+ var TierRowsSchema = object({
17535
+ raw: number().int(),
17536
+ "5m": number().int(),
17537
+ "1h": number().int(),
17538
+ "1d": number().int()
17539
+ });
17540
+ var OrphanSeriesSchema = object({
17541
+ seriesId: number().int(),
17542
+ deviceId: number().int(),
17543
+ key: string(),
17544
+ scope: string(),
17545
+ /** The metric's display name; `null` when its metric row is gone too. */
17546
+ displayName: string().nullable(),
17547
+ reason: DeviceHistoryOrphanReasonSchema,
17548
+ /** `device-gone`: since when the device has been absent; `null` otherwise. */
17549
+ missingSince: number().nullable(),
17550
+ firstTs: number(),
17551
+ lastTs: number(),
17552
+ rows: TierRowsSchema
17553
+ });
17554
+ var DeviceHistoryOrphanDeleteRefusalSchema = _enum([
17555
+ "not-found",
17556
+ "not-orphan",
17557
+ "failed"
17558
+ ]);
17559
+ var OrphanDeleteEntrySchema = discriminatedUnion("ok", [object({
17560
+ seriesId: number().int(),
17561
+ ok: literal(true),
17562
+ deleted: TierRowsSchema
17563
+ }), object({
17564
+ seriesId: number().int(),
17565
+ ok: literal(false),
17566
+ reason: DeviceHistoryOrphanDeleteRefusalSchema
17567
+ })]);
17568
+ var OrphanListSchema = object({
17569
+ series: array(OrphanSeriesSchema).readonly(),
17570
+ /** More orphans exist than {@link DEVICE_HISTORY_ORPHAN_LIST_MAX}. */
17571
+ truncated: boolean()
17572
+ });
17519
17573
  var DeviceHistoryStatusSchema = object({
17520
17574
  startedAt: number(),
17521
17575
  /** The store is declared, series loaded and the first reconcile has answered. */
@@ -17613,7 +17667,10 @@ method(object({ deviceId: number().int() }), array(SeriesInfoSchema).readonly())
17613
17667
  }), object({ enabled: boolean() }), {
17614
17668
  kind: "mutation",
17615
17669
  auth: "admin"
17616
- }), method(object({}), DeviceHistoryStatusSchema, { auth: "admin" });
17670
+ }), 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() }), {
17671
+ kind: "mutation",
17672
+ auth: "admin"
17673
+ });
17617
17674
  var DeviceCaStatusSchema = discriminatedUnion("state", [
17618
17675
  object({ state: literal("absent") }),
17619
17676
  object({
@@ -50697,6 +50754,19 @@ var NodeInferenceDeviceSchema = object({
50697
50754
  /** Whether the node's live probe reports the device as usable right now. */
50698
50755
  available: boolean(),
50699
50756
  /**
50757
+ * Is the device on the node at all (D919)? `present` — the live probe
50758
+ * reported it; `absent` — the probe ANSWERED and did not report it, so only
50759
+ * its stored settings remain (unplugged, moved to another node): never
50760
+ * eligible, whatever its stored `enabled`, and forgettable with
50761
+ * `forgetInferenceDevice`; `unknown` — the probe did not answer, nothing is
50762
+ * claimed (D315). Optional only for an orchestrator older than the field.
50763
+ */
50764
+ presence: _enum([
50765
+ "present",
50766
+ "absent",
50767
+ "unknown"
50768
+ ]).optional(),
50769
+ /**
50700
50770
  * Whether this device participates in dispatch. AUTO default (spec C2):
50701
50771
  * accelerators are opt-OUT (a discovered NPU/iGPU/Coral/ANE with no stored
50702
50772
  * entry is `true`); CPU is opt-IN (`false` by default — the fallback pool,
@@ -50922,7 +50992,13 @@ method(object({
50922
50992
  }), object({ success: literal(true) }), {
50923
50993
  kind: "mutation",
50924
50994
  auth: "admin"
50925
- }), method(object({ nodeId: string() }), NodeInferenceDevicesSchema), method(object({ agentNodeId: string() }), object({
50995
+ }), method(object({ nodeId: string() }), NodeInferenceDevicesSchema), method(object({
50996
+ agentNodeId: string(),
50997
+ deviceKey: string()
50998
+ }), object({ success: literal(true) }), {
50999
+ kind: "mutation",
51000
+ auth: "admin"
51001
+ }), method(object({ agentNodeId: string() }), object({
50926
51002
  success: literal(true),
50927
51003
  /** Hardware-aware default detection model now in effect on the node (null when unresolvable). */
50928
51004
  effectiveModelId: string().nullable(),
@@ -55586,17 +55662,69 @@ var connectivityCapability = {
55586
55662
  volatileStateFields: ["lastChangedAt"]
55587
55663
  };
55588
55664
  /**
55589
- * Generic device-consumables capability — surfaces a device's
55590
- * maintenance items (vacuum filters/brushes, replaceable cartridges,
55591
- * descaling cycles, …) with their remaining life and an optional
55592
- * "Replaced" reset action. Device-agnostic: any provider that knows its
55593
- * device tracks consumables can register it; the cap declares no
55594
- * vocabulary of its own — the provider names each item verbatim.
55665
+ * Generic device-consumables capability — the ONE place a device reports what
55666
+ * it uses up or fills: wear parts (vacuum filters/brushes, cartridges,
55667
+ * descaling cycles), supplies it draws from (a vacuum's clean-water tank and
55668
+ * detergent, a dishwasher's salt and rinse aid) and waste it collects (a dirty
55669
+ * water tank, a dust bin). Each item carries its remaining life or fill and an
55670
+ * optional "Replaced" reset action. Device-agnostic: any provider that knows
55671
+ * its device tracks consumables registers it; the provider names each item
55672
+ * verbatim and says which `kind` it is.
55673
+ *
55674
+ * The admin UI renders it as ONE collapsible section directly under the
55675
+ * device page's hero card (`placement: 'hero'`), for every device bound to
55676
+ * this cap — never drawn by a device type's hero card itself (D915).
55595
55677
  *
55596
55678
  * Like `childLayout`, the cap is INERT until a provider sets items: no
55597
55679
  * provider populates it by guessing (no HA inference). The UI renders a
55598
55680
  * "No consumables reported" placeholder when `items` is empty.
55599
55681
  */
55682
+ /**
55683
+ * What an item IS, which decides which direction is bad:
55684
+ * - `wear` — a part that wears out (a brush, a filter); low life is bad.
55685
+ * - `supply` — something the device draws from (clean water, detergent,
55686
+ * salt, rinse aid); low or empty is bad.
55687
+ * - `waste` — something the device fills (dirty water, a dust bin); full is
55688
+ * bad.
55689
+ * Absent = `wear`.
55690
+ */
55691
+ var ConsumableKindSchema = _enum([
55692
+ "wear",
55693
+ "supply",
55694
+ "waste"
55695
+ ]);
55696
+ /**
55697
+ * What an item LOOKS like, which decides how a client draws it — independent
55698
+ * of `kind`, which decides which direction is bad:
55699
+ * - `part` — a part that wears (a brush, a filter, a mop pad): a wear bar,
55700
+ * remaining time and a reset.
55701
+ * - `tank` — a container of liquid (clean water, dirty water): a fill gauge.
55702
+ * - `product` — something bought and refilled (detergent, salt, rinse aid):
55703
+ * a stepped level and "refill".
55704
+ * - `bin` — a container that collects waste (a dust bin): a fill gauge
55705
+ * that warns when full.
55706
+ * Absent = derived from the kind ({@link consumableFormOf}).
55707
+ */
55708
+ var ConsumableFormSchema = _enum([
55709
+ "part",
55710
+ "tank",
55711
+ "product",
55712
+ "bin"
55713
+ ]);
55714
+ /** The provider's own discrete verdict on an item. */
55715
+ var ConsumableStatusSchema = _enum([
55716
+ "ok",
55717
+ "low",
55718
+ "empty",
55719
+ "full",
55720
+ "replace"
55721
+ ]);
55722
+ _enum([
55723
+ "ok",
55724
+ "low",
55725
+ "empty",
55726
+ "full"
55727
+ ]);
55600
55728
  /** Units a remaining-life counter is reported in. Closed: the panel renders
55601
55729
  * each. */
55602
55730
  var ConsumableRemainingUnitSchema = _enum([
@@ -55611,18 +55739,23 @@ var ConsumableRemainingSchema = object({
55611
55739
  unit: ConsumableRemainingUnitSchema
55612
55740
  });
55613
55741
  /** A single consumable item. Either a continuous `level` (remaining
55614
- * life %) or a discrete `status` may be known — both may be null when a
55615
- * provider only knows the item exists. `level` and `status` are not
55616
- * mutually exclusive; a provider may report both. */
55742
+ * life %, or fill % for a `supply` / `waste` item) or a discrete `status`
55743
+ * may be known — both may be null when a provider only knows the item
55744
+ * exists. `level` and `status` are not mutually exclusive; a provider may
55745
+ * report both. */
55617
55746
  var ConsumableItemSchema = object({
55618
55747
  /** Stable id, e.g. 'main-brush'. */
55619
55748
  key: string().min(1),
55620
55749
  /** Display name. */
55621
55750
  label: string().min(1),
55622
- /** Remaining life % when known (0..100). */
55751
+ /** Remaining life % (`wear`) or fill % (`supply`, `waste`) when known (0..100). */
55623
55752
  level: number().min(0).max(100).nullable(),
55624
- /** Discrete state when known (binary mode). */
55625
- status: _enum(["ok", "replace"]).nullable(),
55753
+ /** The provider's discrete verdict when known (binary mode). */
55754
+ status: ConsumableStatusSchema.nullable(),
55755
+ /** What the item is — decides whether low or full is bad. Absent = `wear`. */
55756
+ kind: ConsumableKindSchema.optional(),
55757
+ /** How the item is drawn (part, tank, product, bin). Absent = derived from `kind`. */
55758
+ form: ConsumableFormSchema.optional(),
55626
55759
  /** Ms epoch of the last replace, when known. */
55627
55760
  lastResetAt: number().nullable(),
55628
55761
  /** Whether `reset()` is meaningful for this item. */
@@ -55645,7 +55778,7 @@ var consumablesCapability = {
55645
55778
  kind: "widget",
55646
55779
  widgetId: "host/consumables-panel",
55647
55780
  tab: "consumables",
55648
- topTab: true,
55781
+ placement: "hero",
55649
55782
  label: "Consumables",
55650
55783
  order: 5
55651
55784
  } },
@@ -55706,9 +55839,37 @@ reset: method(object({
55706
55839
  */
55707
55840
  durability: "restored",
55708
55841
  /**
55709
- * History (D850): none — `items` is an array keyed by runtime ids; a history path never enters it.
55842
+ * History (D850, D917): one series per (item field, item `key`) — the item key
55843
+ * is the series scope, the item `label` names it. A vacuum tank's fill, a
55844
+ * brush's remaining life and a dishwasher's salt are each recorded the moment
55845
+ * their provider reports them; an item that appears later gets its series.
55710
55846
  */
55711
- history: "none",
55847
+ history: {
55848
+ fields: {},
55849
+ items: {
55850
+ path: "items",
55851
+ key: "key",
55852
+ label: "label",
55853
+ fields: {
55854
+ level: {
55855
+ kind: "gauge",
55856
+ unit: "%",
55857
+ deadband: 2,
55858
+ displayName: "Level"
55859
+ },
55860
+ status: {
55861
+ kind: "enum",
55862
+ displayName: "Status"
55863
+ },
55864
+ "remaining.value": {
55865
+ kind: "gauge",
55866
+ unitFrom: "remaining.unit",
55867
+ deadband: 1,
55868
+ displayName: "Remaining"
55869
+ }
55870
+ }
55871
+ }
55872
+ },
55712
55873
  /** Clocks, not content: a re-read that changed no item costs no commit. */
55713
55874
  volatileStateFields: ["lastChangedAt", "lastFetchedAt"]
55714
55875
  };
@@ -56123,8 +56284,9 @@ onStatusChanged: { data: object({
56123
56284
  volatileStateFields: ["lastChangedAt"]
56124
56285
  };
56125
56286
  /**
56126
- * Smart-dishwasher cap — program lifecycle, door / remote-start gates,
56127
- * consumable levels (salt, rinse aid) and common program options.
56287
+ * Smart-dishwasher cap — program lifecycle, door / remote-start gates and
56288
+ * common program options. Salt and rinse aid are NOT here: they are items of
56289
+ * the device's `consumables` cap, like every other device's (D915).
56128
56290
  *
56129
56291
  * Sources: native Bosch Home Connect (`dishwasher` device type). Reusable
56130
56292
  * by any integration that exposes the same program / option surface.
@@ -56172,11 +56334,6 @@ var DishwasherAvailabilitySchema = _enum([
56172
56334
  "offline",
56173
56335
  "description-missing"
56174
56336
  ]);
56175
- var DishwasherConsumableLevelSchema = _enum([
56176
- "ok",
56177
- "low",
56178
- "empty"
56179
- ]);
56180
56337
  var DishwasherStatusSchema = object({
56181
56338
  availability: DishwasherAvailabilitySchema,
56182
56339
  /** Coarse state for compact surfaces; `unavailable` whenever the appliance state is not known. */
@@ -56209,8 +56366,6 @@ var DishwasherStatusSchema = object({
56209
56366
  powerOn: boolean().nullable(),
56210
56367
  /** The raw power state (`On`, `Off`, `Standby`, …); null when not known. */
56211
56368
  powerState: string().nullable(),
56212
- saltLevel: DishwasherConsumableLevelSchema.nullable(),
56213
- rinseAidLevel: DishwasherConsumableLevelSchema.nullable(),
56214
56369
  /**
56215
56370
  * True while the appliance asks for its filter to be cleaned (smart-filter, filter-system or
56216
56371
  * combined care-and-filter reminder raised); false when every such reminder reads clear; null
@@ -59086,7 +59241,7 @@ var motionTriggerCapability = {
59086
59241
  enabled: boolean()
59087
59242
  }), _void(), {
59088
59243
  kind: "mutation",
59089
- auth: "admin"
59244
+ auth: "protected"
59090
59245
  }) },
59091
59246
  events: { onMotionTriggerChanged: { data: object({
59092
59247
  deviceId: number(),
@@ -59816,6 +59971,13 @@ var TopologyNodeSchema = object({
59816
59971
  cpuModel: string().nullable(),
59817
59972
  cpuCores: number(),
59818
59973
  memoryMB: number(),
59974
+ /**
59975
+ * The inference RUNTIMES installed on the node (`pythonRuntimes`: onnx,
59976
+ * openvino, edgetpu …) — not its devices. An installed runtime says nothing
59977
+ * about whether its hardware is there (a Coral delegate stays installed
59978
+ * after the stick leaves, D919); the live device set is
59979
+ * `pipelineOrchestrator.getNodeInferenceDevices`.
59980
+ */
59819
59981
  engines: array(string()).readonly(),
59820
59982
  isHub: boolean(),
59821
59983
  isOnline: boolean(),
@@ -60933,7 +61095,28 @@ var ResolvedInferenceConfigSchema = object({
60933
61095
  format: ModelFormatSchema,
60934
61096
  reason: string()
60935
61097
  });
60936
- method(_void(), PlatformCapabilitiesSchema), method(_void(), HardwareInfoSchema), method(object({ requirements: array(ModelRequirementSchema).readonly() }), ResolvedInferenceConfigSchema), method(object({ prefer: HwAccelBackendInputSchema }), HwAccelResolutionSchema);
61098
+ /**
61099
+ * The answer of an accelerator rescan (D919): the node's device list after
61100
+ * the re-probe, what changed, and the evidence that decided the Coral answer
61101
+ * (`usbBus` — could the USB bus be read at all; `decidedBy` — USB ids, the PCI
61102
+ * bus, the installed-delegate fallback, or nothing).
61103
+ */
61104
+ var AcceleratorRescanSchema = object({
61105
+ devices: array(InferenceDeviceDescriptorSchema).readonly(),
61106
+ appeared: array(string()).readonly(),
61107
+ disappeared: array(string()).readonly(),
61108
+ usbBus: _enum(["observed", "unobservable"]),
61109
+ decidedBy: _enum([
61110
+ "usb-ids",
61111
+ "pci",
61112
+ "delegate-fallback",
61113
+ "none"
61114
+ ])
61115
+ });
61116
+ method(_void(), PlatformCapabilitiesSchema), method(_void(), HardwareInfoSchema), method(object({ requirements: array(ModelRequirementSchema).readonly() }), ResolvedInferenceConfigSchema), method(object({ prefer: HwAccelBackendInputSchema }), HwAccelResolutionSchema), method(_void(), AcceleratorRescanSchema, {
61117
+ kind: "mutation",
61118
+ auth: "admin"
61119
+ });
60937
61120
  /**
60938
61121
  * Multi-metric electrical meter. One slice can carry any combination
60939
61122
  * of instantaneous power (W), cumulative energy (kWh), voltage (V),
@@ -65026,60 +65209,17 @@ method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserI
65026
65209
  auth: "admin",
65027
65210
  access: "delete"
65028
65211
  });
65029
- /**
65030
- * Robot-vacuum cap. Models HA `vacuum.*` entities — anything with a
65031
- * cleaning lifecycle plus a return-to-base / locate surface and an
65032
- * optional fan-speed selector.
65033
- *
65034
- * State follows HA's canonical vacuum lifecycle: `idle` / `cleaning` /
65035
- * `paused` / `returning` / `docked` / `error`. `batteryLevel`
65036
- * (0..100) is nullable — some vacuums don't report a battery
65037
- * percentage. `fanSpeed` is the current speed token (provider-verbatim,
65038
- * e.g. `'standard'` / `'turbo'`) and `availableFanSpeeds` lists the
65039
- * tokens the hardware accepts so the UI renders only supported choices.
65040
- *
65041
- * The `setFanSpeed` method takes the bare `speed` token — the provider
65042
- * validates it against the vacuum's own list. `locate` triggers the
65043
- * find-me chirp; `returnToBase` sends it home.
65044
- *
65045
- * Consumable / waste tanks: `cleanWater` / `dirtyWater` / `detergent` /
65046
- * `dustBin` each carry a nullable `{ level (0..100 %), status ('ok' |
65047
- * 'low' | 'full') }` reading. Native providers (e.g. Dreame, Roborock)
65048
- * SHOULD populate whichever tanks the hardware has — leave a field `null`
65049
- * only when the device has no such tank at all, and use a `TankStatus`
65050
- * with both inner fields `null` when the tank exists but its level is
65051
- * currently unknown. HA `vacuum.*` entities expose no per-tank telemetry,
65052
- * so the HA provider leaves all four `null`.
65053
- */
65054
- var VacuumStateSchema = _enum([
65055
- "idle",
65056
- "cleaning",
65057
- "paused",
65058
- "returning",
65059
- "docked",
65060
- "drying",
65061
- "error"
65062
- ]);
65063
- /**
65064
- * One consumable / waste tank on a robot vacuum (clean-water, dirty-water,
65065
- * detergent or dust-bin). A tank can report a numeric fill `level` (0..100),
65066
- * a discrete `status` (binary-style hardware), or both. Both `null` means the
65067
- * level is currently unknown; the OWNING field being `null` means the
65068
- * hardware has no such tank at all.
65069
- */
65070
- var TankStatusSchema = object({
65071
- /** Numeric fill 0..100 when the hardware reports a percentage; null otherwise. */
65072
- level: number().min(0).max(100).nullable(),
65073
- /** Discrete state when the hardware is binary-mode; null otherwise. */
65074
- status: _enum([
65075
- "ok",
65076
- "low",
65077
- "full"
65078
- ]).nullable()
65079
- });
65080
65212
  var VacuumControlStatusSchema = object({
65081
65213
  /** Lifecycle state of the vacuum. */
65082
- state: VacuumStateSchema,
65214
+ state: _enum([
65215
+ "idle",
65216
+ "cleaning",
65217
+ "paused",
65218
+ "returning",
65219
+ "docked",
65220
+ "drying",
65221
+ "error"
65222
+ ]),
65083
65223
  /** 0..100 battery percentage. Null when the device has no battery
65084
65224
  * reading. */
65085
65225
  batteryLevel: number().min(0).max(100).nullable(),
@@ -65088,14 +65228,6 @@ var VacuumControlStatusSchema = object({
65088
65228
  fanSpeed: string().nullable(),
65089
65229
  /** Speed tokens the hardware accepts — drives the UI selector. */
65090
65230
  availableFanSpeeds: array(string()),
65091
- /** Clean-water (mop) tank. Null when the hardware has no clean-water tank. */
65092
- cleanWater: TankStatusSchema.nullable(),
65093
- /** Dirty-water (recovery) tank. Null when the hardware has no dirty-water tank. */
65094
- dirtyWater: TankStatusSchema.nullable(),
65095
- /** Detergent tank. Null when the hardware has no detergent tank. */
65096
- detergent: TankStatusSchema.nullable(),
65097
- /** Dust bin. Null when the hardware has no dust bin. */
65098
- dustBin: TankStatusSchema.nullable(),
65099
65231
  /** 0..100 cleaning-completion percentage of the current task, or null. */
65100
65232
  progressPercent: number().min(0).max(100).nullable(),
65101
65233
  /** Current error code (0 / null = no error). */
@@ -65157,35 +65289,14 @@ var vacuumControlCapability = {
65157
65289
  */
65158
65290
  durability: "session",
65159
65291
  /**
65160
- * History (D850): recorded series. Tank levels are fixed-object paths (`cleanWater.level`, ...).
65292
+ * History (D850): recorded series. The tanks moved to `consumables` (D915), whose
65293
+ * items are keyed by runtime ids and record no history.
65161
65294
  */
65162
- history: { fields: {
65163
- batteryLevel: {
65164
- kind: "gauge",
65165
- unit: "%",
65166
- deadband: 2
65167
- },
65168
- "cleanWater.level": {
65169
- kind: "gauge",
65170
- unit: "%",
65171
- deadband: 2
65172
- },
65173
- "dirtyWater.level": {
65174
- kind: "gauge",
65175
- unit: "%",
65176
- deadband: 2
65177
- },
65178
- "detergent.level": {
65179
- kind: "gauge",
65180
- unit: "%",
65181
- deadband: 2
65182
- },
65183
- "dustBin.level": {
65184
- kind: "gauge",
65185
- unit: "%",
65186
- deadband: 2
65187
- }
65188
- } }
65295
+ history: { fields: { batteryLevel: {
65296
+ kind: "gauge",
65297
+ unit: "%",
65298
+ deadband: 2
65299
+ } } }
65189
65300
  };
65190
65301
  var ValveStatusSchema = object({
65191
65302
  /** Lifecycle state of the valve. */
@@ -69579,6 +69690,12 @@ Object.freeze({
69579
69690
  addonId: null,
69580
69691
  access: "create"
69581
69692
  },
69693
+ "deviceHistory.deleteOrphanSeries": {
69694
+ capName: "device-history",
69695
+ capScope: "system",
69696
+ addonId: null,
69697
+ access: "delete"
69698
+ },
69582
69699
  "deviceHistory.getDeviceEnabled": {
69583
69700
  capName: "device-history",
69584
69701
  capScope: "system",
@@ -69597,6 +69714,12 @@ Object.freeze({
69597
69714
  addonId: null,
69598
69715
  access: "view"
69599
69716
  },
69717
+ "deviceHistory.listOrphanSeries": {
69718
+ capName: "device-history",
69719
+ capScope: "system",
69720
+ addonId: null,
69721
+ access: "view"
69722
+ },
69600
69723
  "deviceHistory.listSeries": {
69601
69724
  capName: "device-history",
69602
69725
  capScope: "system",
@@ -73221,6 +73344,12 @@ Object.freeze({
73221
73344
  addonId: null,
73222
73345
  access: "delete"
73223
73346
  },
73347
+ "pipelineOrchestrator.forgetInferenceDevice": {
73348
+ capName: "pipeline-orchestrator",
73349
+ capScope: "system",
73350
+ addonId: null,
73351
+ access: "delete"
73352
+ },
73224
73353
  "pipelineOrchestrator.getAgentLoad": {
73225
73354
  capName: "pipeline-orchestrator",
73226
73355
  capScope: "system",
@@ -73797,6 +73926,12 @@ Object.freeze({
73797
73926
  addonId: null,
73798
73927
  access: "view"
73799
73928
  },
73929
+ "platformProbe.rescanAccelerators": {
73930
+ capName: "platform-probe",
73931
+ capScope: "system",
73932
+ addonId: null,
73933
+ access: "create"
73934
+ },
73800
73935
  "platformProbe.resolveHwAccel": {
73801
73936
  capName: "platform-probe",
73802
73937
  capScope: "system",
@@ -79602,7 +79737,7 @@ var STATE_SUMMARY_VARS = [
79602
79737
  ([...RULE_TEXT], [...COMBINED_ALARM]),
79603
79738
  ([...RULE_TEXT], [...DEVICE_EVENTS]),
79604
79739
  ([...RULE_TEXT], [...BATTERY, ...CONSUMABLE]),
79605
- ([...RULE_TEXT], [...CONSUMABLE]),
79740
+ ([...RULE_TEXT], [...CONSUMABLE, ...TANK]),
79606
79741
  ([...RULE_TEXT], [...TANK]),
79607
79742
  [...RULE_TEXT],
79608
79743
  ([...RULE_TEXT], [...UPDATES, ...ALERT_EPISODE]),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-homematic",
3
- "version": "1.2.153",
3
+ "version": "1.2.155",
4
4
  "description": "Homematic / HomematicIP (CCU3 / RaspberryMatic) device-provider addon for CamStack — wraps the nodehomematic library",
5
5
  "keywords": [
6
6
  "camstack",