@camstack/addon-provider-homeassistant 1.2.627 → 1.2.629
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/README.md +22 -0
- package/dist/addon.js +3 -1
- package/dist/addon.mjs +3 -1
- package/dist/{dist-BFnk4bwH.mjs → dist-DWMNvtWN.mjs} +301 -15
- package/dist/{dist-CRwUHjY7.js → dist-sQp4D2Eo.js} +306 -14
- package/dist/ha-export/ha-export.addon.js +45 -31
- package/dist/ha-export/ha-export.addon.mjs +45 -31
- package/package.json +4 -2
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this package are documented in this file.
|
|
4
|
+
|
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
+
|
|
8
|
+
## [Unreleased]
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
|
|
12
|
+
- Package README and changelog, included in the published files list.
|
package/README.md
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# @camstack/addon-provider-homeassistant
|
|
2
|
+
|
|
3
|
+
Home Assistant device provider addon for CamStack
|
|
4
|
+
|
|
5
|
+
## What it does
|
|
6
|
+
|
|
7
|
+
- **Home Assistant Provider** (`provider-homeassistant`): Adopt Home Assistant devices into CamStack via WebSocket
|
|
8
|
+
- Node placement: `hub-only`.
|
|
9
|
+
- Capabilities: `broker`, `device-adoption`, `vacuum-control`, `lawn-mower-control`, `running-state`, `valve`, `humidifier`, `water-heater`, `weather`, `image`, `update`, `notification-output`, `addon-routes`, `calendar-source`.
|
|
10
|
+
- **Home Assistant Export** (`homeassistant-export`): Pushes CamStack entities to the CamStack Home Assistant custom component over HTTP. Chooses which devices reach which Home Assistant instance; Home Assistant never polls the hub for a value.
|
|
11
|
+
- Node placement: `hub-only`.
|
|
12
|
+
- Capabilities: `device-export`, `addon-routes`, `oauth-integration`.
|
|
13
|
+
|
|
14
|
+
## Settings
|
|
15
|
+
|
|
16
|
+
Settings this addon exposes are edited from System → Addons → this addon → Settings when they apply to the whole cluster, and from the device page when they belong to one device. A password field is stored in the keychain.
|
|
17
|
+
|
|
18
|
+
## Requirements
|
|
19
|
+
|
|
20
|
+
- Peer packages already on the node: `@camstack/types`.
|
|
21
|
+
- A CamStack hub. An agent is used only when the placement above allows it.
|
|
22
|
+
|
package/dist/addon.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
-
const require_dist = require("./dist-
|
|
2
|
+
const require_dist = require("./dist-sQp4D2Eo.js");
|
|
3
3
|
let node_crypto = require("node:crypto");
|
|
4
4
|
let node_zlib = require("node:zlib");
|
|
5
5
|
//#region src/ha-admin-link.ts
|
|
@@ -6487,6 +6487,8 @@ var PARENT_TYPE_PRIORITY = [
|
|
|
6487
6487
|
require_dist.DeviceType.Fan,
|
|
6488
6488
|
require_dist.DeviceType.Vacuum,
|
|
6489
6489
|
require_dist.DeviceType.LawnMower,
|
|
6490
|
+
require_dist.DeviceType.Washer,
|
|
6491
|
+
require_dist.DeviceType.Dryer,
|
|
6490
6492
|
require_dist.DeviceType.Dishwasher,
|
|
6491
6493
|
require_dist.DeviceType.Light,
|
|
6492
6494
|
require_dist.DeviceType.Switch,
|
package/dist/addon.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { $ as
|
|
1
|
+
import { $ as lawnMowerControlCapability, $t as union, A as buttonCapability, At as weatherCapability, B as coverCapability, Bt as defineRecordKinds, C as batteryCapability, Ct as tryConvertDelta, D as brokerCapability, Dt as valveCapability, E as brightnessCapability, Et as vacuumControlCapability, F as connectivityCapability, G as eventEmitterCapability, Gt as array, H as deviceAdoptionCapability, It as RecordSecretUnavailableError, J as gasCapability, Jt as literal, K as fanControlCapability, Kt as boolean, Lt as baseUnitOf, M as carbonMonoxideCapability, Mt as DeviceRole, N as climateControlCapability, Nt as DeviceType, O as buildAddonRouteProvider, Ot as vibrationCapability, P as colorCapability, Pt as errMsg, Q as ingestReading, Qt as string, R as contactCapability, Rt as createEvent, S as automationControlCapability, St as temperatureSensorCapability, T as binaryCapability, Tt as updateCapability, V as deviceAdminLinkCapability, Vt as entryBody, W as enumSensorCapability, Wt as _enum, X as humiditySensorCapability, Xt as object, Y as humidifierCapability, Yt as number, Z as imageCapability, Zt as record, _ as accessoriesCapability, _t as runningStateCapability, at as notifierCapability, b as alarmPanelCapability, bt as switchCapability, ct as parseAdminBase, dt as presenceCapability, en as unknown, et as lockControlCapability, ft as pressureSensorCapability, g as TargetSchema, gt as runningFromVacuumState, h as RUNNING_STATE_COLD, ht as runningFromMediaPlayer, it as notificationOutputCapability, j as calendarSourceCapability, jt as DeviceFeature, k as buildDeviceAdminUrl, kt as waterHeaterCapability, lt as powerMeterCapability, mt as runningFromLawnMower, n as BaseDevice, nn as EventCategory, nt as motionCapability, ot as numericSensorCapability, pt as quantityFromUnit, q as floodCapability, qt as discriminatedUnion, r as BaseDeviceProvider, rt as normalizeUnit, tn as url, tt as mediaPlayerCapability, u as EnumSensorDateTimeFormatSchema, ut as prepareNotification, v as addonRoutesCapability, vt as scriptRunnerCapability, w as bestLocationMatch, wt as tryConvertUnit, x as ambientLightSensorCapability, xt as tamperCapability, y as airQualitySensorCapability, yt as smokeCapability, z as controlCapability, zt as defineEntryKind } from "./dist-DWMNvtWN.mjs";
|
|
2
2
|
import { randomUUID } from "node:crypto";
|
|
3
3
|
import { brotliCompressSync, deflateSync, gzipSync } from "node:zlib";
|
|
4
4
|
//#region src/ha-admin-link.ts
|
|
@@ -6486,6 +6486,8 @@ var PARENT_TYPE_PRIORITY = [
|
|
|
6486
6486
|
DeviceType.Fan,
|
|
6487
6487
|
DeviceType.Vacuum,
|
|
6488
6488
|
DeviceType.LawnMower,
|
|
6489
|
+
DeviceType.Washer,
|
|
6490
|
+
DeviceType.Dryer,
|
|
6489
6491
|
DeviceType.Dishwasher,
|
|
6490
6492
|
DeviceType.Light,
|
|
6491
6493
|
DeviceType.Switch,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
//#region ../types/dist/event-category-
|
|
1
|
+
//#region ../types/dist/event-category-CT-hz5Rb.mjs
|
|
2
2
|
var EventCategory = /* @__PURE__ */ function(EventCategory) {
|
|
3
3
|
EventCategory["SystemBoot"] = "system.boot";
|
|
4
4
|
EventCategory["SystemAddonsReady"] = "system.addons-ready";
|
|
@@ -324,6 +324,14 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
|
|
|
324
324
|
/** The recovery edge of {@link PipelineMotionNoisy}: the motion fell back, or a detection arrived. */
|
|
325
325
|
EventCategory["PipelineMotionCalm"] = "pipeline.motion-calm";
|
|
326
326
|
/**
|
|
327
|
+
* A camera's package LLM confirm has failed closed three times in a row
|
|
328
|
+
* (D931, 2026-10-26). One edge per camera until
|
|
329
|
+
* {@link PipelinePackageLlmAnswered}.
|
|
330
|
+
*/
|
|
331
|
+
EventCategory["PipelinePackageLlmSilent"] = "pipeline.package-llm-silent";
|
|
332
|
+
/** The recovery edge of {@link PipelinePackageLlmSilent}: a confirm returned yes or no. */
|
|
333
|
+
EventCategory["PipelinePackageLlmAnswered"] = "pipeline.package-llm-answered";
|
|
334
|
+
/**
|
|
327
335
|
* Per-camera pipeline config was mutated by the orchestrator
|
|
328
336
|
* (a settings change via `setAgentInferenceDevices` /
|
|
329
337
|
* `setCameraStepToggle` / `setCameraStepSettings`). Orchestrator
|
|
@@ -5566,7 +5574,7 @@ var ZodIssueCode = {
|
|
|
5566
5574
|
var ZodFirstPartyTypeKind;
|
|
5567
5575
|
ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
|
|
5568
5576
|
//#endregion
|
|
5569
|
-
//#region ../types/dist/sleep-
|
|
5577
|
+
//#region ../types/dist/sleep-bykKrTgu.mjs
|
|
5570
5578
|
/**
|
|
5571
5579
|
* The audio chunk plane's byte format, and the ONE expansion from a coded
|
|
5572
5580
|
* window to float samples (D455).
|
|
@@ -9009,6 +9017,7 @@ var CAP_NAMES = Object.freeze([
|
|
|
9009
9017
|
"filesystem-browse",
|
|
9010
9018
|
"flood",
|
|
9011
9019
|
"gas",
|
|
9020
|
+
"group-commands",
|
|
9012
9021
|
"group-status",
|
|
9013
9022
|
"heating-valve",
|
|
9014
9023
|
"humidifier",
|
|
@@ -10830,7 +10839,7 @@ object({
|
|
|
10830
10839
|
params: record(string(), union([string(), number()])).optional()
|
|
10831
10840
|
});
|
|
10832
10841
|
//#endregion
|
|
10833
|
-
//#region ../types/dist/err-msg-
|
|
10842
|
+
//#region ../types/dist/err-msg-DIorGYeC.mjs
|
|
10834
10843
|
var DeviceType = /* @__PURE__ */ function(DeviceType) {
|
|
10835
10844
|
DeviceType["Camera"] = "camera";
|
|
10836
10845
|
DeviceType["Hub"] = "hub";
|
|
@@ -10924,8 +10933,14 @@ var DeviceType = /* @__PURE__ */ function(DeviceType) {
|
|
|
10924
10933
|
DeviceType["PetFeeder"] = "pet-feeder";
|
|
10925
10934
|
/** Built-in dishwasher — program lifecycle, door / remote-start gates,
|
|
10926
10935
|
* salt and rinse-aid levels. Installed with the `dishwasher` cap.
|
|
10927
|
-
* Sources: native Bosch Home Connect, reusable by similar integrations.
|
|
10936
|
+
* Sources: native Bosch Home Connect, reusable by similar integrations.
|
|
10937
|
+
* A plug-built dishwasher carries running-state and power instead. */
|
|
10928
10938
|
DeviceType["Dishwasher"] = "dishwasher";
|
|
10939
|
+
/** Washing machine. A plug-built one is running while its power stays
|
|
10940
|
+
* above a threshold. No program cap — that surface is the dishwasher's. */
|
|
10941
|
+
DeviceType["Washer"] = "washer";
|
|
10942
|
+
/** Tumble dryer. Same plug-built running surface as {@link Washer}. */
|
|
10943
|
+
DeviceType["Dryer"] = "dryer";
|
|
10929
10944
|
return DeviceType;
|
|
10930
10945
|
}({});
|
|
10931
10946
|
var DeviceFeature = /* @__PURE__ */ function(DeviceFeature) {
|
|
@@ -11183,7 +11198,7 @@ function errMsg(err) {
|
|
|
11183
11198
|
return String(err);
|
|
11184
11199
|
}
|
|
11185
11200
|
//#endregion
|
|
11186
|
-
//#region ../types/dist/composition-
|
|
11201
|
+
//#region ../types/dist/composition-B2rw5L29.mjs
|
|
11187
11202
|
/**
|
|
11188
11203
|
* The ffmpeg build every CamStack node downloads, per platform and arch.
|
|
11189
11204
|
*
|
|
@@ -11939,6 +11954,26 @@ function validateExpressionSource(src) {
|
|
|
11939
11954
|
return null;
|
|
11940
11955
|
}
|
|
11941
11956
|
/**
|
|
11957
|
+
* One power reading becomes a washer, dryer or dishwasher (D944 helper).
|
|
11958
|
+
*
|
|
11959
|
+
* Standby of the control board is under 5 W; a motor or a heater is far
|
|
11960
|
+
* above that, so 5 W is the line. A door lock or a short pump spike is not
|
|
11961
|
+
* a cycle, so running starts only after 30 s above the line.
|
|
11962
|
+
*
|
|
11963
|
+
* A wash, dry or dishwasher pause (soak, heat-wait, heater off between
|
|
11964
|
+
* bursts) lasts several minutes. Ending the cycle on the first dip would
|
|
11965
|
+
* report "finished" in the middle of the program, so the stop dwell is
|
|
11966
|
+
* 10 minutes on every type. The number is stored per type so one machine
|
|
11967
|
+
* can move later without moving the others.
|
|
11968
|
+
*/
|
|
11969
|
+
var APPLIANCE_TEMPLATE_ID = "appliance";
|
|
11970
|
+
var APPLIANCE_KINDS = [
|
|
11971
|
+
"washer",
|
|
11972
|
+
"dryer",
|
|
11973
|
+
"dishwasher"
|
|
11974
|
+
];
|
|
11975
|
+
DeviceType.Washer, DeviceType.Dryer, DeviceType.Dishwasher;
|
|
11976
|
+
/**
|
|
11942
11977
|
* A composition source identity: `(addonId, stableId)`, never a numeric device
|
|
11943
11978
|
* id. Split out so helper schemas can name it without a cycle through
|
|
11944
11979
|
* `composition.ts` (D659).
|
|
@@ -11962,7 +11997,9 @@ var GROUP_TEMPLATE_IDS = [
|
|
|
11962
11997
|
"leak",
|
|
11963
11998
|
"smoke",
|
|
11964
11999
|
"occupancy",
|
|
11965
|
-
"binary"
|
|
12000
|
+
"binary",
|
|
12001
|
+
"switch",
|
|
12002
|
+
"light"
|
|
11966
12003
|
];
|
|
11967
12004
|
var NUMERIC_AGGREGATES = [
|
|
11968
12005
|
"mean",
|
|
@@ -11972,6 +12009,8 @@ var NUMERIC_AGGREGATES = [
|
|
|
11972
12009
|
"sum"
|
|
11973
12010
|
];
|
|
11974
12011
|
var BINARY_AGGREGATES = ["any", "all"];
|
|
12012
|
+
/** How an actuator group decides it is on. Unknown members never count as off. */
|
|
12013
|
+
var ACTIVE_CRITERIA = ["at-least-one", "all"];
|
|
11975
12014
|
var AGGREGATE_REDUCERS = [
|
|
11976
12015
|
"mean",
|
|
11977
12016
|
"median",
|
|
@@ -11983,6 +12022,7 @@ var AGGREGATE_REDUCERS = [
|
|
|
11983
12022
|
];
|
|
11984
12023
|
var GroupTemplateIdSchema = _enum(GROUP_TEMPLATE_IDS);
|
|
11985
12024
|
var AggregateReducerSchema = _enum(AGGREGATE_REDUCERS);
|
|
12025
|
+
var ActiveCriterionSchema = _enum(ACTIVE_CRITERIA);
|
|
11986
12026
|
/** One member. The field is stored so occupancy can name motion or binary. */
|
|
11987
12027
|
var HelperMemberSchema = object({
|
|
11988
12028
|
source: CompositionSourceRefSchema,
|
|
@@ -11993,7 +12033,17 @@ var HelperSpecSchema = discriminatedUnion("kind", [object({
|
|
|
11993
12033
|
kind: literal("group"),
|
|
11994
12034
|
templateId: GroupTemplateIdSchema,
|
|
11995
12035
|
aggregate: AggregateReducerSchema,
|
|
11996
|
-
members: array(HelperMemberSchema).min(1).max(64)
|
|
12036
|
+
members: array(HelperMemberSchema).min(1).max(64),
|
|
12037
|
+
/** Actuator groups only. Readings leave this unset. */
|
|
12038
|
+
active: ActiveCriterionSchema.optional()
|
|
12039
|
+
}), object({
|
|
12040
|
+
kind: literal("appliance"),
|
|
12041
|
+
templateId: literal(APPLIANCE_TEMPLATE_ID),
|
|
12042
|
+
appliance: _enum(APPLIANCE_KINDS),
|
|
12043
|
+
thresholdWatts: number().positive(),
|
|
12044
|
+
startDwellMs: number().int().nonnegative(),
|
|
12045
|
+
stopDwellMs: number().int().nonnegative(),
|
|
12046
|
+
member: HelperMemberSchema
|
|
11997
12047
|
})]);
|
|
11998
12048
|
/** A composed device's stableId is this prefix plus the block id. */
|
|
11999
12049
|
var COMPOSED_DEVICE_STABLE_ID_PREFIX = "composed-";
|
|
@@ -18798,6 +18848,7 @@ function numeric(input) {
|
|
|
18798
18848
|
family: "numeric",
|
|
18799
18849
|
deviceType: DeviceType.Sensor,
|
|
18800
18850
|
memberDeviceType: DeviceType.Sensor,
|
|
18851
|
+
commandCaps: [],
|
|
18801
18852
|
baseUnit: baseUnitOf(input.quantity),
|
|
18802
18853
|
aggregates: NUMERIC_AGGREGATES,
|
|
18803
18854
|
accept: [{
|
|
@@ -18812,6 +18863,7 @@ function binary(input) {
|
|
|
18812
18863
|
family: "binary",
|
|
18813
18864
|
deviceType: DeviceType.Sensor,
|
|
18814
18865
|
memberDeviceType: DeviceType.Sensor,
|
|
18866
|
+
commandCaps: [],
|
|
18815
18867
|
quantity: "none",
|
|
18816
18868
|
baseUnit: void 0,
|
|
18817
18869
|
aggregates: BINARY_AGGREGATES,
|
|
@@ -19006,9 +19058,47 @@ var GROUP_TEMPLATES = [
|
|
|
19006
19058
|
fieldPath: "on"
|
|
19007
19059
|
}],
|
|
19008
19060
|
companions: [CHANGED]
|
|
19061
|
+
}),
|
|
19062
|
+
actuator({
|
|
19063
|
+
id: "switch",
|
|
19064
|
+
summary: "On when at least one switch is on, or when all of them are. Offline and unknown members are left out of that decision, never read as off, and still receive the command.",
|
|
19065
|
+
deviceType: DeviceType.Switch,
|
|
19066
|
+
outputCap: "switch",
|
|
19067
|
+
commandCaps: ["switch"]
|
|
19068
|
+
}),
|
|
19069
|
+
actuator({
|
|
19070
|
+
id: "light",
|
|
19071
|
+
summary: "On when at least one light is on, or when all of them are. Brightness and colour are offered only when every member has them. A command is not sent to a member that lacks it.",
|
|
19072
|
+
deviceType: DeviceType.Light,
|
|
19073
|
+
outputCap: "switch",
|
|
19074
|
+
commandCaps: [
|
|
19075
|
+
"switch",
|
|
19076
|
+
"brightness",
|
|
19077
|
+
"color"
|
|
19078
|
+
]
|
|
19009
19079
|
})
|
|
19010
19080
|
];
|
|
19081
|
+
function actuator(input) {
|
|
19082
|
+
return {
|
|
19083
|
+
...input,
|
|
19084
|
+
family: "actuator",
|
|
19085
|
+
role: void 0,
|
|
19086
|
+
memberDeviceType: input.deviceType,
|
|
19087
|
+
outputField: "on",
|
|
19088
|
+
quantity: "none",
|
|
19089
|
+
baseUnit: void 0,
|
|
19090
|
+
aggregates: BINARY_AGGREGATES,
|
|
19091
|
+
defaultAggregate: "any",
|
|
19092
|
+
empty: "offline",
|
|
19093
|
+
accept: [{
|
|
19094
|
+
cap: "switch",
|
|
19095
|
+
fieldPath: "on"
|
|
19096
|
+
}],
|
|
19097
|
+
companions: [CHANGED]
|
|
19098
|
+
};
|
|
19099
|
+
}
|
|
19011
19100
|
new Map(GROUP_TEMPLATES.map((template) => [template.id, template]));
|
|
19101
|
+
DeviceFeature.LightColorRgb, DeviceFeature.LightColorHsv, DeviceFeature.LightColorMired;
|
|
19012
19102
|
`${COMPOSED_DEVICE_STABLE_ID_PREFIX}`;
|
|
19013
19103
|
/**
|
|
19014
19104
|
* What a composition may BUILD on a device type (G2, D676): the caps a new
|
|
@@ -46096,6 +46186,8 @@ var NcSystemEventKindSchema = _enum([
|
|
|
46096
46186
|
"detection-blind",
|
|
46097
46187
|
"motion-noisy",
|
|
46098
46188
|
"motion-calm",
|
|
46189
|
+
"package-llm-silent",
|
|
46190
|
+
"package-llm-answered",
|
|
46099
46191
|
"recording-stalled",
|
|
46100
46192
|
"recording-healthy",
|
|
46101
46193
|
"recording-degraded",
|
|
@@ -57275,6 +57367,28 @@ var PackageVersionInfoSchema = object({
|
|
|
57275
57367
|
deprecated: string().optional(),
|
|
57276
57368
|
distTags: array(string()).readonly()
|
|
57277
57369
|
});
|
|
57370
|
+
/**
|
|
57371
|
+
* One published document. `ok` is markdown from the registry. `missing` means
|
|
57372
|
+
* the registry answered and the file was not there. `error` is a registry or
|
|
57373
|
+
* tarball failure — never an empty string standing in for either.
|
|
57374
|
+
*/
|
|
57375
|
+
var PackageDocBodySchema = discriminatedUnion("status", [
|
|
57376
|
+
object({
|
|
57377
|
+
status: literal("ok"),
|
|
57378
|
+
markdown: string()
|
|
57379
|
+
}),
|
|
57380
|
+
object({ status: literal("missing") }),
|
|
57381
|
+
object({
|
|
57382
|
+
status: literal("error"),
|
|
57383
|
+
message: string()
|
|
57384
|
+
})
|
|
57385
|
+
]);
|
|
57386
|
+
var PackageDocsSchema = object({
|
|
57387
|
+
name: string(),
|
|
57388
|
+
version: string(),
|
|
57389
|
+
readme: PackageDocBodySchema,
|
|
57390
|
+
changelog: PackageDocBodySchema
|
|
57391
|
+
});
|
|
57278
57392
|
var SearchResultSchema = object({
|
|
57279
57393
|
name: string(),
|
|
57280
57394
|
version: string(),
|
|
@@ -57493,7 +57607,10 @@ method(object({ nodeId: string().optional() }).optional(), array(AddonListItemSc
|
|
|
57493
57607
|
}), object({ success: literal(true) }), {
|
|
57494
57608
|
kind: "mutation",
|
|
57495
57609
|
auth: "admin"
|
|
57496
|
-
}), method(object({ name: string() }), array(PackageVersionInfoSchema).readonly()), method(object({
|
|
57610
|
+
}), method(object({ name: string() }), array(PackageVersionInfoSchema).readonly()), method(object({
|
|
57611
|
+
name: string().min(1),
|
|
57612
|
+
version: string().min(1).optional()
|
|
57613
|
+
}), PackageDocsSchema, { auth: "admin" }), method(object({ addonId: string() }), RestartAddonResultSchema, {
|
|
57497
57614
|
kind: "mutation",
|
|
57498
57615
|
auth: "admin"
|
|
57499
57616
|
}), method(object({ packageName: string() }), object({ success: literal(true) }), {
|
|
@@ -60863,6 +60980,39 @@ var gasCapability = {
|
|
|
60863
60980
|
* whether persisting is worth a SQLite commit. */
|
|
60864
60981
|
volatileStateFields: ["lastChangedAt"]
|
|
60865
60982
|
};
|
|
60983
|
+
var GroupCommandsSchema = object({
|
|
60984
|
+
/** One row per member that has been commanded. A later command replaces that member's row. */
|
|
60985
|
+
results: array(object({
|
|
60986
|
+
deviceId: number().int().nonnegative(),
|
|
60987
|
+
cap: string().min(1),
|
|
60988
|
+
method: string().min(1),
|
|
60989
|
+
ok: boolean(),
|
|
60990
|
+
error: string().optional(),
|
|
60991
|
+
/** Ms epoch of the attempt. */
|
|
60992
|
+
at: number()
|
|
60993
|
+
})) });
|
|
60994
|
+
var groupCommandsCapability = {
|
|
60995
|
+
name: "group-commands",
|
|
60996
|
+
scope: "device",
|
|
60997
|
+
deviceNative: true,
|
|
60998
|
+
mode: "singleton",
|
|
60999
|
+
deviceTypes: [DeviceType.Switch, DeviceType.Light],
|
|
61000
|
+
methods: {},
|
|
61001
|
+
status: {
|
|
61002
|
+
schema: GroupCommandsSchema,
|
|
61003
|
+
kind: "push"
|
|
61004
|
+
},
|
|
61005
|
+
runtimeState: GroupCommandsSchema,
|
|
61006
|
+
/**
|
|
61007
|
+
* Runtime-state durability: **session** — the last attempt. A restored
|
|
61008
|
+
* failure would outlive the command that caused it.
|
|
61009
|
+
*
|
|
61010
|
+
* See `RuntimeStateDurability`. Enforced by
|
|
61011
|
+
* `scripts/check-runtime-state-durability.ts`.
|
|
61012
|
+
*/
|
|
61013
|
+
durability: "session",
|
|
61014
|
+
history: "none"
|
|
61015
|
+
};
|
|
60866
61016
|
/**
|
|
60867
61017
|
* How many members of a helper group answered (D944). Counts are integers,
|
|
60868
61018
|
* not measurements: zero included is a real count, never a stand-in reading.
|
|
@@ -60891,7 +61041,11 @@ var groupStatusCapability = {
|
|
|
60891
61041
|
scope: "device",
|
|
60892
61042
|
deviceNative: true,
|
|
60893
61043
|
mode: "singleton",
|
|
60894
|
-
deviceTypes: [
|
|
61044
|
+
deviceTypes: [
|
|
61045
|
+
DeviceType.Sensor,
|
|
61046
|
+
DeviceType.Switch,
|
|
61047
|
+
DeviceType.Light
|
|
61048
|
+
],
|
|
60895
61049
|
methods: {},
|
|
60896
61050
|
status: {
|
|
60897
61051
|
schema: GroupStatusSchema,
|
|
@@ -64726,7 +64880,12 @@ var powerMeterCapability = {
|
|
|
64726
64880
|
scope: "device",
|
|
64727
64881
|
deviceNative: true,
|
|
64728
64882
|
mode: "singleton",
|
|
64729
|
-
deviceTypes: [
|
|
64883
|
+
deviceTypes: [
|
|
64884
|
+
DeviceType.Sensor,
|
|
64885
|
+
DeviceType.Washer,
|
|
64886
|
+
DeviceType.Dryer,
|
|
64887
|
+
DeviceType.Dishwasher
|
|
64888
|
+
],
|
|
64730
64889
|
methods: {},
|
|
64731
64890
|
status: {
|
|
64732
64891
|
schema: PowerMeterStatusSchema,
|
|
@@ -65472,6 +65631,8 @@ var runningCustomize = {
|
|
|
65472
65631
|
stateField: "running"
|
|
65473
65632
|
},
|
|
65474
65633
|
deviceTypes: [
|
|
65634
|
+
DeviceType.Washer,
|
|
65635
|
+
DeviceType.Dryer,
|
|
65475
65636
|
DeviceType.Dishwasher,
|
|
65476
65637
|
DeviceType.Vacuum,
|
|
65477
65638
|
DeviceType.LawnMower,
|
|
@@ -70610,7 +70771,7 @@ function tryConvertDelta(value, from, to) {
|
|
|
70610
70771
|
return shifted - origin;
|
|
70611
70772
|
}
|
|
70612
70773
|
SOURCE_CAPS.filter((cap) => cap !== "switch" && cap !== "motion");
|
|
70613
|
-
DeviceType.Camera, DeviceType.Sensor, DeviceType.Button, DeviceType.Switch, DeviceType.PetFeeder, DeviceType.Container, DeviceType.Thermostat, DeviceType.Camera, DeviceType.Hub, DeviceType.Light, DeviceType.Siren, DeviceType.Switch, DeviceType.Sensor, DeviceType.Thermostat, DeviceType.Climate, DeviceType.Button, DeviceType.EventEmitter, DeviceType.Update, DeviceType.Generic, DeviceType.Notifier, DeviceType.Script, DeviceType.Automation, DeviceType.Lock, DeviceType.Cover, DeviceType.Valve, DeviceType.Humidifier, DeviceType.WaterHeater, DeviceType.Fan, DeviceType.MediaPlayer, DeviceType.AlarmPanel, DeviceType.Control, DeviceType.Presence, DeviceType.Weather, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.Container, DeviceType.Image, DeviceType.PetFeeder, DeviceType.Dishwasher, DeviceType.Camera, DeviceType.Camera, DeviceType.Dishwasher, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.MediaPlayer, DeviceType.WaterHeater, DeviceType.Humidifier, DeviceType.Fan, DeviceType.Climate, DeviceType.Thermostat, DeviceType.PetFeeder;
|
|
70774
|
+
DeviceType.Camera, DeviceType.Sensor, DeviceType.Button, DeviceType.Switch, DeviceType.PetFeeder, DeviceType.Container, DeviceType.Thermostat, DeviceType.Camera, DeviceType.Hub, DeviceType.Light, DeviceType.Siren, DeviceType.Switch, DeviceType.Sensor, DeviceType.Thermostat, DeviceType.Climate, DeviceType.Button, DeviceType.EventEmitter, DeviceType.Update, DeviceType.Generic, DeviceType.Notifier, DeviceType.Script, DeviceType.Automation, DeviceType.Lock, DeviceType.Cover, DeviceType.Valve, DeviceType.Humidifier, DeviceType.WaterHeater, DeviceType.Fan, DeviceType.MediaPlayer, DeviceType.AlarmPanel, DeviceType.Control, DeviceType.Presence, DeviceType.Weather, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.Container, DeviceType.Image, DeviceType.PetFeeder, DeviceType.Dishwasher, DeviceType.Washer, DeviceType.Dryer, DeviceType.Camera, DeviceType.Camera, DeviceType.Washer, DeviceType.Dryer, DeviceType.Dishwasher, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.MediaPlayer, DeviceType.WaterHeater, DeviceType.Humidifier, DeviceType.Fan, DeviceType.Climate, DeviceType.Thermostat, DeviceType.PetFeeder;
|
|
70614
70775
|
String.raw`rose\(active(\d+), changed(\d+), (\d+(?:\.\d+)?)\)`;
|
|
70615
70776
|
DeviceRole.BinarySensor, DeviceRole.MotionSensor;
|
|
70616
70777
|
new Set(CAP_NAMES);
|
|
@@ -70939,6 +71100,7 @@ var DEVICE_LOCAL_STATE_CAPS = {
|
|
|
70939
71100
|
featureProbe: featureProbeCapability,
|
|
70940
71101
|
flood: floodCapability,
|
|
70941
71102
|
gas: gasCapability,
|
|
71103
|
+
groupCommands: groupCommandsCapability,
|
|
70942
71104
|
groupStatus: groupStatusCapability,
|
|
70943
71105
|
heatingValve: heatingValveCapability,
|
|
70944
71106
|
humidifier: humidifierCapability,
|
|
@@ -72208,7 +72370,7 @@ var BaseDeviceProvider = class extends BaseAddon {
|
|
|
72208
72370
|
return toDeviceSummary(device, this.addonId);
|
|
72209
72371
|
}
|
|
72210
72372
|
};
|
|
72211
|
-
DeviceType.Cover, DeviceType.Valve, DeviceType.Humidifier, DeviceType.WaterHeater, DeviceType.Camera, DeviceType.Hub, DeviceType.Switch, DeviceType.Siren, DeviceType.Light, DeviceType.Fan, DeviceType.Sensor, DeviceType.Thermostat, DeviceType.Climate, DeviceType.Button, DeviceType.EventEmitter, DeviceType.Update, DeviceType.Generic, DeviceType.Notifier, DeviceType.Script, DeviceType.Automation, DeviceType.Lock, DeviceType.MediaPlayer, DeviceType.AlarmPanel, DeviceType.Control, DeviceType.Presence, DeviceType.Weather, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.Container, DeviceType.Image, DeviceType.PetFeeder, DeviceType.Dishwasher;
|
|
72373
|
+
DeviceType.Cover, DeviceType.Valve, DeviceType.Humidifier, DeviceType.WaterHeater, DeviceType.Camera, DeviceType.Hub, DeviceType.Switch, DeviceType.Siren, DeviceType.Light, DeviceType.Fan, DeviceType.Sensor, DeviceType.Thermostat, DeviceType.Climate, DeviceType.Button, DeviceType.EventEmitter, DeviceType.Update, DeviceType.Generic, DeviceType.Notifier, DeviceType.Script, DeviceType.Automation, DeviceType.Lock, DeviceType.MediaPlayer, DeviceType.AlarmPanel, DeviceType.Control, DeviceType.Presence, DeviceType.Weather, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.Container, DeviceType.Image, DeviceType.PetFeeder, DeviceType.Dishwasher, DeviceType.Washer, DeviceType.Dryer;
|
|
72212
72374
|
new Set(Object.values(DeviceType));
|
|
72213
72375
|
Object.freeze({
|
|
72214
72376
|
"accessories.getStatus": {
|
|
@@ -72316,6 +72478,13 @@ Object.freeze({
|
|
|
72316
72478
|
access: "view",
|
|
72317
72479
|
role: "admin"
|
|
72318
72480
|
},
|
|
72481
|
+
"addons.getPackageDocs": {
|
|
72482
|
+
capName: "addons",
|
|
72483
|
+
capScope: "system",
|
|
72484
|
+
addonId: null,
|
|
72485
|
+
access: "view",
|
|
72486
|
+
role: "admin"
|
|
72487
|
+
},
|
|
72319
72488
|
"addons.getVersions": {
|
|
72320
72489
|
capName: "addons",
|
|
72321
72490
|
capScope: "system",
|
|
@@ -75424,6 +75593,13 @@ Object.freeze({
|
|
|
75424
75593
|
access: "view",
|
|
75425
75594
|
role: "viewer"
|
|
75426
75595
|
},
|
|
75596
|
+
"groupCommands.getStatus": {
|
|
75597
|
+
capName: "group-commands",
|
|
75598
|
+
capScope: "device",
|
|
75599
|
+
addonId: null,
|
|
75600
|
+
access: "view",
|
|
75601
|
+
role: "viewer"
|
|
75602
|
+
},
|
|
75427
75603
|
"groupStatus.getStatus": {
|
|
75428
75604
|
capName: "group-status",
|
|
75429
75605
|
capScope: "device",
|
|
@@ -84481,7 +84657,39 @@ var APPLIANCE_CAP_VOCABULARY = {
|
|
|
84481
84657
|
phrase: t("When {device} finishes", "Quando {device} finisce"),
|
|
84482
84658
|
icon: "square"
|
|
84483
84659
|
}
|
|
84484
|
-
}
|
|
84660
|
+
},
|
|
84661
|
+
overrides: { byType: {
|
|
84662
|
+
[DeviceType.Washer]: {
|
|
84663
|
+
state: { running: {
|
|
84664
|
+
whenTrue: t("When the washing machine starts", "Quando la lavatrice inizia"),
|
|
84665
|
+
whenFalse: t("When the washing machine has finished", "Quando la lavatrice ha finito")
|
|
84666
|
+
} },
|
|
84667
|
+
events: {
|
|
84668
|
+
onStarted: { phrase: t("When the washing machine starts", "Quando la lavatrice inizia") },
|
|
84669
|
+
onFinished: { phrase: t("When the washing machine has finished", "Quando la lavatrice ha finito") }
|
|
84670
|
+
}
|
|
84671
|
+
},
|
|
84672
|
+
[DeviceType.Dryer]: {
|
|
84673
|
+
state: { running: {
|
|
84674
|
+
whenTrue: t("When the dryer starts", "Quando l'asciugatrice inizia"),
|
|
84675
|
+
whenFalse: t("When the dryer has finished", "Quando l'asciugatrice ha finito")
|
|
84676
|
+
} },
|
|
84677
|
+
events: {
|
|
84678
|
+
onStarted: { phrase: t("When the dryer starts", "Quando l'asciugatrice inizia") },
|
|
84679
|
+
onFinished: { phrase: t("When the dryer has finished", "Quando l'asciugatrice ha finito") }
|
|
84680
|
+
}
|
|
84681
|
+
},
|
|
84682
|
+
[DeviceType.Dishwasher]: {
|
|
84683
|
+
state: { running: {
|
|
84684
|
+
whenTrue: t("When the dishwasher starts", "Quando la lavastoviglie inizia"),
|
|
84685
|
+
whenFalse: t("When the dishwasher has finished", "Quando la lavastoviglie ha finito")
|
|
84686
|
+
} },
|
|
84687
|
+
events: {
|
|
84688
|
+
onStarted: { phrase: t("When the dishwasher starts", "Quando la lavastoviglie inizia") },
|
|
84689
|
+
onFinished: { phrase: t("When the dishwasher has finished", "Quando la lavastoviglie ha finito") }
|
|
84690
|
+
}
|
|
84691
|
+
}
|
|
84692
|
+
} }
|
|
84485
84693
|
},
|
|
84486
84694
|
update: {
|
|
84487
84695
|
scope: "device",
|
|
@@ -85253,6 +85461,10 @@ var SENSOR_CAP_VOCABULARY = {
|
|
|
85253
85461
|
icon: "flame"
|
|
85254
85462
|
}]
|
|
85255
85463
|
},
|
|
85464
|
+
"group-commands": {
|
|
85465
|
+
scope: "device",
|
|
85466
|
+
noun: t("Group command", "Comando di gruppo")
|
|
85467
|
+
},
|
|
85256
85468
|
"group-status": {
|
|
85257
85469
|
scope: "device",
|
|
85258
85470
|
noun: t("Group", "Gruppo"),
|
|
@@ -85777,8 +85989,58 @@ function projectAction(cap, action) {
|
|
|
85777
85989
|
};
|
|
85778
85990
|
}
|
|
85779
85991
|
Object.entries(CAP_VOCABULARY_BY_NAME).flatMap(([cap, entry]) => entry.scope === "device" ? (entry.actions ?? []).map((a) => projectAction(cap, a)) : []);
|
|
85780
|
-
DeviceType.Camera, DeviceType.Hub, DeviceType.Light, DeviceType.Siren, DeviceType.Switch, DeviceType.Sensor, DeviceType.Thermostat, DeviceType.Climate, DeviceType.Button, DeviceType.EventEmitter, DeviceType.Update, DeviceType.Generic, DeviceType.Notifier, DeviceType.Script, DeviceType.Automation, DeviceType.Lock, DeviceType.Cover, DeviceType.Valve, DeviceType.Humidifier, DeviceType.WaterHeater, DeviceType.Fan, DeviceType.MediaPlayer, DeviceType.AlarmPanel, DeviceType.Control, DeviceType.Presence, DeviceType.Weather, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.Container, DeviceType.Image, DeviceType.PetFeeder, DeviceType.Dishwasher;
|
|
85992
|
+
DeviceType.Camera, DeviceType.Hub, DeviceType.Light, DeviceType.Siren, DeviceType.Switch, DeviceType.Sensor, DeviceType.Thermostat, DeviceType.Climate, DeviceType.Button, DeviceType.EventEmitter, DeviceType.Update, DeviceType.Generic, DeviceType.Notifier, DeviceType.Script, DeviceType.Automation, DeviceType.Lock, DeviceType.Cover, DeviceType.Valve, DeviceType.Humidifier, DeviceType.WaterHeater, DeviceType.Fan, DeviceType.MediaPlayer, DeviceType.AlarmPanel, DeviceType.Control, DeviceType.Presence, DeviceType.Weather, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.Container, DeviceType.Image, DeviceType.PetFeeder, DeviceType.Dishwasher, DeviceType.Washer, DeviceType.Dryer;
|
|
85781
85993
|
DeviceFeature.BatteryOperated;
|
|
85994
|
+
/**
|
|
85995
|
+
* How a washer, dryer or dishwasher leaves CamStack.
|
|
85996
|
+
*
|
|
85997
|
+
* Home Assistant has no laundry domain: the device is offered, and what
|
|
85998
|
+
* travels is its power reading. The others have a laundry type that this
|
|
85999
|
+
* export cannot honour yet, so they are named and withheld.
|
|
86000
|
+
*/
|
|
86001
|
+
var PLUG_APPLIANCE_TYPES = [
|
|
86002
|
+
DeviceType.Washer,
|
|
86003
|
+
DeviceType.Dryer,
|
|
86004
|
+
DeviceType.Dishwasher
|
|
86005
|
+
];
|
|
86006
|
+
var HA_AS = "a power sensor (device_class power). Home Assistant has no laundry domain. running-state stays unexported until a null reading can be published as unavailable.";
|
|
86007
|
+
var HOMEKIT_REASON = "HomeKit has no laundry-appliance service. The export tab would pair an accessory with nothing on it: running-state is withheld until a null reading can be unavailable, and power is not a HomeKit service this export honours.";
|
|
86008
|
+
var ALEXA_REASON = "Alexa has no laundry category in this export, and neither power nor running has an Alexa interface.";
|
|
86009
|
+
var GOOGLE_REASON = "Google WASHER, DRYER and DISHWASHER require RunCycle. A power threshold is not that trait, and this export does not publish RunCycle.";
|
|
86010
|
+
var MATTER_REASON = "No Matter export is built. The closest device types are Laundry Washer (0x0073) and Laundry Dryer (0x0074); a power threshold is not the Laundry Washer Mode cluster.";
|
|
86011
|
+
function withheld(reason) {
|
|
86012
|
+
return {
|
|
86013
|
+
[DeviceType.Washer]: {
|
|
86014
|
+
exported: false,
|
|
86015
|
+
reason
|
|
86016
|
+
},
|
|
86017
|
+
[DeviceType.Dryer]: {
|
|
86018
|
+
exported: false,
|
|
86019
|
+
reason
|
|
86020
|
+
},
|
|
86021
|
+
[DeviceType.Dishwasher]: {
|
|
86022
|
+
exported: false,
|
|
86023
|
+
reason
|
|
86024
|
+
}
|
|
86025
|
+
};
|
|
86026
|
+
}
|
|
86027
|
+
function offered(received) {
|
|
86028
|
+
return {
|
|
86029
|
+
[DeviceType.Washer]: {
|
|
86030
|
+
exported: true,
|
|
86031
|
+
as: received
|
|
86032
|
+
},
|
|
86033
|
+
[DeviceType.Dryer]: {
|
|
86034
|
+
exported: true,
|
|
86035
|
+
as: received
|
|
86036
|
+
},
|
|
86037
|
+
[DeviceType.Dishwasher]: {
|
|
86038
|
+
exported: true,
|
|
86039
|
+
as: received
|
|
86040
|
+
}
|
|
86041
|
+
};
|
|
86042
|
+
}
|
|
86043
|
+
offered(HA_AS), withheld(HOMEKIT_REASON), withheld(ALEXA_REASON), withheld(GOOGLE_REASON), withheld(MATTER_REASON);
|
|
85782
86044
|
Object.freeze({
|
|
85783
86045
|
"accessories.getStatus": [{
|
|
85784
86046
|
name: "deviceId",
|
|
@@ -86745,6 +87007,11 @@ Object.freeze({
|
|
|
86745
87007
|
form: "single",
|
|
86746
87008
|
optional: false
|
|
86747
87009
|
}],
|
|
87010
|
+
"groupCommands.getStatus": [{
|
|
87011
|
+
name: "deviceId",
|
|
87012
|
+
form: "single",
|
|
87013
|
+
optional: false
|
|
87014
|
+
}],
|
|
86748
87015
|
"groupStatus.getStatus": [{
|
|
86749
87016
|
name: "deviceId",
|
|
86750
87017
|
form: "single",
|
|
@@ -88941,6 +89208,8 @@ new Map(Object.entries({
|
|
|
88941
89208
|
"detection-blind": "device-events",
|
|
88942
89209
|
"motion-noisy": "device-events",
|
|
88943
89210
|
"motion-calm": "device-events",
|
|
89211
|
+
"package-llm-silent": "device-events",
|
|
89212
|
+
"package-llm-answered": "device-events",
|
|
88944
89213
|
"recording-stalled": "device-events",
|
|
88945
89214
|
"recording-healthy": "device-events",
|
|
88946
89215
|
"recording-degraded": "device-events",
|
|
@@ -89024,6 +89293,12 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
|
|
|
89024
89293
|
label: "Motion without a subject",
|
|
89025
89294
|
kinds: ["motion-noisy", "motion-calm"]
|
|
89026
89295
|
},
|
|
89296
|
+
{
|
|
89297
|
+
id: "package-llm",
|
|
89298
|
+
family: "device-events",
|
|
89299
|
+
label: "Package confirm",
|
|
89300
|
+
kinds: ["package-llm-silent", "package-llm-answered"]
|
|
89301
|
+
},
|
|
89027
89302
|
{
|
|
89028
89303
|
id: "recording",
|
|
89029
89304
|
family: "device-events",
|
|
@@ -89205,6 +89480,8 @@ var DEVICE_EVENTS = [
|
|
|
89205
89480
|
"detection-blind",
|
|
89206
89481
|
"motion-noisy",
|
|
89207
89482
|
"motion-calm",
|
|
89483
|
+
"package-llm-silent",
|
|
89484
|
+
"package-llm-answered",
|
|
89208
89485
|
"recording-stalled",
|
|
89209
89486
|
"recording-healthy",
|
|
89210
89487
|
"recording-degraded",
|
|
@@ -89473,6 +89750,15 @@ new Map([
|
|
|
89473
89750
|
snapshotLabel: "Cameras with constant motion now",
|
|
89474
89751
|
snapshotSection: null
|
|
89475
89752
|
},
|
|
89753
|
+
{
|
|
89754
|
+
id: "package-llm-confirm",
|
|
89755
|
+
family: "device-events",
|
|
89756
|
+
label: "Package confirm (not answering / answering again)",
|
|
89757
|
+
bad: ["package-llm-silent"],
|
|
89758
|
+
recovery: ["package-llm-answered"],
|
|
89759
|
+
snapshotLabel: "Cameras whose package confirm is not answering",
|
|
89760
|
+
snapshotSection: null
|
|
89761
|
+
},
|
|
89476
89762
|
{
|
|
89477
89763
|
id: "recording-health",
|
|
89478
89764
|
family: "device-events",
|
|
@@ -90194,4 +90480,4 @@ function bestLocationMatch(externalName, existing, threshold = .8) {
|
|
|
90194
90480
|
var MB = 1024 * 1024;
|
|
90195
90481
|
1024 * MB, 3072 * MB;
|
|
90196
90482
|
//#endregion
|
|
90197
|
-
export {
|
|
90483
|
+
export { lawnMowerControlCapability as $, union as $t, buttonCapability as A, weatherCapability as At, coverCapability as B, defineRecordKinds as Bt, batteryCapability as C, tryConvertDelta as Ct, brokerCapability as D, valveCapability as Dt, brightnessCapability as E, vacuumControlCapability as Et, connectivityCapability as F, BaseAddon as Ft, eventEmitterCapability as G, array as Gt, deviceAdoptionCapability as H, isReadingQuantity as Ht, consumableFormOf as I, RecordSecretUnavailableError as It, gasCapability as J, literal as Jt, fanControlCapability as K, boolean as Kt, consumableKindOf as L, baseUnitOf as Lt, carbonMonoxideCapability as M, DeviceRole as Mt, climateControlCapability as N, DeviceType as Nt, buildAddonRouteProvider as O, vibrationCapability as Ot, colorCapability as P, errMsg as Pt, ingestReading as Q, string as Qt, contactCapability as R, createEvent as Rt, automationControlCapability as S, temperatureSensorCapability as St, binaryCapability as T, updateCapability as Tt, deviceExportCapability as U, nodePin as Ut, deviceAdminLinkCapability as V, entryBody as Vt, enumSensorCapability as W, _enum as Wt, humiditySensorCapability as X, object as Xt, humidifierCapability as Y, number as Yt, imageCapability as Z, record as Zt, accessoriesCapability as _, runningStateCapability as _t, COCO_TO_MACRO as a, notifierCapability as at, alarmPanelCapability as b, switchCapability as bt, ConsumableItemSchema as c, parseAdminBase as ct, FanDirectionSchema as d, presenceCapability as dt, unknown as en, lockControlCapability as et, HvacModeSchema as f, pressureSensorCapability as ft, TargetSchema as g, runningFromVacuumState as gt, RUNNING_STATE_COLD as h, runningFromMediaPlayer as ht, CAMERA_SWITCH_ORDER as i, notificationOutputCapability as it, calendarSourceCapability as j, DeviceFeature as jt, buildDeviceAdminUrl as k, waterHeaterCapability as kt, ConsumableStatusSchema as l, powerMeterCapability as lt, PLUG_APPLIANCE_TYPES as m, runningFromLawnMower as mt, BaseDevice as n, EventCategory as nn, motionCapability as nt, CameraSwitchIdSchema as o, numericSensorCapability as ot, MediaPlayerRepeatSchema as p, quantityFromUnit as pt, floodCapability as q, discriminatedUnion as qt, BaseDeviceProvider as r, normalizeUnit as rt, ConsumableFormSchema as s, oauthIntegrationCapability as st, AlarmArmModeSchema as t, url as tn, mediaPlayerCapability as tt, EnumSensorDateTimeFormatSchema as u, prepareNotification as ut, addonRoutesCapability as v, scriptRunnerCapability as vt, bestLocationMatch as w, tryConvertUnit as wt, ambientLightSensorCapability as x, tamperCapability as xt, airQualitySensorCapability as y, smokeCapability as yt, controlCapability as z, defineEntryKind as zt };
|