@camstack/addon-provider-dreame 0.2.150 → 0.2.152
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.
- package/dist/addon.js +364 -146
- package/dist/addon.mjs +364 -146
- package/package.json +1 -1
package/dist/addon.js
CHANGED
|
@@ -5476,7 +5476,7 @@ var ZodIssueCode$1 = {
|
|
|
5476
5476
|
var ZodFirstPartyTypeKind$1;
|
|
5477
5477
|
ZodFirstPartyTypeKind$1 || (ZodFirstPartyTypeKind$1 = {});
|
|
5478
5478
|
//#endregion
|
|
5479
|
-
//#region ../types/dist/sleep-
|
|
5479
|
+
//#region ../types/dist/sleep-CUp20JkO.mjs
|
|
5480
5480
|
/**
|
|
5481
5481
|
* The audio chunk plane's byte format, and the ONE expansion from a coded
|
|
5482
5482
|
* window to float samples (D455).
|
|
@@ -8368,7 +8368,11 @@ var ContributionSectionSchema = object({
|
|
|
8368
8368
|
literal(4)
|
|
8369
8369
|
]).optional(),
|
|
8370
8370
|
tab: string().optional(),
|
|
8371
|
-
location: _enum([
|
|
8371
|
+
location: _enum([
|
|
8372
|
+
"settings",
|
|
8373
|
+
"top-tab",
|
|
8374
|
+
"hero"
|
|
8375
|
+
]).optional(),
|
|
8372
8376
|
order: number().optional(),
|
|
8373
8377
|
fields: array(any())
|
|
8374
8378
|
});
|
|
@@ -13315,7 +13319,11 @@ var ConfigSectionWithValuesSchema = object({
|
|
|
13315
13319
|
literal(4)
|
|
13316
13320
|
]).optional(),
|
|
13317
13321
|
tab: string().optional(),
|
|
13318
|
-
location: _enum([
|
|
13322
|
+
location: _enum([
|
|
13323
|
+
"settings",
|
|
13324
|
+
"top-tab",
|
|
13325
|
+
"hero"
|
|
13326
|
+
]).optional(),
|
|
13319
13327
|
order: number().optional(),
|
|
13320
13328
|
fields: array(any())
|
|
13321
13329
|
});
|
|
@@ -17195,6 +17203,52 @@ var TierStatusSchema = object({
|
|
|
17195
17203
|
countedAt: number().nullable()
|
|
17196
17204
|
});
|
|
17197
17205
|
/** Operator/diagnostic view: rows per tier, last runs, refusals and drops since boot. */
|
|
17206
|
+
/**
|
|
17207
|
+
* Why a series is orphan. `device-gone`: its device is absent from the
|
|
17208
|
+
* successful device listings (the departure clock). `undeclared`: its `cap:`
|
|
17209
|
+
* key is declared by no capability any more (a field a cap removed).
|
|
17210
|
+
*/
|
|
17211
|
+
var DeviceHistoryOrphanReasonSchema = _enum(["device-gone", "undeclared"]);
|
|
17212
|
+
/** Rows held per stored tier. */
|
|
17213
|
+
var TierRowsSchema = object({
|
|
17214
|
+
raw: number().int(),
|
|
17215
|
+
"5m": number().int(),
|
|
17216
|
+
"1h": number().int(),
|
|
17217
|
+
"1d": number().int()
|
|
17218
|
+
});
|
|
17219
|
+
var OrphanSeriesSchema = object({
|
|
17220
|
+
seriesId: number().int(),
|
|
17221
|
+
deviceId: number().int(),
|
|
17222
|
+
key: string(),
|
|
17223
|
+
scope: string(),
|
|
17224
|
+
/** The metric's display name; `null` when its metric row is gone too. */
|
|
17225
|
+
displayName: string().nullable(),
|
|
17226
|
+
reason: DeviceHistoryOrphanReasonSchema,
|
|
17227
|
+
/** `device-gone`: since when the device has been absent; `null` otherwise. */
|
|
17228
|
+
missingSince: number().nullable(),
|
|
17229
|
+
firstTs: number(),
|
|
17230
|
+
lastTs: number(),
|
|
17231
|
+
rows: TierRowsSchema
|
|
17232
|
+
});
|
|
17233
|
+
var DeviceHistoryOrphanDeleteRefusalSchema = _enum([
|
|
17234
|
+
"not-found",
|
|
17235
|
+
"not-orphan",
|
|
17236
|
+
"failed"
|
|
17237
|
+
]);
|
|
17238
|
+
var OrphanDeleteEntrySchema = discriminatedUnion("ok", [object({
|
|
17239
|
+
seriesId: number().int(),
|
|
17240
|
+
ok: literal(true),
|
|
17241
|
+
deleted: TierRowsSchema
|
|
17242
|
+
}), object({
|
|
17243
|
+
seriesId: number().int(),
|
|
17244
|
+
ok: literal(false),
|
|
17245
|
+
reason: DeviceHistoryOrphanDeleteRefusalSchema
|
|
17246
|
+
})]);
|
|
17247
|
+
var OrphanListSchema = object({
|
|
17248
|
+
series: array(OrphanSeriesSchema).readonly(),
|
|
17249
|
+
/** More orphans exist than {@link DEVICE_HISTORY_ORPHAN_LIST_MAX}. */
|
|
17250
|
+
truncated: boolean()
|
|
17251
|
+
});
|
|
17198
17252
|
var DeviceHistoryStatusSchema = object({
|
|
17199
17253
|
startedAt: number(),
|
|
17200
17254
|
/** The store is declared, series loaded and the first reconcile has answered. */
|
|
@@ -17292,7 +17346,10 @@ method(object({ deviceId: number().int() }), array(SeriesInfoSchema).readonly())
|
|
|
17292
17346
|
}), object({ enabled: boolean() }), {
|
|
17293
17347
|
kind: "mutation",
|
|
17294
17348
|
auth: "admin"
|
|
17295
|
-
}), method(object({}), DeviceHistoryStatusSchema, { auth: "admin" })
|
|
17349
|
+
}), 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() }), {
|
|
17350
|
+
kind: "mutation",
|
|
17351
|
+
auth: "admin"
|
|
17352
|
+
});
|
|
17296
17353
|
var DeviceCaStatusSchema = discriminatedUnion("state", [
|
|
17297
17354
|
object({ state: literal("absent") }),
|
|
17298
17355
|
object({
|
|
@@ -50275,6 +50332,19 @@ var NodeInferenceDeviceSchema = object({
|
|
|
50275
50332
|
/** Whether the node's live probe reports the device as usable right now. */
|
|
50276
50333
|
available: boolean(),
|
|
50277
50334
|
/**
|
|
50335
|
+
* Is the device on the node at all (D919)? `present` — the live probe
|
|
50336
|
+
* reported it; `absent` — the probe ANSWERED and did not report it, so only
|
|
50337
|
+
* its stored settings remain (unplugged, moved to another node): never
|
|
50338
|
+
* eligible, whatever its stored `enabled`, and forgettable with
|
|
50339
|
+
* `forgetInferenceDevice`; `unknown` — the probe did not answer, nothing is
|
|
50340
|
+
* claimed (D315). Optional only for an orchestrator older than the field.
|
|
50341
|
+
*/
|
|
50342
|
+
presence: _enum([
|
|
50343
|
+
"present",
|
|
50344
|
+
"absent",
|
|
50345
|
+
"unknown"
|
|
50346
|
+
]).optional(),
|
|
50347
|
+
/**
|
|
50278
50348
|
* Whether this device participates in dispatch. AUTO default (spec C2):
|
|
50279
50349
|
* accelerators are opt-OUT (a discovered NPU/iGPU/Coral/ANE with no stored
|
|
50280
50350
|
* entry is `true`); CPU is opt-IN (`false` by default — the fallback pool,
|
|
@@ -50500,7 +50570,13 @@ method(object({
|
|
|
50500
50570
|
}), object({ success: literal(true) }), {
|
|
50501
50571
|
kind: "mutation",
|
|
50502
50572
|
auth: "admin"
|
|
50503
|
-
}), method(object({ nodeId: string() }), NodeInferenceDevicesSchema), method(object({
|
|
50573
|
+
}), method(object({ nodeId: string() }), NodeInferenceDevicesSchema), method(object({
|
|
50574
|
+
agentNodeId: string(),
|
|
50575
|
+
deviceKey: string()
|
|
50576
|
+
}), object({ success: literal(true) }), {
|
|
50577
|
+
kind: "mutation",
|
|
50578
|
+
auth: "admin"
|
|
50579
|
+
}), method(object({ agentNodeId: string() }), object({
|
|
50504
50580
|
success: literal(true),
|
|
50505
50581
|
/** Hardware-aware default detection model now in effect on the node (null when unresolvable). */
|
|
50506
50582
|
effectiveModelId: string().nullable(),
|
|
@@ -55189,17 +55265,73 @@ var connectivityCapability = {
|
|
|
55189
55265
|
volatileStateFields: ["lastChangedAt"]
|
|
55190
55266
|
};
|
|
55191
55267
|
/**
|
|
55192
|
-
* Generic device-consumables capability —
|
|
55193
|
-
*
|
|
55194
|
-
* descaling cycles,
|
|
55195
|
-
*
|
|
55196
|
-
*
|
|
55197
|
-
*
|
|
55268
|
+
* Generic device-consumables capability — the ONE place a device reports what
|
|
55269
|
+
* it uses up or fills: wear parts (vacuum filters/brushes, cartridges,
|
|
55270
|
+
* descaling cycles), supplies it draws from (a vacuum's clean-water tank and
|
|
55271
|
+
* detergent, a dishwasher's salt and rinse aid) and waste it collects (a dirty
|
|
55272
|
+
* water tank, a dust bin). Each item carries its remaining life or fill and an
|
|
55273
|
+
* optional "Replaced" reset action. Device-agnostic: any provider that knows
|
|
55274
|
+
* its device tracks consumables registers it; the provider names each item
|
|
55275
|
+
* verbatim and says which `kind` it is.
|
|
55276
|
+
*
|
|
55277
|
+
* The admin UI renders it as ONE collapsible section directly under the
|
|
55278
|
+
* device page's hero card (`placement: 'hero'`), for every device bound to
|
|
55279
|
+
* this cap — never drawn by a device type's hero card itself (D915).
|
|
55198
55280
|
*
|
|
55199
55281
|
* Like `childLayout`, the cap is INERT until a provider sets items: no
|
|
55200
55282
|
* provider populates it by guessing (no HA inference). The UI renders a
|
|
55201
55283
|
* "No consumables reported" placeholder when `items` is empty.
|
|
55202
55284
|
*/
|
|
55285
|
+
/**
|
|
55286
|
+
* What an item IS, which decides which direction is bad:
|
|
55287
|
+
* - `wear` — a part that wears out (a brush, a filter); low life is bad.
|
|
55288
|
+
* - `supply` — something the device draws from (clean water, detergent,
|
|
55289
|
+
* salt, rinse aid); low or empty is bad.
|
|
55290
|
+
* - `waste` — something the device fills (dirty water, a dust bin); full is
|
|
55291
|
+
* bad.
|
|
55292
|
+
* Absent = `wear`.
|
|
55293
|
+
*/
|
|
55294
|
+
var ConsumableKindSchema = _enum([
|
|
55295
|
+
"wear",
|
|
55296
|
+
"supply",
|
|
55297
|
+
"waste"
|
|
55298
|
+
]);
|
|
55299
|
+
/**
|
|
55300
|
+
* What an item LOOKS like, which decides how a client draws it — independent
|
|
55301
|
+
* of `kind`, which decides which direction is bad:
|
|
55302
|
+
* - `part` — a part that wears (a brush, a filter, a mop pad): a wear bar,
|
|
55303
|
+
* remaining time and a reset.
|
|
55304
|
+
* - `tank` — a container of liquid (clean water, dirty water): a fill gauge.
|
|
55305
|
+
* - `product` — something bought and refilled (detergent, salt, rinse aid):
|
|
55306
|
+
* a stepped level and "refill".
|
|
55307
|
+
* - `bin` — a container that collects waste (a dust bin): a fill gauge
|
|
55308
|
+
* that warns when full.
|
|
55309
|
+
* Absent = derived from the kind ({@link consumableFormOf}).
|
|
55310
|
+
*/
|
|
55311
|
+
var ConsumableFormSchema = _enum([
|
|
55312
|
+
"part",
|
|
55313
|
+
"tank",
|
|
55314
|
+
"product",
|
|
55315
|
+
"bin"
|
|
55316
|
+
]);
|
|
55317
|
+
/** The provider's own discrete verdict on an item. */
|
|
55318
|
+
var ConsumableStatusSchema = _enum([
|
|
55319
|
+
"ok",
|
|
55320
|
+
"low",
|
|
55321
|
+
"empty",
|
|
55322
|
+
"full",
|
|
55323
|
+
"replace"
|
|
55324
|
+
]);
|
|
55325
|
+
_enum([
|
|
55326
|
+
"ok",
|
|
55327
|
+
"low",
|
|
55328
|
+
"empty",
|
|
55329
|
+
"full"
|
|
55330
|
+
]);
|
|
55331
|
+
/** The kind of an item, with the documented default for an absent one. */
|
|
55332
|
+
function consumableKindOf(item) {
|
|
55333
|
+
return item.kind ?? "wear";
|
|
55334
|
+
}
|
|
55203
55335
|
/** Units a remaining-life counter is reported in. Closed: the panel renders
|
|
55204
55336
|
* each. */
|
|
55205
55337
|
var ConsumableRemainingUnitSchema = _enum([
|
|
@@ -55214,18 +55346,23 @@ var ConsumableRemainingSchema = object({
|
|
|
55214
55346
|
unit: ConsumableRemainingUnitSchema
|
|
55215
55347
|
});
|
|
55216
55348
|
/** A single consumable item. Either a continuous `level` (remaining
|
|
55217
|
-
* life
|
|
55218
|
-
*
|
|
55219
|
-
* mutually exclusive; a provider may
|
|
55349
|
+
* life %, or fill % for a `supply` / `waste` item) or a discrete `status`
|
|
55350
|
+
* may be known — both may be null when a provider only knows the item
|
|
55351
|
+
* exists. `level` and `status` are not mutually exclusive; a provider may
|
|
55352
|
+
* report both. */
|
|
55220
55353
|
var ConsumableItemSchema = object({
|
|
55221
55354
|
/** Stable id, e.g. 'main-brush'. */
|
|
55222
55355
|
key: string().min(1),
|
|
55223
55356
|
/** Display name. */
|
|
55224
55357
|
label: string().min(1),
|
|
55225
|
-
/** Remaining life % when known (0..100). */
|
|
55358
|
+
/** Remaining life % (`wear`) or fill % (`supply`, `waste`) when known (0..100). */
|
|
55226
55359
|
level: number().min(0).max(100).nullable(),
|
|
55227
|
-
/**
|
|
55228
|
-
status:
|
|
55360
|
+
/** The provider's discrete verdict when known (binary mode). */
|
|
55361
|
+
status: ConsumableStatusSchema.nullable(),
|
|
55362
|
+
/** What the item is — decides whether low or full is bad. Absent = `wear`. */
|
|
55363
|
+
kind: ConsumableKindSchema.optional(),
|
|
55364
|
+
/** How the item is drawn (part, tank, product, bin). Absent = derived from `kind`. */
|
|
55365
|
+
form: ConsumableFormSchema.optional(),
|
|
55229
55366
|
/** Ms epoch of the last replace, when known. */
|
|
55230
55367
|
lastResetAt: number().nullable(),
|
|
55231
55368
|
/** Whether `reset()` is meaningful for this item. */
|
|
@@ -55248,7 +55385,7 @@ var consumablesCapability = {
|
|
|
55248
55385
|
kind: "widget",
|
|
55249
55386
|
widgetId: "host/consumables-panel",
|
|
55250
55387
|
tab: "consumables",
|
|
55251
|
-
|
|
55388
|
+
placement: "hero",
|
|
55252
55389
|
label: "Consumables",
|
|
55253
55390
|
order: 5
|
|
55254
55391
|
} },
|
|
@@ -55309,9 +55446,37 @@ reset: method(object({
|
|
|
55309
55446
|
*/
|
|
55310
55447
|
durability: "restored",
|
|
55311
55448
|
/**
|
|
55312
|
-
* History (D850):
|
|
55449
|
+
* History (D850, D917): one series per (item field, item `key`) — the item key
|
|
55450
|
+
* is the series scope, the item `label` names it. A vacuum tank's fill, a
|
|
55451
|
+
* brush's remaining life and a dishwasher's salt are each recorded the moment
|
|
55452
|
+
* their provider reports them; an item that appears later gets its series.
|
|
55313
55453
|
*/
|
|
55314
|
-
history:
|
|
55454
|
+
history: {
|
|
55455
|
+
fields: {},
|
|
55456
|
+
items: {
|
|
55457
|
+
path: "items",
|
|
55458
|
+
key: "key",
|
|
55459
|
+
label: "label",
|
|
55460
|
+
fields: {
|
|
55461
|
+
level: {
|
|
55462
|
+
kind: "gauge",
|
|
55463
|
+
unit: "%",
|
|
55464
|
+
deadband: 2,
|
|
55465
|
+
displayName: "Level"
|
|
55466
|
+
},
|
|
55467
|
+
status: {
|
|
55468
|
+
kind: "enum",
|
|
55469
|
+
displayName: "Status"
|
|
55470
|
+
},
|
|
55471
|
+
"remaining.value": {
|
|
55472
|
+
kind: "gauge",
|
|
55473
|
+
unitFrom: "remaining.unit",
|
|
55474
|
+
deadband: 1,
|
|
55475
|
+
displayName: "Remaining"
|
|
55476
|
+
}
|
|
55477
|
+
}
|
|
55478
|
+
}
|
|
55479
|
+
},
|
|
55315
55480
|
/** Clocks, not content: a re-read that changed no item costs no commit. */
|
|
55316
55481
|
volatileStateFields: ["lastChangedAt", "lastFetchedAt"]
|
|
55317
55482
|
};
|
|
@@ -55726,8 +55891,9 @@ onStatusChanged: { data: object({
|
|
|
55726
55891
|
volatileStateFields: ["lastChangedAt"]
|
|
55727
55892
|
};
|
|
55728
55893
|
/**
|
|
55729
|
-
* Smart-dishwasher cap — program lifecycle, door / remote-start gates
|
|
55730
|
-
*
|
|
55894
|
+
* Smart-dishwasher cap — program lifecycle, door / remote-start gates and
|
|
55895
|
+
* common program options. Salt and rinse aid are NOT here: they are items of
|
|
55896
|
+
* the device's `consumables` cap, like every other device's (D915).
|
|
55731
55897
|
*
|
|
55732
55898
|
* Sources: native Bosch Home Connect (`dishwasher` device type). Reusable
|
|
55733
55899
|
* by any integration that exposes the same program / option surface.
|
|
@@ -55775,11 +55941,6 @@ var DishwasherAvailabilitySchema = _enum([
|
|
|
55775
55941
|
"offline",
|
|
55776
55942
|
"description-missing"
|
|
55777
55943
|
]);
|
|
55778
|
-
var DishwasherConsumableLevelSchema = _enum([
|
|
55779
|
-
"ok",
|
|
55780
|
-
"low",
|
|
55781
|
-
"empty"
|
|
55782
|
-
]);
|
|
55783
55944
|
var DishwasherStatusSchema = object({
|
|
55784
55945
|
availability: DishwasherAvailabilitySchema,
|
|
55785
55946
|
/** Coarse state for compact surfaces; `unavailable` whenever the appliance state is not known. */
|
|
@@ -55812,8 +55973,6 @@ var DishwasherStatusSchema = object({
|
|
|
55812
55973
|
powerOn: boolean().nullable(),
|
|
55813
55974
|
/** The raw power state (`On`, `Off`, `Standby`, …); null when not known. */
|
|
55814
55975
|
powerState: string().nullable(),
|
|
55815
|
-
saltLevel: DishwasherConsumableLevelSchema.nullable(),
|
|
55816
|
-
rinseAidLevel: DishwasherConsumableLevelSchema.nullable(),
|
|
55817
55976
|
/**
|
|
55818
55977
|
* True while the appliance asks for its filter to be cleaned (smart-filter, filter-system or
|
|
55819
55978
|
* combined care-and-filter reminder raised); false when every such reminder reads clear; null
|
|
@@ -58689,7 +58848,7 @@ var motionTriggerCapability = {
|
|
|
58689
58848
|
enabled: boolean()
|
|
58690
58849
|
}), _void(), {
|
|
58691
58850
|
kind: "mutation",
|
|
58692
|
-
auth: "
|
|
58851
|
+
auth: "protected"
|
|
58693
58852
|
}) },
|
|
58694
58853
|
events: { onMotionTriggerChanged: { data: object({
|
|
58695
58854
|
deviceId: number(),
|
|
@@ -59567,6 +59726,13 @@ var TopologyNodeSchema = object({
|
|
|
59567
59726
|
cpuModel: string().nullable(),
|
|
59568
59727
|
cpuCores: number(),
|
|
59569
59728
|
memoryMB: number(),
|
|
59729
|
+
/**
|
|
59730
|
+
* The inference RUNTIMES installed on the node (`pythonRuntimes`: onnx,
|
|
59731
|
+
* openvino, edgetpu …) — not its devices. An installed runtime says nothing
|
|
59732
|
+
* about whether its hardware is there (a Coral delegate stays installed
|
|
59733
|
+
* after the stick leaves, D919); the live device set is
|
|
59734
|
+
* `pipelineOrchestrator.getNodeInferenceDevices`.
|
|
59735
|
+
*/
|
|
59570
59736
|
engines: array(string()).readonly(),
|
|
59571
59737
|
isHub: boolean(),
|
|
59572
59738
|
isOnline: boolean(),
|
|
@@ -60684,7 +60850,28 @@ var ResolvedInferenceConfigSchema = object({
|
|
|
60684
60850
|
format: ModelFormatSchema,
|
|
60685
60851
|
reason: string()
|
|
60686
60852
|
});
|
|
60687
|
-
|
|
60853
|
+
/**
|
|
60854
|
+
* The answer of an accelerator rescan (D919): the node's device list after
|
|
60855
|
+
* the re-probe, what changed, and the evidence that decided the Coral answer
|
|
60856
|
+
* (`usbBus` — could the USB bus be read at all; `decidedBy` — USB ids, the PCI
|
|
60857
|
+
* bus, the installed-delegate fallback, or nothing).
|
|
60858
|
+
*/
|
|
60859
|
+
var AcceleratorRescanSchema = object({
|
|
60860
|
+
devices: array(InferenceDeviceDescriptorSchema).readonly(),
|
|
60861
|
+
appeared: array(string()).readonly(),
|
|
60862
|
+
disappeared: array(string()).readonly(),
|
|
60863
|
+
usbBus: _enum(["observed", "unobservable"]),
|
|
60864
|
+
decidedBy: _enum([
|
|
60865
|
+
"usb-ids",
|
|
60866
|
+
"pci",
|
|
60867
|
+
"delegate-fallback",
|
|
60868
|
+
"none"
|
|
60869
|
+
])
|
|
60870
|
+
});
|
|
60871
|
+
method(_void(), PlatformCapabilitiesSchema), method(_void(), HardwareInfoSchema), method(object({ requirements: array(ModelRequirementSchema).readonly() }), ResolvedInferenceConfigSchema), method(object({ prefer: HwAccelBackendInputSchema }), HwAccelResolutionSchema), method(_void(), AcceleratorRescanSchema, {
|
|
60872
|
+
kind: "mutation",
|
|
60873
|
+
auth: "admin"
|
|
60874
|
+
});
|
|
60688
60875
|
/**
|
|
60689
60876
|
* Multi-metric electrical meter. One slice can carry any combination
|
|
60690
60877
|
* of instantaneous power (W), cumulative energy (kWh), voltage (V),
|
|
@@ -64777,60 +64964,17 @@ method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserI
|
|
|
64777
64964
|
auth: "admin",
|
|
64778
64965
|
access: "delete"
|
|
64779
64966
|
});
|
|
64780
|
-
/**
|
|
64781
|
-
* Robot-vacuum cap. Models HA `vacuum.*` entities — anything with a
|
|
64782
|
-
* cleaning lifecycle plus a return-to-base / locate surface and an
|
|
64783
|
-
* optional fan-speed selector.
|
|
64784
|
-
*
|
|
64785
|
-
* State follows HA's canonical vacuum lifecycle: `idle` / `cleaning` /
|
|
64786
|
-
* `paused` / `returning` / `docked` / `error`. `batteryLevel`
|
|
64787
|
-
* (0..100) is nullable — some vacuums don't report a battery
|
|
64788
|
-
* percentage. `fanSpeed` is the current speed token (provider-verbatim,
|
|
64789
|
-
* e.g. `'standard'` / `'turbo'`) and `availableFanSpeeds` lists the
|
|
64790
|
-
* tokens the hardware accepts so the UI renders only supported choices.
|
|
64791
|
-
*
|
|
64792
|
-
* The `setFanSpeed` method takes the bare `speed` token — the provider
|
|
64793
|
-
* validates it against the vacuum's own list. `locate` triggers the
|
|
64794
|
-
* find-me chirp; `returnToBase` sends it home.
|
|
64795
|
-
*
|
|
64796
|
-
* Consumable / waste tanks: `cleanWater` / `dirtyWater` / `detergent` /
|
|
64797
|
-
* `dustBin` each carry a nullable `{ level (0..100 %), status ('ok' |
|
|
64798
|
-
* 'low' | 'full') }` reading. Native providers (e.g. Dreame, Roborock)
|
|
64799
|
-
* SHOULD populate whichever tanks the hardware has — leave a field `null`
|
|
64800
|
-
* only when the device has no such tank at all, and use a `TankStatus`
|
|
64801
|
-
* with both inner fields `null` when the tank exists but its level is
|
|
64802
|
-
* currently unknown. HA `vacuum.*` entities expose no per-tank telemetry,
|
|
64803
|
-
* so the HA provider leaves all four `null`.
|
|
64804
|
-
*/
|
|
64805
|
-
var VacuumStateSchema = _enum([
|
|
64806
|
-
"idle",
|
|
64807
|
-
"cleaning",
|
|
64808
|
-
"paused",
|
|
64809
|
-
"returning",
|
|
64810
|
-
"docked",
|
|
64811
|
-
"drying",
|
|
64812
|
-
"error"
|
|
64813
|
-
]);
|
|
64814
|
-
/**
|
|
64815
|
-
* One consumable / waste tank on a robot vacuum (clean-water, dirty-water,
|
|
64816
|
-
* detergent or dust-bin). A tank can report a numeric fill `level` (0..100),
|
|
64817
|
-
* a discrete `status` (binary-style hardware), or both. Both `null` means the
|
|
64818
|
-
* level is currently unknown; the OWNING field being `null` means the
|
|
64819
|
-
* hardware has no such tank at all.
|
|
64820
|
-
*/
|
|
64821
|
-
var TankStatusSchema = object({
|
|
64822
|
-
/** Numeric fill 0..100 when the hardware reports a percentage; null otherwise. */
|
|
64823
|
-
level: number().min(0).max(100).nullable(),
|
|
64824
|
-
/** Discrete state when the hardware is binary-mode; null otherwise. */
|
|
64825
|
-
status: _enum([
|
|
64826
|
-
"ok",
|
|
64827
|
-
"low",
|
|
64828
|
-
"full"
|
|
64829
|
-
]).nullable()
|
|
64830
|
-
});
|
|
64831
64967
|
var VacuumControlStatusSchema = object({
|
|
64832
64968
|
/** Lifecycle state of the vacuum. */
|
|
64833
|
-
state:
|
|
64969
|
+
state: _enum([
|
|
64970
|
+
"idle",
|
|
64971
|
+
"cleaning",
|
|
64972
|
+
"paused",
|
|
64973
|
+
"returning",
|
|
64974
|
+
"docked",
|
|
64975
|
+
"drying",
|
|
64976
|
+
"error"
|
|
64977
|
+
]),
|
|
64834
64978
|
/** 0..100 battery percentage. Null when the device has no battery
|
|
64835
64979
|
* reading. */
|
|
64836
64980
|
batteryLevel: number().min(0).max(100).nullable(),
|
|
@@ -64839,14 +64983,6 @@ var VacuumControlStatusSchema = object({
|
|
|
64839
64983
|
fanSpeed: string().nullable(),
|
|
64840
64984
|
/** Speed tokens the hardware accepts — drives the UI selector. */
|
|
64841
64985
|
availableFanSpeeds: array(string()),
|
|
64842
|
-
/** Clean-water (mop) tank. Null when the hardware has no clean-water tank. */
|
|
64843
|
-
cleanWater: TankStatusSchema.nullable(),
|
|
64844
|
-
/** Dirty-water (recovery) tank. Null when the hardware has no dirty-water tank. */
|
|
64845
|
-
dirtyWater: TankStatusSchema.nullable(),
|
|
64846
|
-
/** Detergent tank. Null when the hardware has no detergent tank. */
|
|
64847
|
-
detergent: TankStatusSchema.nullable(),
|
|
64848
|
-
/** Dust bin. Null when the hardware has no dust bin. */
|
|
64849
|
-
dustBin: TankStatusSchema.nullable(),
|
|
64850
64986
|
/** 0..100 cleaning-completion percentage of the current task, or null. */
|
|
64851
64987
|
progressPercent: number().min(0).max(100).nullable(),
|
|
64852
64988
|
/** Current error code (0 / null = no error). */
|
|
@@ -64908,35 +65044,14 @@ var vacuumControlCapability = {
|
|
|
64908
65044
|
*/
|
|
64909
65045
|
durability: "session",
|
|
64910
65046
|
/**
|
|
64911
|
-
* History (D850): recorded series.
|
|
65047
|
+
* History (D850): recorded series. The tanks moved to `consumables` (D915), whose
|
|
65048
|
+
* items are keyed by runtime ids and record no history.
|
|
64912
65049
|
*/
|
|
64913
|
-
history: { fields: {
|
|
64914
|
-
|
|
64915
|
-
|
|
64916
|
-
|
|
64917
|
-
|
|
64918
|
-
},
|
|
64919
|
-
"cleanWater.level": {
|
|
64920
|
-
kind: "gauge",
|
|
64921
|
-
unit: "%",
|
|
64922
|
-
deadband: 2
|
|
64923
|
-
},
|
|
64924
|
-
"dirtyWater.level": {
|
|
64925
|
-
kind: "gauge",
|
|
64926
|
-
unit: "%",
|
|
64927
|
-
deadband: 2
|
|
64928
|
-
},
|
|
64929
|
-
"detergent.level": {
|
|
64930
|
-
kind: "gauge",
|
|
64931
|
-
unit: "%",
|
|
64932
|
-
deadband: 2
|
|
64933
|
-
},
|
|
64934
|
-
"dustBin.level": {
|
|
64935
|
-
kind: "gauge",
|
|
64936
|
-
unit: "%",
|
|
64937
|
-
deadband: 2
|
|
64938
|
-
}
|
|
64939
|
-
} }
|
|
65050
|
+
history: { fields: { batteryLevel: {
|
|
65051
|
+
kind: "gauge",
|
|
65052
|
+
unit: "%",
|
|
65053
|
+
deadband: 2
|
|
65054
|
+
} } }
|
|
64940
65055
|
};
|
|
64941
65056
|
var ValveStatusSchema = object({
|
|
64942
65057
|
/** Lifecycle state of the valve. */
|
|
@@ -69346,6 +69461,12 @@ Object.freeze({
|
|
|
69346
69461
|
addonId: null,
|
|
69347
69462
|
access: "create"
|
|
69348
69463
|
},
|
|
69464
|
+
"deviceHistory.deleteOrphanSeries": {
|
|
69465
|
+
capName: "device-history",
|
|
69466
|
+
capScope: "system",
|
|
69467
|
+
addonId: null,
|
|
69468
|
+
access: "delete"
|
|
69469
|
+
},
|
|
69349
69470
|
"deviceHistory.getDeviceEnabled": {
|
|
69350
69471
|
capName: "device-history",
|
|
69351
69472
|
capScope: "system",
|
|
@@ -69364,6 +69485,12 @@ Object.freeze({
|
|
|
69364
69485
|
addonId: null,
|
|
69365
69486
|
access: "view"
|
|
69366
69487
|
},
|
|
69488
|
+
"deviceHistory.listOrphanSeries": {
|
|
69489
|
+
capName: "device-history",
|
|
69490
|
+
capScope: "system",
|
|
69491
|
+
addonId: null,
|
|
69492
|
+
access: "view"
|
|
69493
|
+
},
|
|
69367
69494
|
"deviceHistory.listSeries": {
|
|
69368
69495
|
capName: "device-history",
|
|
69369
69496
|
capScope: "system",
|
|
@@ -72988,6 +73115,12 @@ Object.freeze({
|
|
|
72988
73115
|
addonId: null,
|
|
72989
73116
|
access: "delete"
|
|
72990
73117
|
},
|
|
73118
|
+
"pipelineOrchestrator.forgetInferenceDevice": {
|
|
73119
|
+
capName: "pipeline-orchestrator",
|
|
73120
|
+
capScope: "system",
|
|
73121
|
+
addonId: null,
|
|
73122
|
+
access: "delete"
|
|
73123
|
+
},
|
|
72991
73124
|
"pipelineOrchestrator.getAgentLoad": {
|
|
72992
73125
|
capName: "pipeline-orchestrator",
|
|
72993
73126
|
capScope: "system",
|
|
@@ -73564,6 +73697,12 @@ Object.freeze({
|
|
|
73564
73697
|
addonId: null,
|
|
73565
73698
|
access: "view"
|
|
73566
73699
|
},
|
|
73700
|
+
"platformProbe.rescanAccelerators": {
|
|
73701
|
+
capName: "platform-probe",
|
|
73702
|
+
capScope: "system",
|
|
73703
|
+
addonId: null,
|
|
73704
|
+
access: "create"
|
|
73705
|
+
},
|
|
73567
73706
|
"platformProbe.resolveHwAccel": {
|
|
73568
73707
|
capName: "platform-probe",
|
|
73569
73708
|
capScope: "system",
|
|
@@ -79369,7 +79508,7 @@ var STATE_SUMMARY_VARS = [
|
|
|
79369
79508
|
([...RULE_TEXT], [...COMBINED_ALARM]),
|
|
79370
79509
|
([...RULE_TEXT], [...DEVICE_EVENTS]),
|
|
79371
79510
|
([...RULE_TEXT], [...BATTERY, ...CONSUMABLE]),
|
|
79372
|
-
([...RULE_TEXT], [...CONSUMABLE]),
|
|
79511
|
+
([...RULE_TEXT], [...CONSUMABLE, ...TANK]),
|
|
79373
79512
|
([...RULE_TEXT], [...TANK]),
|
|
79374
79513
|
[...RULE_TEXT],
|
|
79375
79514
|
([...RULE_TEXT], [...UPDATES, ...ALERT_EPISODE]),
|
|
@@ -135239,8 +135378,7 @@ function dirtyWaterTankStatus(value, errorCode) {
|
|
|
135239
135378
|
return null;
|
|
135240
135379
|
}
|
|
135241
135380
|
/**
|
|
135242
|
-
* The four
|
|
135243
|
-
* dust-bin) decoded from the model's {@link VacuumCapabilities}, with the
|
|
135381
|
+
* The four tanks (clean-water / dirty-water / detergent / dust-bin) decoded from the model's {@link VacuumCapabilities}, with the
|
|
135244
135382
|
* discrete `status` populated from the live MIoT enum props when supplied. Pure.
|
|
135245
135383
|
*
|
|
135246
135384
|
* The nodedreame library exposes NO tank FILL-LEVEL telemetry — the cloud shadow
|
|
@@ -135271,6 +135409,57 @@ function decodeVacuumTanks(caps, props, errorCode = null) {
|
|
|
135271
135409
|
dustBin: tank(Boolean(caps?.canAutoEmpty), props ? dustBinTankStatus(props.dustCollection, props.dustBagStatus) : null)
|
|
135272
135410
|
};
|
|
135273
135411
|
}
|
|
135412
|
+
/** How each tank is named and what it is, in the order the panel lists them. */
|
|
135413
|
+
var TANK_ITEMS = [
|
|
135414
|
+
{
|
|
135415
|
+
key: "cleanWater",
|
|
135416
|
+
label: "Clean water tank",
|
|
135417
|
+
kind: "supply",
|
|
135418
|
+
form: "tank"
|
|
135419
|
+
},
|
|
135420
|
+
{
|
|
135421
|
+
key: "dirtyWater",
|
|
135422
|
+
label: "Dirty water tank",
|
|
135423
|
+
kind: "waste",
|
|
135424
|
+
form: "tank"
|
|
135425
|
+
},
|
|
135426
|
+
{
|
|
135427
|
+
key: "detergent",
|
|
135428
|
+
label: "Detergent",
|
|
135429
|
+
kind: "supply",
|
|
135430
|
+
form: "product"
|
|
135431
|
+
},
|
|
135432
|
+
{
|
|
135433
|
+
key: "dustBin",
|
|
135434
|
+
label: "Dust bin",
|
|
135435
|
+
kind: "waste",
|
|
135436
|
+
form: "bin"
|
|
135437
|
+
}
|
|
135438
|
+
];
|
|
135439
|
+
/**
|
|
135440
|
+
* The tanks as `consumables` items (D915): every PRESENT tank becomes a
|
|
135441
|
+
* `supply` (clean water, detergent) or `waste` (dirty water, dust bin) item
|
|
135442
|
+
* keyed by its old field name, drawn as a `tank` (the two water tanks), a
|
|
135443
|
+
* `product` (detergent) or a `bin` (the dust bin) — the key the notification centre's tank
|
|
135444
|
+
* episodes were built on, so an open episode carries on. A tank is never
|
|
135445
|
+
* resettable: emptying or refilling it is the reset. Pure.
|
|
135446
|
+
*/
|
|
135447
|
+
function vacuumTankItems(tanks) {
|
|
135448
|
+
return TANK_ITEMS.flatMap(({ key, label, kind, form }) => {
|
|
135449
|
+
const tank = tanks[key];
|
|
135450
|
+
if (tank === null) return [];
|
|
135451
|
+
return [{
|
|
135452
|
+
key,
|
|
135453
|
+
label,
|
|
135454
|
+
level: tank.level,
|
|
135455
|
+
status: tank.status,
|
|
135456
|
+
kind,
|
|
135457
|
+
form,
|
|
135458
|
+
lastResetAt: null,
|
|
135459
|
+
resettable: false
|
|
135460
|
+
}];
|
|
135461
|
+
});
|
|
135462
|
+
}
|
|
135274
135463
|
/**
|
|
135275
135464
|
* Clamp a raw consumable percentage to `[0, 100]`, or return `null` when the
|
|
135276
135465
|
* value is absent / non-finite. The library reports remaining life as a 0..100
|
|
@@ -135299,7 +135488,8 @@ function buildVacuumConsumableItems(readings) {
|
|
|
135299
135488
|
level: clampConsumablePct(c.leftPct),
|
|
135300
135489
|
status: null,
|
|
135301
135490
|
lastResetAt: null,
|
|
135302
|
-
resettable: c.resettable
|
|
135491
|
+
resettable: c.resettable,
|
|
135492
|
+
form: "part"
|
|
135303
135493
|
}));
|
|
135304
135494
|
}
|
|
135305
135495
|
/** Structural equality of two JSON-shaped values, key order ignored. */
|
|
@@ -182684,7 +182874,8 @@ function buildMowerConsumables(readings) {
|
|
|
182684
182874
|
level: r.remainingPercent,
|
|
182685
182875
|
status: null,
|
|
182686
182876
|
lastResetAt: null,
|
|
182687
|
-
resettable: true
|
|
182877
|
+
resettable: true,
|
|
182878
|
+
form: "part"
|
|
182688
182879
|
}));
|
|
182689
182880
|
}
|
|
182690
182881
|
//#endregion
|
|
@@ -182708,7 +182899,7 @@ var CONSUMABLES_COLD_START = {
|
|
|
182708
182899
|
lastFetchedAt: 0
|
|
182709
182900
|
};
|
|
182710
182901
|
function itemEqual(a, b) {
|
|
182711
|
-
return a.key === b.key && a.label === b.label && a.level === b.level && a.status === b.status && a.lastResetAt === b.lastResetAt && a.resettable === b.resettable;
|
|
182902
|
+
return a.key === b.key && a.label === b.label && a.level === b.level && a.status === b.status && a.lastResetAt === b.lastResetAt && a.resettable === b.resettable && a.kind === b.kind && a.remaining?.value === b.remaining?.value && a.remaining?.unit === b.remaining?.unit;
|
|
182712
182903
|
}
|
|
182713
182904
|
function itemsEqual(a, b) {
|
|
182714
182905
|
return a.length === b.length && a.every((item, i) => {
|
|
@@ -183698,6 +183889,31 @@ var DreameSwitchDevice = class extends DreameChildDevice {
|
|
|
183698
183889
|
};
|
|
183699
183890
|
//#endregion
|
|
183700
183891
|
//#region src/devices/dreame-vacuum-consumables.ts
|
|
183892
|
+
/**
|
|
183893
|
+
* The vacuum's `consumables` slice: when it is re-read, and what a reset does.
|
|
183894
|
+
*
|
|
183895
|
+
* The life %s and their time-left twins are settings the robot rarely re-pushes
|
|
183896
|
+
* over MQTT, and the library does not poll them. So they are re-read from the
|
|
183897
|
+
* cloud SHADOW (no robot wake) on activate, every {@link CONSUMABLES_REFRESH_MS},
|
|
183898
|
+
* and on the edge INTO `docked` — the moment a run has just used them up. The
|
|
183899
|
+
* same read reseeds the station tank-status props (dirty water, dust bag, …),
|
|
183900
|
+
* which otherwise arrive only as pushes.
|
|
183901
|
+
*
|
|
183902
|
+
* A reset goes through the library, which re-reads the item it reset (live,
|
|
183903
|
+
* else shadow) before it resolves; the slice is rebuilt from that. A shadow
|
|
183904
|
+
* answer may still be the pre-reset value, so it earns ONE follow-up refresh.
|
|
183905
|
+
*
|
|
183906
|
+
* The TANKS ride the same slice (D915): every push hands over the tank items
|
|
183907
|
+
* the device decoded, appended after the wear items. Either half may be
|
|
183908
|
+
* unknown for a while after a restart — the shadow has not answered, or a
|
|
183909
|
+
* refresh lands before the first push brought the tanks — and the slice is
|
|
183910
|
+
* `restored`, so an unknown half keeps the restored rows instead of erasing
|
|
183911
|
+
* them.
|
|
183912
|
+
*/
|
|
183913
|
+
/** A tank item (`supply` / `waste`) as opposed to a wear item. */
|
|
183914
|
+
function isTankItem(item) {
|
|
183915
|
+
return consumableKindOf(item) !== "wear";
|
|
183916
|
+
}
|
|
183701
183917
|
/** Hourly: a consumable moves by hours of cleaning, and the dock edge covers a run. */
|
|
183702
183918
|
var CONSUMABLES_REFRESH_MS = 60 * 6e4;
|
|
183703
183919
|
/** Time for the robot to report a reset to the cloud before the shadow is re-read. */
|
|
@@ -183714,6 +183930,8 @@ var DreameVacuumConsumables = class {
|
|
|
183714
183930
|
#refresher;
|
|
183715
183931
|
/** Last pushed lifecycle state; `null` until the first push after boot. */
|
|
183716
183932
|
#prevState = null;
|
|
183933
|
+
/** Last pushed tank items; `null` until the first push after boot. */
|
|
183934
|
+
#tanks = null;
|
|
183717
183935
|
constructor(deps) {
|
|
183718
183936
|
this.#deps = deps;
|
|
183719
183937
|
this.#refresher = new DreameConsumablesRefresher({
|
|
@@ -183733,12 +183951,14 @@ var DreameVacuumConsumables = class {
|
|
|
183733
183951
|
this.#refresher.stop();
|
|
183734
183952
|
}
|
|
183735
183953
|
/**
|
|
183736
|
-
* Every `stateChanged` push: replay the cache
|
|
183737
|
-
* an item changed) and refresh on the edge into
|
|
183738
|
-
* boot is not an edge — activation already
|
|
183739
|
-
* between station routines (`drying` →
|
|
183954
|
+
* Every `stateChanged` push: replay the cache and the pushed tanks into the
|
|
183955
|
+
* slice (written only if an item changed) and refresh on the edge into
|
|
183956
|
+
* `docked`. The first push after boot is not an edge — activation already
|
|
183957
|
+
* reads — and neither is a hop between station routines (`drying` →
|
|
183958
|
+
* `docked`): only the end of a RUN is.
|
|
183740
183959
|
*/
|
|
183741
|
-
onPush(state) {
|
|
183960
|
+
onPush(state, tanks) {
|
|
183961
|
+
this.#tanks = tanks;
|
|
183742
183962
|
this.#apply(false);
|
|
183743
183963
|
const enteredDock = this.#prevState !== null && DOCK_EDGE_FROM.has(this.#prevState) && state === "docked";
|
|
183744
183964
|
this.#prevState = state;
|
|
@@ -183788,7 +184008,11 @@ var DreameVacuumConsumables = class {
|
|
|
183788
184008
|
const { store, resolveVacuum, now } = this.#deps;
|
|
183789
184009
|
const vacuum = resolveVacuum();
|
|
183790
184010
|
if (vacuum === null) return;
|
|
183791
|
-
|
|
184011
|
+
const prev = store.getCapState("consumables")?.items ?? [];
|
|
184012
|
+
const read = buildVacuumConsumableItems(vacuum.supportedConsumables);
|
|
184013
|
+
const wear = read.length > 0 ? read : prev.filter((item) => !isTankItem(item));
|
|
184014
|
+
const tanks = this.#tanks ?? prev.filter(isTankItem);
|
|
184015
|
+
writeConsumables(store, [...wear, ...tanks], (now ?? Date.now)(), landed);
|
|
183792
184016
|
}
|
|
183793
184017
|
};
|
|
183794
184018
|
function resetMeta(result) {
|
|
@@ -183808,10 +184032,6 @@ var CONTROL_COLD_START = {
|
|
|
183808
184032
|
batteryLevel: null,
|
|
183809
184033
|
fanSpeed: null,
|
|
183810
184034
|
availableFanSpeeds: [],
|
|
183811
|
-
cleanWater: null,
|
|
183812
|
-
dirtyWater: null,
|
|
183813
|
-
detergent: null,
|
|
183814
|
-
dustBin: null,
|
|
183815
184035
|
progressPercent: null,
|
|
183816
184036
|
errorCode: null,
|
|
183817
184037
|
errorLabel: null,
|
|
@@ -183827,11 +184047,13 @@ var CONTROL_COLD_START = {
|
|
|
183827
184047
|
* `setFanSpeed`→`setSuction()` (token validated against the model's supported
|
|
183828
184048
|
* suction levels).
|
|
183829
184049
|
*
|
|
183830
|
-
*
|
|
183831
|
-
*
|
|
183832
|
-
*
|
|
183833
|
-
*
|
|
183834
|
-
*
|
|
184050
|
+
* Tanks (clean water / dirty water / detergent / dust bin) are `supply` /
|
|
184051
|
+
* `waste` items of the `consumables` slice (D915), not `vacuum-control` fields:
|
|
184052
|
+
* the library exposes NO tank fill LEVEL, so `level` is always null. PRESENCE
|
|
184053
|
+
* comes from the model capability flags and a discrete `status` from the
|
|
184054
|
+
* station's tank-status enum props (`decodeVacuumTanks`, ids in
|
|
184055
|
+
* `VACUUM_TANK_PROPS`); an absent tank is no item, an unknown status is `null`
|
|
184056
|
+
* — never `ok`.
|
|
183835
184057
|
*
|
|
183836
184058
|
* Consumables: whatever the model REPORTS (the library's presence-driven
|
|
183837
184059
|
* `supportedConsumables`), re-read from the cloud shadow on activate, hourly and
|
|
@@ -183955,16 +184177,12 @@ var DreameVacuumDevice = class extends DreameChildDevice {
|
|
|
183955
184177
|
recomputeSlice() {
|
|
183956
184178
|
const vacuum = this.resolveVacuum();
|
|
183957
184179
|
if (vacuum === null) return;
|
|
183958
|
-
const tanks = decodeVacuumTanks(vacuum.vacuumCapabilities, this.readTankProps(), vacuum.errorCode);
|
|
184180
|
+
const tanks = vacuumTankItems(decodeVacuumTanks(vacuum.vacuumCapabilities, this.readTankProps(), vacuum.errorCode));
|
|
183959
184181
|
const controlSlice = {
|
|
183960
184182
|
state: mapMiotStateToVacuumState(vacuum.status),
|
|
183961
184183
|
batteryLevel: clampBatteryLevel$1(vacuum.battery),
|
|
183962
184184
|
fanSpeed: suctionLevelToken(vacuum.suction),
|
|
183963
184185
|
availableFanSpeeds: supportedFanSpeedTokens(vacuum.supportedSuctionLevels),
|
|
183964
|
-
cleanWater: tanks.cleanWater,
|
|
183965
|
-
dirtyWater: tanks.dirtyWater,
|
|
183966
|
-
detergent: tanks.detergent,
|
|
183967
|
-
dustBin: tanks.dustBin,
|
|
183968
184186
|
progressPercent: clampPercent$1(vacuum.taskProgressPct),
|
|
183969
184187
|
errorCode: vacuum.errorCode,
|
|
183970
184188
|
errorLabel: vacuum.errorCode ? `Error ${vacuum.errorCode}` : null,
|
|
@@ -183972,7 +184190,7 @@ var DreameVacuumDevice = class extends DreameChildDevice {
|
|
|
183972
184190
|
};
|
|
183973
184191
|
const toWrite = nextVacuumControlSlice(this.runtimeState.getCapState(CAP_NAME$1), controlSlice);
|
|
183974
184192
|
if (toWrite !== null) this.runtimeState.setCapState(CAP_NAME$1, toWrite);
|
|
183975
|
-
this.consumables.onPush(controlSlice.state);
|
|
184193
|
+
this.consumables.onPush(controlSlice.state, tanks);
|
|
183976
184194
|
}
|
|
183977
184195
|
/**
|
|
183978
184196
|
* Read the tank-status MIoT enum props ({@link VACUUM_TANK_PROPS}) from the
|