@camstack/addon-notifiers 1.2.617 → 1.2.618

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 +151 -83
  2. package/dist/addon.mjs +151 -83
  3. package/package.json +1 -1
package/dist/addon.js CHANGED
@@ -5594,7 +5594,7 @@ var ZodIssueCode = {
5594
5594
  var ZodFirstPartyTypeKind;
5595
5595
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5596
5596
  //#endregion
5597
- //#region ../types/dist/sleep-DJFUfKvA.mjs
5597
+ //#region ../types/dist/sleep-CUp20JkO.mjs
5598
5598
  /**
5599
5599
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5600
5600
  * window to float samples (D455).
@@ -8632,7 +8632,11 @@ var ContributionSectionSchema = object({
8632
8632
  literal(4)
8633
8633
  ]).optional(),
8634
8634
  tab: string().optional(),
8635
- location: _enum(["settings", "top-tab"]).optional(),
8635
+ location: _enum([
8636
+ "settings",
8637
+ "top-tab",
8638
+ "hero"
8639
+ ]).optional(),
8636
8640
  order: number().optional(),
8637
8641
  fields: array(any())
8638
8642
  });
@@ -13723,7 +13727,11 @@ var ConfigSectionWithValuesSchema = object({
13723
13727
  literal(4)
13724
13728
  ]).optional(),
13725
13729
  tab: string().optional(),
13726
- location: _enum(["settings", "top-tab"]).optional(),
13730
+ location: _enum([
13731
+ "settings",
13732
+ "top-tab",
13733
+ "hero"
13734
+ ]).optional(),
13727
13735
  order: number().optional(),
13728
13736
  fields: array(any())
13729
13737
  });
@@ -17497,6 +17505,52 @@ var TierStatusSchema = object({
17497
17505
  countedAt: number().nullable()
17498
17506
  });
17499
17507
  /** Operator/diagnostic view: rows per tier, last runs, refusals and drops since boot. */
17508
+ /**
17509
+ * Why a series is orphan. `device-gone`: its device is absent from the
17510
+ * successful device listings (the departure clock). `undeclared`: its `cap:`
17511
+ * key is declared by no capability any more (a field a cap removed).
17512
+ */
17513
+ var DeviceHistoryOrphanReasonSchema = _enum(["device-gone", "undeclared"]);
17514
+ /** Rows held per stored tier. */
17515
+ var TierRowsSchema = object({
17516
+ raw: number().int(),
17517
+ "5m": number().int(),
17518
+ "1h": number().int(),
17519
+ "1d": number().int()
17520
+ });
17521
+ var OrphanSeriesSchema = object({
17522
+ seriesId: number().int(),
17523
+ deviceId: number().int(),
17524
+ key: string(),
17525
+ scope: string(),
17526
+ /** The metric's display name; `null` when its metric row is gone too. */
17527
+ displayName: string().nullable(),
17528
+ reason: DeviceHistoryOrphanReasonSchema,
17529
+ /** `device-gone`: since when the device has been absent; `null` otherwise. */
17530
+ missingSince: number().nullable(),
17531
+ firstTs: number(),
17532
+ lastTs: number(),
17533
+ rows: TierRowsSchema
17534
+ });
17535
+ var DeviceHistoryOrphanDeleteRefusalSchema = _enum([
17536
+ "not-found",
17537
+ "not-orphan",
17538
+ "failed"
17539
+ ]);
17540
+ var OrphanDeleteEntrySchema = discriminatedUnion("ok", [object({
17541
+ seriesId: number().int(),
17542
+ ok: literal(true),
17543
+ deleted: TierRowsSchema
17544
+ }), object({
17545
+ seriesId: number().int(),
17546
+ ok: literal(false),
17547
+ reason: DeviceHistoryOrphanDeleteRefusalSchema
17548
+ })]);
17549
+ var OrphanListSchema = object({
17550
+ series: array(OrphanSeriesSchema).readonly(),
17551
+ /** More orphans exist than {@link DEVICE_HISTORY_ORPHAN_LIST_MAX}. */
17552
+ truncated: boolean()
17553
+ });
17500
17554
  var DeviceHistoryStatusSchema = object({
17501
17555
  startedAt: number(),
17502
17556
  /** The store is declared, series loaded and the first reconcile has answered. */
@@ -17594,7 +17648,10 @@ method(object({ deviceId: number().int() }), array(SeriesInfoSchema).readonly())
17594
17648
  }), object({ enabled: boolean() }), {
17595
17649
  kind: "mutation",
17596
17650
  auth: "admin"
17597
- }), method(object({}), DeviceHistoryStatusSchema, { auth: "admin" });
17651
+ }), 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() }), {
17652
+ kind: "mutation",
17653
+ auth: "admin"
17654
+ });
17598
17655
  var DeviceCaStatusSchema = discriminatedUnion("state", [
17599
17656
  object({ state: literal("absent") }),
17600
17657
  object({
@@ -54625,17 +54682,69 @@ object({
54625
54682
  });
54626
54683
  DeviceType.Sensor;
54627
54684
  /**
54628
- * Generic device-consumables capability — surfaces a device's
54629
- * maintenance items (vacuum filters/brushes, replaceable cartridges,
54630
- * descaling cycles, …) with their remaining life and an optional
54631
- * "Replaced" reset action. Device-agnostic: any provider that knows its
54632
- * device tracks consumables can register it; the cap declares no
54633
- * vocabulary of its own — the provider names each item verbatim.
54685
+ * Generic device-consumables capability — the ONE place a device reports what
54686
+ * it uses up or fills: wear parts (vacuum filters/brushes, cartridges,
54687
+ * descaling cycles), supplies it draws from (a vacuum's clean-water tank and
54688
+ * detergent, a dishwasher's salt and rinse aid) and waste it collects (a dirty
54689
+ * water tank, a dust bin). Each item carries its remaining life or fill and an
54690
+ * optional "Replaced" reset action. Device-agnostic: any provider that knows
54691
+ * its device tracks consumables registers it; the provider names each item
54692
+ * verbatim and says which `kind` it is.
54693
+ *
54694
+ * The admin UI renders it as ONE collapsible section directly under the
54695
+ * device page's hero card (`placement: 'hero'`), for every device bound to
54696
+ * this cap — never drawn by a device type's hero card itself (D915).
54634
54697
  *
54635
54698
  * Like `childLayout`, the cap is INERT until a provider sets items: no
54636
54699
  * provider populates it by guessing (no HA inference). The UI renders a
54637
54700
  * "No consumables reported" placeholder when `items` is empty.
54638
54701
  */
54702
+ /**
54703
+ * What an item IS, which decides which direction is bad:
54704
+ * - `wear` — a part that wears out (a brush, a filter); low life is bad.
54705
+ * - `supply` — something the device draws from (clean water, detergent,
54706
+ * salt, rinse aid); low or empty is bad.
54707
+ * - `waste` — something the device fills (dirty water, a dust bin); full is
54708
+ * bad.
54709
+ * Absent = `wear`.
54710
+ */
54711
+ var ConsumableKindSchema = _enum([
54712
+ "wear",
54713
+ "supply",
54714
+ "waste"
54715
+ ]);
54716
+ /**
54717
+ * What an item LOOKS like, which decides how a client draws it — independent
54718
+ * of `kind`, which decides which direction is bad:
54719
+ * - `part` — a part that wears (a brush, a filter, a mop pad): a wear bar,
54720
+ * remaining time and a reset.
54721
+ * - `tank` — a container of liquid (clean water, dirty water): a fill gauge.
54722
+ * - `product` — something bought and refilled (detergent, salt, rinse aid):
54723
+ * a stepped level and "refill".
54724
+ * - `bin` — a container that collects waste (a dust bin): a fill gauge
54725
+ * that warns when full.
54726
+ * Absent = derived from the kind ({@link consumableFormOf}).
54727
+ */
54728
+ var ConsumableFormSchema = _enum([
54729
+ "part",
54730
+ "tank",
54731
+ "product",
54732
+ "bin"
54733
+ ]);
54734
+ /** The provider's own discrete verdict on an item. */
54735
+ var ConsumableStatusSchema = _enum([
54736
+ "ok",
54737
+ "low",
54738
+ "empty",
54739
+ "full",
54740
+ "replace"
54741
+ ]);
54742
+ _enum([
54743
+ "ok",
54744
+ "low",
54745
+ "empty",
54746
+ "full"
54747
+ ]);
54639
54748
  /** Units a remaining-life counter is reported in. Closed: the panel renders
54640
54749
  * each. */
54641
54750
  var ConsumableRemainingUnitSchema = _enum([
@@ -54655,10 +54764,14 @@ var ConsumablesStatusSchema = object({
54655
54764
  key: string().min(1),
54656
54765
  /** Display name. */
54657
54766
  label: string().min(1),
54658
- /** Remaining life % when known (0..100). */
54767
+ /** Remaining life % (`wear`) or fill % (`supply`, `waste`) when known (0..100). */
54659
54768
  level: number().min(0).max(100).nullable(),
54660
- /** Discrete state when known (binary mode). */
54661
- status: _enum(["ok", "replace"]).nullable(),
54769
+ /** The provider's discrete verdict when known (binary mode). */
54770
+ status: ConsumableStatusSchema.nullable(),
54771
+ /** What the item is — decides whether low or full is bad. Absent = `wear`. */
54772
+ kind: ConsumableKindSchema.optional(),
54773
+ /** How the item is drawn (part, tank, product, bin). Absent = derived from `kind`. */
54774
+ form: ConsumableFormSchema.optional(),
54662
54775
  /** Ms epoch of the last replace, when known. */
54663
54776
  lastResetAt: number().nullable(),
54664
54777
  /** Whether `reset()` is meaningful for this item. */
@@ -54893,8 +55006,9 @@ object({
54893
55006
  status: DeviceStatusSchema
54894
55007
  });
54895
55008
  /**
54896
- * Smart-dishwasher cap — program lifecycle, door / remote-start gates,
54897
- * consumable levels (salt, rinse aid) and common program options.
55009
+ * Smart-dishwasher cap — program lifecycle, door / remote-start gates and
55010
+ * common program options. Salt and rinse aid are NOT here: they are items of
55011
+ * the device's `consumables` cap, like every other device's (D915).
54898
55012
  *
54899
55013
  * Sources: native Bosch Home Connect (`dishwasher` device type). Reusable
54900
55014
  * by any integration that exposes the same program / option surface.
@@ -54942,11 +55056,6 @@ var DishwasherAvailabilitySchema = _enum([
54942
55056
  "offline",
54943
55057
  "description-missing"
54944
55058
  ]);
54945
- var DishwasherConsumableLevelSchema = _enum([
54946
- "ok",
54947
- "low",
54948
- "empty"
54949
- ]);
54950
55059
  object({
54951
55060
  availability: DishwasherAvailabilitySchema,
54952
55061
  /** Coarse state for compact surfaces; `unavailable` whenever the appliance state is not known. */
@@ -54979,8 +55088,6 @@ object({
54979
55088
  powerOn: boolean().nullable(),
54980
55089
  /** The raw power state (`On`, `Off`, `Standby`, …); null when not known. */
54981
55090
  powerState: string().nullable(),
54982
- saltLevel: DishwasherConsumableLevelSchema.nullable(),
54983
- rinseAidLevel: DishwasherConsumableLevelSchema.nullable(),
54984
55091
  /**
54985
55092
  * True while the appliance asks for its filter to be cleaned (smart-filter, filter-system or
54986
55093
  * combined care-and-filter reminder raised); false when every such reminder reads clear; null
@@ -61763,60 +61870,17 @@ method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserI
61763
61870
  auth: "admin",
61764
61871
  access: "delete"
61765
61872
  });
61766
- /**
61767
- * Robot-vacuum cap. Models HA `vacuum.*` entities — anything with a
61768
- * cleaning lifecycle plus a return-to-base / locate surface and an
61769
- * optional fan-speed selector.
61770
- *
61771
- * State follows HA's canonical vacuum lifecycle: `idle` / `cleaning` /
61772
- * `paused` / `returning` / `docked` / `error`. `batteryLevel`
61773
- * (0..100) is nullable — some vacuums don't report a battery
61774
- * percentage. `fanSpeed` is the current speed token (provider-verbatim,
61775
- * e.g. `'standard'` / `'turbo'`) and `availableFanSpeeds` lists the
61776
- * tokens the hardware accepts so the UI renders only supported choices.
61777
- *
61778
- * The `setFanSpeed` method takes the bare `speed` token — the provider
61779
- * validates it against the vacuum's own list. `locate` triggers the
61780
- * find-me chirp; `returnToBase` sends it home.
61781
- *
61782
- * Consumable / waste tanks: `cleanWater` / `dirtyWater` / `detergent` /
61783
- * `dustBin` each carry a nullable `{ level (0..100 %), status ('ok' |
61784
- * 'low' | 'full') }` reading. Native providers (e.g. Dreame, Roborock)
61785
- * SHOULD populate whichever tanks the hardware has — leave a field `null`
61786
- * only when the device has no such tank at all, and use a `TankStatus`
61787
- * with both inner fields `null` when the tank exists but its level is
61788
- * currently unknown. HA `vacuum.*` entities expose no per-tank telemetry,
61789
- * so the HA provider leaves all four `null`.
61790
- */
61791
- var VacuumStateSchema = _enum([
61792
- "idle",
61793
- "cleaning",
61794
- "paused",
61795
- "returning",
61796
- "docked",
61797
- "drying",
61798
- "error"
61799
- ]);
61800
- /**
61801
- * One consumable / waste tank on a robot vacuum (clean-water, dirty-water,
61802
- * detergent or dust-bin). A tank can report a numeric fill `level` (0..100),
61803
- * a discrete `status` (binary-style hardware), or both. Both `null` means the
61804
- * level is currently unknown; the OWNING field being `null` means the
61805
- * hardware has no such tank at all.
61806
- */
61807
- var TankStatusSchema = object({
61808
- /** Numeric fill 0..100 when the hardware reports a percentage; null otherwise. */
61809
- level: number().min(0).max(100).nullable(),
61810
- /** Discrete state when the hardware is binary-mode; null otherwise. */
61811
- status: _enum([
61812
- "ok",
61813
- "low",
61814
- "full"
61815
- ]).nullable()
61816
- });
61817
61873
  object({
61818
61874
  /** Lifecycle state of the vacuum. */
61819
- state: VacuumStateSchema,
61875
+ state: _enum([
61876
+ "idle",
61877
+ "cleaning",
61878
+ "paused",
61879
+ "returning",
61880
+ "docked",
61881
+ "drying",
61882
+ "error"
61883
+ ]),
61820
61884
  /** 0..100 battery percentage. Null when the device has no battery
61821
61885
  * reading. */
61822
61886
  batteryLevel: number().min(0).max(100).nullable(),
@@ -61825,14 +61889,6 @@ object({
61825
61889
  fanSpeed: string().nullable(),
61826
61890
  /** Speed tokens the hardware accepts — drives the UI selector. */
61827
61891
  availableFanSpeeds: array(string()),
61828
- /** Clean-water (mop) tank. Null when the hardware has no clean-water tank. */
61829
- cleanWater: TankStatusSchema.nullable(),
61830
- /** Dirty-water (recovery) tank. Null when the hardware has no dirty-water tank. */
61831
- dirtyWater: TankStatusSchema.nullable(),
61832
- /** Detergent tank. Null when the hardware has no detergent tank. */
61833
- detergent: TankStatusSchema.nullable(),
61834
- /** Dust bin. Null when the hardware has no dust bin. */
61835
- dustBin: TankStatusSchema.nullable(),
61836
61892
  /** 0..100 cleaning-completion percentage of the current task, or null. */
61837
61893
  progressPercent: number().min(0).max(100).nullable(),
61838
61894
  /** Current error code (0 / null = no error). */
@@ -64373,6 +64429,12 @@ Object.freeze({
64373
64429
  addonId: null,
64374
64430
  access: "create"
64375
64431
  },
64432
+ "deviceHistory.deleteOrphanSeries": {
64433
+ capName: "device-history",
64434
+ capScope: "system",
64435
+ addonId: null,
64436
+ access: "delete"
64437
+ },
64376
64438
  "deviceHistory.getDeviceEnabled": {
64377
64439
  capName: "device-history",
64378
64440
  capScope: "system",
@@ -64391,6 +64453,12 @@ Object.freeze({
64391
64453
  addonId: null,
64392
64454
  access: "view"
64393
64455
  },
64456
+ "deviceHistory.listOrphanSeries": {
64457
+ capName: "device-history",
64458
+ capScope: "system",
64459
+ addonId: null,
64460
+ access: "view"
64461
+ },
64394
64462
  "deviceHistory.listSeries": {
64395
64463
  capName: "device-history",
64396
64464
  capScope: "system",
@@ -74603,7 +74671,7 @@ var STATE_SUMMARY_VARS = [
74603
74671
  ([...RULE_TEXT], [...COMBINED_ALARM]),
74604
74672
  ([...RULE_TEXT], [...DEVICE_EVENTS]),
74605
74673
  ([...RULE_TEXT], [...BATTERY, ...CONSUMABLE]),
74606
- ([...RULE_TEXT], [...CONSUMABLE]),
74674
+ ([...RULE_TEXT], [...CONSUMABLE, ...TANK]),
74607
74675
  ([...RULE_TEXT], [...TANK]),
74608
74676
  [...RULE_TEXT],
74609
74677
  ([...RULE_TEXT], [...UPDATES, ...ALERT_EPISODE]),
package/dist/addon.mjs CHANGED
@@ -5567,7 +5567,7 @@ var ZodIssueCode = {
5567
5567
  var ZodFirstPartyTypeKind;
5568
5568
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5569
5569
  //#endregion
5570
- //#region ../types/dist/sleep-DJFUfKvA.mjs
5570
+ //#region ../types/dist/sleep-CUp20JkO.mjs
5571
5571
  /**
5572
5572
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5573
5573
  * window to float samples (D455).
@@ -8605,7 +8605,11 @@ var ContributionSectionSchema = object({
8605
8605
  literal(4)
8606
8606
  ]).optional(),
8607
8607
  tab: string().optional(),
8608
- location: _enum(["settings", "top-tab"]).optional(),
8608
+ location: _enum([
8609
+ "settings",
8610
+ "top-tab",
8611
+ "hero"
8612
+ ]).optional(),
8609
8613
  order: number().optional(),
8610
8614
  fields: array(any())
8611
8615
  });
@@ -13696,7 +13700,11 @@ var ConfigSectionWithValuesSchema = object({
13696
13700
  literal(4)
13697
13701
  ]).optional(),
13698
13702
  tab: string().optional(),
13699
- location: _enum(["settings", "top-tab"]).optional(),
13703
+ location: _enum([
13704
+ "settings",
13705
+ "top-tab",
13706
+ "hero"
13707
+ ]).optional(),
13700
13708
  order: number().optional(),
13701
13709
  fields: array(any())
13702
13710
  });
@@ -17470,6 +17478,52 @@ var TierStatusSchema = object({
17470
17478
  countedAt: number().nullable()
17471
17479
  });
17472
17480
  /** Operator/diagnostic view: rows per tier, last runs, refusals and drops since boot. */
17481
+ /**
17482
+ * Why a series is orphan. `device-gone`: its device is absent from the
17483
+ * successful device listings (the departure clock). `undeclared`: its `cap:`
17484
+ * key is declared by no capability any more (a field a cap removed).
17485
+ */
17486
+ var DeviceHistoryOrphanReasonSchema = _enum(["device-gone", "undeclared"]);
17487
+ /** Rows held per stored tier. */
17488
+ var TierRowsSchema = object({
17489
+ raw: number().int(),
17490
+ "5m": number().int(),
17491
+ "1h": number().int(),
17492
+ "1d": number().int()
17493
+ });
17494
+ var OrphanSeriesSchema = object({
17495
+ seriesId: number().int(),
17496
+ deviceId: number().int(),
17497
+ key: string(),
17498
+ scope: string(),
17499
+ /** The metric's display name; `null` when its metric row is gone too. */
17500
+ displayName: string().nullable(),
17501
+ reason: DeviceHistoryOrphanReasonSchema,
17502
+ /** `device-gone`: since when the device has been absent; `null` otherwise. */
17503
+ missingSince: number().nullable(),
17504
+ firstTs: number(),
17505
+ lastTs: number(),
17506
+ rows: TierRowsSchema
17507
+ });
17508
+ var DeviceHistoryOrphanDeleteRefusalSchema = _enum([
17509
+ "not-found",
17510
+ "not-orphan",
17511
+ "failed"
17512
+ ]);
17513
+ var OrphanDeleteEntrySchema = discriminatedUnion("ok", [object({
17514
+ seriesId: number().int(),
17515
+ ok: literal(true),
17516
+ deleted: TierRowsSchema
17517
+ }), object({
17518
+ seriesId: number().int(),
17519
+ ok: literal(false),
17520
+ reason: DeviceHistoryOrphanDeleteRefusalSchema
17521
+ })]);
17522
+ var OrphanListSchema = object({
17523
+ series: array(OrphanSeriesSchema).readonly(),
17524
+ /** More orphans exist than {@link DEVICE_HISTORY_ORPHAN_LIST_MAX}. */
17525
+ truncated: boolean()
17526
+ });
17473
17527
  var DeviceHistoryStatusSchema = object({
17474
17528
  startedAt: number(),
17475
17529
  /** The store is declared, series loaded and the first reconcile has answered. */
@@ -17567,7 +17621,10 @@ method(object({ deviceId: number().int() }), array(SeriesInfoSchema).readonly())
17567
17621
  }), object({ enabled: boolean() }), {
17568
17622
  kind: "mutation",
17569
17623
  auth: "admin"
17570
- }), method(object({}), DeviceHistoryStatusSchema, { auth: "admin" });
17624
+ }), 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() }), {
17625
+ kind: "mutation",
17626
+ auth: "admin"
17627
+ });
17571
17628
  var DeviceCaStatusSchema = discriminatedUnion("state", [
17572
17629
  object({ state: literal("absent") }),
17573
17630
  object({
@@ -54598,17 +54655,69 @@ object({
54598
54655
  });
54599
54656
  DeviceType.Sensor;
54600
54657
  /**
54601
- * Generic device-consumables capability — surfaces a device's
54602
- * maintenance items (vacuum filters/brushes, replaceable cartridges,
54603
- * descaling cycles, …) with their remaining life and an optional
54604
- * "Replaced" reset action. Device-agnostic: any provider that knows its
54605
- * device tracks consumables can register it; the cap declares no
54606
- * vocabulary of its own — the provider names each item verbatim.
54658
+ * Generic device-consumables capability — the ONE place a device reports what
54659
+ * it uses up or fills: wear parts (vacuum filters/brushes, cartridges,
54660
+ * descaling cycles), supplies it draws from (a vacuum's clean-water tank and
54661
+ * detergent, a dishwasher's salt and rinse aid) and waste it collects (a dirty
54662
+ * water tank, a dust bin). Each item carries its remaining life or fill and an
54663
+ * optional "Replaced" reset action. Device-agnostic: any provider that knows
54664
+ * its device tracks consumables registers it; the provider names each item
54665
+ * verbatim and says which `kind` it is.
54666
+ *
54667
+ * The admin UI renders it as ONE collapsible section directly under the
54668
+ * device page's hero card (`placement: 'hero'`), for every device bound to
54669
+ * this cap — never drawn by a device type's hero card itself (D915).
54607
54670
  *
54608
54671
  * Like `childLayout`, the cap is INERT until a provider sets items: no
54609
54672
  * provider populates it by guessing (no HA inference). The UI renders a
54610
54673
  * "No consumables reported" placeholder when `items` is empty.
54611
54674
  */
54675
+ /**
54676
+ * What an item IS, which decides which direction is bad:
54677
+ * - `wear` — a part that wears out (a brush, a filter); low life is bad.
54678
+ * - `supply` — something the device draws from (clean water, detergent,
54679
+ * salt, rinse aid); low or empty is bad.
54680
+ * - `waste` — something the device fills (dirty water, a dust bin); full is
54681
+ * bad.
54682
+ * Absent = `wear`.
54683
+ */
54684
+ var ConsumableKindSchema = _enum([
54685
+ "wear",
54686
+ "supply",
54687
+ "waste"
54688
+ ]);
54689
+ /**
54690
+ * What an item LOOKS like, which decides how a client draws it — independent
54691
+ * of `kind`, which decides which direction is bad:
54692
+ * - `part` — a part that wears (a brush, a filter, a mop pad): a wear bar,
54693
+ * remaining time and a reset.
54694
+ * - `tank` — a container of liquid (clean water, dirty water): a fill gauge.
54695
+ * - `product` — something bought and refilled (detergent, salt, rinse aid):
54696
+ * a stepped level and "refill".
54697
+ * - `bin` — a container that collects waste (a dust bin): a fill gauge
54698
+ * that warns when full.
54699
+ * Absent = derived from the kind ({@link consumableFormOf}).
54700
+ */
54701
+ var ConsumableFormSchema = _enum([
54702
+ "part",
54703
+ "tank",
54704
+ "product",
54705
+ "bin"
54706
+ ]);
54707
+ /** The provider's own discrete verdict on an item. */
54708
+ var ConsumableStatusSchema = _enum([
54709
+ "ok",
54710
+ "low",
54711
+ "empty",
54712
+ "full",
54713
+ "replace"
54714
+ ]);
54715
+ _enum([
54716
+ "ok",
54717
+ "low",
54718
+ "empty",
54719
+ "full"
54720
+ ]);
54612
54721
  /** Units a remaining-life counter is reported in. Closed: the panel renders
54613
54722
  * each. */
54614
54723
  var ConsumableRemainingUnitSchema = _enum([
@@ -54628,10 +54737,14 @@ var ConsumablesStatusSchema = object({
54628
54737
  key: string().min(1),
54629
54738
  /** Display name. */
54630
54739
  label: string().min(1),
54631
- /** Remaining life % when known (0..100). */
54740
+ /** Remaining life % (`wear`) or fill % (`supply`, `waste`) when known (0..100). */
54632
54741
  level: number().min(0).max(100).nullable(),
54633
- /** Discrete state when known (binary mode). */
54634
- status: _enum(["ok", "replace"]).nullable(),
54742
+ /** The provider's discrete verdict when known (binary mode). */
54743
+ status: ConsumableStatusSchema.nullable(),
54744
+ /** What the item is — decides whether low or full is bad. Absent = `wear`. */
54745
+ kind: ConsumableKindSchema.optional(),
54746
+ /** How the item is drawn (part, tank, product, bin). Absent = derived from `kind`. */
54747
+ form: ConsumableFormSchema.optional(),
54635
54748
  /** Ms epoch of the last replace, when known. */
54636
54749
  lastResetAt: number().nullable(),
54637
54750
  /** Whether `reset()` is meaningful for this item. */
@@ -54866,8 +54979,9 @@ object({
54866
54979
  status: DeviceStatusSchema
54867
54980
  });
54868
54981
  /**
54869
- * Smart-dishwasher cap — program lifecycle, door / remote-start gates,
54870
- * consumable levels (salt, rinse aid) and common program options.
54982
+ * Smart-dishwasher cap — program lifecycle, door / remote-start gates and
54983
+ * common program options. Salt and rinse aid are NOT here: they are items of
54984
+ * the device's `consumables` cap, like every other device's (D915).
54871
54985
  *
54872
54986
  * Sources: native Bosch Home Connect (`dishwasher` device type). Reusable
54873
54987
  * by any integration that exposes the same program / option surface.
@@ -54915,11 +55029,6 @@ var DishwasherAvailabilitySchema = _enum([
54915
55029
  "offline",
54916
55030
  "description-missing"
54917
55031
  ]);
54918
- var DishwasherConsumableLevelSchema = _enum([
54919
- "ok",
54920
- "low",
54921
- "empty"
54922
- ]);
54923
55032
  object({
54924
55033
  availability: DishwasherAvailabilitySchema,
54925
55034
  /** Coarse state for compact surfaces; `unavailable` whenever the appliance state is not known. */
@@ -54952,8 +55061,6 @@ object({
54952
55061
  powerOn: boolean().nullable(),
54953
55062
  /** The raw power state (`On`, `Off`, `Standby`, …); null when not known. */
54954
55063
  powerState: string().nullable(),
54955
- saltLevel: DishwasherConsumableLevelSchema.nullable(),
54956
- rinseAidLevel: DishwasherConsumableLevelSchema.nullable(),
54957
55064
  /**
54958
55065
  * True while the appliance asks for its filter to be cleaned (smart-filter, filter-system or
54959
55066
  * combined care-and-filter reminder raised); false when every such reminder reads clear; null
@@ -61736,60 +61843,17 @@ method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserI
61736
61843
  auth: "admin",
61737
61844
  access: "delete"
61738
61845
  });
61739
- /**
61740
- * Robot-vacuum cap. Models HA `vacuum.*` entities — anything with a
61741
- * cleaning lifecycle plus a return-to-base / locate surface and an
61742
- * optional fan-speed selector.
61743
- *
61744
- * State follows HA's canonical vacuum lifecycle: `idle` / `cleaning` /
61745
- * `paused` / `returning` / `docked` / `error`. `batteryLevel`
61746
- * (0..100) is nullable — some vacuums don't report a battery
61747
- * percentage. `fanSpeed` is the current speed token (provider-verbatim,
61748
- * e.g. `'standard'` / `'turbo'`) and `availableFanSpeeds` lists the
61749
- * tokens the hardware accepts so the UI renders only supported choices.
61750
- *
61751
- * The `setFanSpeed` method takes the bare `speed` token — the provider
61752
- * validates it against the vacuum's own list. `locate` triggers the
61753
- * find-me chirp; `returnToBase` sends it home.
61754
- *
61755
- * Consumable / waste tanks: `cleanWater` / `dirtyWater` / `detergent` /
61756
- * `dustBin` each carry a nullable `{ level (0..100 %), status ('ok' |
61757
- * 'low' | 'full') }` reading. Native providers (e.g. Dreame, Roborock)
61758
- * SHOULD populate whichever tanks the hardware has — leave a field `null`
61759
- * only when the device has no such tank at all, and use a `TankStatus`
61760
- * with both inner fields `null` when the tank exists but its level is
61761
- * currently unknown. HA `vacuum.*` entities expose no per-tank telemetry,
61762
- * so the HA provider leaves all four `null`.
61763
- */
61764
- var VacuumStateSchema = _enum([
61765
- "idle",
61766
- "cleaning",
61767
- "paused",
61768
- "returning",
61769
- "docked",
61770
- "drying",
61771
- "error"
61772
- ]);
61773
- /**
61774
- * One consumable / waste tank on a robot vacuum (clean-water, dirty-water,
61775
- * detergent or dust-bin). A tank can report a numeric fill `level` (0..100),
61776
- * a discrete `status` (binary-style hardware), or both. Both `null` means the
61777
- * level is currently unknown; the OWNING field being `null` means the
61778
- * hardware has no such tank at all.
61779
- */
61780
- var TankStatusSchema = object({
61781
- /** Numeric fill 0..100 when the hardware reports a percentage; null otherwise. */
61782
- level: number().min(0).max(100).nullable(),
61783
- /** Discrete state when the hardware is binary-mode; null otherwise. */
61784
- status: _enum([
61785
- "ok",
61786
- "low",
61787
- "full"
61788
- ]).nullable()
61789
- });
61790
61846
  object({
61791
61847
  /** Lifecycle state of the vacuum. */
61792
- state: VacuumStateSchema,
61848
+ state: _enum([
61849
+ "idle",
61850
+ "cleaning",
61851
+ "paused",
61852
+ "returning",
61853
+ "docked",
61854
+ "drying",
61855
+ "error"
61856
+ ]),
61793
61857
  /** 0..100 battery percentage. Null when the device has no battery
61794
61858
  * reading. */
61795
61859
  batteryLevel: number().min(0).max(100).nullable(),
@@ -61798,14 +61862,6 @@ object({
61798
61862
  fanSpeed: string().nullable(),
61799
61863
  /** Speed tokens the hardware accepts — drives the UI selector. */
61800
61864
  availableFanSpeeds: array(string()),
61801
- /** Clean-water (mop) tank. Null when the hardware has no clean-water tank. */
61802
- cleanWater: TankStatusSchema.nullable(),
61803
- /** Dirty-water (recovery) tank. Null when the hardware has no dirty-water tank. */
61804
- dirtyWater: TankStatusSchema.nullable(),
61805
- /** Detergent tank. Null when the hardware has no detergent tank. */
61806
- detergent: TankStatusSchema.nullable(),
61807
- /** Dust bin. Null when the hardware has no dust bin. */
61808
- dustBin: TankStatusSchema.nullable(),
61809
61865
  /** 0..100 cleaning-completion percentage of the current task, or null. */
61810
61866
  progressPercent: number().min(0).max(100).nullable(),
61811
61867
  /** Current error code (0 / null = no error). */
@@ -64346,6 +64402,12 @@ Object.freeze({
64346
64402
  addonId: null,
64347
64403
  access: "create"
64348
64404
  },
64405
+ "deviceHistory.deleteOrphanSeries": {
64406
+ capName: "device-history",
64407
+ capScope: "system",
64408
+ addonId: null,
64409
+ access: "delete"
64410
+ },
64349
64411
  "deviceHistory.getDeviceEnabled": {
64350
64412
  capName: "device-history",
64351
64413
  capScope: "system",
@@ -64364,6 +64426,12 @@ Object.freeze({
64364
64426
  addonId: null,
64365
64427
  access: "view"
64366
64428
  },
64429
+ "deviceHistory.listOrphanSeries": {
64430
+ capName: "device-history",
64431
+ capScope: "system",
64432
+ addonId: null,
64433
+ access: "view"
64434
+ },
64367
64435
  "deviceHistory.listSeries": {
64368
64436
  capName: "device-history",
64369
64437
  capScope: "system",
@@ -74576,7 +74644,7 @@ var STATE_SUMMARY_VARS = [
74576
74644
  ([...RULE_TEXT], [...COMBINED_ALARM]),
74577
74645
  ([...RULE_TEXT], [...DEVICE_EVENTS]),
74578
74646
  ([...RULE_TEXT], [...BATTERY, ...CONSUMABLE]),
74579
- ([...RULE_TEXT], [...CONSUMABLE]),
74647
+ ([...RULE_TEXT], [...CONSUMABLE, ...TANK]),
74580
74648
  ([...RULE_TEXT], [...TANK]),
74581
74649
  [...RULE_TEXT],
74582
74650
  ([...RULE_TEXT], [...UPDATES, ...ALERT_EPISODE]),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-notifiers",
3
- "version": "1.2.617",
3
+ "version": "1.2.618",
4
4
  "description": "System notifiers addon for CamStack — a `notification-output` collection provider hosting per-kind notifier adapters (ntfy, pushover, gotify, telegram, discord, webhook, zentik).",
5
5
  "keywords": [
6
6
  "camstack",