@camstack/addon-provider-homeassistant 1.1.7 → 1.1.9
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 +128 -26
- package/dist/addon.mjs +128 -26
- package/package.json +1 -1
package/dist/addon.js
CHANGED
|
@@ -10109,15 +10109,18 @@ var humiditySensorCapability = {
|
|
|
10109
10109
|
runtimeState: HumiditySensorStatusSchema
|
|
10110
10110
|
};
|
|
10111
10111
|
/**
|
|
10112
|
-
* Image display cap. Models
|
|
10113
|
-
*
|
|
10114
|
-
*
|
|
10115
|
-
* Read-only: there are no setters. The provider resolves
|
|
10116
|
-
*
|
|
10117
|
-
*
|
|
10118
|
-
*
|
|
10119
|
-
*
|
|
10120
|
-
*
|
|
10112
|
+
* Image display cap. Models a single still image exposed by an integration —
|
|
10113
|
+
* a snapshot, a chart, a generated picture, or a robot's cleaning-map render.
|
|
10114
|
+
*
|
|
10115
|
+
* Read-only: there are no setters. The provider resolves whatever upstream
|
|
10116
|
+
* source it has into an ABSOLUTE URL the browser loads directly:
|
|
10117
|
+
* - HA `image.*` entities → the `entity_picture` signed-token path
|
|
10118
|
+
* (token stays in the query string, so no auth header is needed);
|
|
10119
|
+
* - a Dreame/robot map → the cloud/OSS map-image URL (or an addon
|
|
10120
|
+
* data-plane URL serving the rendered map bytes), exposed as its own
|
|
10121
|
+
* Image child device grouped under the robot's container.
|
|
10122
|
+
* The slice carries that URL plus the upstream last-updated timestamp; the
|
|
10123
|
+
* image changes when the source's last-updated marker changes.
|
|
10121
10124
|
*/
|
|
10122
10125
|
var ImageStatusSchema = object({
|
|
10123
10126
|
/** Absolute signed URL the browser loads directly. Null when the
|
|
@@ -10143,18 +10146,47 @@ var imageCapability = {
|
|
|
10143
10146
|
*/
|
|
10144
10147
|
runtimeState: ImageStatusSchema
|
|
10145
10148
|
};
|
|
10149
|
+
/**
|
|
10150
|
+
* Robotic lawn-mower cap. Models HA `lawn_mower.*` entities — anything
|
|
10151
|
+
* with a mowing lifecycle plus a dock action.
|
|
10152
|
+
*
|
|
10153
|
+
* Activity follows HA's canonical lawn-mower lifecycle: `idle` /
|
|
10154
|
+
* `mowing` / `paused` / `docked` / `error`. `batteryLevel` (0..100) is
|
|
10155
|
+
* nullable — some mowers don't report a battery percentage.
|
|
10156
|
+
*
|
|
10157
|
+
* `startMowing` begins a mowing run, `pause` halts it in place, and
|
|
10158
|
+
* `dock` sends the mower back to its charging station.
|
|
10159
|
+
*/
|
|
10160
|
+
var LawnMowerActivitySchema = _enum([
|
|
10161
|
+
"idle",
|
|
10162
|
+
"mowing",
|
|
10163
|
+
"paused",
|
|
10164
|
+
"docked",
|
|
10165
|
+
"error"
|
|
10166
|
+
]);
|
|
10167
|
+
/** Severity of the current device/error code — info (status), warning, error. */
|
|
10168
|
+
var DeviceCodeSeveritySchema = _enum([
|
|
10169
|
+
"info",
|
|
10170
|
+
"warning",
|
|
10171
|
+
"error"
|
|
10172
|
+
]);
|
|
10146
10173
|
var LawnMowerControlStatusSchema = object({
|
|
10147
10174
|
/** Lifecycle activity of the mower. */
|
|
10148
|
-
activity:
|
|
10149
|
-
"idle",
|
|
10150
|
-
"mowing",
|
|
10151
|
-
"paused",
|
|
10152
|
-
"docked",
|
|
10153
|
-
"error"
|
|
10154
|
-
]),
|
|
10175
|
+
activity: LawnMowerActivitySchema,
|
|
10155
10176
|
/** 0..100 battery percentage. Null when the device has no battery
|
|
10156
10177
|
* reading. */
|
|
10157
10178
|
batteryLevel: number().min(0).max(100).nullable(),
|
|
10179
|
+
/** 0..100 mowing-completion percentage of the current task, or null when no
|
|
10180
|
+
* task is active / progress is unavailable. */
|
|
10181
|
+
progressPercent: number().min(0).max(100).nullable(),
|
|
10182
|
+
/** Current device/event code (dynamic — mostly status, sometimes an error),
|
|
10183
|
+
* or null when unknown. */
|
|
10184
|
+
currentCode: number().nullable(),
|
|
10185
|
+
/** Human label for {@link currentCode}, or null when undecodable. */
|
|
10186
|
+
currentCodeLabel: string().nullable(),
|
|
10187
|
+
/** Severity of {@link currentCode}. `error` (and often `warning`) warrants UI
|
|
10188
|
+
* attention; `info` is normal status. */
|
|
10189
|
+
severity: DeviceCodeSeveritySchema,
|
|
10158
10190
|
/** Ms epoch when the slice was last updated. */
|
|
10159
10191
|
lastChangedAt: number()
|
|
10160
10192
|
});
|
|
@@ -12380,6 +12412,7 @@ var VacuumStateSchema = _enum([
|
|
|
12380
12412
|
"paused",
|
|
12381
12413
|
"returning",
|
|
12382
12414
|
"docked",
|
|
12415
|
+
"drying",
|
|
12383
12416
|
"error"
|
|
12384
12417
|
]);
|
|
12385
12418
|
/**
|
|
@@ -12418,6 +12451,12 @@ var VacuumControlStatusSchema = object({
|
|
|
12418
12451
|
detergent: TankStatusSchema.nullable(),
|
|
12419
12452
|
/** Dust bin. Null when the hardware has no dust bin. */
|
|
12420
12453
|
dustBin: TankStatusSchema.nullable(),
|
|
12454
|
+
/** 0..100 cleaning-completion percentage of the current task, or null. */
|
|
12455
|
+
progressPercent: number().min(0).max(100).nullable(),
|
|
12456
|
+
/** Current error code (0 / null = no error). */
|
|
12457
|
+
errorCode: number().nullable(),
|
|
12458
|
+
/** Human label for {@link errorCode}, or null when none / undecodable. */
|
|
12459
|
+
errorLabel: string().nullable(),
|
|
12421
12460
|
/** Ms epoch when the slice was last updated. */
|
|
12422
12461
|
lastChangedAt: number()
|
|
12423
12462
|
});
|
|
@@ -13384,9 +13423,29 @@ var BaseDevice = class {
|
|
|
13384
13423
|
* is open (Reolink writes `hasPtz/hasIntercom`, Hikvision writes
|
|
13385
13424
|
* `hasSupplementalLight/hasAlarmIo`, etc).
|
|
13386
13425
|
*
|
|
13387
|
-
* Default:
|
|
13388
|
-
|
|
13389
|
-
|
|
13426
|
+
* Default: nothing to probe → mark the device PROBED (set `lastProbedAt`) so
|
|
13427
|
+
* the kernel treats it as ready immediately. A device that derives its shape
|
|
13428
|
+
* from a spec (a container, or an accessory sensor) rather than from a
|
|
13429
|
+
* hardware probe has no probe to "complete"; without stamping `lastProbedAt`
|
|
13430
|
+
* it would look perpetually un-probed — logging "Initial probe did not
|
|
13431
|
+
* complete" on every boot and spinning a pointless retry chain. Drivers that
|
|
13432
|
+
* DO probe override this and write their own `feature-probe` slice (including
|
|
13433
|
+
* `lastProbedAt`) once their probe actually succeeds.
|
|
13434
|
+
*/
|
|
13435
|
+
async onProbe() {
|
|
13436
|
+
const base = this.runtimeState.getCapState("feature-probe") ?? {
|
|
13437
|
+
flags: {},
|
|
13438
|
+
deviceType: null,
|
|
13439
|
+
model: null,
|
|
13440
|
+
channelCount: null,
|
|
13441
|
+
lastProbedAt: 0,
|
|
13442
|
+
lastFetchedAt: 0
|
|
13443
|
+
};
|
|
13444
|
+
this.runtimeState.setCapState("feature-probe", {
|
|
13445
|
+
...base,
|
|
13446
|
+
lastProbedAt: Date.now()
|
|
13447
|
+
});
|
|
13448
|
+
}
|
|
13390
13449
|
/**
|
|
13391
13450
|
* Phase 5 — fired after the device + its accessories are registered.
|
|
13392
13451
|
* Drivers publish streams to the broker, kick off background tasks,
|
|
@@ -14848,17 +14907,32 @@ var ReleaseInputSchema = object({
|
|
|
14848
14907
|
* the parent cascades into every accessory. */
|
|
14849
14908
|
camDeviceId: number().int().nonnegative()
|
|
14850
14909
|
});
|
|
14851
|
-
var ResyncInputSchema = object({
|
|
14852
|
-
/** Parent CamStack device id of an adopted device. The provider resolves its
|
|
14853
|
-
* source (integration/broker + native id) and re-aligns the device's
|
|
14854
|
-
* structural spec (type/role/capabilities/units) with the live mapping,
|
|
14855
|
-
* rebuilding any child whose class changed while preserving operator edits. */
|
|
14856
|
-
camDeviceId: number().int().nonnegative()
|
|
14910
|
+
var ResyncInputSchema = object({
|
|
14911
|
+
/** Parent CamStack device id of an adopted device. The provider resolves its
|
|
14912
|
+
* source (integration/broker + native id) and re-aligns the device's
|
|
14913
|
+
* structural spec (type/role/capabilities/units) with the live mapping,
|
|
14914
|
+
* rebuilding any child whose class changed while preserving operator edits. */
|
|
14915
|
+
camDeviceId: number().int().nonnegative(),
|
|
14916
|
+
/** "Resync from zero" (#19). When true, the kernel PURGES every accessory
|
|
14917
|
+
* child of `camDeviceId` BEFORE the provider re-derives the device, so the
|
|
14918
|
+
* children are rebuilt fresh from source — correct names, coords, and units —
|
|
14919
|
+
* instead of being preserved by the incremental reconcile. Use to recover from
|
|
14920
|
+
* legacy generic/placeholder names that the normal name-precedence keeps frozen
|
|
14921
|
+
* (the operator's explicit reset). Push-driven integrations (no-op resync)
|
|
14922
|
+
* rebuild on their next snapshot; pull/command integrations rebuild in `resync`.
|
|
14923
|
+
* Operator edits on the PARENT (its name, layout, primary-child pick) survive —
|
|
14924
|
+
* only the children are torn down. Omitted/false ⇒ the normal incremental
|
|
14925
|
+
* re-sync that preserves children. */
|
|
14926
|
+
resetToSource: boolean().optional()
|
|
14927
|
+
});
|
|
14857
14928
|
var ResyncResultSchema = object({
|
|
14858
14929
|
/** True when the persisted spec actually changed (children may have been rebuilt). */
|
|
14859
14930
|
changed: boolean(),
|
|
14860
14931
|
/** Number of child devices rebuilt into a new class by this re-sync. */
|
|
14861
|
-
rebuiltChildren: number().int().nonnegative()
|
|
14932
|
+
rebuiltChildren: number().int().nonnegative(),
|
|
14933
|
+
/** Number of accessory children torn down by a `resetToSource` purge before the
|
|
14934
|
+
* provider re-derived the device. 0/absent for a normal incremental re-sync. */
|
|
14935
|
+
removedChildren: number().int().nonnegative().optional()
|
|
14862
14936
|
});
|
|
14863
14937
|
var deviceAdoptionCapability = {
|
|
14864
14938
|
name: "device-adoption",
|
|
@@ -16623,6 +16697,11 @@ var DeviceMetaSchema = object({
|
|
|
16623
16697
|
addonId: string(),
|
|
16624
16698
|
type: string(),
|
|
16625
16699
|
name: string(),
|
|
16700
|
+
/** True once an operator explicitly renamed the device via `setName`. Drives
|
|
16701
|
+
* reconcile name-precedence (preserve operator name vs adopt fresh provider
|
|
16702
|
+
* name). Absent ⇒ treated as user-named (PRESERVE) for legacy rows. See
|
|
16703
|
+
* `DeviceMeta.userNamed`. */
|
|
16704
|
+
userNamed: boolean().optional(),
|
|
16626
16705
|
location: string().nullable(),
|
|
16627
16706
|
disabled: boolean(),
|
|
16628
16707
|
parentDeviceId: number().nullable(),
|
|
@@ -16933,6 +17012,9 @@ method(object({
|
|
|
16933
17012
|
}), method(ReleaseInputSchema.extend({ addonId: string() }), _void(), {
|
|
16934
17013
|
kind: "mutation",
|
|
16935
17014
|
auth: "admin"
|
|
17015
|
+
}), method(ResyncInputSchema, ResyncResultSchema, {
|
|
17016
|
+
kind: "mutation",
|
|
17017
|
+
auth: "admin"
|
|
16936
17018
|
}), method(object({
|
|
16937
17019
|
deviceId: number(),
|
|
16938
17020
|
key: string(),
|
|
@@ -20784,6 +20866,12 @@ Object.freeze({
|
|
|
20784
20866
|
addonId: null,
|
|
20785
20867
|
access: "create"
|
|
20786
20868
|
},
|
|
20869
|
+
"deviceManager.adoptionResync": {
|
|
20870
|
+
capName: "device-manager",
|
|
20871
|
+
capScope: "system",
|
|
20872
|
+
addonId: null,
|
|
20873
|
+
access: "create"
|
|
20874
|
+
},
|
|
20787
20875
|
"deviceManager.allocateDeviceId": {
|
|
20788
20876
|
capName: "device-manager",
|
|
20789
20877
|
capScope: "system",
|
|
@@ -27481,6 +27569,9 @@ var COLD_START$12 = {
|
|
|
27481
27569
|
dirtyWater: null,
|
|
27482
27570
|
detergent: null,
|
|
27483
27571
|
dustBin: null,
|
|
27572
|
+
progressPercent: null,
|
|
27573
|
+
errorCode: null,
|
|
27574
|
+
errorLabel: null,
|
|
27484
27575
|
lastChangedAt: 0
|
|
27485
27576
|
};
|
|
27486
27577
|
/**
|
|
@@ -27517,6 +27608,9 @@ var HaVacuumDevice = class extends HaBaseChildDevice {
|
|
|
27517
27608
|
dirtyWater: null,
|
|
27518
27609
|
detergent: null,
|
|
27519
27610
|
dustBin: null,
|
|
27611
|
+
progressPercent: null,
|
|
27612
|
+
errorCode: null,
|
|
27613
|
+
errorLabel: lifecycleState === "error" ? readStringAttr$3(state.attributes, "error") : null,
|
|
27520
27614
|
lastChangedAt
|
|
27521
27615
|
});
|
|
27522
27616
|
}
|
|
@@ -27573,6 +27667,10 @@ function readStringArrayAttr(attrs, key) {
|
|
|
27573
27667
|
var COLD_START$11 = {
|
|
27574
27668
|
activity: "idle",
|
|
27575
27669
|
batteryLevel: null,
|
|
27670
|
+
progressPercent: null,
|
|
27671
|
+
currentCode: null,
|
|
27672
|
+
currentCodeLabel: null,
|
|
27673
|
+
severity: "info",
|
|
27576
27674
|
lastChangedAt: 0
|
|
27577
27675
|
};
|
|
27578
27676
|
/**
|
|
@@ -27598,6 +27696,10 @@ var HaLawnMowerDevice = class extends HaBaseChildDevice {
|
|
|
27598
27696
|
this.runtimeState.setCapState("lawn-mower-control", {
|
|
27599
27697
|
activity,
|
|
27600
27698
|
batteryLevel,
|
|
27699
|
+
progressPercent: readNumericAttr$1(state.attributes, "mowing_progress"),
|
|
27700
|
+
currentCode: null,
|
|
27701
|
+
currentCodeLabel: null,
|
|
27702
|
+
severity: activity === "error" ? "error" : "info",
|
|
27601
27703
|
lastChangedAt
|
|
27602
27704
|
});
|
|
27603
27705
|
}
|
package/dist/addon.mjs
CHANGED
|
@@ -10108,15 +10108,18 @@ var humiditySensorCapability = {
|
|
|
10108
10108
|
runtimeState: HumiditySensorStatusSchema
|
|
10109
10109
|
};
|
|
10110
10110
|
/**
|
|
10111
|
-
* Image display cap. Models
|
|
10112
|
-
*
|
|
10113
|
-
*
|
|
10114
|
-
* Read-only: there are no setters. The provider resolves
|
|
10115
|
-
*
|
|
10116
|
-
*
|
|
10117
|
-
*
|
|
10118
|
-
*
|
|
10119
|
-
*
|
|
10111
|
+
* Image display cap. Models a single still image exposed by an integration —
|
|
10112
|
+
* a snapshot, a chart, a generated picture, or a robot's cleaning-map render.
|
|
10113
|
+
*
|
|
10114
|
+
* Read-only: there are no setters. The provider resolves whatever upstream
|
|
10115
|
+
* source it has into an ABSOLUTE URL the browser loads directly:
|
|
10116
|
+
* - HA `image.*` entities → the `entity_picture` signed-token path
|
|
10117
|
+
* (token stays in the query string, so no auth header is needed);
|
|
10118
|
+
* - a Dreame/robot map → the cloud/OSS map-image URL (or an addon
|
|
10119
|
+
* data-plane URL serving the rendered map bytes), exposed as its own
|
|
10120
|
+
* Image child device grouped under the robot's container.
|
|
10121
|
+
* The slice carries that URL plus the upstream last-updated timestamp; the
|
|
10122
|
+
* image changes when the source's last-updated marker changes.
|
|
10120
10123
|
*/
|
|
10121
10124
|
var ImageStatusSchema = object({
|
|
10122
10125
|
/** Absolute signed URL the browser loads directly. Null when the
|
|
@@ -10142,18 +10145,47 @@ var imageCapability = {
|
|
|
10142
10145
|
*/
|
|
10143
10146
|
runtimeState: ImageStatusSchema
|
|
10144
10147
|
};
|
|
10148
|
+
/**
|
|
10149
|
+
* Robotic lawn-mower cap. Models HA `lawn_mower.*` entities — anything
|
|
10150
|
+
* with a mowing lifecycle plus a dock action.
|
|
10151
|
+
*
|
|
10152
|
+
* Activity follows HA's canonical lawn-mower lifecycle: `idle` /
|
|
10153
|
+
* `mowing` / `paused` / `docked` / `error`. `batteryLevel` (0..100) is
|
|
10154
|
+
* nullable — some mowers don't report a battery percentage.
|
|
10155
|
+
*
|
|
10156
|
+
* `startMowing` begins a mowing run, `pause` halts it in place, and
|
|
10157
|
+
* `dock` sends the mower back to its charging station.
|
|
10158
|
+
*/
|
|
10159
|
+
var LawnMowerActivitySchema = _enum([
|
|
10160
|
+
"idle",
|
|
10161
|
+
"mowing",
|
|
10162
|
+
"paused",
|
|
10163
|
+
"docked",
|
|
10164
|
+
"error"
|
|
10165
|
+
]);
|
|
10166
|
+
/** Severity of the current device/error code — info (status), warning, error. */
|
|
10167
|
+
var DeviceCodeSeveritySchema = _enum([
|
|
10168
|
+
"info",
|
|
10169
|
+
"warning",
|
|
10170
|
+
"error"
|
|
10171
|
+
]);
|
|
10145
10172
|
var LawnMowerControlStatusSchema = object({
|
|
10146
10173
|
/** Lifecycle activity of the mower. */
|
|
10147
|
-
activity:
|
|
10148
|
-
"idle",
|
|
10149
|
-
"mowing",
|
|
10150
|
-
"paused",
|
|
10151
|
-
"docked",
|
|
10152
|
-
"error"
|
|
10153
|
-
]),
|
|
10174
|
+
activity: LawnMowerActivitySchema,
|
|
10154
10175
|
/** 0..100 battery percentage. Null when the device has no battery
|
|
10155
10176
|
* reading. */
|
|
10156
10177
|
batteryLevel: number().min(0).max(100).nullable(),
|
|
10178
|
+
/** 0..100 mowing-completion percentage of the current task, or null when no
|
|
10179
|
+
* task is active / progress is unavailable. */
|
|
10180
|
+
progressPercent: number().min(0).max(100).nullable(),
|
|
10181
|
+
/** Current device/event code (dynamic — mostly status, sometimes an error),
|
|
10182
|
+
* or null when unknown. */
|
|
10183
|
+
currentCode: number().nullable(),
|
|
10184
|
+
/** Human label for {@link currentCode}, or null when undecodable. */
|
|
10185
|
+
currentCodeLabel: string().nullable(),
|
|
10186
|
+
/** Severity of {@link currentCode}. `error` (and often `warning`) warrants UI
|
|
10187
|
+
* attention; `info` is normal status. */
|
|
10188
|
+
severity: DeviceCodeSeveritySchema,
|
|
10157
10189
|
/** Ms epoch when the slice was last updated. */
|
|
10158
10190
|
lastChangedAt: number()
|
|
10159
10191
|
});
|
|
@@ -12379,6 +12411,7 @@ var VacuumStateSchema = _enum([
|
|
|
12379
12411
|
"paused",
|
|
12380
12412
|
"returning",
|
|
12381
12413
|
"docked",
|
|
12414
|
+
"drying",
|
|
12382
12415
|
"error"
|
|
12383
12416
|
]);
|
|
12384
12417
|
/**
|
|
@@ -12417,6 +12450,12 @@ var VacuumControlStatusSchema = object({
|
|
|
12417
12450
|
detergent: TankStatusSchema.nullable(),
|
|
12418
12451
|
/** Dust bin. Null when the hardware has no dust bin. */
|
|
12419
12452
|
dustBin: TankStatusSchema.nullable(),
|
|
12453
|
+
/** 0..100 cleaning-completion percentage of the current task, or null. */
|
|
12454
|
+
progressPercent: number().min(0).max(100).nullable(),
|
|
12455
|
+
/** Current error code (0 / null = no error). */
|
|
12456
|
+
errorCode: number().nullable(),
|
|
12457
|
+
/** Human label for {@link errorCode}, or null when none / undecodable. */
|
|
12458
|
+
errorLabel: string().nullable(),
|
|
12420
12459
|
/** Ms epoch when the slice was last updated. */
|
|
12421
12460
|
lastChangedAt: number()
|
|
12422
12461
|
});
|
|
@@ -13383,9 +13422,29 @@ var BaseDevice = class {
|
|
|
13383
13422
|
* is open (Reolink writes `hasPtz/hasIntercom`, Hikvision writes
|
|
13384
13423
|
* `hasSupplementalLight/hasAlarmIo`, etc).
|
|
13385
13424
|
*
|
|
13386
|
-
* Default:
|
|
13387
|
-
|
|
13388
|
-
|
|
13425
|
+
* Default: nothing to probe → mark the device PROBED (set `lastProbedAt`) so
|
|
13426
|
+
* the kernel treats it as ready immediately. A device that derives its shape
|
|
13427
|
+
* from a spec (a container, or an accessory sensor) rather than from a
|
|
13428
|
+
* hardware probe has no probe to "complete"; without stamping `lastProbedAt`
|
|
13429
|
+
* it would look perpetually un-probed — logging "Initial probe did not
|
|
13430
|
+
* complete" on every boot and spinning a pointless retry chain. Drivers that
|
|
13431
|
+
* DO probe override this and write their own `feature-probe` slice (including
|
|
13432
|
+
* `lastProbedAt`) once their probe actually succeeds.
|
|
13433
|
+
*/
|
|
13434
|
+
async onProbe() {
|
|
13435
|
+
const base = this.runtimeState.getCapState("feature-probe") ?? {
|
|
13436
|
+
flags: {},
|
|
13437
|
+
deviceType: null,
|
|
13438
|
+
model: null,
|
|
13439
|
+
channelCount: null,
|
|
13440
|
+
lastProbedAt: 0,
|
|
13441
|
+
lastFetchedAt: 0
|
|
13442
|
+
};
|
|
13443
|
+
this.runtimeState.setCapState("feature-probe", {
|
|
13444
|
+
...base,
|
|
13445
|
+
lastProbedAt: Date.now()
|
|
13446
|
+
});
|
|
13447
|
+
}
|
|
13389
13448
|
/**
|
|
13390
13449
|
* Phase 5 — fired after the device + its accessories are registered.
|
|
13391
13450
|
* Drivers publish streams to the broker, kick off background tasks,
|
|
@@ -14847,17 +14906,32 @@ var ReleaseInputSchema = object({
|
|
|
14847
14906
|
* the parent cascades into every accessory. */
|
|
14848
14907
|
camDeviceId: number().int().nonnegative()
|
|
14849
14908
|
});
|
|
14850
|
-
var ResyncInputSchema = object({
|
|
14851
|
-
/** Parent CamStack device id of an adopted device. The provider resolves its
|
|
14852
|
-
* source (integration/broker + native id) and re-aligns the device's
|
|
14853
|
-
* structural spec (type/role/capabilities/units) with the live mapping,
|
|
14854
|
-
* rebuilding any child whose class changed while preserving operator edits. */
|
|
14855
|
-
camDeviceId: number().int().nonnegative()
|
|
14909
|
+
var ResyncInputSchema = object({
|
|
14910
|
+
/** Parent CamStack device id of an adopted device. The provider resolves its
|
|
14911
|
+
* source (integration/broker + native id) and re-aligns the device's
|
|
14912
|
+
* structural spec (type/role/capabilities/units) with the live mapping,
|
|
14913
|
+
* rebuilding any child whose class changed while preserving operator edits. */
|
|
14914
|
+
camDeviceId: number().int().nonnegative(),
|
|
14915
|
+
/** "Resync from zero" (#19). When true, the kernel PURGES every accessory
|
|
14916
|
+
* child of `camDeviceId` BEFORE the provider re-derives the device, so the
|
|
14917
|
+
* children are rebuilt fresh from source — correct names, coords, and units —
|
|
14918
|
+
* instead of being preserved by the incremental reconcile. Use to recover from
|
|
14919
|
+
* legacy generic/placeholder names that the normal name-precedence keeps frozen
|
|
14920
|
+
* (the operator's explicit reset). Push-driven integrations (no-op resync)
|
|
14921
|
+
* rebuild on their next snapshot; pull/command integrations rebuild in `resync`.
|
|
14922
|
+
* Operator edits on the PARENT (its name, layout, primary-child pick) survive —
|
|
14923
|
+
* only the children are torn down. Omitted/false ⇒ the normal incremental
|
|
14924
|
+
* re-sync that preserves children. */
|
|
14925
|
+
resetToSource: boolean().optional()
|
|
14926
|
+
});
|
|
14856
14927
|
var ResyncResultSchema = object({
|
|
14857
14928
|
/** True when the persisted spec actually changed (children may have been rebuilt). */
|
|
14858
14929
|
changed: boolean(),
|
|
14859
14930
|
/** Number of child devices rebuilt into a new class by this re-sync. */
|
|
14860
|
-
rebuiltChildren: number().int().nonnegative()
|
|
14931
|
+
rebuiltChildren: number().int().nonnegative(),
|
|
14932
|
+
/** Number of accessory children torn down by a `resetToSource` purge before the
|
|
14933
|
+
* provider re-derived the device. 0/absent for a normal incremental re-sync. */
|
|
14934
|
+
removedChildren: number().int().nonnegative().optional()
|
|
14861
14935
|
});
|
|
14862
14936
|
var deviceAdoptionCapability = {
|
|
14863
14937
|
name: "device-adoption",
|
|
@@ -16622,6 +16696,11 @@ var DeviceMetaSchema = object({
|
|
|
16622
16696
|
addonId: string(),
|
|
16623
16697
|
type: string(),
|
|
16624
16698
|
name: string(),
|
|
16699
|
+
/** True once an operator explicitly renamed the device via `setName`. Drives
|
|
16700
|
+
* reconcile name-precedence (preserve operator name vs adopt fresh provider
|
|
16701
|
+
* name). Absent ⇒ treated as user-named (PRESERVE) for legacy rows. See
|
|
16702
|
+
* `DeviceMeta.userNamed`. */
|
|
16703
|
+
userNamed: boolean().optional(),
|
|
16625
16704
|
location: string().nullable(),
|
|
16626
16705
|
disabled: boolean(),
|
|
16627
16706
|
parentDeviceId: number().nullable(),
|
|
@@ -16932,6 +17011,9 @@ method(object({
|
|
|
16932
17011
|
}), method(ReleaseInputSchema.extend({ addonId: string() }), _void(), {
|
|
16933
17012
|
kind: "mutation",
|
|
16934
17013
|
auth: "admin"
|
|
17014
|
+
}), method(ResyncInputSchema, ResyncResultSchema, {
|
|
17015
|
+
kind: "mutation",
|
|
17016
|
+
auth: "admin"
|
|
16935
17017
|
}), method(object({
|
|
16936
17018
|
deviceId: number(),
|
|
16937
17019
|
key: string(),
|
|
@@ -20783,6 +20865,12 @@ Object.freeze({
|
|
|
20783
20865
|
addonId: null,
|
|
20784
20866
|
access: "create"
|
|
20785
20867
|
},
|
|
20868
|
+
"deviceManager.adoptionResync": {
|
|
20869
|
+
capName: "device-manager",
|
|
20870
|
+
capScope: "system",
|
|
20871
|
+
addonId: null,
|
|
20872
|
+
access: "create"
|
|
20873
|
+
},
|
|
20786
20874
|
"deviceManager.allocateDeviceId": {
|
|
20787
20875
|
capName: "device-manager",
|
|
20788
20876
|
capScope: "system",
|
|
@@ -27480,6 +27568,9 @@ var COLD_START$12 = {
|
|
|
27480
27568
|
dirtyWater: null,
|
|
27481
27569
|
detergent: null,
|
|
27482
27570
|
dustBin: null,
|
|
27571
|
+
progressPercent: null,
|
|
27572
|
+
errorCode: null,
|
|
27573
|
+
errorLabel: null,
|
|
27483
27574
|
lastChangedAt: 0
|
|
27484
27575
|
};
|
|
27485
27576
|
/**
|
|
@@ -27516,6 +27607,9 @@ var HaVacuumDevice = class extends HaBaseChildDevice {
|
|
|
27516
27607
|
dirtyWater: null,
|
|
27517
27608
|
detergent: null,
|
|
27518
27609
|
dustBin: null,
|
|
27610
|
+
progressPercent: null,
|
|
27611
|
+
errorCode: null,
|
|
27612
|
+
errorLabel: lifecycleState === "error" ? readStringAttr$3(state.attributes, "error") : null,
|
|
27519
27613
|
lastChangedAt
|
|
27520
27614
|
});
|
|
27521
27615
|
}
|
|
@@ -27572,6 +27666,10 @@ function readStringArrayAttr(attrs, key) {
|
|
|
27572
27666
|
var COLD_START$11 = {
|
|
27573
27667
|
activity: "idle",
|
|
27574
27668
|
batteryLevel: null,
|
|
27669
|
+
progressPercent: null,
|
|
27670
|
+
currentCode: null,
|
|
27671
|
+
currentCodeLabel: null,
|
|
27672
|
+
severity: "info",
|
|
27575
27673
|
lastChangedAt: 0
|
|
27576
27674
|
};
|
|
27577
27675
|
/**
|
|
@@ -27597,6 +27695,10 @@ var HaLawnMowerDevice = class extends HaBaseChildDevice {
|
|
|
27597
27695
|
this.runtimeState.setCapState("lawn-mower-control", {
|
|
27598
27696
|
activity,
|
|
27599
27697
|
batteryLevel,
|
|
27698
|
+
progressPercent: readNumericAttr$1(state.attributes, "mowing_progress"),
|
|
27699
|
+
currentCode: null,
|
|
27700
|
+
currentCodeLabel: null,
|
|
27701
|
+
severity: activity === "error" ? "error" : "info",
|
|
27600
27702
|
lastChangedAt
|
|
27601
27703
|
});
|
|
27602
27704
|
}
|