@camstack/addon-provider-homeassistant 1.2.655 → 1.2.657
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/CHANGELOG.md +12 -0
- package/dist/addon.js +4 -3
- package/dist/addon.mjs +4 -3
- package/dist/ha-export/ha-export.addon.js +461 -248
- package/dist/ha-export/ha-export.addon.mjs +448 -249
- package/dist/{ha-instance-settings-DLDNOmgL.mjs → ha-instance-settings-CxalgfRa.mjs} +126 -34
- package/dist/{ha-instance-settings-5Ms7yRju.js → ha-instance-settings-DJXP_6Rg.js} +131 -45
- package/package.json +2 -2
|
@@ -5980,7 +5980,7 @@ var ZodIssueCode = {
|
|
|
5980
5980
|
var ZodFirstPartyTypeKind;
|
|
5981
5981
|
ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
|
|
5982
5982
|
//#endregion
|
|
5983
|
-
//#region ../types/dist/sleep-
|
|
5983
|
+
//#region ../types/dist/sleep-Cv4Zmie9.mjs
|
|
5984
5984
|
/**
|
|
5985
5985
|
* The audio chunk plane's byte format, and the ONE expansion from a coded
|
|
5986
5986
|
* window to float samples (D455).
|
|
@@ -6590,7 +6590,7 @@ var NOT_RUN = {
|
|
|
6590
6590
|
* throws: an unreachable or refusing engine is logged and reported `declared: false`,
|
|
6591
6591
|
* because the hub (and this addon's boot) must not hang on a migration.
|
|
6592
6592
|
*/
|
|
6593
|
-
async function runAddonMigrations(host, migrations, logger) {
|
|
6593
|
+
async function runAddonMigrations(host, migrations, logger, options = {}) {
|
|
6594
6594
|
const first = migrations[0];
|
|
6595
6595
|
if (first === void 0) return NOT_RUN;
|
|
6596
6596
|
const owner = first.meta.owner;
|
|
@@ -6619,7 +6619,9 @@ async function runAddonMigrations(host, migrations, logger) {
|
|
|
6619
6619
|
else if (status === "blocked") blocked.push(id);
|
|
6620
6620
|
else skipped.push(id);
|
|
6621
6621
|
};
|
|
6622
|
+
const selected = options.only === void 0 ? null : new Set(options.only);
|
|
6622
6623
|
for (const step of declaration.steps) {
|
|
6624
|
+
if (selected !== null && !selected.has(step.id)) continue;
|
|
6623
6625
|
const bound = byId.get(step.id);
|
|
6624
6626
|
if (bound === void 0 || step.action === "skip") {
|
|
6625
6627
|
skipped.push(step.id);
|
|
@@ -7779,14 +7781,18 @@ var BaseAddon = class {
|
|
|
7779
7781
|
* nothing; the boot continues. A migration that FAILED (or was blocked by one)
|
|
7780
7782
|
* and declares `onFailure: 'block-owner'` makes this throw, so the addon does not
|
|
7781
7783
|
* serve data whose shape it cannot trust; `tolerate` migrations never do.
|
|
7784
|
+
*
|
|
7785
|
+
* ALWAYS pass the whole catalogue; a phase that must run only some of it passes
|
|
7786
|
+
* `{ only: [ids] }` — never a filtered catalogue (the engine would judge the
|
|
7787
|
+
* omitted applied ids "newer").
|
|
7782
7788
|
*/
|
|
7783
|
-
async runMigrations(migrations) {
|
|
7789
|
+
async runMigrations(migrations, options) {
|
|
7784
7790
|
const api = this.ctx.api.migrations;
|
|
7785
7791
|
const report = await runAddonMigrations({
|
|
7786
7792
|
declareOwner: (input) => api.declareOwner.mutate(input),
|
|
7787
7793
|
startMigration: (input) => api.startMigration.mutate(input),
|
|
7788
7794
|
finishMigration: (input) => api.finishMigration.mutate(input)
|
|
7789
|
-
}, migrations, this.ctx.logger);
|
|
7795
|
+
}, migrations, this.ctx.logger, options);
|
|
7790
7796
|
if (report.blockOwner.length > 0) throw new AddonMigrationsBlockedError(report.blockOwner);
|
|
7791
7797
|
return report;
|
|
7792
7798
|
}
|
|
@@ -8782,6 +8788,13 @@ var RecordsError = class extends Error {
|
|
|
8782
8788
|
this.detail = detail;
|
|
8783
8789
|
}
|
|
8784
8790
|
};
|
|
8791
|
+
/** A write guarded by `ifRev` found another revision (or an existing row for `ifRev: 0`). */
|
|
8792
|
+
var RevConflictError = class extends RecordsError {
|
|
8793
|
+
constructor(detail) {
|
|
8794
|
+
super("rev-conflict", detail);
|
|
8795
|
+
this.name = "RevConflictError";
|
|
8796
|
+
}
|
|
8797
|
+
};
|
|
8785
8798
|
/** The keychain could not store or serve a value: explicit, never an empty string. */
|
|
8786
8799
|
var RecordSecretUnavailableError = class extends RecordsError {
|
|
8787
8800
|
constructor(detail) {
|
|
@@ -8826,6 +8839,10 @@ var RECORD_SECRET_COLLECTION_PREFIX = "records:";
|
|
|
8826
8839
|
* (`collectZodSecretPaths`): dotted keys, `[]` for "each element of this array"
|
|
8827
8840
|
* (`auth.accessToken`, `headers[].value`).
|
|
8828
8841
|
*
|
|
8842
|
+
* `{}` after a key means "each value of this map" (`applianceSecrets{}`): the map's own key
|
|
8843
|
+
* names the value (`applianceSecrets{fridge}`), so no id key is declared and a body that drops a
|
|
8844
|
+
* key releases exactly that key's secret.
|
|
8845
|
+
*
|
|
8829
8846
|
* Array elements are matched by a DECLARED id key (`secretArrayKeys`:
|
|
8830
8847
|
* `{ headers: 'name' }`), never by index, so reordering a list keeps every
|
|
8831
8848
|
* keychain ref (the same rule as `arrayItemFieldPath`). The concrete path of a
|
|
@@ -8838,11 +8855,13 @@ function parseSecretPath(path) {
|
|
|
8838
8855
|
if (path.length === 0) throw new InvalidRecordError("an empty secret path");
|
|
8839
8856
|
return path.split(".").map((raw) => {
|
|
8840
8857
|
const each = raw.endsWith("[]");
|
|
8841
|
-
const
|
|
8858
|
+
const map = raw.endsWith("{}");
|
|
8859
|
+
const key = each || map ? raw.slice(0, -2) : raw;
|
|
8842
8860
|
if (key.length === 0) throw new InvalidRecordError(`secret path "${path}" has an empty segment`);
|
|
8843
8861
|
return {
|
|
8844
8862
|
key,
|
|
8845
|
-
each
|
|
8863
|
+
each,
|
|
8864
|
+
map
|
|
8846
8865
|
};
|
|
8847
8866
|
});
|
|
8848
8867
|
}
|
|
@@ -8894,6 +8913,22 @@ function mapAt(node, segments, index, walkedKeys, concretePrefix, declared, arra
|
|
|
8894
8913
|
[segment.key]: mapped
|
|
8895
8914
|
};
|
|
8896
8915
|
}
|
|
8916
|
+
if (segment.map) {
|
|
8917
|
+
if (!isRecord$4(child)) return node;
|
|
8918
|
+
const kept = Object.entries(child).map(([mapKey, value]) => {
|
|
8919
|
+
const concrete = `${concretePrefix}${concretePrefix.length > 0 ? "." : ""}${segment.key}{${encodeURIComponent(mapKey)}}`;
|
|
8920
|
+
if (!last) return [mapKey, mapAt(value, segments, index + 1, keys, concrete, declared, arrayKeys, visit)];
|
|
8921
|
+
return [mapKey, visit({
|
|
8922
|
+
declared,
|
|
8923
|
+
concrete,
|
|
8924
|
+
value
|
|
8925
|
+
})];
|
|
8926
|
+
}).filter(([, value]) => value !== REMOVE_LEAF);
|
|
8927
|
+
return {
|
|
8928
|
+
...node,
|
|
8929
|
+
[segment.key]: Object.fromEntries(kept)
|
|
8930
|
+
};
|
|
8931
|
+
}
|
|
8897
8932
|
const concrete = `${concretePrefix}${concretePrefix.length > 0 ? "." : ""}${segment.key}`;
|
|
8898
8933
|
if (last) {
|
|
8899
8934
|
const replacement = visit({
|
|
@@ -9035,7 +9070,8 @@ function isZodSecret(schema) {
|
|
|
9035
9070
|
}
|
|
9036
9071
|
/**
|
|
9037
9072
|
* Every declared secret path in a config schema: dotted keys, `[]` for "each
|
|
9038
|
-
* element of this array" (`connection.password`, `rows[].token`)
|
|
9073
|
+
* element of this array" (`connection.password`, `rows[].token`), `{}` for "each value of this
|
|
9074
|
+
* map" (`applianceSecrets{}`). A declared
|
|
9039
9075
|
* object or array is reported as one path and not descended into — everything
|
|
9040
9076
|
* under it is secret.
|
|
9041
9077
|
*/
|
|
@@ -9046,6 +9082,7 @@ function collectZodSecretPaths(schema, prefix = "") {
|
|
|
9046
9082
|
const def = defOf(layer);
|
|
9047
9083
|
if (def.type === "object" && def.shape) for (const [key, child] of Object.entries(def.shape)) paths.push(...collectZodSecretPaths(child, prefix ? `${prefix}.${key}` : key));
|
|
9048
9084
|
else if (def.type === "array" && def.element) paths.push(...collectZodSecretPaths(def.element, `${prefix}[]`));
|
|
9085
|
+
else if (def.type === "record" && def.valueType) paths.push(...collectZodSecretPaths(def.valueType, `${prefix}{}`));
|
|
9049
9086
|
else if (def.type === "union" && def.options) for (const option of def.options) paths.push(...collectZodSecretPaths(option, prefix));
|
|
9050
9087
|
else if (def.type === "intersection") {
|
|
9051
9088
|
if (def.left) paths.push(...collectZodSecretPaths(def.left, prefix));
|
|
@@ -13422,11 +13459,49 @@ function buildCapturingReply(envelope) {
|
|
|
13422
13459
|
};
|
|
13423
13460
|
return wrapper;
|
|
13424
13461
|
}
|
|
13462
|
+
/**
|
|
13463
|
+
* `RecordIntegrationInstances` - the `integration-instances` provider over ONE
|
|
13464
|
+
* entry kind, so an addon that holds a connection serves it in ~30 lines.
|
|
13465
|
+
*
|
|
13466
|
+
* Every instance is one record of the addon's own kind, keyed by the
|
|
13467
|
+
* `integrations` registry id. The records door does the secret work: a field the
|
|
13468
|
+
* kind marks `.meta({ secret: true })` is a keychain marker bound to the row, so
|
|
13469
|
+
* deleting the row deletes the secret, and one row's value is never another's.
|
|
13470
|
+
*
|
|
13471
|
+
* Patch rules for a secret (`updateInstance`): omitted, `''`, the redaction
|
|
13472
|
+
* token or the view the form was given KEEP the stored secret;
|
|
13473
|
+
* `{ $secretClear: true }` clears it; any other string replaces it.
|
|
13474
|
+
*/
|
|
13425
13475
|
/** The most instances one addon lists (an integrations page, not a table). */
|
|
13426
13476
|
var INSTANCES_LIST_MAX = 1e3;
|
|
13427
13477
|
/** The keys of the kind's secret fields that sit at the top level of the body. */
|
|
13428
13478
|
function topLevelSecretKeys(paths) {
|
|
13429
|
-
return new Set(paths.filter((p) => !p.includes(".") && !p.includes("[")));
|
|
13479
|
+
return new Set(paths.filter((p) => !p.includes(".") && !p.includes("[") && !p.includes("{")));
|
|
13480
|
+
}
|
|
13481
|
+
/** The keys of the kind's top-level MAPS whose values are secrets (`applianceSecrets{}`). */
|
|
13482
|
+
function secretMapKeys(paths) {
|
|
13483
|
+
return new Set(paths.filter((p) => p.endsWith("{}") && !p.slice(0, -2).match(/[.[{]/)).map((p) => p.slice(0, -2)));
|
|
13484
|
+
}
|
|
13485
|
+
/**
|
|
13486
|
+
* A patch value for a map of secrets: an entry that is omitted, `''`, the redaction token or the
|
|
13487
|
+
* view the form was given KEEPS its stored secret (it is left out of the merge); `{ $secretClear }`
|
|
13488
|
+
* or `null` removes the entry; any other string replaces it. Null when nothing is left to merge.
|
|
13489
|
+
*/
|
|
13490
|
+
function secretMapPatch(value) {
|
|
13491
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) return null;
|
|
13492
|
+
const out = {};
|
|
13493
|
+
for (const [key, entry] of Object.entries(value)) if (entry === null || isSecretClear(entry)) out[key] = null;
|
|
13494
|
+
else if (typeof entry === "string" && entry !== "" && entry !== "__camstack_redacted__" && !isSecretFieldView(entry)) out[key] = entry;
|
|
13495
|
+
return Object.keys(out).length > 0 ? out : null;
|
|
13496
|
+
}
|
|
13497
|
+
/** Does the kind's body schema carry an `enabled` field? */
|
|
13498
|
+
function declaresEnabled(kind) {
|
|
13499
|
+
const json = toJSONSchema(kind.schema, {
|
|
13500
|
+
unrepresentable: "any",
|
|
13501
|
+
io: "input"
|
|
13502
|
+
});
|
|
13503
|
+
const properties = Reflect.get(json, "properties");
|
|
13504
|
+
return typeof properties === "object" && properties !== null && "enabled" in properties;
|
|
13430
13505
|
}
|
|
13431
13506
|
var RecordIntegrationInstances = class {
|
|
13432
13507
|
records;
|
|
@@ -13434,14 +13509,20 @@ var RecordIntegrationInstances = class {
|
|
|
13434
13509
|
hooks;
|
|
13435
13510
|
handle;
|
|
13436
13511
|
secretKeys;
|
|
13512
|
+
secretMaps;
|
|
13437
13513
|
nameField;
|
|
13514
|
+
/** The `integrations` registry owns the on/off switch (`role: devices`); the body has none. */
|
|
13515
|
+
registryOwnsEnabled;
|
|
13438
13516
|
constructor(records, kind, hooks) {
|
|
13439
13517
|
this.records = records;
|
|
13440
13518
|
this.kind = kind;
|
|
13441
13519
|
this.hooks = hooks;
|
|
13442
13520
|
this.handle = records.kind(kind);
|
|
13443
13521
|
this.secretKeys = topLevelSecretKeys(kind.declaration.secretPaths);
|
|
13522
|
+
this.secretMaps = secretMapKeys(kind.declaration.secretPaths);
|
|
13444
13523
|
this.nameField = kind.declaration.entry?.nameField ?? "name";
|
|
13524
|
+
this.registryOwnsEnabled = hooks.description.role === "devices";
|
|
13525
|
+
if (this.registryOwnsEnabled && declaresEnabled(kind)) throw new Error(`kind "${kind.name}": the integrations registry owns the on/off switch of a role "devices" addon, so the body must not declare "enabled"`);
|
|
13445
13526
|
}
|
|
13446
13527
|
/**
|
|
13447
13528
|
* One instance read for the addon's own runtime; null when absent. When the keychain is
|
|
@@ -13492,7 +13573,7 @@ var RecordIntegrationInstances = class {
|
|
|
13492
13573
|
id: record.id,
|
|
13493
13574
|
name: typeof rawName === "string" ? rawName : record.id,
|
|
13494
13575
|
configured: this.hooks.configured(record.data),
|
|
13495
|
-
enabled: record.data.enabled !== false,
|
|
13576
|
+
...this.registryOwnsEnabled ? {} : { enabled: record.data.enabled !== false },
|
|
13496
13577
|
formValues: shown,
|
|
13497
13578
|
...kind !== void 0 ? { kind } : {},
|
|
13498
13579
|
...health?.status !== void 0 ? { status: health.status } : {},
|
|
@@ -13522,32 +13603,36 @@ var RecordIntegrationInstances = class {
|
|
|
13522
13603
|
id: minted,
|
|
13523
13604
|
data: this.hooks.initialBody(name, kind)
|
|
13524
13605
|
}, { ifRev: 0 });
|
|
13525
|
-
await this.hooks.onChanged?.(minted);
|
|
13606
|
+
await this.hooks.onChanged?.(minted, "created");
|
|
13526
13607
|
return { id: minted };
|
|
13527
13608
|
};
|
|
13528
13609
|
updateInstance = async ({ id, name, values }) => {
|
|
13529
13610
|
const patch = {};
|
|
13530
13611
|
for (const [key, value] of Object.entries(values)) {
|
|
13531
13612
|
if (value === void 0) continue;
|
|
13532
|
-
if (
|
|
13613
|
+
if (this.secretMaps.has(key)) {
|
|
13614
|
+
const entries = secretMapPatch(value);
|
|
13615
|
+
if (entries !== null) patch[key] = entries;
|
|
13616
|
+
} else if (!this.secretKeys.has(key)) patch[key] = value;
|
|
13533
13617
|
else if (isSecretClear(value)) patch[key] = null;
|
|
13534
13618
|
else if (typeof value === "string" && value !== "" && value !== "__camstack_redacted__" && !isSecretFieldView(value)) patch[key] = value;
|
|
13535
13619
|
}
|
|
13536
13620
|
if (name !== void 0) patch[this.nameField] = name;
|
|
13537
13621
|
await this.handle.patch(id, patch);
|
|
13538
|
-
await this.hooks.onChanged?.(id);
|
|
13622
|
+
await this.hooks.onChanged?.(id, "updated");
|
|
13539
13623
|
return { ok: true };
|
|
13540
13624
|
};
|
|
13541
13625
|
/** The switch lives in the record body; the addon is told so it applies it (D996). */
|
|
13542
13626
|
setInstanceEnabled = async ({ id, enabled }) => {
|
|
13627
|
+
if (this.registryOwnsEnabled) throw new Error(`instance "${id}": the integrations registry owns the on/off switch of this addon; set it with integrations.update`);
|
|
13543
13628
|
await this.handle.patch(id, { enabled });
|
|
13544
|
-
await this.hooks.onChanged?.(id);
|
|
13629
|
+
await this.hooks.onChanged?.(id, "enabled");
|
|
13545
13630
|
return { ok: true };
|
|
13546
13631
|
};
|
|
13547
13632
|
/** The row and its keychain refs go together (the records door). */
|
|
13548
13633
|
deleteInstance = async ({ id }) => {
|
|
13549
13634
|
await this.handle.delete(id);
|
|
13550
|
-
await this.hooks.onChanged?.(id);
|
|
13635
|
+
await this.hooks.onChanged?.(id, "deleted");
|
|
13551
13636
|
return { ok: true };
|
|
13552
13637
|
};
|
|
13553
13638
|
testInstance = async (input) => {
|
|
@@ -14645,7 +14730,13 @@ var MigrationLedgerEntrySchema = object({
|
|
|
14645
14730
|
* joined by the engine from the catalogues it knows this boot. Absent when no
|
|
14646
14731
|
* catalogue lists the id (a newer database).
|
|
14647
14732
|
*/
|
|
14648
|
-
meta: MigrationMetaSchema.optional()
|
|
14733
|
+
meta: MigrationMetaSchema.optional(),
|
|
14734
|
+
/**
|
|
14735
|
+
* Set when this is an applied row of an addon owner whose catalogue the answering
|
|
14736
|
+
* process has not loaded (the owner has not declared yet): the row is applied, the
|
|
14737
|
+
* process just cannot judge it. Never `skipped-newer` — that needs the owner loaded.
|
|
14738
|
+
*/
|
|
14739
|
+
ownerNotLoaded: boolean().optional()
|
|
14649
14740
|
});
|
|
14650
14741
|
/** A catalogued migration that is not applied, with where it stands. */
|
|
14651
14742
|
var MigrationPendingEntrySchema = object({
|
|
@@ -56774,6 +56865,21 @@ var IntegrationInstanceKindSchema = object({
|
|
|
56774
56865
|
disconnectPath: string().min(1).optional()
|
|
56775
56866
|
});
|
|
56776
56867
|
var IntegrationInstanceDescriptionSchema = object({
|
|
56868
|
+
/** What the instances are for the Integrations page; see {@link IntegrationInstanceRoleSchema}. */
|
|
56869
|
+
role: _enum([
|
|
56870
|
+
"devices",
|
|
56871
|
+
"services",
|
|
56872
|
+
"both"
|
|
56873
|
+
]),
|
|
56874
|
+
/** How the devices of an instance are found; absent means `{ mode: 'none' }`. */
|
|
56875
|
+
discovery: object({
|
|
56876
|
+
mode: _enum([
|
|
56877
|
+
"none",
|
|
56878
|
+
"lan",
|
|
56879
|
+
"account"
|
|
56880
|
+
]),
|
|
56881
|
+
scopedToInstance: boolean()
|
|
56882
|
+
}).optional(),
|
|
56777
56883
|
/** `single`: at most one instance can exist (Loki). `multiple`: an account each. */
|
|
56778
56884
|
instanceMode: IntegrationInstanceModeSchema,
|
|
56779
56885
|
/** What the instance is, for the UI (`destination`, `relay`, `account`). */
|
|
@@ -56813,10 +56919,11 @@ var IntegrationInstanceSchema = object({
|
|
|
56813
56919
|
/** The addon's own rule (an URL is present, a client id is present...). */
|
|
56814
56920
|
configured: boolean(),
|
|
56815
56921
|
/**
|
|
56816
|
-
* The instance's own on/off switch (D996)
|
|
56817
|
-
*
|
|
56922
|
+
* The instance's own on/off switch (D996), derived from the record body (`enabled !== false`,
|
|
56923
|
+
* so a row written before the field existed is on). Absent when the `integrations` registry
|
|
56924
|
+
* owns the switch (`describe().role` is `devices`): read it from the registry row.
|
|
56818
56925
|
*/
|
|
56819
|
-
enabled: boolean(),
|
|
56926
|
+
enabled: boolean().optional(),
|
|
56820
56927
|
/** The kind of this instance (one of `describe().kinds[].id`), when the provider has kinds. */
|
|
56821
56928
|
kind: string().optional(),
|
|
56822
56929
|
/** Values for the instance form; a secret is a `SecretFieldView`, never text. */
|
|
@@ -98299,20 +98406,5 @@ function haInstanceSettingsPortsOver(api) {
|
|
|
98299
98406
|
}
|
|
98300
98407
|
};
|
|
98301
98408
|
}
|
|
98302
|
-
/** The brokerId → settings view of the instances: what a reader keeps per broker. */
|
|
98303
|
-
function settingsByBroker(rows) {
|
|
98304
|
-
const out = /* @__PURE__ */ new Map();
|
|
98305
|
-
for (const row of rows) if (row.brokerId !== null) out.set(row.brokerId, row.settings);
|
|
98306
|
-
return out;
|
|
98307
|
-
}
|
|
98308
|
-
/** Read the instances, or report why not and answer nothing (a reader falls back to the legacy key). */
|
|
98309
|
-
async function listInstancesOrNothing(ports, onError) {
|
|
98310
|
-
try {
|
|
98311
|
-
return await ports.listInstances();
|
|
98312
|
-
} catch (err) {
|
|
98313
|
-
onError(errMsg(err));
|
|
98314
|
-
return [];
|
|
98315
|
-
}
|
|
98316
|
-
}
|
|
98317
98409
|
//#endregion
|
|
98318
|
-
export {
|
|
98410
|
+
export { fanControlCapability as $, createEvent as $t, bestLocationMatch as A, runningFromMediaPlayer as At, climateControlCapability as B, tryConvertDelta as Bt, accessoriesCapability as C, pressureSensorCapability as Ct, ambientLightSensorCapability as D, resolveAttachmentUrls as Dt, alarmPanelCapability as E, quantityFromUnit as Et, buildAddonRouteProvider as F, smokeCapability as Ft, contactCapability as G, vibrationCapability as Gt, connectivityCapability as H, updateCapability as Ht, buildDeviceAdminUrl as I, statusInstanceOf as It, deviceAdminLinkCapability as J, BaseAddon as Jt, controlCapability as K, waterHeaterCapability as Kt, buttonCapability as L, switchCapability as Lt, boardKeySourceCapability as M, runningStateCapability as Mt, brightnessCapability as N, scriptRunnerCapability as Nt, automationControlCapability as O, runExportedAction as Ot, brokerCapability as P, sendToExportedTarget as Pt, eventEmitterCapability as Q, baseUnitOf as Qt, calendarSourceCapability as R, tamperCapability as Rt, TargetSchema as S, EventCategory as Sn, presenceCapability as St, airQualitySensorCapability as T, publicEndpointReaderFrom as Tt, consumableFormOf as U, vacuumControlCapability as Ut, colorCapability as V, tryConvertUnit as Vt, consumableKindOf as W, valveCapability as Wt, deviceExportCapability as X, RecordSecretUnavailableError as Xt, deviceAdoptionCapability as Y, REDACTED_SECRET as Yt, enumSensorCapability as Z, RevConflictError as Zt, HvacModeSchema as _, url as _n, oauthIntegrationCapability as _t, AlarmArmModeSchema as a, nodePin as an, humiditySensorCapability as at, RUNNING_STATE_COLD as b, DeviceType as bn, preconditionOf as bt, CAMERA_SWITCH_ORDER as c, boolean as cn, integrationInstancesCapability as ct, ConsumableFormSchema as d, number as dn, mediaPlayerCapability as dt, defineAddonMigrations as en, flattenNestedRecords as et, ConsumableItemSchema as f, object as fn, motionCapability as ft, FanDirectionSchema as g, unknown as gn, numericSensorCapability as gt, ExportInstanceUnknownError as h, union as hn, notifierCapability as ht, listHomeAssistantBrokers as i, isReadingQuantity as in, humidifierCapability as it, binaryCapability as j, runningFromVacuumState as jt, batteryCapability as k, runningFromLawnMower as kt, COCO_TO_MACRO as l, discriminatedUnion as ln, lawnMowerControlCapability as lt, EnumSensorDateTimeFormatSchema as m, string as mn, notificationOutputCapability as mt, HA_BROKER_KIND as n, defineRecordKinds as nn, floodCapability as nt, BaseDevice as o, _enum as on, imageCapability as ot, ConsumableStatusSchema as p, record as pn, normalizeUnit as pt, coverCapability as q, weatherCapability as qt, HA_PROVIDER_ADDON_ID$1 as r, entryBody as rn, gasCapability as rt, BaseDeviceProvider as s, array as sn, ingestReading as st, haInstanceSettingsPortsOver as t, defineEntryKind as tn, flattenPortsOver as tt, CameraSwitchIdSchema as u, literal as un, lockControlCapability as ut, MediaPlayerRepeatSchema as v, DeviceFeature as vn, parseAdminBase as vt, addonRoutesCapability as w, pruneDeletedEntities as wt, RecordIntegrationInstances as x, errMsg as xn, prepareNotification as xt, PLUG_APPLIANCE_TYPES as y, DeviceRole as yn, powerMeterCapability as yt, carbonMonoxideCapability as z, temperatureSensorCapability as zt };
|